Terinspirasi oleh xkcd .
Tantangan Anda adalah menentukan apakah angka akan membuat kombinasi yang baik di game 2048 . Masukan Anda akan berupa angka, seperti:
8224
Dan hasilnya adalah apakah angka itu akan menjadi kombo 2048 yang baik, yang untuk input ini akan menjadi true
atau yes
atau 1
atau cara lain untuk menunjukkan hasil positif.
Bagi yang belum terbiasa dengan permainan, inilah penjelasan sederhana: kekuatan dari dua disusun pada grid, seperti ini: [2] [2]
. Ubin dapat dipindahkan ke segala arah, dan jika dua ubin identik bertemu, mereka menjadi kekuatan berikutnya dari dua (jadi [2] [2]
ketika dipindahkan ke kiri atau kanan menjadi [4]
). Atau, Anda bisa mencoba permainannya di sini .
Apa yang dimaksud dengan "kombinasi 2048 yang baik"? Itu berarti angka apa pun yang, jika ada dalam game "2048", itu bisa digabungkan menjadi satu nomor tunggal. (Nol berarti ruang kosong , dan dapat diabaikan jika diperlukan.) Perhatikan bahwa angka bisa jadi beberapa digit! Namun, angka-angka tidak boleh berubah di antara gerakan. Berikut adalah beberapa contoh / kasus uji (dengan "Baik" menunjukkan kombinasi yang baik, dan "Buruk" yang berarti tidak baik):
- Bagus: 8224 (8224 -> 844 -> 88 -> 16)
- Bagus: 2222 (2222 -> 44 -> 8)
- Bagus: 22048 (22048 -> 448 -> 88 -> 16)
- Buruk: 20482 (tidak dapat mengombinasikan 2 bagian luar, Anda juga tidak dapat menggabungkan 2048 dan 2)
- Bagus: 20482048 (20482048 -> 4096)
- Buruk: 210241024 (210241024 -> 22048, tapi ini sekarang [2] [2048] dan tidak dapat digabungkan karena angka tidak dapat berubah di antara gerakan)
- Bagus: 2048 (sudah satu nomor)
- Buruk: 2047 (ini bukan kekuatan 2)
- Buruk: 11 (tidak ada angka 1 di game)
- Bagus: 000040000000 (nol adalah ruang kosong)
Aturan lain-lain:
- Input dapat dari mana saja masuk akal, yaitu STDIN, argumen fungsi, file, dll.
- Output juga bisa masuk akal, yaitu STDOUT, nilai pengembalian fungsi, file, dll.
- Abaikan ukuran kisi -
22222222
masih harus menampilkan true. - Jumlahnya tidak maksimal untuk angka apa, asalkan kekuatan dua. Oleh karena itu angka yang mungkin adalah kekuatan dua lebih besar dari 0.
- Bagi mereka yang khawatir tentang nol yang menyebabkan ambiguitas, bukan itu masalahnya. Misalnya,
22048
dapat diuraikan sebagai salah satu[2] [2048]
atau[2] [2] [0] [4] [8]
. Yang pertama tidak berfungsi, tetapi yang kedua tidak, jadi seharusnya hasilnya benar. - Ini adalah kode-golf , jadi kode terpendek dalam byte akan menang!
1
22048
outputgood
tetapi itu tidak benar. Anda tidak dapat menggabungkan2
dengan2048
dan kisi adalah4x4
jika semua angka harus terpisah Anda akan mendapatkan 5 sel. jadi mungkin Anda harus menghapus0
? Juga contoh ke-5 Anda tampaknya tidak valid karena permainan berhenti pada2048
:)Jawaban:
GolfScript, 137 karakter
Masukan harus diberikan pada STDIN. Outputnya adalah
0
/1
untuk angka buruk / baik. Sebagian besar kode diperlukan untuk mengurai input yang mungkin.Versi yang lebih pendek ini (113 karakter) melakukan tes pergeseran sederhana yang tidak akan berfungsi dengan benar untuk input seperti
224422
.Semua test case dapat diperiksa online .
sumber
Python:
457422 karakterFungsi f mendapat string angka dan menghasilkan 'baik' atau 'buruk'. Saya memilih untuk tidak menggunakan 0 sebagai spasi karena spasi tidak berarti dalam permainan dan mereka menciptakan ambiguitas ketika mengurai string (apakah 22048 baik atau buruk?). Ini hanya menggunakan angka hingga 2048, tetapi itu dapat diubah tanpa menambahkan karakter. Dengan biaya 10 karakter atau lebih saya juga dapat mencetak semua langkah menggabungkan angka. Dan saya menyadari bahwa kode ini belum cukup golf; jangan khawatir, suntingan akan datang.
sumber
Haskell:
285 254 253 237 230227penggunaan - hanya memuatnya ke ghci, dan meneruskan string ke h.
Kode:
Komentar:
i
adalah cek jika angka berkekuatan 2, ini akan dikalahkan oleh bahasa dengan sedikit twiddling.%
secara rekursif menghasilkan semua parses yang merupakan daftar kekuatan 2 atau 0. petakc
runtuh.l
tes secara rekursif jika ubin dilipat ke kiri atau bagus.g
menguji apakah ubin dilipat ke kiri atau kanan. Tidak ada batasan angka pada ubin - mis.h ((show (2^200))++(show (2^200)))
Mengembalikan true untuk 2 ubin bertanda "1606938044258990275541962092341162602522202993782792835301376".Diedit untuk memperbaiki bug yang tidak benar-benar runtuh "88222288888" di sebelah kanan, tetapi juga menemukan lebih banyak peluang bermain golf.
sumber
Perl, 175-336 byte
Menjaga hal-hal penting tetap utuh:
[ 64 dan 256 menyebabkan beberapa ambiguitas yang tidak dapat diselesaikan dengan baik sehingga pencocokan serakah tidak dapat mengatasi ... tetapi ini adalah jumlah byte yang bagus . ]
sumber
Delphi
572582 karakterKode yang diedit, batas ditetapkan ke 2 ^ 30 sehingga tidak akan melebihi nilai MaxInt dalam Delphi.
Golf
Tidak disatukan
EDIT
Jadi saya jadi penasaran dan bertanya-tanya berapa banyak dari kombinasi ini yang cocok dengan teka-teki dan menjalankan tes itu.
Bagi yang lain yang juga penasaran, buat tes juga;)
Tapi ok inilah hasilnya:
20736 combinations were tested and 1166 were great combinations
Saya harus mengatakan kombinasi dengan 3 atau lebih nol dilewati (merek merasakan kan?)
Kombinasi hampir unik, yang berarti kombinasi
2248
,8224
,8422
dan4228
semua dihitung sebagai kombinasi yang hebat.sumber
Mathematica - 218 byte
Versi tidak disatukan:
The
Internal\
PartitionRagged` sihir diambil dari pertanyaan ini .Solusi ini menangani ukuran grid sembarang dan jumlah besar sembarang.
Ini adalah versi 195 byte yang berfungsi seperti gim sebenarnya dengan hanya hingga 4 ubin (begitu
f[22222222]
jugaFalse
):di mana saya telah diganti
dengan
sumber
DeleteCases
sepertinya ia menghilangkan pasangan paling kiri, jadif[88222288888]
apakah akan gagal?DeleteCases
hanya menghapus nol dan angka yang bukan kekuatan dua. Runtuhnya pasangan yang sebenarnya dilakukan oleh aturan//. {a___, x_, x_, b___} :> {a, 2 x, b}
, yang bekerja untuk nomor itu dan sebaliknya. Saya sebenarnya tidak sepenuhnya yakin tentang urutan Mathematica menerapkan penggantian itu, tetapi berhasil.Haskell - 260
263f
adalah fungsinya. Contoh:Penjelasan kecil:
p
mengembalikan semua cara untuk membagi daftar.q
memfilter yang terdiri dari hanya kekuatan 2 (tidak termasuk 1 tetapi termasuk 0).c
mencoba meruntuhkan string.r
beralih collapsion kanan dan kiri hingga hanya ada 1 elemen yang tersisa, atau string tidak dapat dicairkan.sumber
c
dalamnya, coba "222244442222" - itu mengembalikan true, tapi itu tidak bisa diciutkan dalam permainan. Perlu diulang(2*x):c s
.