Tantangan
Pertimbangkan diagram Lima Belas Teka-teki berikut dalam keadaan terselesaikan:
_____________________
| | | | |
| 1 | 2 | 3 | 4 |
|____|____|____|____|
| | | | |
| 5 | 6 | 7 | 8 |
|____|____|____|____|
| | | | |
| 9 | 10 | 11 | 12 |
|____|____|____|____|
| | | | |
| 13 | 14 | 15 | |
|____|____|____|____|
Pada setiap gerakan, seorang kusut yang bersemangat memiliki kesempatan untuk memindahkan satu bagian yang berdekatan dengan ruang kosong ke ruang kosong. Misalnya, setelah 1
pindah, kami memiliki 2
skenario yang memungkinkan (biarkan 0
ruang kosong):
1 2 3 4 1 2 3 4
5 6 7 8 5 6 7 8
9 10 11 12 and 9 10 11 0
13 14 0 15 13 14 15 12
Setelah 2
bergerak, puzzle memiliki 5
hasil yang berbeda (Perhatikan bahwa kedua kasus di atas dikecualikan, karena mereka tidak dapat dicapai dalam 2 gerakan). Salah satu situasi ini adalah keadaan terselesaikan yang asli, dan dapat dicapai dengan dua cara berbeda.
Tugas Anda dalam tantangan ini adalah untuk menghasilkan sejumlah hasil yang berbeda yang dapat menyebabkan sejumlah gerakan tertentu. Sebagai input, ambil nomor N >= 0
, dan hasilkan jumlah situasi unik yang mungkin muncul setelah N
bergerak.
Aturan
- Ini adalah kode-golf. Kode terpendek menang!
- Celah standar tidak diijinkan.
- Kode Anda harus dapat menghitung kasing
N = 10
dalam beberapa menit. Saya kemungkinan tidak akan menguji aturan ini kecuali ada penyalahgunaan waktu yang jelas dalam jawaban.
Uji Kasus
(Hasil yang dihasilkan dari penjumlahan OEIS A089484 (Seperti yang dijelaskan Geobits dalam obrolan ), diotomatisasi oleh skrip Martin Büttner . Terima kasih atas semua bantuannya!)
0 moves: 1
1 moves: 2
2 moves: 5
3 moves: 12
4 moves: 29
5 moves: 66
6 moves: 136
7 moves: 278
8 moves: 582
9 moves: 1224
10 moves: 2530
11 moves: 5162
12 moves: 10338
13 moves: 20706
14 moves: 41159
15 moves: 81548
16 moves: 160159
17 moves: 313392
18 moves: 607501
19 moves: 1173136
20 moves: 2244884
21 moves: 4271406
22 moves: 8047295
23 moves: 15055186
24 moves: 27873613
25 moves: 51197332
26 moves: 93009236
27 moves: 167435388
28 moves: 297909255
29 moves: 524507316
30 moves: 911835416
31 moves: 1566529356
sumber
s.add
mungkin akan menyimpan beberapa karakter.t
berselisih pendapat. Selain itu, saya pikir kemungkinan besar ada lebih banyak ruang untuk perbaikan jika saya memiliki keterampilan Python yang lebih baik.if
pernyataan dalam ekspresi hubungan arus pendek dengan efek samping sepertij%4and e(j-1,j)
sehingga Anda dapat menempatkan mereka ke dalam satu baris sebagai tupel boolean:j%4and e(j-1,j),j%4>2or e(j,j+1),j<4or e(j-4,j),j>11or e(j,j+4)
.if
pernyataan. Saya juga bertanya-tanya apakah ada cara yang lebih pendek untuk membangun tuple dengan dua elemen yang ditukar.def e(a,b):*l,=t;l[a],l[b]=l[b],l[a];s.add(tuple(l))
.Perl, 148
Contoh:
sumber