小町算
Posted feedbacks - Smalltalk
Squeak Smalltalk で。
eval(Compiler class>>#evaluate:)を使いたかったのですが、Smalltalk には四則演算で乗除の優先がないので断念(^_^;)。Squeak OMeta でパーサー&インタープリタを書いて、それに eval 相当の仕事を肩代わりさせています。
eval(Compiler class>>#evaluate:)を使いたかったのですが、Smalltalk には四則演算で乗除の優先がないので断念(^_^;)。Squeak OMeta でパーサー&インタープリタを書いて、それに eval 相当の仕事を肩代わりさせています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | !OMeta methodsFor: 'calc'!
num ::= <digit>+:xs => [Integer readFrom: xs readStream]! !
!OMeta methodsFor: 'calc'!
mul ::= <mul>:x ( $* <num>:y => [x * y] | $/ <num>:y => [x / y] ) | <num>! !
!OMeta methodsFor: 'calc'!
add ::= <add>:x ( $+ <mul>:y => [x + y] | $- <mul>:y => [x - y] ) | <mul>! !
!OMeta methodsFor: 'calc'!
exp ::= <add>! !
World findATranscript: nil.
#('' '+' '-' '*' '/') asDigitsToPower: 8 do: [:comb |
| expStr result |
expStr := '1{1}2{2}3{3}4{4}5{5}6{6}7{7}8{8}9' format: comb.
result := (OMeta onTree: nil) apply: #exp withArguments: expStr.
result = 100 ifTrue: [Transcript cr; show: expStr]]
|


dpp
#4509()
Rating0/2=0.00
古典的なパズルである小町算を解くプログラムを作成してください。
小町算とは:
1□2□3□4□5□6□7□8□9=100
四角の中に、空白、+、-、×、÷のいずれかを一つ入れ、等式が成り立つようにするパズルです。
解答例:
1-2-3+4×56÷7+8×9=100
1+234×5÷6-7-89=100
参考: http://ja.wikipedia.org/wiki/%E5%B0%8F%E7%94%BA%E7%AE%97
手元で20数行ほどのPythonスクリプトを書いてみたところ、101個の解答が得られました。
[ reply ]