Bukan hanya puzzle empat merangkak

11

Dalam varian Four Four puzzle ini, Anda harus menggunakan hingga x x's(dan tidak ada nomor lain) dan serangkaian operasi untuk mencapai setiap angka dari 0 hingga 100. Jika x = 4demikian, Anda dapat menggunakan hingga empat 4sdan pertanyaan ini menjadi empat merangkak klasik puzzle (kecuali Anda dapat menggunakan hingga empat 4s daripada harus menggunakan persis empat dari mereka). Kami berasumsi 1 < x <= 9.

Dalam versi ini, hanya operator berikut yang diizinkan:

  • Penambahan ( +), Pengurangan ( -), Perkalian ( *), Divisi ( /). Perhatikan ini adalah pembagian nyata, jadi itu 5/2 = 2.5.
  • Eksponensial (mis. 4 ^ 4) karena ini tidak melibatkan simbol tambahan jika ditulis secara normal dengan tangan.
  • Anda dapat membuat bilangan bulat baru dengan menyatukan xs. Misalnya Anda dapat membuat bilangan bulat 4, 44, 444, 4444.

Anda juga dapat menggunakan tanda kurung untuk mengelompokkan angka hanya untuk mengontrol urutan evaluasi operator. Misalnya Anda tidak dapat menggabungkan tanda kurung dengan rangkaian seperti pada (4/4)(4/4) = (1)(1) = 11.

Tidak ada simbol lain yang dapat digunakan dan urutan operasi standar berlaku.

Program Anda harus menghasilkan, diberikan xdalam kisaran yang ditentukan dan di nantara 0dan 100inklusif, solusi yang benar untuk input itu jika ada. Kalau tidak, kode Anda harus menampilkan sesuatu untuk menunjukkan tidak ada solusi seperti itu.

Anda harus dapat menjalankan kiriman Anda sampai selesai pada mesin Anda untuk setiap nilai input xdan ndalam rentang yang diizinkan. Ini kode golf, sehingga solusi terpendek menang.

Pertanyaan terkait yang lama ini menggunakan lebih banyak operator (dan hanya 4) dan karenanya semua angka dari 0 hingga 100 dapat dipecahkan yang tidak akan berlaku untuk tantangan ini.

Masukan dan keluaran

Kode Anda mengambil dua bilangan bulat xdan nsebagai input dan harus menampilkan solusi (atau indikasi tidak ada solusi) dalam format yang dapat dibaca manusia yang Anda rasa nyaman. Input 4 6berarti "Menggunakan hingga empat 4s, buat angka 6" misalnya. Jadi jika inputnya adalah 4 6output bisa (4+4)/4+4.

Anush
sumber
1
Referensi Bermanfaat
Engineer Toast
2
Bisakah orangtua digabungkan dengan penggabungan? misal `(4/4) (4/4) = (1) (1) = 11?
Trauma Digital
1
Menambahkan tanda kurung (dan melarang tanda kurung + rangkaian) membuat ini secara signifikan lebih sulit
Draconis
2
Menambahkan operator eksponensial dan loop luar pada berapa kali digit digunakan jangan IMO menambahkan sesuatu yang non-sepele atas codegolf.stackexchange.com/q/82884/194
Peter Taylor
2
@PeterTaylor Tanda kurung tampaknya membuat banyak perbedaan. Saya akan memilih untuk membuka kembali jika saya bisa.
felipa

Jawaban:

4

Python 3 , 265 byte

def f(x,n):
 for e in g(x,x-(x>7)):
  try:
   if eval(e)==n:return e
  except:1
g=lambda x,d:{str(x)*-~i for i in range(d)}|{s%(a,b)for a in g(x,d-1)for b in g(x,d-a.count(str(x)))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}if d else{}

Cobalah online!

Berfungsi untuk semua angka dalam referensi yang ditautkan oleh Engineer Toast.

Berjalan hingga x=8tio, x=9membutuhkan beberapa menit di mesin saya.


Fungsi gmengembalikan satu set semua kombinasi dengan xjumlah paling banyak x. fkemudian lewati mereka dan kembalikan yang pertama mengevaluasi ke nomor tersebut n.

Jumlah nilai yang mungkin saya temukan untuk masing x- masing adalah:

x  possible numbers
------
2  5
3  17
4  35
5  56
6  83
7  101
8  101
9  101

Semua angka-angka di atas dapat dihasilkan dari (a+b), (a-b), (a+b), a*b, a/b, (a/b), dan a^b. a+bdan a-bjangan memberi angka lebih banyak.

a^b juga hanya digunakan sekali, karena jika tidak, angka yang sangat besar akan dibuat (ini juga diverifikasi dalam dokumen referensi di atas)


Versi alternatif yang mengalami hubungan arus pendek segera setelah menemukan solusi (tidak seperti golf):

Ini jauh lebih cepat karena x=7..9semua nomor dapat dibuat.

Python 3 , 338 289 byte

def f(x,n,d=-1):
 d=[d,x][d<0];X=str(x);r=set()
 for E in{X*-~i for i in range(d)}|{s%(a,b)for a in[0]*d and f(x,n,d-1)for b in f(x,n,d-a.count(X))for s in'%s**%s (%s/%s) (%s+%s) (%s-%s) %s*%s %s/%s'.split()['**'in a+b:]}:
  try:e=eval(E)
  except:e=-1
  if e==n:exit(E)
  r|={E}
 return r

Cobalah online!

TFeld
sumber
Ini jawaban yang sangat bagus! Saya pikir Anda selalu menggunakan tepat (sebagai lawan hingga) x xs (misalnya (4/4**(4-4))untuk 4) tetapi ternyata bukan itu masalahnya.
Anush
exit(e)lebih pendek darireturn e
mbomb007