Problem 36 「二種類の基数による回文数」
585 = 1001001001 (2進) は10進でも2進でも回文数である.100万未満で10進でも2進でも回文数になるような数の総和を求めよ.
(注: 先頭に0を含めて回文にすることは許されない.)
ワンライナーで行けた。
(max=>(
( rev=n=>String(n)
.split("")
.reverse()
.join(""),
b
)=>[...Array(max)]
.map((_,i)=>++i)
.filter(e=>String(e)==rev(e))
.filter(e=>(b=Number(e).toString(2))==rev(b))
.reduce((a,c)=>a+c, 0) // 872187
)())(1000000)
これワンライナーで行けるのはNumber#toString(radix)のおかげだと思う。
ちなみに真面目に2進数化する処理を書いてみるとこんな感じに。
const bin = n =>{
let a = String(n).split("").map(Number), b = [];
while( a.some(e=>e>0) ){
for(let i = 0, s = a.length, c; i < s; i++){
c = a[i]%2, a[i] -= c, a[i] /= 2;
if(i+1 < s){ a[i+1]+=c*10; continue; }
b.push(c);
}
}
return b.reverse().join("");
};