Aritmatika ... tok ... tik ... tok

15

Pertanyaan ini diajukan kepada Anda oleh permainan yang ingin saya mainkan ketika terjebak dalam rapat telepon yang panjang.

Diberikan dua kali dari jam 24 jam (dari 00:00 hingga 23:59), berapa banyak persamaan matematika yang valid dapat dihasilkan dengan semua waktu di antara hanya menggunakan operasi aritmatika dasar?

Input: dua string empat digit (tanpa titik dua) mewakili waktu yang valid dalam siklus 24 jam.

Contoh:

Untuk 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.

Operasi yang valid adalah:

  • tambahan
  • pengurangan
  • perkalian
  • pembagian (floating point)
  • eksponensial
  • faktorial

Simbol yang diijinkan lainnya

  • Tanda kurung
  • Tanda-tanda yang sama

Kode terpendek menang.

Catatan

  • Tujuannya adalah untuk menemukan jumlah ekspresi yang valid antara dua kali, bukan jumlah kali yang berisi ekspresi yang valid.
  • Dua kali yang diberikan sebagai input termasuk dalam rentang waktu.
  • Anda dapat mengelompokkan digit dengan cara apa pun yang memungkinkan, jadi "1223" dapat menjadi "12 23" atau "1 2 23" atau "1 223" dll. Dll.
  • Anda dapat menggunakan sebanyak mungkin tanda kurung.
  • Anda dapat menggunakan lebih dari satu =tanda. Misalnya, waktu 11:11memiliki ekspresi yang valid 1=1=1=1.
  • Jika pertama kali terjadi secara kronologis setelah kedua kalinya, rentang waktu akan membungkus seolah-olah menyeberang ke hari berikutnya.
  • Angka-angka harus tetap dalam urutan aslinya - Anda tidak dapat memesan ulang digit.
  • Saat mengelompokkan angka, angka nol mungkin benar-benar digit paling depan, dalam hal ini, angka tersebut diabaikan ("0303" dikelompokkan sebagai "03 03" hanya dua digit dengan nilai 3.)
  • Anda TIDAK BISA menggunakan tanda minus sebagai negasi unary. Karena itu, "12:01" TIDAK menghasilkan "1-2 = - (01)", tetapi TIDAK menghasilkan "1-2 = 0-1".
  • Anda TIDAK BISA menambahkan titik desimal ke angka. Karena itu, "12:05" TIDAK menghasilkan "1/2 = 0,5".
  • Tidak ada rantai faktorial - satu digit dapat diikuti oleh paling banyak satu "!", Tidak lebih, jika tidak, berkali-kali akan memiliki solusi tak terbatas. Mis: "5!" valid tetapi "5 !!" tidak valid.
nobillygreen
sumber
4
" Operasi yang valid termasuk " tampaknya mencegah Anda untuk dapat menambahkan kasus uji. Ini akan menjadi pertanyaan yang lebih baik jika Anda mengubahnya menjadi " Operasi yang valid adalah " dan menambahkan beberapa kasus uji. Ini juga akan berguna untuk menjadi akurat tentang titik akhir: untuk input 0000 1300haruskah persamaan berasal 0000dan 1300dimasukkan dalam hitungan?
Peter Taylor
1
Digit yang diberikan "1423", lakukan "1 + 4 = 2 + 3", "(1 + 4) = (2 + 3)", "(1 + 4) = 2 + 3" dan "1 + 4 = (2 +3) "dihitung sebagai satu atau empat persamaan? Dan ... apa semua persamaan "0000"? Saya memikirkan sekitar 100 kemungkinan, atau bahkan lebih ... Mungkinkah ini?
bobbel
2
Apakah ada batasan penggunaan operator unary? Tanpa adanya pembatasan dalam aturan, faktorial dapat diterapkan berulang kali dan dengan demikian solusi sempurna mungkin terbukti tidak mungkin.
Michael Stern
1
Michael, itu pengamatan yang bagus. Jadi demi teka-teki itu, saya pikir saya akan membatasi hanya satu faktorial per "digit", jika itu masuk akal. Untuk itu, 5! valid tetapi 5 !! tidak valid.
nobillygreen

Jawaban:

1

Python3, 363 karakter

Karena tidak ada jawaban yang diberikan sampai hari ini, saya menyerahkan apa yang saya dapatkan. Sayangnya, coba / kecuali blok terlalu gemuk, saya tidak menemukan cara untuk menyelamatkan karakter di sana. Ini benar-benar rumit dengan loop bersarang di sana, tidak semua dapat dilakukan dengan pemahaman daftar saya pikir, tapi mungkin seseorang dapat memberitahu saya caranya.

Namun, saya membatasi tantangan saya sendiri hanya menggunakan matematika dasar '+ - * /' dan tidak ada tanda kurung.

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)

Kode lengkap saya (harap sesuatu yang jelas) pada CodeGolf ini dapat ditemukan di pastebin saya .

Oliver Friedrich
sumber