goo blog サービス終了のお知らせ 

パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

25 ビットと型変換にはまる

2018-05-26 | プログラムをマスター計画2020
ビットと型変換はよく悩ませてくれます。今回も謎の問題をいろいろな言語で解いてみます。

問題



翻訳



5から始めた場合、バイナリ表現101に変換
それを英語 "one zero one"として綴り、
その文字数10が次の数になります。


最大の問題点、計算量に特大あり!

制約
1≦n≦10 ^ 18
1≦開始≦10 ^ 18


実際こんな数値があります。
start n
99999999999999999 99999999999999999

途方もない数値がなければ解答は数行


慣れている言語にしておこうとPython3。
実際は99999999999999999回計算はない、
循環するはず。それを探します。


解いてみると言語の基礎てんこもり。
(変数、配列、繰り返し、条件分岐、関数、数値変換など)
いろいろな言語で解く謎チャレンジをしなければ。



ところが...フランスのZexionさんの解答例がすばらしすぎて方針転換です。

Zexionさんの解答


ちなみに
start n
99999999999999999 99999999999999999

プログラムで求める結果は18です。

18はバイナリで表すと10010
10010は one zero zero one zeroと18文字

18の次世代は18となり循環判定は不要。

かなり楽になったつもりだったのですが罠が待ち受けていました。
PHP 2:12


Perl 2:32
文字列の中の特定文字のカウントが大変。
正規表現というもの使ってます。
ネットの情報も間違え率が高かったです。


Java 2:43


JavaScript 3:10



VBの前にKotlin、Dart、Scalaに挑みましたが数値からバイナリ変換の情報がみつからず一旦断念。


VB.NET 4:20



一晩寝て自前で計算する関数を作成。


Kotlin 12:01


Dart 12:34


Scala 13:10

Scalaのfor文でlong型のデータが使えません。そこで別のアプローチをしています。
breakを使い方も独特。



中国のthirstycrowさんの解答

こうやってJavaを呼び出すんですね。


ロシアのSmoothさんの解答

scalaでのよりよい解答なんだと思います。
13と18が収束する値のようです。



しかし6行ってすごいな。



最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。