code wars quiz: toInteger
Your task is to program a function which converts any input to an integer.
Do not perform rounding, the fractional part should simply be discarded.
If converting the input to an integer does not make sense (with an object, for instance), the function should return 0 (zero).
Also, Math.floor(), parseInt() and parseFloat() are disabled for your unconvenience.
Onegaishimasu!
function toInteger(n) {
var arr, i, ret = 0, sgn = 1, mul;
var pos, front, matches, swap;
if(typeof n == 'string' || typeof n == 'number'){
n += '';
if(n.slice(0, 1) == '-'){
sgn = -1;
n = n.slice(1);
}
if(matches = /^(\d*\.\d+)e(-?\d+)$/i.exec(n)){
front = matches[1];
mul = toInteger(matches[2]);
pos = front.indexOf('.');
arr = front.split('');
if(mul >= 0){
for(i = 0; i < mul; ++i){
swap = arr[pos + i];
arr[pos + i] = arr[pos + i + 1];
arr[pos + i + 1] = swap;
if(arr[arr.length - 1] == '.')arr.push('0');
}
}else{
if(pos < -mul){
for(i = -mul - pos; i > 0; --i){
arr.unshift('0');
}
}
for(i = 0; i > mul; --i){
swap = arr[pos + i];
arr[pos + i] = arr[pos + i - 1];
arr[pos + i - 1] = swap;
}
}
}else{
arr = n.split('');
}
for(i = 0; i < arr.length; ++i){
if(arr[i] >= '0' && arr[i] <= '9'){
ret = ret * 10 + (arr[i] - '0');
}else if(arr[i] == 'e' || arr[i] == 'E'){
mul = arr.slice(i + 1).join('');
if(!/^-?\d+$/.test(mul)){
ret = 0;
break;
}
mul = toInteger(mul);
ret *= (mul > 0? Math.pow(10, mul): Math.pow(.1, - mul));
ret = toInteger(ret);
break;
}else if(arr[i] == '.'){
break;
}else{
ret = 0;
break;
}
}
}
else if(n === true)return 1;
return ret * sgn;
}
It passes all my unit tests, can not figure out what is wrong with my code.
Test.assertEquals(toInteger(1), 1)
Test.assertEquals(toInteger('1e-2'), 0)
Test.assertEquals(toInteger('-20e-2'), 0)
Test.assertEquals(toInteger('-.98720e-2'), 0)
Test.assertEquals(toInteger('-200.67e-2'), -2)
Test.assertEquals(toInteger('-200.67e3'), -200670)
Test.assertEquals(toInteger('-200.67e0'), -200)
Test.assertEquals(toInteger('-1234e-5'), 0)
Test.assertEquals(toInteger('1234e7'), 12340000000)
Test.assertEquals(toInteger('-200e-2'), -2)
Test.assertEquals(toInteger('e-0'), 1)
Test.assertEquals(toInteger('.3e1'), 3)
Test.assertEquals(toInteger('5000e-2'), 50)
Test.expect(toInteger("4.55") === 4)
后面我修了一下,简化了这部分的逻辑,加入了对16进制、8进制和单元素数组的处理……最后终于被迫用eval破了这个kata。
看了其他人的答案,发现问题的关键是用位运算符,它自带Int32的操作……
例如~~n, n >> 0, n | 0, n ^ 0,这些都是可行的直接切割整数部分的技巧。
code wars quiz: toInteger的更多相关文章
- Web site collections
Integration 伯乐在线 极客头条 Hacker News Stack Overflow RFC Search Security Python Hacker - Freebuf PrimalS ...
- 递归调用里的性能问题(js)
说明 这是在codewars.com上刷的一道js练习题,在此做个记录 问题描述 The Fibonacci sequence is traditionally used to explain tre ...
- Concurrent.Thread.js
(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...
- Quiz(贪心,快速幂乘)
C. Quiz time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- mysql----JOIN Quiz
JOIN quiz game id mdate stadium team1 team2 1001 8 June 2012 National Stadium, Warsaw POL GRE 1002 8 ...
- mysql----Nested SELECT Quiz
Nested SELECT quiz bbc name region area population gdp Afghanistan South Asia 652225 26000000 Alb ...
- (转载)ASP.NET Quiz Answers: Does Page.Cache leak memory?
原文地址:http://blogs.msdn.com/b/tess/archive/2006/08/11/695268.aspx "We use Page.Cache to store te ...
- Visual Studio Code 代理设置
Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...
- 我们是怎么做Code Review的
前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...
随机推荐
- JAXB解析xml 的注解说明
1.将 xml 文件中的各个节点和属性信息创建对应的Java模型 2.在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示@XmlRootElement 将一个Java类映射 ...
- Jsp四个作用域page、request、session和application的区别
1.简单说 page指当前页面.在一个jsp页面里有效 2.request 指从http请求到服务器处理结束,返回响应的整个过程.在这个过程中使用forward方式跳转多个jsp.在这些页面里你都可 ...
- Android内存管理(15)SparseArray系列代替HashMap系列
参考: https://liuzhichao.com/p/832.html http://www.2cto.com/kf/201311/255640.html 1,简介: SparseArray是an ...
- 386 Lexicographical Numbers 字典序排数
给定一个整数 n, 返回从 1 到 n 的字典顺序.例如,给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] .请尽可能的优化算法的时间复杂度和空间复杂度. 输入 ...
- 网站开发综合技术 第一部分HTML 1.3.2表单
<form id="" name="" method="post/get" action="负责处理的服务端"&g ...
- 纵横填字js
新数据结构设计: 定义一个map: key是横纵坐标字符串,比如“0,4” value是一个json,包含以下属性:字,横向的词(若 有的话,无的话,空串),纵向的词(若有的话,无的话,空串). 另有 ...
- 60查找nanopim1plus的HDMI为720p输出的问题
60查找nanopim1plus的HDMI为720p输出的问题 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17:51 版本:V1. ...
- Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 执行SQL语句 下一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 ...
- java 基础学习笔记 - 安装
1. 从www.sun.com中 下载jdk安装包 2. 执行安装包,安装jdk ,jre(Java运行环境) 3. 配置path路径 增加jdk下的bin目录. 配置完后需要重启cmd窗口,因为cm ...
- VR虚拟红包的技术实现
2017年1月20日,腾讯发布消息称将推出Q-Glass,除了一般VR眼镜的标配功能外,Q-Glass还能实现眨眼抢红包.听起来是不是很酷炫?上市时间可要在10年后.不过,2016年底支付宝首推AR实 ...