裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

数理パズルなど

2014年11月27日 | ブログラミング

「難しいパズルを解きたい」と思うのは,「パズルを解くのが面白いから」というのが動機だろう

パズルを解く参加者に制限を加えたり,正解が開示されなかったり,期限(?)が過ぎたら問題自体が参照できなくなったり,最初提示された締め切り日がズルズルズルズルと引き延ばされたり,挙げ句の果てに急に終わってしまう,というような,パズルを解くということと無関係(正反対)な制約があるのでは,なんだかなあと思う。

それらの制約が,「優秀なコンピュータサイエンティストの発掘」,「求職者来たれ!」ということなんだろうけど,その問題自体がその目的を満たすにはほど遠い,低レベル(?)なものでであるとしたら,なにをかいわんや(アハ!)。そんなレベルの求職者にどの程度の待遇を用意するのか??

今後も,どしどし,解答するぞ!

それが,低レベルなものなら,反面教師になるだろう。

同じ解答を得られる,もっと高精度・高速なプログラムを得た人は,本来の窓口から投稿すべし。

主催者は,ちょっと運営方針を見直した方がよいんじゃないか??

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

サルベジオン社で宇宙船のデータを救え

2014年11月27日 | ブログラミング

「サルベジオン社で宇宙船のデータを救え」とのことで...

問題 1. キーは昇順になっているので,二分法で探索する。
    求める値は "V406435859539156181269150751031"

library(gmp)
url = "http://salvageon.textfile.org/?db=1&index=%s"
key = as.bigz("208050656559285601386927895421059705239114932023754")
begin = as.bigz("0")
end   = as.bigz("1267650600228229401496703205375")
for (i in 0:110) {
    cat(i, as.character(end-begin), "\n")
    med = (begin+end) %/% 2
    m = scan(sprintf(url, med), ""); Sys.sleep(1)
    k = as.bigz(substr(m[3], 2, nchar(m[3])))
    if (k > key) {
        end = med
    } else if (key > k) {
        begin = med
    } else {
        print(m)
        break
    }
}

問題 2. 奇数のキーは後ろ半分にまとまって,順序正しく並んでいる。
    求める値は "V1101943557675920722238136981003"

これは,プログラムを組まずに求めた。

まず,レコードの個数が 2^100 なのに気づけば,ちょうど真ん中が何になっているか,気になる。真ん中の次,その次と見てみれば,ははあ~んと気づいた。

2023636070998557444542586045 は 初項 = 1,項差 = 2 の数列の何番目か?
> (as.bigz("2023636070998557444542586045")+1)/2
[1] 1011818035499278722271293023

対応するコードは
> as.bigz("633825300114114700748351602688")+(as.bigz("2023636070998557444542586045")+1)%/%2 - 1
Big Integer ('bigz') :
[1] 634837118149613979470622895710

コードは 634837118149613979470622895710
scan("http://salvageon.textfile.org/?db=2&index=634837118149613979470622895710", "")

問題 2 で,キーが偶数だったら,ちょっと面倒だったはず。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村