Schreiben Sie das kürzeste Programm, das diesen ASCII-Kunstabschnitt einer hexagonalen Kachelung oder Wabe druckt :
__
__/ \__
__/ \__/ \__
/ \__/ \__/ \
\__/ \__/ \__/
/ \__/ \__/ \
\__/ \__/ \__/
/ \__/ \__/ \
\__/ \__/ \__/
\__/ \__/
\__/
- Es sollten keine Eingaben gemacht werden.
- Ausgabe auf stdout oder die nächstgelegene Alternative Ihrer Sprache.
- Anstelle eines Programms können Sie eine benannte Funktion schreiben , die keine Parameter annimmt und das Ergebnis normal ausgibt oder als Zeichenfolge zurückgibt.
- Die Ausgabe kann eine beliebige Anzahl von führenden und / oder nachfolgenden Zeilen aufweisen, und jede Zeile in der Ausgabe kann eine beliebige Anzahl von führenden und / oder nachfolgenden Leerzeichen aufweisen (sofern das Muster ordnungsgemäß ausgerichtet ist).
- Der kürzeste Code in Bytes gewinnt.
code-golf
ascii-art
kolmogorov-complexity
tiling
hexagonal-grid
Calvins Hobbys
quelle
quelle
Antworten:
CJam,
4543424140 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
Wiederholt das Muster
\__/
38 Mal und teilt es in Stücke mit der Länge 21 auf . Wenn die Blöcke durch Zeilenvorschübe getrennt wären, wäre dies das Ergebnis:Dieser enthält eindeutig die gewünschte Wabe. Sie müssen lediglich einige Zeichen durch Leerzeichen ersetzen, andere abschneiden und die Zeilenvorschübe einführen.
generiert die Ganzzahl 74 100 000 036 und konvertiert sie in das Array [7 4 1 0 0 0 0 0 0 3 6] . Jedes Array-Element codiert die Anzahl der führenden Zeichen der entsprechenden Zeile, die durch Leerzeichen ersetzt werden müssen. Indem wir diese Zahl von 16 subtrahieren , erhalten wir auch die richtige Länge für diese Zeile.
Da ein Leerzeichen einen niedrigeren Codepunkt als die anderen Zeichen von L hat und vektorisierte Operatoren die Zeichen der längeren Zeichenfolge, die keinem der kürzeren Zeichen entsprechen, unberührt lassen, werden
.e<
die ersten D- Zeichen durch Leerzeichen ersetzt.quelle
Python 2, 73
Sehen Sie es laufen.
Berechnet für jede der 11 Ausgabezeilen die Anzahl der führenden Leerzeichen
k
als maximal drei lineare Funktionen, die die Hüllkurve der linken Seite des Sechsecks bilden. Da die diagonalen Linien Steigung3
und haben-3
, ist es besser, die Zeilennummer als zu indiziereni=0,3,...30
.Um das Sechsecknetz zu erstellen, müssen Sie zuerst genügend Teile der Einheit kacheln
'\__/ '
. Durch Verschieben[i:]
wird es dann für ungerade Zeilen um 3 neu ausgerichtet. Schließlich nehmen wir den benötigten Teil[k:16-k]
und lassenk
links und rechts einen Rand frei .quelle
CJam,
655655 BytesProbieren Sie es online im CJam-Interpreter aus .
Idee
Die rechte Hälfte jeder Zeile ist eine umgekehrte Kopie der linken Hälfte mit getauschten Schrägstrichen und umgekehrten Schrägstrichen. Daher genügt es, die linke Hälfte der Wabe zu codieren:
Anstatt dieses Muster Zeile für Zeile zu analysieren, können wir es Spalte für Spalte analysieren:
Offensichtliche Muster entstehen:
_ _ _ _
kommt fünfmal vor./
folgt ein\
.Jeden durch Ersetzen
/\
,_
,_ _ _ _
und Raum mit einer Zahl von 0 bis 3, kann man das resultierende Array von einer Zahl zur Basis 4 zu einer höheren Basis und speichere das vollständige Muster in einer kompakten Art und umzuwandeln.Code
quelle
C
148144140 BytesMit Leerzeichen, ohne Compiler-Warnungen und vor einigen Code-Optimierungen, um ein paar Bytes zu sparen:
Dieser Ansatz verwendet keine Zeichen- / Zeichenfolgentabellen. Es durchläuft alle 187 (11 Zeilen, 17 Spalten, einschließlich Zeilenvorschub) und entscheidet anhand einer Kombination von Bedingungen, welches Zeichen für jede Position gedruckt werden soll.
Die Bedingungen umfassen einen Test, um innerhalb / außerhalb der 4 Ecken zu sein, unter Verwendung von 4 Liniengleichungen, wobei das Ergebnis in Variable gespeichert wird
p
. Der Rest wiederholt sich dann meist alle 6 Zeichen, wobei die ungeraden Zeilen gegenüber den geraden Zeilen um 3 Zeichen verschoben sind.quelle
int
.k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
Ruby - 78 Bytes
Eine Transkription von xnors Lösung (69 Bytes):
quelle
11.times
spart 2 BytesJavaScript (ES6), 129
130Dies ist eine reine Zeichenfolge zum Ersetzen / Ersetzen / Ersetzen, die keine geometrischen Eigenschaften ausnutzt.
Bei Verwendung von Vorlagenzeichenfolgen sind alle Zeilenumbrüche signifikant und zählen.
Führen Sie zum Testen das Snippet in Firefox aus
quelle
PHP -
1391371071019187 BytesIch weiß nicht, ob dies der beste Weg ist, um Golf zu spielen, aber hier ist mein Versuch:
303646-50 Bytes dank Ismael MiguelTesten Sie es hier online
alter Code:
quelle
<?
anstelle von<?php
3 Bytes speichern. Stattdessen$c=$a.$a."/ \\\n\__".$a.$a."/\n";
können Sie schreiben$c="$a$a/ \\\n\__.$a$a/\n";
(da PHP Variablen in Strings erweitert). Sie können dieselbe Logik auf die anwendenecho
, um ihre Länge weiter zu verringern. Außerdem benötigen Sie diesen Abstand zwischen derecho
und der Zeichenfolge nicht.\n
, können Sie eine echte neue Zeile einfügen und 1 Byte pro Zeile speichern.<?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";
. Denken Sie daran, das\t
Zeichen durch ein Tabulatorzeichen und\n
eine echte Newline zu ersetzen .Lua 146
(Zeilenumbrüche zur Verdeutlichung hinzugefügt)
quelle
S
dreimal wiederholt habe .Dart - 113
Reine String-Interpolationslösung, nichts Besonderes. Zeichenfolgenoperationen wie "Teilzeichenfolge" sind zu ausführlich, um in der Praxis konkurrieren zu können.
Führen Sie es auf DartPad aus .
quelle
Javascript ( ES7-Entwurf ),
969493 BytesInspiration aus ein paar Lösungen hier ...
Edit: -1 von edc65
Kommentiert:
quelle
.substr(+x+z,16-x-x)
->.slice(+x+z,16-x+z)
-1+x
statt nurx
?x
zu einer Zahl zu werfen . Ohne sie würde es verkettenz
Python 3,
10087 BytesUnd eine lesbare Version des Codes unten. Die Idee ist, die Intervalle (Anfang, Länge) fest zu codieren und dann mit der richtigen Anzahl von Leerzeichen zu füllen, um das Intervall zu zentrieren.
quelle
Netzhaut , 66 Bytes
Jede Zeile sollte in eine eigene Datei gehen und
<LF>
bedeutet, dass die Datei tatsächlich eine neue Zeile enthält. 1 Byte pro zusätzlicher Datei zur Byteanzahl hinzugefügt.Sie können den Code als eine Datei mit dem
-s
Flag<LF>
ausführen , wobei die Markierungen beibehalten und gegebenenfalls in der Ausgabe in Zeilenumbrüche geändert werden, um die Lesbarkeit zu gewährleisten.Der Algorithmus besteht aus 5 einfachen Ersatzschritten (Ändern des Inhalts einer ungeraden Zeile in einen Inhalt einer geraden Zeile), beginnend mit einer leeren Eingabezeichenfolge. Die Ergebnisse nach jedem Schritt sind (durch
=
's begrenzt):quelle
Javascript,
154151 Bytesquelle