Empat merangkak puzzle

21

The Four merangkak puzzle adalah teka-teki matematika rekreasi populer yang melibatkan menggunakan tepat empat 4s (dan tidak ada nomor lain) dan satu set didefinisikan operasi untuk mencapai setiap nomor dari 0 sampai maksimum yang diberikan.

Dalam versi ini, satu-satunya operator berikut diizinkan:

  • Simbol pengelompokan apa pun dapat digunakan
  • Tambahan ( +), Pengurangan ( -), Perkalian ( *), Divisi ( /)
  • Factorial ( !), Fungsi Gamma ( Γ)
  • Eksponensial ( ^), akar kuadrat ( )
  • Concatenation (mis. 44Adalah dua 4s)
  • Titik desimal (mis. 4.4Adalah dua 4s), Overbar (mis. .4~ = 4/9)

Pesanan operasi standar berlaku.

Program Anda harus menghasilkan, diberi input antara 0 dan 100 inklusif, solusi yang tepat untuk input itu. Jika program mengeluarkan solusi yang tidak valid untuk input apa pun, program itu tidak valid.

Misalnya, dengan input 0, program Anda mungkin menghasilkan 44-44.

Penggunaan modul eksternal tidak diperbolehkan. Hanya _.4~diizinkan untuk operator overbar - yaitu, hanya satu yang 4bisa berada di belakang titik desimal.

Ini adalah kode golf, sehingga solusi terpendek menang.


Sunting : Agar lebih jelas, program harus mengeluarkan satu set operasi di atas yang diterapkan tepat empat 4s - tidak lebih, tidak kurang. Juga, .4 = 4/10adalah istilah yang valid, dan dianggap hanya menggunakan satu 4.

Keriangan
sumber
tidak ada operasi pembulatan? :-(
John Dvorak
@ JanDvorak err, tidak, itu tidak akan diizinkan.
Volatilitas
gamma dan faktorial keduanya diizinkan?
John Dvorak
@JanDvorak semua yang terdaftar (tetapi hanya hal-hal yang terdaftar) yang dapat digunakan.
Volatilitas
Apakah kita diizinkan untuk menampilkan faktorial sebagai fungsi awalan ( !(4)bukan (4)!)?
John Dvorak

Jawaban:

6

GolfScript (129 karakter *)

[4.`2'√4'24'4!'6'Γ4'1'Γ√4'120'ΓΓ4']2/:F{.F=[[44.`]]*\{`{+{'+*-'1/{:^;.[~@[\]{'()'1/*}%^*@@^~\]\}/}:|~2/~\+|;}+F/}%+}3*\{\0==}+?1=

Waktu berjalan adalah dalam urutan 4 menit pada PC saya. Percepatan moderat dapat diperoleh dengan mengorbankan dua karakter dengan menambahkan operasi keunikan .&segera setelah %+.

Saya menggunakan ekspresi pra-kode untuk 1, 2, 4, 6, 24, 120, dan 44, dan membangun beristirahat dari orang-orang hanya menggunakan +, *dan -. Dengan cara ini saya tidak perlu melakukan aritmatika non-integer dalam program itu sendiri. Saya sudah mencoba untuk mendapatkan ekspresi yang lebih sederhana dengan menempatkan nilai pra-kode yang lebih sederhana di awal.

Semua dari nilai-nilai yang diperlukan , dan itu perlu untuk mendukung kedua arah dari pengurangan ( complex_expression - simple_expressiondan sebaliknya). Anda juga perlu memasukkan beberapa operasi yang memerlukan tanda kurung (khusus, a*(b-c)), jadi saya mengelompokkan semua subekspresi tanpa pandang bulu.

* Saya menghitung poin kode Unicode dengan asumsi program dikodekan UTF-8, dan menyikat fakta bahwa kecuali Anda menggunakan Ruby versi terbaru untuk menjalankan interpreter, itu benar-benar memperlakukannya sebagai karakter ASCII. Jika Anda sangat khawatir tentang ini, gunakan Guntuk Gamma dan vuntuk sqrt.

Nah, ketat saya bisa menghapus 44dalam pertukaran untuk 11sebagai 44/4dan 71sebagai √(Γ√4+(ΓΓ4+Γ√4)!), tapi itu bukan trade-off yang baik.

Peter Taylor
sumber
7

Python 155 byte

h={4:'4',24:'4!',6:'â4',.4:'.4',1:'âû4',4/9.:'.4~'}
f={}
def g(r,s='24',y='4!'):f[eval(s)]=y;[g(r-1,s+o+`k`,y+o+h[k])for k in h for o in'/*-+'if r]
g(3)

Tiga byte pertama ( \xEF\xBB\xBF) adalah tanda urutan byte UTF-8, meskipun file tersebut harus disimpan dalam format ANSI. The ûdan âakan diinterpretasikan sebagai dan Γmasing - masing dalam cp437 dan cp850 , yang seharusnya bekerja pada hampir semua kotak Windows.

Runtime sekitar 0,4 detik di komputer saya.

Contoh penggunaan (beri nama file four_fours.py):

$ python
>>> from four_fours import f
>>> f[39]
'4!+4!/.4/4'
>>> f[87]
'4!*4-4/.4~'
>>> for i in range(101): print i, f[i]
0 4!+4!-4!-4!
1 4!+4!/4!-4!
2 4!-4!+Γ4-4
3 4!-4!+4-Γ√4
4 4!+4!/Γ4-4!
.
.
.
96 4!+4!+4!+4!
97 4!*4!/Γ4+Γ√4
98 4!*4+Γ4-4
99 4!*4+4-Γ√4
100 4!*4!/Γ4+4

Hasil untuk 0..100 . Karena cara hash iterasi, ia lebih suka menggunakan 4!sesering mungkin.

Sunting: menyimpan sejumlah byte dengan menambahkan Γ√4 = 1, yang menghilangkan kebutuhan untuk pengelompokan apa pun, dan dengan menghapus √4 = 2, yang tidak lagi diperlukan.

primo
sumber
4

J, 175 161 karakter

   f=.')',~'(',;@((<;._2'+ - * % .4 .4~ g(r(4)) r(4) 4 g(4) 4! ( ) '){~(143402 A.i.9)
      /:~(12,11,0,6$0 4 4)+(9$4 7 7)#:((,@(+/,-/,*/,%/)~)^:2,0.4 4r9 1 2 4 6 24)&i.)

   f 1
(.4+.4)+(.4%r(4))

   f 42
(r(4)+4)+(g(4)*g(4))

   f 100
(r(4)+r(4))+(4*4!)

Format yang diperiksa adalah di (v op v) op (v op v)mana v={0.4 4/9 1 2 4 6 24}danop={+ - * /}

hasil 0,100 penuh

randomra
sumber
Saya tidak berpikir .4angka yang valid untuk game ini.
John Dvorak
@ JanDvorak itu - mungkin aku harus membuatnya lebih jelas
Volatilitas