Dalam permainan strategi "Hexplode" , pemain secara bergantian menempatkan token pada papan heksagonal. Setelah jumlah token sama dengan jumlah petak yang berdekatan, petak itu hexplodes , dan memindahkan semua token di atasnya ke tetangga sekitarnya. Anda dapat memainkan game online di sini .
Saya suka game ini, tetapi terkadang sulit untuk mengetahui dengan pasti berapa banyak token yang dipasang pada ubin tertentu; Saya selalu menghitung jumlah tetangga. Akan sangat nyaman jika saya memiliki seni ASCII untuk membantu saya mengingat berapa banyak token yang dipasang di setiap ubin.
Anda perlu menulis sebuah program atau fungsi yang mengambil bilangan bulat positif sebagai masukan, dan menghasilkan ini representasi ASCII dari segi enam ukuran N . Setiap ubin akan menjadi jumlah tetangga yang dimiliki ubin. Karena 1 adalah kasus sudut aneh dengan nol tetangga, Anda hanya perlu menangani input yang lebih besar dari 1.
Anda dapat mengambil nomor ini dalam format apa pun yang wajar, seperti STDIN, argumen fungsi, argumen baris perintah, dari file, dll. Outputnya juga dapat dalam format apa pun yang masuk akal, seperti mencetak ke STDOUT, menulis ke file, mengembalikan daftar string, string yang dipisahkan baris baru, dll.
Berikut adalah beberapa contoh output untuk 5 input pertama:
2)
3 3
3 6 3
3 3
3)
3 4 3
4 6 6 4
3 6 6 6 3
4 6 6 4
3 4 3
4)
3 4 4 3
4 6 6 6 4
4 6 6 6 6 4
3 6 6 6 6 6 3
4 6 6 6 6 4
4 6 6 6 4
3 4 4 3
5)
3 4 4 4 3
4 6 6 6 6 4
4 6 6 6 6 6 4
4 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 3
4 6 6 6 6 6 6 4
4 6 6 6 6 6 4
4 6 6 6 6 4
3 4 4 4 3
6)
3 4 4 4 4 3
4 6 6 6 6 6 4
4 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 6 6 3
4 6 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 4
4 6 6 6 6 6 4
3 4 4 4 4 3
Dan polanya berlanjut dengan cara yang serupa. Seperti biasa, celah standar berlaku, dan jawaban dengan byte-count terendah akan dinobatkan sebagai pemenang!
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=92194,OVERRIDE_USER=31716;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Jawaban:
MATL ,
3937 byteCobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Saya dapat menggunakan konvolusi lagi!
Pertimbangkan input
n = 3
. Kode pertama membangun matriks ukuran4*n-3
×n
dengan menambahkan vektor kolom[1; 2; ...; 9]
ke vektor baris[1, 2, 3]
dengan siaran. Ini berarti menghitung array array 2D dari semua penambahan berpasangan:Mengganti angka genap dengan
1
dan angka ganjil dengan0
memberikan pola kotak-kotakIni akan digunakan untuk menghasilkan (bagian dari) kisi heksagonal. Yang akan mewakili poin di grid, dan nol akan mewakili spasi.
Sudut kanan atas dihapus dengan memusatkan semua entri di atas "diagonal" utama dari matriks:
Elemen-bijaksana mengalikan matriks ini dengan versi membalik secara vertikal itu sendiri menghilangkan sudut kanan bawah juga. Transposing kemudian memberi
Ini mulai terlihat seperti segi enam. Dengan menggunakan simetri, kisi diperpanjang untuk menghasilkan bagian atas:
Sekarang kita perlu mengganti setiap entri sama dengan satu dengan jumlah tetangga. Untuk ini kami menggunakan konvolusi dengan lingkungan 3 × 5 (yaitu, kernel adalah matriks 3x5). Hasil,
memiliki dua masalah (yang akan diselesaikan nanti):
1
.Kode sekarang menambah
47
setiap nilai yang dihitung. Ini sesuai dengan pengurangan1
untuk menyelesaikan masalah (2) dan menambahkan48
(ASCII untuk'0'
), yang mengubah setiap angka ke titik kode karakter terkait.Matriks yang dihasilkan kemudian dikalikan dengan salinan kisi nol-satu. Ini memecahkan masalah (1) di atas, membuat titik-titik yang bukan bagian dari kisi heksagonal sama dengan nol lagi:
Akhirnya, array angka ini dilemparkan ke array char. Zero chars ditampilkan sebagai spasi, yang memberikan hasil akhir:
sumber
JavaScript (ES6),
118117 byteDimana
\n
mewakili karakter baris baru literal. Penjelasan: Misalkann=4
. Kita mulai dengan kotak digit yang dipisahkan oleh spasi berikut:Yang pertama
|n-i|
0
dihapus, tetapi spasi tetap:Segi enam instan! Kemudian cukup untuk menghitung nilai yang sesuai di tempat masing-masing
0
dengan memeriksa apakah kita berada di baris dan / atau kolom pertama atau terakhir. Sunting: Disimpan 1 byte berkat @Arnauld.sumber
n=>{for(i=n+--n;i--;)console.log(' '.repeat(l=i>n?i-n:n-i)+(j=3+!l%n)+` ${l-n?6:4}`.repeat(2*n-l-1)+' '+j)}
3+!i%n
!Python 2,
125123 byteTes ada di ideone
Berjalan melalui bagian atas ke baris tengah,
for r in range(n)
, membangun string:- membuat dua sudut atau dua sisi,
'34'[r%m>0]*2
;- mengisi dengan bergabung mereka dengan berulang
'6'
atau'4'
,'46'[r>0]*(r+m-1)
;- bergabung dengan sudut dan tepi dengan
' '
;- mengawali dengan spasi,
' '*(m-r)
;Lalu cetak ini dan itu refleksi di baris tengah bergabung dengan baris baru,
print'\n'.join(t+t[-2::-1])
sumber
Python 2, 96 byte
Ini terlihat sangat berantakan dan agak golf ...
sumber
Java,
375363361339329317293 byteTidak disatukan
Penggunaan :
Saya yakin bahwa blok if-else yang bersarang yang mengerikan dapat ditulis ulang menjadi lebih kecil tetapi saya tidak dapat mengetahuinya saat ini. Setiap saran dipersilahkan :-)
Memperbarui
sumber
Integer.parseInt
bisa di -golfInteger.decode
.l=(h*4-3-s.trim().length())/2;if(l==0)
bisa bermain golfif((l=(h*4-3-s.trim().length())/2)==0)
. Juga, itu benar-benar dapat diterima untuk hanya memposting metode tanpa kelas (kecuali jika pertanyaan menyatakan sebaliknya), jadivoid f(int i){...use i...}
alih-alihinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}
, itu akan menyelamatkan Anda beberapa byte juga. Ketika saya memiliki lebih banyak waktu, saya akan mencari lebih jauh.l=(h*4-3-s.trim().length())/2;if(l==0)
sebenarnya panjangnya sama denganif((l=(h*4-3-s.trim().length())/2)==0)
.05AB1E , 44 byte
Penjelasan
Karena bagian atas dan bawah segi enam dicerminkan, kita hanya perlu membuat bagian atas.
Jadi untuk input X kita perlu menghasilkan baris X. Itulah yang dilakukan loop utama.
Kemudian kita lakukan bagian tengah baris.
Ini adalah 4 untuk baris pertama dan 6 untuk sisanya (karena kami hanya melakukan bagian atas).
Kami menggabungkan angka ini dengan spasi karena pola akan membutuhkan jarak antar angka.
Kami kemudian mengulangi string ini X-2 + N kali, di mana N adalah baris saat ini yang diindeks 0 dan menambahkan karakter spasi di sisi kiri.
Setelah ini saatnya untuk sudut. Mereka akan menjadi 3 untuk baris pertama dan terakhir dan 4 untuk baris tengah.
Sekarang kita perlu memastikan baris berbaris dengan benar dengan menambahkan spasi di depan setiap baris. Jumlah spasi yang ditambahkan adalah X-1-N .
Sekarang setelah bagian atas grid selesai, kita tambahkan baris ke daftar, buat salinan terbalik dan hapus item pertama dari salinan itu (karena kita hanya perlu baris tengah satu kali), lalu gabungkan kedua daftar ini menjadi satu dan mencetak.
Cobalah online!
Solusi tambahan, juga 44 byte:
sumber
Ruby, 87 byte
Fungsi anonim mengambil n sebagai argumen dan mengembalikan array string.
Tidak digabungkan dalam program uji
Masukan melalui stdin. Menulis seluruh bentuk menjadi stdout. Cukup jelas.
sumber
V , 60 byte
Cobalah online!
Ini terlalu lama. Ini hexdump, karena ini mengandung karakter yang tidak patut dicetak:
sumber
Racket, 487 byte
Pengujian:
Versi detail:
sumber