Bulgarian Solitaire adalah permainan pemain tunggal yang dipopulerkan oleh Martin Gardner dalam kolom matematika di Scientific American .
Anda memiliki N
kartu yang identik, dibagi menjadi beberapa tumpukan. Anda mengambil kartu dari setiap tumpukan dan membentuk tumpukan baru dengan kartu yang dilepaskan. Anda mengulangi proses ini sampai Anda mencapai keadaan yang sudah Anda lihat dan melanjutkan akan mengulangi loop.
Misalnya, Anda memiliki 8
kartu, terbagi menjadi tumpukan 5
dan tumpukan 3
. Kami menulis ukuran tumpukan di urutan menurun: 5 3
. Berikut transkrip permainan:
5 3
4 2 2
3 3 1 1
4 2 2
Pertama-tama Anda mengeluarkan kartu dari masing-masing tumpukan, meninggalkan tumpukan 4
dan 2
, dan tumpukan 2
pemberian yang baru dibuat 4 2 2
. Pada langkah berikutnya, penurunan ini 3 1 1
diikuti dengan tumpukan baru 3
. Akhirnya, langkah terakhir mengosongkan tumpukan ukuran 1
dan menghasilkan 4 2 2
yang sudah muncul, jadi kami berhenti.
Perhatikan bahwa jumlah ukuran tumpukan tetap sama.
Tujuan Anda adalah mencetak transkrip permainan dari konfigurasi awal yang diberikan. Ini adalah kode golf, byte paling sedikit menang.
Memasukkan
Daftar angka positif dalam urutan menurun mewakili ukuran tumpukan awal. Ambil input melalui STDIN atau input fungsi. Anda dapat menggunakan struktur seperti daftar yang Anda inginkan.
Anda tidak mendapatkan jumlah kartu N
sebagai input.
Keluaran
Cetak urutan ukuran tumpukan yang dilalui permainan Solitaire Bulgaria. Perhatikan bahwa pencetakan diperlukan, bukan kembali. Setiap langkah harus menjadi garisnya sendiri.
Setiap baris harus memiliki urutan angka positif dalam urutan menurun tanpa 0
's. Anda mungkin memiliki pemisah dan token awal dan akhir (misalnya, [3, 3, 1, 1]
). Angka-angka mungkin memiliki beberapa digit, sehingga harus dipisahkan entah bagaimana.
Cetak pemisahan tumpukan yang Anda lihat sampai dan termasuk mencapai pengulangan. Jadi, baris pertama harus menjadi input, dan baris terakhir harus merupakan pengulangan dari baris sebelumnya. Seharusnya tidak ada pengulangan lainnya.
Uji kasus
>> [1]
1
1
>> [2]
2
1 1
2
>> [1, 1, 1, 1, 1, 1, 1]
1 1 1 1 1 1 1
7
6 1
5 2
4 2 1
3 3 1
3 2 2
3 2 1 1
4 2 1
>> [5, 3]
5 3
4 2 2
3 3 1 1
4 2 2
>> [3, 2, 1]
3 2 1
3 2 1
>> [4, 4, 3, 2, 1]
4 4 3 2 1
5 3 3 2 1
5 4 2 2 1
5 4 3 1 1
5 4 3 2
4 4 3 2 1
v$input()$
denganQ
. 2. Jika Anda menyimpan daftar dalam urutan menurun, Anda tidak perluN
sama sekali:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
QW!}QY~Y]Q=Q_S+]lQfTmtdQQ
. Persis sama, karakter untuk karakter, hingga komutatif.CJam, 26 byte
Cobalah online.
Contoh dijalankan
sumber
:p
berhasil, saya bisa ...:p
Ruby, 98
Penjelasan
Array
.Hash
g
.Array#map
untuk mengurangi setiap elemen sebanyak 1, tambahkan panjangArray
elemen, mengurutkannya dalam urutan menurun dan menghapus elemen0
.g
memiliki kunci untuk keadaan permainan baru sudah cukup.sumber
sort_by
hal ini jelas pintar,sort.reverse
sebenarnya satu karakter lebih pendek ^^CJam,
35 3433 byte(Sial, pemadaman listrik ini bahwa saya bukan orang pertama yang memposting di CJam)
Memasukkan:
Keluaran:
Cobalah online di sini
sumber
Python 2 - 103
Mirip dengan jawaban Quincunx, tetapi mengganti menambahkan dengan penambahan, dan menghapus dua baris terakhir.
Output sampel:
sumber
GolfScript,
5046Hampir bisa dipastikan golf lebih lanjut. Cobalah di sini.
sumber
Haskell, 99
sumber
CJam,
403634 byteUji di sini. Masukkan input sebagai larik gaya CJam, seperti
[5 3]
, ke dalam bidang STDIN. Format output mirip, jadi kurung dan spasi persegi sebagai pembatas.Bahkan jika saya memainkan ini lebih jauh (yang pasti mungkin), tidak ada cara untuk mengalahkan Pyth dengan ini. Mungkin sudah waktunya untuk belajar J. Penjelasan datang nanti.
sumber
JavaScript (E6) 113
Entri terburuk sejauh ini :(
Uji di konsol FireFox / FireBug
Keluaran
sumber
Python 2,
148130101Ini hanya mengingat semua iterasi sebelumnya, dan memeriksa apakah yang baru ada dalam daftar itu. Kemudian, ia mencetaknya.
Contoh dijalankan:
Memasukkan:
Keluaran:
Sunting: Saya membaca ulang spesifikasi untuk golf, plus menerapkan banyak golf.
sumber
[4,2,2]
. Ada perbaikan yang mudah.Python 3: 89 karakter
Sama seperti solusi Python yang sudah diposting, tetapi dengan panggilan fungsi rekursif daripada loop. Daftar
s
menyimpan perpecahan yang sudah terlihat, dan hubung singkat rekursi jika terjadi pengulangan.Fungsi
print()
(ini adalah Python 3) hanya perlu dipanggil entah bagaimana di setiap loop. Yang sulit adalah bahwalambda
hanya memungkinkan satu ekspresi, jadi kita tidak bisa melakukannyaprint(l);...
. Juga, ini menghasilkanNone
, yang sulit untuk dikerjakan. Saya akhirnya menempatkanprint(l)
di satu sisi ketidaksetaraan;==
tidak bekerja karena alasan yang tidak saya mengerti.Pendekatan alternatif menempelkannya dalam daftar menggunakan banyak karakter.
Menggunakan
print(*l)
akan memformat output seperti4 2 2
daripada[4,2,2]
.sumber