算術…トック…ティック…トック


15

この質問は、長い電話会議で立ち往生しているときにプレイしたいゲームによってもたらされました。

24時間制(00:00から23:59)の任意の2つの時刻が与えられた場合、基本的な算術演算のみを使用して、その間のすべての時間で有効な数学方程式をいくつ生成できますか?

入力: 24時間サイクルの有効な時間を表す2つの4桁の文字列(コロンなし)。

例:

input = 0000、1300の場合

03:26 produces: "0+3*2=6" and "03*2=6" etc.
11:10 produces quite a few, including: "1*1=1+0" and "1=1=1^0" and  "1=11^0" etc.
12:24 produces: "1/2=2/4" and "1=(2*2)/4" etc.

有効な操作は次のとおりです。

  • 添加
  • 引き算
  • 乗算
  • 除算(浮動小数点)
  • べき乗
  • 階乗

その他の許可される記号

  • 括弧
  • 等号

最短のコードが優先されます。

ノート

  • 目標は、有効な式を含む回数ではなく、2回の間の有効な式のを見つけることです。
  • 入力として指定された2つの時間は、時間の範囲に含まれます。
  • 可能な任意の方法で数字をグループ化できます。そのため、「1223」は「12 23」、「1 2 23」、「1 223」などになります。
  • 必要な数の括弧を使用できます。
  • 複数の=記号を使用できます。たとえば、時間11:11には有効な式があります1=1=1=1
  • 1回目が2回目以降に発生する場合、時間の範囲は翌日に渡るようにラップする必要があります。
  • 番号は元の順序のままにする必要があります。数字を並べ替えることはできません。
  • 数字をクラスタリングする場合、ゼロは絶対に最前面の数字である場合があります。その場合、それらは無視されます(「03 03」としてクラスター化された「0303」は、値が3の2桁のみです)。
  • マイナス記号を単項否定として使用することはできません。したがって、「12:01」は「1-2 =-(01)」を生成しませんが、DOESは「1-2 = 0-1」を生成します。
  • 数字に小数点を追加することはできません。したがって、「12:05」は「1/2 = 0.5」を生成しません。
  • 階乗の連鎖はありません-数字の後に最大で1つの「!」が続く場合があります。例:「5!」有効ですが、「5 !!」有効ではない。


4
有効な操作」には、テストケースを追加できないように思われます。それを「有効な操作は」に変更し、いくつかのテストケースを追加した場合、より良い質問になるでしょう。また、エンドポイントについて、正確には有用であろう:入力のため0000 1300の方程式が由来すべきである00001300カウントに含まれますか?
ピーターテイラー

1
数字「1423」が与えられた場合、「1 + 4 = 2 + 3」、「(1 + 4)=(2 + 3)」、「(1 + 4)= 2 + 3」および「1 + 4 =(2 +3)」は1つまたは4つの方程式としてカウントされますか?そして... 「0000」のすべての方程式は何ですか?私は約100の可能性、またはそれ以上を考えています...これは可能でしょうか?
ボベル

2
単項演算子の使用に制限はありますか?ルールにこのような制限がない場合、階乗は繰り返し適用できるため、完全な解決策は不可能である可能性があります。
マイケルスターン

1
マイケル、それは素晴らしい観察です。それで、パズルのために、もしそれが理にかなっているなら、私はそれを「数字」ごとに1つの階乗に制限すると思います。そのため、5!有効ですが、5 !! 有効ではない。
nobillygreen

回答:


1

Python3、363文字

今日まで答えが出ないので、手に入れたものを提出します。悲しいことに、try / exceptブロックは太すぎて、そこに文字を保存する方法を見つけられませんでした。そこにネストされたループでは本当にトリッキーです。リストの内包表記ですべてを実行できるとは限りませんが、誰かが教えてくれるかもしれません。

ただし、基本的な数学「+-* /」のみを使用し、括弧は使用しないようにチャレンジを制限しました。

a,b = input().split()
r=0
for time in [c for c in range(int(a),int(b)) if c/10%10<6]:
 t,*ts='%04d'%time
 e=[t]
 for d in ts:
  e=[(n+o+d,n+d)[o==' '] for o in ' -+*/=' for n in e]
 for h in [g for g in [e.split('=') for e in e if '='in e] if len(g)>1]:
  for k in h:
   try:
    if eval(h[0]) != eval(k):
     break
   except:
    break
  else:
   r+=1
print(r)

このCodeGolf上の私の完全なコード(希望何かの説明は)私の上で見つけることができるペーストビン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.