Accordion adalah permainan kartu solitaire yang baru-baru ini saya temui di mana hampir setiap tata letak dipecahkan, tetapi sangat sulit. Anda bisa memainkannya di sini .
Aturan
52 kartu wajah ditempatkan menghadap ke atas dalam urutan acak. Setiap belokan, Anda mengganti kartu dengan kartu yang lebih baru, di mana kedua kartu :
- Bagikan setelan atau nomor dan
- Berada pada jarak 1 (berdekatan) atau 3 (dua kartu di antaranya).
Permainan dimenangkan ketika hanya ada 1 kartu yang tersisa . Anda dapat mengasumsikan bahwa setiap input dapat dipecahkan. Kartu yang diganti harus selalu mendahului kartu yang diganti.
Contoh
Sebagai contoh, pertimbangkan tata letak berikut:
2H,2S,1S,2D (H: Hearts, S: Spades, D: Diamonds)
Ada 3 kemungkinan gerakan di sini:
- Ganti
2H
dengan yang berdekatan2S
, jadi kita berakhir dengan2S,1S,2D
- Ganti
2S
dengan yang berdekatan1S
, jadi kita berakhir dengan2H,1S,2D
- Ganti
2H
dengan2D
(pada jarak 3), jadi kita berakhir dengan2D,2S,1S
Dari 3 gerakan itu, hanya yang terakhir yang memiliki kemungkinan menang (Anda menang dengan mengganti 2D <- 2S
, lalu 2S <- 1S
).
Input output
Tugas Anda adalah menulis pemecah Accordion . Anda diberikan daftar kartu, dan Anda harus mengembalikan daftar gerakan untuk menyelesaikan permainan.
Anda diberikan daftar kartu sebagai string yang dibatasi koma, di mana setiap kartu dilewatkan sebagai bilangan bulat yang mewakili nilai numeriknya, lalu karakter yang mewakili suit mereka.
Anda harus mengembalikan daftar penggantian sebagai string yang dibatasi koma, di mana setiap penggantian dalam format Card <- Card
(mengikuti format kartu yang dijelaskan di atas). Kartu pertama dalam setiap pasangan adalah kartu yang sedang diganti.
Kasus uji:
5H,1C,12S,9C,9H,2C,12C,11H,10C,13S,3D,8H,1H,12H,4S,1D,7H,1S,13D,13C,7D,12D,6H,10H,4H,8S,3H,5D,2D,11C,10S,7S,4C,2H,3C,11S,13H,3S,6C,6S,4D,11D,8D,8C,6D,5C,7C,5S,9D,10D,2S,9S
5H,9C,11H,7S,7D,12D,6H,10S,3H,4D,12C,2S,3C,5C,7H,6S,1H,8S,2H,11S,4C,10D,12H,9H,2D,4H,6C,13H,11C,2C,10H,8C,1S,11D,3S,12S,7C,5D,13S,8D,4S,6D,13C,3D,8H,13D,1D,9D,9S,1C,5S,10C
7H,11C,8C,7S,10D,13H,4S,10C,4D,2C,4H,13D,3C,2H,12C,6C,9H,4C,12H,11H,9S,5H,8S,13S,8H,6D,2S,5D,11D,10S,1H,2D,5C,1C,1S,5S,3H,6S,7C,11S,9C,6H,8D,12S,1D,13C,9D,12D,3D,7D,10H,3S
Meskipun kompetisi ini adalah golf kode , saya sangat tertarik pada solusi yang efisien waktu, dan saya cenderung memberi solusi cerdas dengan hadiah. Yang mengatakan, solusi yang mengambil jumlah waktu astronomi masih dapat diterima (saya akan merekomendasikan pengujian dengan deck yang lebih kecil, seperti 16-card, 4 suit deck).
sumber
Jawaban:
Python 3,
274272271 byte2 byte disimpan berkat @orlp .
Ini sangat lambat. Namun, Anda dapat mencobanya dengan memoize . Ini memiliki beberapa tambahan
list
-tuple
konversi, tetapi jika tidak setara.Bahkan yang satu ini secara astronomis lambat dengan input tertentu.
Kode menggunakan string, bukan angka, sehingga juga mendukung notasi seperti
KH
bukan13H
.Contoh:
sumber
functools.lru_cache
alih-alih menulis sendiri.list
dapat diguncang itu tidak bekerja.str.split
mengembalikanlist
). Saya lebih suka kedua program menjadi setara secara fungsional.h=lambda p:lru_cache(None)(g)(''.join(p))
.