|
萌え指向プログラミング言語「萌香」のBlog
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 萌香で京大の入試問題を力技の巻おまえにハートブレイク☆オーバードライブ - 小粋な数学入試問題 より ......って引用しようと思ったけど数式が画像とか引用がめんどくさいので元記事読んでください。 んでこれの設問の2。これが萌香があれば解けちゃうんです。ソースはこちら 「レンジ を 「(開始 終点)
「もし (開始 終点 >)
'()
「開始 「(開始 1.0 +) 終点 の レンジ」 の コンス」」
の 仕事」 と 定義」
「階乗 を 「(a b)
「もし (b 0.1 <=) ;; たぶん無いけど丸め誤差とかがあったときのため
1.0
「(a (b 1.0 -) の 階乗) a *」」
の 仕事」 と 定義」
「f を 「(n)
「n の 7 の 剰余」
の 仕事」 と 定義」
「g を 「(n)
(3 に
((+
0
(「(num) 「num の n の 階乗」 の 仕事」 に
「1 7 の レンジ」 を マップ)
の 右畳み込み) の f)
を かける) 仕事」 と 定義」
「「(n) 「n と 表示」
「":" と 表示」
「(n の g) と 表示」
「改行」 の 仕事」 に
「1 15 の レンジ」 を マップ」
これを実行すると6と12のところで18点ゲット。 fの性質よりmaxの点が18なので答案用紙に6と書けば、この問題はパーヘクツですよあなた !! なんで中途半端な15までなのかって ?.......... 萌香は数値をすべてRubyのFloatで保持しているため Cのdouble型の精度となります。そうすると仮数部が53 bitなため2^53を超えるところ 10^16のところで正確な計算ができなくなってしまい、 20のところで7^20が出て、これが10^16を超えるので正確な計算ができなくなりおかしな数字が出てしまう結果となります。これは ここ(遥か彼方の彼方から - 小粋な数学入試問題をcodepadで組んでみた) のプログラムもおんなじ原因じゃないかと思ってたらすでに指摘があった..... ちなみにRuby版が #!/usr/local/bin/ruby
def pow(x, y)
result = 1
(1..y).each do |dummy|
result = result * x
end
return result
end
def f(n)
return n % 7
end
def g(n)
return 3 * (f((1..7).map{|num| pow(num, n)}.inject(0){|sum, num| sum + num}))
end
(1..100).each do |num|
puts "#{num}:#{g(num)}"
end
Scheme(Gauche)版が
#!/usr/local/bin/gosh
(use srfi-1)
(define pow
(lambda (x y)
(if (= 1 y)
x
(* x (pow x (- y 1))))))
(define f
(lambda (n)
(modulo n 7)))
(define g
(lambda (n)
(* 3
(f (fold + 0 (map (lambda (num) (pow num n))
(iota 7 1)))))))
(map (lambda (num)
(format #t "~a: ~a\n" num (g num)))
(iota 100 1))
となります。
どちらも100程度まではなんの問題もなく動きます。 Bignumなんかいらね、とか思ってたのですが、この程度でも必要になってくるのですね。 PR
|
カレンダー
カテゴリー
フリーエリア
最新CM
[11/30 Lehar9296
]
[11/19 Bihler7840
]
[04/09 pavelvolinkins]
最新記事
(05/04)
(03/13)
(02/18)
(10/30)
(04/17)
最新TB
プロフィール
HN:
No Name Ninja
性別:
非公開
ブログ内検索
最古記事
(12/25)
(01/10)
(01/17)
(02/14)
(04/17)
アクセス解析
|