結城先生のサルベジオン問題
numdot問題をやったのはすでに1年以上前か。(西暦の引き算を間違えて(平成26の6から3引いて3年前と勘違い)3年前と書いていた。
http://d.hatena.ne.jp/noharra/20130925
あのときはもう、寝ても覚めてもくらいの勢いで、熱中できた!
今回はサルベジオン問題をやってみた。
https://codeiq.jp/ace/yuki_hiroshi/q1215
答え1)V406435859539156181269150751031
答え2)V1101943557675920722238136981003
使用した環境: Ruby,LibreOffice Calc
POINT: 1問目:最初と最後の幾つかを調べると
Kは単調増加で、前後差の平均は約8×10の25乗とわかる。
それを使って答えを求めた。下記プログラムは出来てから整理したもの。
2問目:最初の幾つかのKの値の比を取ると、
1,0.5,1.5,0.25,0.75,1.25,1.75,0.125,0.375、といった規則で並んでいることが分かる。
与えられたKは奇数なので最後のブロックに属する。
基準になる数字は
633825300114114700748351602688(2の99乗)だ。
与えられたK(2023636070998557444542586045)に1を足し2で割った値と、2の99乗の和マイナス1
がインデクス番号。
任意のKに対して、idを求めるプログラム書けた!
1)
require 'net/http' require 'uri' dot="" dt= Array.new num="" num0=208050656559285601386927895421059705239114932023754 suu=0 sa0=80166809078684100000000000 ll=100 while ll**2 >0 rrll='http://salvageon.textfile.org/?db=1&index='+suu.to_s uri = URI.parse(rrll) dot= Net::HTTP.get(uri) dt=dot.split dt[2].slice!(0,1) num=dt[2] chigai=-(num.to_i-num0) ll=chigai/sa0 suu=suu+ll p ll p suu sleep 1 end
2)
NN=99 K=2023636070998557444542586045 K2=K.to_s(2) i=0 while i<100 if K2.slice(-1)=="1" then break end K2.slice!(-1) i=i+1 end li=2**(NN-i) JJ =("0b" + K2).oct id=(JJ.to_i+1)/2 +li -1 p id
バッジ
結城 浩さん「サルベジオン社で宇宙船のデータを救え」問題の特典バッジ
と評価5、いただけましたあ〜!! 嬉しい
今回はかなり易しかったとのことだが、わたしには丁度よかった。
CodeIQサルベジオン問題、解答コードまとめ、の諸兄のコードを見て勉強しよう。
http://togetter.com/li/758302