プログラムを始めて3年、ついに「4つの数字で10を作るプログラム」が完成した
■ このスレッドは過去ログ倉庫に格納されています
小町算プログラム昔作った
()ありは結構難しい
4桁なら何とかなるけど桁数増やすとアルゴリズムの知識が必要になる 逆ポーランド記法で組み合わせ考えていけば、括弧開く閉じるの考慮しなくて済んで楽だぞ >>95
あったなそんなの
こういう時のために使うのか >>89
辞書型でもキーと値と二分探索木に必要なポインタでメモリ食うし、なら4次元配列の方がシンプルだし速いしいいかなと思ったんだけど >>74
できる
>>76
(7/7)+3*3
>>96
2*(3-5+7) >>95
ググったら
なtるほどとおもった
これなら
最大 (前に出た数字の数−1)だけ演算子を付けることができるのかな
3 4 + 5 × − 6 ÷ − +
みたいな >>97
本来は前から順に数式の文字をスキャンして計算できるように並べるやり方だけどね
今回のケースだと、数値4、演算子3の組み合わせの7文字で表記できて
先頭2文字は必ず数字
残りの5文字を数値2演算子3で埋めていけば網羅できそう >>102
括弧の組み合わせがおかしかった
>>103
それはなってる
今は入力で4つの数字と10をわざわざ指定してる a,b,c,d→ab,c,d→abc,d→abcd
a,b,c,d→ab,c,d→ab,cd→abcd
みたいな計算の順序が3!=6通り
各ステップに入れる演算子が4^3=64通り
だから全探索したら384通りだな
メモ化はズルだからなしとして 前に現れた数の個数−1だけ 演算ができて(しなくてもいい) トータルの演算回数は3回
といったかんじかな 賛否両論になった
これだと 括弧付きの 掛け算の 問題も 揉めることはなかった
これ
https://togetter.com/li/793433 >>112
括弧を使うと
a⬜︎b⬜︎c⬜︎d
(a⬜︎b)⬜︎c⬜︎d
(a⬜︎b⬜︎c)⬜︎d
(a⬜︎b)⬜︎(c⬜︎d)
a⬜︎(b⬜︎c)⬜︎d
a⬜︎(b⬜︎c⬜︎d)
a⬜︎b⬜︎(c⬜︎d)
の7パターン考えられるが、いらないのはどれだろう? >>114
訂正
これだと
賛否両論になった
括弧付きの 掛け算の 問題も 揉めることはなかった >>115
a□b□cみたいに3つ以上繋がってるのは演算子によって順序が違うから数え方として良くない
例えば(a⬜︎b⬜︎c)⬜︎dは(a⬜︎b)⬜︎c)⬜︎dとa⬜︎(b⬜︎c)⬜︎dと被ってる
a⬜︎b⬜︎c⬜︎dやa⬜︎(b⬜︎c⬜︎d)も同様 6 2 ÷ 1 2 + × →9
なのか
6 2 1 2 + × ÷ →1
なのか
興味深い >>115
括弧だと
123 : ((a⬜︎b)⬜︎c)⬜︎d
132, 312 : ((a⬜︎b)⬜︎(c⬜︎d)) 2個重複
213 : (a⬜︎(b⬜︎c))⬜︎d
231 : a⬜︎((b⬜︎c)⬜︎d)
321 : a⬜︎(b⬜︎(c⬜︎d))
132と312は重複してるから320通りでよかったわ >>118
20+1+(5-3-2)×(4+6+7+8+…+19) 多分「4つの数字」の部分を一般化すると一気に難易度が上がる
上手くやれば擬多項式時間でいけるかもしれないけど で、逆ポーランドで考えるとこの4パターンで網羅かな?
a b □ c □ d □
a b c □ □ d □
a b c □ d □ □
a b c d □ □ □ >>117
括弧7パターンに対して、逆ポーランド記法6パターンになるのはなぜか?という話
演算子がどのような組み合わせでも括弧を使うと必ず7パターンのうち一つだけどれか重複するってことか? で、>>123この4パターンで□は四則演算のどれかが任意で入るから、4パターン×4×4×4の256パターン総当たりで計算させれば良いだけだね
多分 >>124
演算の順序と括弧のパターンは一対一対応してない
a+(b+c)*d と a*(b+c)+d は括弧が同じで順序が違う
a+b+c+d と (a+b+c)+d は括弧が違って順序が同じ >>121
お見事。綺麗だね
ちなみに別解...
19-20/((1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16)/17-18) >>126 括弧無しなら楽勝すぎる
chatGPTに聞けば一瞬でコード書いてくれるよ GPT4の回答
0から9までの任意の4つの整数を使用して計算結果を10にするためのPythonコードを作成する場合、与えられた整数と任意の演算子や構文を用いて解を見つけるアルゴリズムが必要になります。このような問題に対処する一つの方法は、与えられた整数と可能な演算子の組み合わせをすべて試し、結果が10になる式を探すことです。
以下は、0から9までの任意の4つの整数と、加算(+)、減算(-)、乗算(*)、除算(/)、および括弧を含む可能なすべての演算子の組み合わせを使用して、結果が10になる式を探すPythonスクリプトの例です。このスクリプトは、総当たり法を使用して、可能なすべての式の組み合わせを生成し、評価します。
```python
import itertools
import operator
# 0から9までの4つの整数をユーザーから入力として受け取る
nums = [int(input(f"{i+1}つ目の整数を入力してください (0-9): ")) for i in range(4)]
# 使用可能な演算子
ops = [operator.add, operator.sub, operator.mul, operator.truediv]
ops_symbols = ['+', '-', '*', '/']
# 演算子のすべての組み合わせを生成
ops_combinations = list(itertools.product(ops, repeat=3))
# 数字の順列を生成
nums_permutations = list(itertools.permutations(nums))
# 結果が10になる式を見つける
for nums_perm in nums_permutations:
for ops_comb in ops_combinations:
# 式を構築
expression = f"(({nums_perm[0]} {ops_symbols[ops.index(ops_comb[0])]} {nums_perm[1]}) {ops_symbols[ops.index(ops_comb[1])]} {nums_perm[2]}) {ops_symbols[ops.index(ops_comb[2])]} {nums_perm[3]}"
# 式を評価
try:
if eval(expression) == 10:
print(f"見つかった式: {expression} = 10")
break
except ZeroDivisionError:
continue
```
このスクリプトは、ユーザーが入力した4つの整数に対して、可能なすべての演算子の組み合わせと数字の順列を試します。結果が10になる式を見つけた場合、その式を出力します。ただし、この方法は計算量が非常に多くなる可能性があるため、実行に時間がかかる場合があります。また、除算を行う際に0での除算が発生しないように注意する必要があります。
このコードは総当たり法を用いており、効率的なアルゴリズムではありません。より複雑な問題や大量のデータに対しては、より高度なアルゴリズムや最適化手法を検討する必要があります。 >>123
逆ポーランド記法を今知ったけど多分(a+b)*(c+d)が抜けてる
a b □c d □ □ かな >>129
演算の順序から括弧は生成できるよ
括弧の付け方の総数は多分カタラン数とかになるんじゃないかな >>130
これは間違ってる
これだと(a+d)*b+cとかも見つけてくるはず 学生の頃は楽しかったなって思い出せたよ
ありがとな なるほど
逆ポーランド記法にしても
AIにしても
カッコにこだわらず 順番にやっていく
という考えでいいのか ただまあ、シンプルにスパッとワンライナーで書きたいかんじよね
書けるもんなら 結局、演算子は3つだからその順番を考えれば良いのか
3つの順列は6パターンだけど132の順で計算するパターンと312の順で計算する場合は同じことだから5パターンか というか0作って消せるように計算できる時点でテストケースとしてあまり良くなかったは ■ このスレッドは過去ログ倉庫に格納されています