パーソナルツール
現在の場所: ホーム takalog 「「1から9までの数字を一回ずつ使って2010にする」の検算」の検算
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
« 2012February »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
このBlogについて
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。 zope/plone関係の技術的な内容については http://takanory.net の方にまとめていこうと思います。 コメント・ツッコミはご自由にどうぞ。
twitter facebook linkedin foursquare
カテゴリ
android (16)
av (27)
books (35)
coreblog (49)
ds (22)
ferret (24)
google (34)
icecream (44)
lego (69)
mac (20)
misc (74)
moblog (277)
movie (32)
pc (44)
plone (337)
puzzle (42)
python (56)
server (67)
snowscoot (9)
software (126)
sports (32)
suidou (30)
winds (47)
 
文書操作

「「1から9までの数字を一回ずつ使って2010にする」の検算」の検算

1+2-(3-4-5)*6*7*8-9

作成者 takanori投稿日 2010年01月05日 12時52分 最終変更日時 2010年01月05日 12時58分
2010年の門松

みなさん、あけましておめでとうございます。

特に新年のネタとかは用意していないので、マンションの門松の写真でお茶を濁そうと思います。

常山日記の 2010-01-05 [Python]巡回 05:13 で紹介されていた 「1から9までの数字を一回ずつ使って2010にする」の検算 - m_yamamo0417の日記 がちょっと気になったので調べてみました。

このページでなにをやっているかというと、1から9の数字を順番に使って 2010 という数字を作る式が大量に http://www.thesamet.com/2010.txt あります。 で、この式が正しいかどうかを python を使って検算しているんですが、検算の結果 645/925 しか答えが 2010 にならないとのことです。

で、パッと見「そんなに間違えてるのかな~」と思って気になりました。

例えば11行目にある数式の答えは0であると書いてあります。 で、ためしにこの数式をコピーして数式を処理できるツール(コマンドラウンちゃーの Launchy です)に渡してみると、 2010 と表示されました。

(1*2/3)*((4+5)*6*7*8-9):0

で、ためしに今度は python の対話モードでこの数式を指定するとこうなります。

>>> (1*2/3)*((4+5)*6*7*8-9)
0

やっぱり 0 になります。で、実は以下の数式がポイントでした。

>>>  2/3
0

python では整数同士の割り算の結果は整数を返すことになっているそうです。(普段あんまり気にしてなかった...) そのため、2/3 が 0.666666 ではなくて 0 になって全体の結果も 0 になると。 おそらく他の答えが合わないものも同じ理由なんじゃないかなーということで、検算のソースコードを修正してみると、全部 2010 になりました。

また、知らなかったんですが python 3 では int 同士の割り算は float を返すようになったそうです。へー。

参考: 言語としての一貫性を重視したPython 3の進化 - @IT

というわけで、コードを以下のように変更すると、全部 2010 になりました。 変更のポイントは、割り算が発生する場合は 1.0 をかけて float にする(手抜き)のと、答えの比較のときに round() を使って誤差をまるめるということです。

***************
*** 13,20 ****
      total_count = 0
      for matched in REGEX.findall(body):
          cmd = matched
          result = eval(cmd)
!         if 2010 == result:
              equal_count += 1
          print cmd + ':' + str(result)
          total_count += 1
--- 13,21 ----
      total_count = 0
      for matched in REGEX.findall(body):
          cmd = matched
+         cmd = cmd.replace("/", "*1.0/")
          result = eval(cmd)
!         if 2010 == round(result):
              equal_count += 1
          print cmd + ':' + str(result)
          total_count += 1

実行結果はこんな感じです。

((1+.2)*1.0/.3)*((.4-.5)*1.0/.6+7*8)*9:2010.0
((1*1.0/.2)*3*1.0/.4)*(.5+6*(.7+8)+.9):2010.0
((1*1.0/(.2+.3))*1.0/.4)*(5*(.6+78)+9):2010.0
((1*1.0/.2)*1.0/.3)*((4+5)*(6-.7+8)+.9):2010.0
((1*1.0/(.2-.3))*1.0/(.4-.5))*(6+7+8-.9):2010.0
eq/total 925/925

すっきり

しかし、この元データどうやって作ったんだろう。そっちが気になる。

カテゴリ
python python
トラックバック用URL:
http://takanory.net/takalog/1192/tbping
コメントを追加

下のフォームに記入してコメントを追加できます。平文テキスト形式。

(必須)
(必須)
(必須)
(Required)
Enter the word

Powered by vine linux, python, zope, plone, coreblog