Im Strategiespiel "Hexplode" legen die Spieler abwechselnd Spielsteine auf ein sechseckiges Brett. Sobald die Anzahl der Spielsteine gleich der Anzahl der benachbarten Spielsteine ist, wird dieser Spielstein hexplodiert und alle Spielsteine darauf werden zu den umliegenden Nachbarn bewegt. Sie können das Spiel hier online spielen .
Ich mag dieses Spiel, aber manchmal ist es schwierig, genau zu wissen, wie viele Spielsteine auf einem bestimmten Plättchen liegen. Ich zähle immer die Anzahl der Nachbarn. Es wäre sehr praktisch, wenn ich eine ASCII-Grafik hätte, um mich daran zu erinnern, wie viele Token auf jedem Plättchen liegen.
Sie müssen ein Programm oder eine Funktion schreiben, die eine positive Ganzzahl als Eingabe verwendet und diese ASCII-Darstellung des Hexagons der Größe N erzeugt . Jedes Plättchen ist die Anzahl der Nachbarn, die das Plättchen hat. Da 1 ein seltsamer Eckfall mit null Nachbarn ist, müssen Sie nur Eingaben verarbeiten, die größer als 1 sind.
Sie können diese Zahl in jedem vernünftigen Format verwenden, z. B. STDIN, Funktionsargumente, Befehlszeilenargumente, aus einer Datei usw. Die Ausgabe kann auch in jedem vernünftigen Format erfolgen, z. B. Drucken in STDOUT, Schreiben in eine Datei, Zurückgeben eine Liste von Zeichenfolgen, eine durch Zeilenumbrüche getrennte Zeichenfolge usw.
Hier einige Beispiele für die ersten 5 Eingänge:
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
Und das Muster setzt sich auf ähnliche Weise fort. Wie üblich gelten Standardlücken, und die Antwort mit der niedrigsten Byteanzahl wird zum Gewinner gekürt!
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu erstellen.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](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>
Antworten:
MATL ,
3937 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Ich kann Faltung wieder benutzen!
Betrachten Sie die Eingabe
n = 3
. Der Code erstellt zunächst eine Matrix der Größe4*n-3
×,n
indem er den Spaltenvektor[1; 2; ...; 9]
dem Zeilenvektor[1, 2, 3]
mit Rundsendung hinzufügt . Dies bedeutet, dass ein 2D-Array-Array aller paarweisen Additionen berechnet wird:Durch Ersetzen von geraden
1
und ungeraden Zahlen0
erhält man ein SchachbrettmusterDies wird zum Erzeugen (eines Teils) des hexagonalen Gitters verwendet. Einsen stellen Punkte im Raster dar, und Nullen stellen Leerzeichen dar.
Die obere rechte Ecke wird entfernt, indem alle Einträge über der Hauptdiagonale der Matrix auf Null gesetzt werden:
Elementweise Multiplikation dieser Matrix mit einer vertikal gespiegelten Version von sich selbst entfernt auch die untere rechte Ecke. Transponieren gibt dann
Dies fängt an, wie ein Sechseck auszusehen. Unter Verwendung der Symmetrie wird das Gitter erweitert, um die obere Hälfte zu erzeugen:
Jetzt müssen wir jeden Eintrag gleich eins durch die Anzahl der Nachbarn ersetzen. Hierfür verwenden wir die Faltung mit einer 3 × 5-Nachbarschaft (das heißt, der Kernel ist eine 3 × 5-Matrix von Einsen). Das Ergebnis,
hat zwei Probleme (die später behoben werden):
1
.Der Code addiert nun
47
zu jedem berechneten Wert. Dies entspricht dem Subtrahieren1
, um das Problem (2) zu lösen, und dem Addieren48
(ASCII für'0'
), wodurch jede Zahl in den Codepunkt des entsprechenden Zeichens konvertiert wird.Die resultierende Matrix wird dann mit einer Kopie des Null-Eins-Gitters multipliziert. Dies löst das obige Problem (1), indem die Punkte, die nicht Teil des hexagonalen Gitters sind, wieder gleich Null werden:
Schließlich wird dieses Zahlenfeld in ein Zeichenfeld umgewandelt. Null-Zeichen werden als Leerzeichen angezeigt, was das Endergebnis ergibt:
quelle
JavaScript (ES6),
118 bis117 ByteWobei
\n
ein buchstäbliches Newline-Zeichen darstellt. Erklärung: Angenommenn=4
. Wir beginnen mit dem folgenden durch Leerzeichen getrennten Ziffernquadrat:Die ersten
|n-i|
0
s werden gelöscht, aber die Leerzeichen bleiben:Sofortiges Sechseck! Es reicht dann aus, den entsprechenden Wert zu berechnen,
0
indem Sie prüfen, ob wir uns in der ersten oder letzten Zeile und / oder Spalte befinden. Bearbeiten: 1 Byte dank @Arnauld gespeichert.quelle
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 BytesTests sind auf ideone
Läuft durch die oberen bis mittleren Reihen und
for r in range(n)
baut Fäden:- Zwei Ecken oder zwei Kanten
'34'[r%m>0]*2
;- Füllen von ihnen mit wiederholtem Beitritt
'6'
oder'4'
,'46'[r>0]*(r+m-1)
;- Verbinden der Ecken und Kanten mit
' '
;- Leerzeichen voranstellen
' '*(m-r)
;Dann druckt dies und es ist Spiegelbild in der mittleren Reihe durch neue Linien verbunden,
print'\n'.join(t+t[-2::-1])
quelle
Python 2, 96 Bytes
Das sieht ziemlich chaotisch und etwas golfen aus ...
quelle
Java,
375363361339329317293 BytesUngolfed
Verwendung :
Ich bin sicher, dass der schreckliche verschachtelte if-else-Block kleiner geschrieben werden kann, aber ich kann es im Moment nicht herausfinden. Anregungen sind willkommen :-)
Aktualisieren
quelle
Integer.parseInt
anwenden, nicht so genau angesehen, aber ein paar kleine Golftipps für Ihren aktuellen Code: Kann zum Golfen verwendet werdenInteger.decode
.l=(h*4-3-s.trim().length())/2;if(l==0)
kann golfen werdenif((l=(h*4-3-s.trim().length())/2)==0)
. Es ist auch völlig akzeptabel, nur eine Methode ohne Klasse zu veröffentlichen (sofern in der Frage nichts anderes angegeben ist), sodass Sievoid f(int i){...use i...}
stattdessen auchinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}
einige Bytes einsparen sollten. Wenn ich mehr Zeit habe, schaue ich weiter.l=(h*4-3-s.trim().length())/2;if(l==0)
ist eigentlich gleich lang mitif((l=(h*4-3-s.trim().length())/2)==0)
.05AB1E , 44 Bytes
Erläuterung
Da die Ober- und Unterseite des Sechsecks gespiegelt sind, müssen wir nur den oberen Teil erzeugen.
Für eine Eingabe von X müssen wir also X- Zeilen generieren . Das macht die Hauptschleife.
Dann machen wir den mittleren Teil der Zeilen.
Dies ist 4 für die erste Reihe und 6 für den Rest (da wir nur den oberen Teil machen).
Wir verketten diese Zahl mit einem Leerzeichen, da das Muster einen Abstand zwischen den Zahlen erfordert.
Dann wiederholen wir diese Zeichenfolge X-2 + N- mal, wobei N die aktuelle Zeile mit dem Index 0 ist, und stellen links ein Leerzeichen voran.
Danach ist es Zeit für die Ecken. Sie sind 3 für die erste und letzte Reihe und 4 für die mittlere Reihe.
Jetzt müssen wir sicherstellen, dass die Zeilen richtig ausgerichtet sind, indem wir vor jeder Zeile Leerzeichen einfügen. Die Anzahl der hinzugefügten Leerzeichen ist X-1-N .
Nachdem der obere Teil des Rasters fertig ist, fügen wir die Zeilen zu einer Liste hinzu, erstellen eine umgekehrte Kopie und entfernen das erste Element aus dieser Kopie (da wir die mittlere Zeile nur einmal benötigen). Führen Sie dann diese beiden Listen zusammen und drucken.
Probieren Sie es online!
Zusätzliche Lösung, auch 44 Bytes:
quelle
Ruby, 87 Bytes
Die anonyme Funktion verwendet n als Argument und gibt ein Array von Zeichenfolgen zurück.
Ungolfed im Testprogramm
Eingabe über stdin. Schreibt die gesamte Form auf stdout. Ziemlich selbsterklärend.
quelle
V , 60 Bytes
Probieren Sie es online!
Das ist wirklich viel zu lang. Hier ist ein Hexdump, da dieser nicht druckbare Zeichen enthält:
quelle
Schläger, 487 Bytes
Testen:
Ausführliche Version:
quelle