W grze strategicznej „Hexplode” gracze na zmianę umieszczają żetony na sześciokątnej planszy. Gdy liczba żetonów jest równa liczbie sąsiadujących kafelków, kafle te są heksodami i przenoszą wszystkie zebrane na nim żetony do otaczających sąsiadów. Możesz zagrać w grę online tutaj .
Podoba mi się ta gra, ale czasami trudno jest dokładnie wiedzieć, ile żetonów trafia na konkretny kafelek; Zawsze liczę liczbę sąsiadów. Byłoby bardzo wygodne, gdybym miał grafikę ASCII, która pomogłaby mi zapamiętać, ile tokenów trafia na każdy kafelek.
Musisz napisać program lub funkcję, która pobiera dodatnia jako wejście i tworzy tę reprezentację ASCII sześciokąta o rozmiarze N . Każdy kafelek będzie liczbą sąsiadów, którą ma kafelek. Ponieważ 1 to dziwny przypadek narożny z zerowymi sąsiadami, musisz obsługiwać tylko dane wejściowe większe niż 1.
Możesz wziąć tę liczbę w dowolnym rozsądnym formacie, takim jak STDIN, argumenty funkcji, argumenty wiersza polecenia, z pliku itp. Dane wyjściowe mogą być również w dowolnym rozsądnym formacie, takim jak drukowanie do STDOUT, zapisywanie do pliku, zwracanie lista ciągów, ciąg oddzielony znakiem nowej linii itp.
Oto przykładowe dane wyjściowe dla pierwszych 5 danych wejściowych:
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
I wzór trwa w podobny sposób. Jak zwykle obowiązują standardowe luki, a zwycięzca otrzyma odpowiedź o najniższej liczbie bajtów!
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](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>
Odpowiedzi:
MATL ,
3937 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Znowu używam splotu!
Rozważ wejście
n = 3
. Kod najpierw buduje macierz wielkości4*n-3
×n
, dodając wektor kolumny[1; 2; ...; 9]
do wektora wiersza[1, 2, 3]
z rozgłoszeniem. Oznacza to obliczenie tablicy tablic 2D wszystkich dodatków parami:Zastąpienie liczb
1
parzystych i nieparzystych przez0
daje wzór szachownicyZostanie to wykorzystane do wygenerowania (części) siatki heksagonalnej. Jedne będą reprezentować punkty na siatce, a zera będą reprezentować spacje.
Prawy górny róg usuwa się przez wyzerowanie wszystkich wpisów powyżej głównej „przekątnej” matrycy:
Mnożenie elementu macierzy przez jej odwróconą pionowo wersję usuwa również prawy dolny róg. Transpozycja następnie daje
To zaczyna wyglądać jak sześciokąt. Używając symetrii, siatka jest przedłużana w celu uzyskania górnej połowy:
Teraz musimy zastąpić każdy wpis równy jeden przez liczbę sąsiadów. W tym celu używamy splotu z otoczeniem 3 × 5 (tj. Jądro jest macierzą 3 × 5 z nich). Wynik,
ma dwa problemy (które zostaną rozwiązane później):
1
.Kod dodaje teraz
47
do każdej obliczonej wartości. Odpowiada to odejmowaniu w1
celu rozwiązania problemu (2) i dodawaniu48
(ASCII dla'0'
), co konwertuje każdą liczbę do punktu kodowego odpowiadającego jej znaku.Otrzymana macierz jest następnie mnożona przez kopię siatki zerowej. Rozwiązuje to problem (1) powyżej, dzięki czemu punkty, które nie są częścią sześciokątnej siatki, znów są równe zero:
Wreszcie ta tablica liczb jest rzutowana na tablicę znaków. Zera znaków są wyświetlane jako spacja, co daje końcowy wynik:
źródło
JavaScript (ES6),
118117 bajtówGdzie
\n
reprezentuje dosłowny znak nowej linii. Objaśnienie: Załóżmyn=4
. Zaczynamy od następującego oddzielonego spacjami kwadratu cyfrowego:Pierwsze
|n-i|
0
s są usuwane, ale spacje pozostają:Natychmiastowy sześciokąt! Wystarczy wtedy obliczyć odpowiednią wartość zamiast każdej
0
, sprawdzając, czy jesteśmy w pierwszym czy ostatnim wierszu i / lub kolumnie. Edycja: Zapisano 1 bajt dzięki @Arnauld.źródło
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 bajtówTesty są na ideone
Biegnie od góry do środkowych rzędów,
for r in range(n)
konstruując struny:- tworząc dwa rogi lub dwie krawędzie
'34'[r%m>0]*2
;- wypełnianie przez połączenie ich z powtarzającym się
'6'
lub'4'
,'46'[r>0]*(r+m-1)
;- łączenie narożników i krawędzi z
' '
;- prepending ze spacjami
' '*(m-r)
;Następnie drukuje to i jego odbicie w środkowym rzędzie połączone nowymi liniami,
print'\n'.join(t+t[-2::-1])
źródło
Python 2, 96 bajtów
Wygląda to dość niechlujnie i nieco golfowo ...
źródło
Java,
375363361339329317293 bajtówNie golfił
Zastosowanie :
Jestem pewien, że ten strasznie zagnieżdżony blok „jeśli-inaczej” można przepisać na mniejszy, ale w tej chwili nie mogę go rozgryźć. Wszelkie sugestie są mile widziane :-)
Aktualizacja
źródło
Integer.parseInt
można grać w golfaInteger.decode
.l=(h*4-3-s.trim().length())/2;if(l==0)
można grać w golfaif((l=(h*4-3-s.trim().length())/2)==0)
. Również całkowicie dopuszczalne jest po prostu opublikowanie metody bez klasy (chyba że pytanie stanowi inaczej), więcvoid f(int i){...use i...}
zamiastinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}
tego powinno to zaoszczędzić sporo bajtów. Kiedy będę miał więcej czasu, będę szukać dalej.l=(h*4-3-s.trim().length())/2;if(l==0)
jest faktycznie tej samej długości zif((l=(h*4-3-s.trim().length())/2)==0)
.05AB1E , 44 bajty
Wyjaśnienie
Ponieważ góra i dół sześciokąta są odbijane, musimy tylko wygenerować górną część.
Tak więc dla wejścia X musimy wygenerować X wierszy. Tak właśnie działa główna pętla.
Następnie wykonujemy środkową część rzędów.
To 4 dla pierwszego rzędu i 6 dla reszty (ponieważ robimy tylko górną część).
Łączymy tę liczbę ze spacją, ponieważ wzorzec będzie wymagał odstępów między liczbami.
Następnie powtarzamy ten ciąg X-2 + N razy, gdzie N to bieżący wiersz indeksowany 0 i wstawiamy spację po lewej stronie.
Potem nadszedł czas na zakręty. Będą to 3 dla pierwszego i ostatniego rzędu i 4 dla środkowych rzędów.
Teraz musimy upewnić się, że rzędy są prawidłowo ustawione, dodając spacje z przodu każdego rzędu. Liczba dodanych spacji będzie X-1-N .
Teraz, gdy mamy już górną część siatki, dodajemy wiersze do listy, tworzymy odwróconą kopię i usuwamy pierwszy element z tej kopii (ponieważ potrzebujemy tylko środkowego wiersza tylko raz), a następnie łączymy te dwie listy razem i wydrukować.
Wypróbuj online!
Dodatkowe rozwiązanie, również 44 bajty:
źródło
Rubinowy, 87 bajtów
Funkcja anonimowa przyjmuje n jako argument i zwraca tablicę ciągów.
Niegolfowany w programie testowym
Wejście przez stdin. Zapisuje cały kształt na standardowe wyjście. Dość oczywiste.
źródło
V , 60 bajtów
Wypróbuj online!
To naprawdę za długo. Oto zrzut heksowy, ponieważ zawiera znaki niedrukowalne:
źródło
Rakieta, 487 bajtów
Testowanie:
Wersja szczegółowa:
źródło