challenge 与えた条件を満たす候補

['and', 'or', 'not', 'and']
のような入力が与えられた場合に、
式 x1 and x2 or not x3 and x4 の値が
Trueとなるような、x1~x4の組み合わせを全て
出力するプログラムを作成してください。
x1~x4には真と偽の2通りの値だけが入るものとします。

Pythonであれば上の入力に対し、
(True, True, True, True)
(True, True, False, True)
(True, False, False, True)
(False, True, False, True)
(False, False, False, True)
と出力します。

andとorの優先順位は同じで左結合性、
つまりa and b or c and dは
(((a and b) or c) and d)
という順番で評価されるものとします。

参考:
d.y.d.

キミならどう書く2.0の小町算問題と似てますが。
このお題はmorchinさんの投稿をもとに作成しました。 ご投稿ありがとうございました。
元ネタの 充足可能性問題 - Wikipedia は、 同じリテラル(x1とかnot x2とか)が複数回出てくることを想定しているので、 今回の問題のようにそれぞれ別の変数でだと乗法標準形 - Wikipediaにした場合に、答えが…と色々悩みどころでした。

Posted feedbacks - Smalltalk

Squeak Smalltalk で。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
| input selStream |
input := #(and or not and).
input replaceAll: #and with: #&.
input replaceAll: #or with: #|.
selStream := input readStream.
World findATranscript: nil.
{true. false} asDigitsToPower: 4 do: [:xs |
    selStream reset.
    (xs allButFirst inject: xs first into: [:result :each |
        | selector |
        selector := selStream next.
        selStream peek = #not ifTrue: [each := each perform: selStream next].
        result perform: selector with: each]) ifTrue: [Transcript cr; show: xs]]

"=> #(true true true true)
   #(true true false true)
   #(true false false true)
   #(false true false true)
   #(false false false true) "

#(not not not) などに対応できる版を Squeak Smalltalk で。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
| input numArgs |
input := #(& | not &).
numArgs := (input collect: [:sel | sel numArgs]) sum + 1.
World findATranscript: nil.
{true. false} asDigitsToPower: numArgs do: [:xs |
     | xsStream expression |
     xsStream := xs readStream.
     expression := input inject: xsStream next printString into: [:expStr :sel |
          expStr, ' ', sel, (sel == #not ifFalse: [xsStream next printString] ifTrue: [''])].
     (Compiler evaluate: expression) ifTrue: [Transcript cr; show: xs]]

Index

Feed

Other

Link

Pathtraq

loading...