Enam belas tumpukan keju diletakkan di atas kotak 4x4. Mereka dilabeli dari hingga . Tumpukan terkecil adalah dan yang terbesar adalah .
Tikus Lapar sangat lapar sehingga selalu langsung menuju tumpukan terbesar (yaitu ) dan langsung memakannya.
Setelah itu, ia pergi ke tumpukan tetangga terbesar dan dengan cepat memakan yang satu juga. (Ya ... Ini benar - benar lapar.) Dan seterusnya sampai tidak ada tumpukan tetangga lagi.
Tumpukan mungkin memiliki hingga 8 tetangga (horizontal, vertikal dan diagonal). Tidak ada bungkus.
Contoh
Kita mulai dengan tumpukan keju berikut:
Tikus Lapar pertama kali makan , dan kemudian tumpukan tetangganya yang terbesar, yaitu .
Langkah selanjutnya adalah , , , , , , , , dan dalam urutan yang tepat ini.
Tidak ada keju lagi di sekitar Tikus Lapar, jadi berhenti di sana.
Tantangan
Dengan konfigurasi keju awal, kode Anda harus mencetak atau mengembalikan jumlah tumpukan yang tersisa setelah Tikus Lapar berhenti memakannya.
Untuk contoh di atas, jawaban yang diharapkan adalah .
Aturan
- Karena ukuran matriks input ditetapkan, Anda dapat menganggapnya sebagai array 2D atau array satu dimensi.
- Setiap nilai dari hingga dijamin akan muncul tepat sekali.
- Ini adalah kode-golf .
Uji kasus
[ [ 4, 3, 2, 1], [ 5, 6, 7, 8], [12, 11, 10, 9], [13, 14, 15, 16] ] --> 0
[ [ 8, 1, 9, 14], [11, 6, 5, 16], [13, 15, 2, 7], [10, 3, 12, 4] ] --> 0
[ [ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12], [13, 14, 15, 16] ] --> 1
[ [10, 15, 14, 11], [ 9, 3, 1, 7], [13, 5, 12, 6], [ 2, 8, 4, 16] ] --> 3
[ [ 3, 7, 10, 5], [ 6, 8, 12, 13], [15, 9, 11, 4], [14, 1, 16, 2] ] --> 12
[ [ 8, 9, 3, 6], [13, 11, 7, 15], [12, 10, 16, 2], [ 4, 14, 1, 5] ] --> 34
[ [ 8, 11, 12, 9], [14, 5, 10, 16], [ 7, 3, 1, 6], [13, 4, 2, 15] ] --> 51
[ [13, 14, 1, 2], [16, 15, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12] ] --> 78
[ [ 9, 10, 11, 12], [ 1, 2, 4, 13], [ 7, 8, 5, 14], [ 3, 16, 6, 15] ] --> 102
[ [ 9, 10, 11, 12], [ 1, 2, 7, 13], [ 6, 16, 4, 14], [ 3, 8, 5, 15] ] --> 103
[[9, 10, 11, 12], [1, 2, 7, 13], [6, 16, 4, 14], [3, 8, 5, 15]]
Jawaban:
Python 2 ,
133130 byteCobalah online!
Mengambil daftar rata dari 16 elemen.
Bagaimana itu bekerja
sumber
a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]
dapat disingkat menjadia[i+j+j/3*2-6]for j in range(9)
(entri nol tidak berbahaya). Python 3 pasti bisa melakukan lebih pendek dengan melakukan hardcoding bytestring panjang-8, tetapi Python 2 mungkin masih lebih baik secara keseluruhan.a=[0]*5
for r in input():a=r+[0]+a
. Mungkin ada solusi mengiris string yang lebih pendek namun tidak memerlukan iterasi.Python 2 , 111 byte
Cobalah online!
Metode dan uji kasus diadaptasi dari Bubbler . Mengambil daftar datar di STDIN.
Kode memeriksa apakah dua indeks rata
i
danj
mewakili sel sentuh dengan memeriksa bahwa kedua baris berbedai/4-j/4
dan perbedaan kolomi%4-j%4
benar-benar antara -2 dan 2. Lewat pertama justru pemeriksaan ini berhasil secara otomatis sehingga entri terbesar ditemukan mengabaikan kedekatan.sumber
MATL ,
504947 byteInput adalah sebuah matriks, menggunakan
;
pemisah baris.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
PHP,
177 174171 byteJalankan dengan
-nr
, berikan elemen matriks sebagai argumen atau coba online .sumber
JavaScript, 122 byte
Saya melakukan lebih dari beberapa kesalahan dalam hal ini dan sekarang saya kehabisan waktu untuk bermain golf lagi, tetapi setidaknya itu berhasil. Akan mengunjungi kembali besok (atau, mengenal saya, di rumah kereta malam ini!), Jika saya dapat menemukan satu menit.
Cobalah online
sumber
flatMap()
: pR ,
128124123112110 byteCobalah online!
Ini menciptakan matriks 4x4 (yang membantu saya untuk memvisualisasikan hal-hal), membalutnya dengan 0, kemudian mulai dari 16 dan mencari di sekitarnya "tumpukan" untuk terbesar berikutnya, dan sebagainya.
Setelah menyimpulkan, itu memang mengeluarkan peringatan, tetapi tidak ada konsekuensi dan tidak mengubah hasilnya.
EDIT: -4 byte dengan mengompresi inisialisasi matriks menjadi 1 baris.
EDIT: -1 terima kasih kepada Robert Hacken
EDIT: -13 byte menggabungkan saran Giuseppe dan Robin Ryder.
sumber
r==16
untukr>15
.which
.m
sebagai logika alih-alih bilangan bulat, dan karenanya hanya perlu memanggilwhich
satu kali, bukan dua kali.X%o%Y
adalah alias untukouter(X,Y,'*')
.outer
adalah salah satu fungsi yang paling mudah digunakan karena dapat berfungsi sebagai fitur "broadcast" Octave / MATLAB / MATL dengan operator aribtrary (vectorized). Lihat di sini ; juga berguna pada kesempatan langkakronecker
yang terhubung di halaman itu.Arang , 47 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Ubah angka input menjadi karakter alfabet (A = 0 .. Q = 16) dan cetaklah sebagai kisi 4x4.
Mulailah dengan makan Q, yaitu 16.
Ulangi sementara ada sesuatu untuk dimakan.
Temukan di mana tumpukan itu. Ini adalah tampilan linear dalam urutan baris-utama.
Konversikan ke koordinat dan lompat ke lokasi itu.
Temukan tumpukan terdekat yang terbesar.
Makan tumpukan saat ini.
Ubah tumpukan menjadi bilangan bulat dan ambil jumlahnya.
Bersihkan kanvas dan hasilkan hasilnya.
sumber
Powershell,
143141136130122121 byteSkrip uji yang kurang golf:
Keluaran:
Penjelasan:
Pertama , tambahkan batas atas dan bawah 0 dan buat array dimensi tunggal:
Powershell kembali
$null
jika Anda mencoba untuk mendapatkan nilai di belakang akhir array.Kedua , loop
biggest neighbor pile
dimulai dari 16 hingga non-nol-maksimum. Dan membatalkannya (Mouse Lapar memakannya).Ketiga , jumlah tumpukan yang tersisa.
sumber
SAS,
236219 byteInput pada kartu punch, satu baris per kisi (dipisahkan spasi), output dicetak ke log.
Tantangan ini sedikit rumit oleh beberapa batasan array di SAS:
Pembaruan:
infile cards;
Pernyataan dihapus (-13)a:
untuk definisi array daripadaa1-a16
(-4)Golf:
Tidak Disatukan:
sumber
Haskell , 163 byte
Cobalah online!
The
f
fungsi mengambil masukan sebagai daftar 4 daftar 4 bilangan bulat.Sedikit tidak berbulu
sumber
JavaScript (ES7), 97 byte
Mengambil input sebagai array yang diratakan.
Cobalah online!
Berkomentar
sumber
APL (Dyalog Unicode) ,
4241 byte SBCSCobalah online!
sumber
Java 10,
272248 byteSel-sel diperiksa sama seperti dalam jawaban saya untuk tantangan All the single eights .
-24 byte terima kasih kepada @ OlivierGrégoire .
Cobalah online.
Penjelasan:
sumber
int r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;
, jadi terima kasih. :)J, 82 byte
Cobalah online!
Saya berencana untuk golf ini lebih besok, dan mungkin menulis lebih J-ish solusi yang mirip dengan ini satu , tapi kupikir aku akan mencoba pendekatan diratakan karena saya tidak melakukan itu sebelumnya.
sumber
]
dig
?Merah , 277 byte
Cobalah online!
Ini solusi yang sangat panjang dan saya tidak senang dengan itu, tapi saya menghabiskan begitu banyak waktu untuk memperbaikinya untuk bekerja di TIO (ternyata ada banyak perbedaan antara versi stabil Win dan Linux Red), jadi saya tetap mempostingnya ...
Lebih mudah dibaca:
sumber
Jelly ,
31 3029 byteKarena metode ini terlalu lambat untuk dijalankan dalam 60-an dengan mouse mulai pada
16
ini memulai9
dan membatasi kemampuannya sehingga ia hanya bisa makan9
atau kurang. Cobalah online! (Jadi di sini dia makan9, 2, 7, 4, 8, 6, 3
pergi97
).Bagaimana?
sumber
Bukan pekerjaan terbaik saya. Ada beberapa perbaikan pasti yang harus dilakukan, beberapa mungkin mendasar untuk algoritma yang digunakan - Saya yakin itu dapat ditingkatkan dengan hanya menggunakan
int[]
, tapi saya tidak tahu bagaimana cara menghitung tetangga secara efisien dengan cara itu. Saya ingin melihat solusi PowerShell yang hanya menggunakan array satu dimensi!Core PowerShell , 348 byte
Cobalah online!
Versi yang lebih mudah dibaca:
sumber
(array|sort)[-1]
alih - alihMeasure -max
bekerja di PSv5 tetapi mendapatkan hasil yang salah pada intinya. Tidak tahu kenapa.(0..10|sort)[-1]
tetapi mengembalikan 10 pada PSv5 tetapi 9 pada PS Core. Ini karena ia memperlakukannya dalam urutan leksikografis, bukan numerik. Malu, itu.C (gcc), 250 byte
Cobalah online!
Catatan: Kiriman ini mengubah array input.
s()
adalah fungsi untuk memanggil dengan argumen yang bisa berubahint[16]
(yang sama di-memori sebagaiint[4][4]
, yangg()
menafsirkannya sebagai).s()
menemukan lokasi16
array, kemudian meneruskan informasi ini keg
, yang merupakan fungsi rekursif yang mengambil lokasi, menetapkan angka di lokasi itu menjadi 0, dan kemudian:Jika ada angka positif yang berdekatan dengannya, ulangi dengan lokasi nomor berdekatan terbesar
Lain, kembalikan jumlah angka dalam array.
sumber
s(int*a){for(i=0;a[i]<16;++i);return g(a,i%4,i/4);}
Bahasa Wolfram (Mathematica) , 149 byte
Cobalah online!
sumber
Tambahkan ++ , 281 byte
Cobalah online!
Oof, ini yang rumit.
Verifikasi semua kasus uji
Bagaimana itu bekerja
Untuk penjelasan ini, kami akan menggunakan input
Ini mengimplementasikan dua fungsi pembantu:
Akhirnya, output t , yaitu nilai yang tersisa, yang tidak dikumpulkan.
sumber
C # (.NET Core) , 258 byte
Tanpa LINQ. Menggunakan System.Collections.Generic adalah untuk memformat setelah - fungsi tidak memerlukannya.
Cobalah online!
sumber
Perl 6 ,
151136126125119 byteSolusi super lusuh. Mengambil input sebagai array rata.
Cobalah online!
sumber
Perl 5
-MList::Util=sum -p
, 137 byteCobalah online!
sumber
K (ngn / k) , 49 byte
Cobalah online!
input (
x
) adalah array 1d(+!4 4)!x
kamus yang memetakan pasangan coords dengan nilaix
h::
tetapkan ke variabel globalh
*>
tombol yang sesuai dengan nilai maks{
}\
ulangi sampai konvergensi, kumpulkan nilai-nilai perantara dalam daftarh[,x]:0
nolkan posisi saat ini+x+0,'1-!3 3
posisi tetangga(
)#h
saring darih
sebagai kamus yang lebih kecil*>
tetangga mana yang memiliki nilai maks? itu menjadi posisi saat ini untuk iterasi baru+/h
akhirnya, kembalikan jumlahh
nilai yang tersisasumber
Bahasa Wolfram (Mathematica) ,
124115 byteCobalah online!
Ini membutuhkan array 2D, menempatkannya di setiap sisi, lalu segera meratakannya sehingga kita tidak perlu menghabiskan byte pengindeksan. Satu-satunya biaya untuk ini adalah
Join@@
meratakan. Setelah itu hasilnya seperti di bawah ini.Versi 124-byte untuk array 2D: Cobalah online!
Sebagian besar karya saya sendiri, dengan sedikit berasal dari jawaban 149-byte J42161217 .
Tidak Disatukan:
sumber