Für diese Herausforderung besteht ein ASCII-Quilt aus einem Textblock mit einer Breite von 24 Zeichen und einer Höhe von 18 Zeilen, der die Zeichen =-<>/\
in einem quiltartigen Muster enthält, das horizontal und vertikal symmetrisch ist.
Beispiel Quilt:
========================
------------------------
//\\//\\\//\/\\///\\//\\
<<><<>>>>><<>><<<<<>><>>
/\\/\\\\/\/\/\/\////\//\
------------------------
/\/////\\///\\\//\\\\\/\
\///\/\/\\\\////\/\/\\\/
\///\/\/\\\\////\/\/\\\/
/\\\/\/\////\\\\/\/\///\
/\\\/\/\////\\\\/\/\///\
\/\\\\\//\\\///\\/////\/
------------------------
\//\////\/\/\/\/\\\\/\\/
<<><<>>>>><<>><<<<<>><>>
\\//\\///\\/\//\\\//\\//
------------------------
========================
Alle Quilts haben die gleiche Form:
- Sie sind immer 24 mal 18.
- Die oberste Zeile (Zeile 1) und die unterste Zeile (Zeile 18) sind
=
durchgehend. - Die Zeilen 2, 6, 13 und 17 sind
-
durchgehend. - Die Zeilen 4 und 15 sind das gleiche zufällige horizontal symmetrische Muster von
<
und>
. - Alle anderen Leitungen (3, 5, 7, 8, 9, 10, 11, 12, 14, 16) mit gefüllt
/
und\
in einer völlig zufälligen Art und Weise , so dass die gesamte Bettdecke bleibt horizontal und vertikal symmetrisch .
Beachten Sie, dass die Formen der Zeichen genau übereinstimmen , wenn Sie die Steppdecke vertikal oder horizontal genau zur Hälfte falten . Verwechseln Sie dies nicht mit den übereinstimmenden Charakteren. zb zeile 3 und zeile 16 sind nicht identisch, sie sind vertikale spiegelbilder.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die einen zufälligen ASCII-Quilt ausgibt oder zurückgibt.
Aufgrund der vielen fest codierten Zeilen und der Symmetrie kommt die einzige echte Zufälligkeit aus den ersten 12 Zeichen in den Zeilen 3, 4, 5, 7, 8, 9:
- Die ersten 12 Zeichen in Zeile 4 sollten eine beliebige Länge von 12 Zeichen
<
und haben>
. - Die ersten 12 Zeichen in den Zeilen 3, 5, 7, 8, 9 sollten 12 Zeichen lang
/
und\
(unabhängig voneinander) sein. - Diese zufälligen Zeichenfolgen werden dann entsprechend gespiegelt, um den gesamten Quilt zu erstellen.
Die kürzeste Antwort in Bytes gewinnt. Tiebreaker ist früherer Beitrag.
Sie können Pseudozufallszahlengeneratoren verwenden. (Nein, Sie brauchen nicht zu beweisen , dass alle 12 Zeichen String <>
oder /\
erzeugt werden kann , mit Ihnen die Sprache des PRNG.)
Die Ausgabe kann optional einen abschließenden Zeilenumbruch enthalten, jedoch keine abschließenden Leerzeichen oder andere Zeichen außer dem, was für den Quilt erforderlich ist.
Antworten:
CJam,
61605855545251 BytesMit Hilfe von Sp3000 und Optimizer etwas verkürzt.
Teste es hier.
Erläuterung
Wie bei diesen symmetrischen ASCII-Kunstherausforderungen üblich, erstelle ich einen Quadranten und erweitere ihn dann vollständig durch zwei geeignete Spiegelungsoperationen.
Für diese Erklärung sollte ich mit der Funktion beginnen
F
, die ich irgendwo auf dem Weg definiere, da sie an drei Stellen für drei verschiedene Dinge verwendet wird:Dies erwartet eine Ganzzahl oben auf dem Stapel und eine Zeichenfolge darunter. Sein Zweck ist es, die Zeichenfolge umzukehren und einige Zeichen auszutauschen, um die richtige Spiegelung zu erzielen. Die Ganzzahl ist entweder
1
oder3
und gibt an, ob (1
) sowohl Klammern als auch Schrägstriche ausgetauscht werden sollen oder (3
) nur Klammern ausgetauscht werden sollen. So funktioniert es:Nun zum Rest des Codes:
Die beiden Hälften und diese einzelne Zeile werden dann am Ende des Programms automatisch gedruckt.
quelle
Python 3,
257229192185176149143 BytesMit Hilfe von @xnor haben wir JS endlich eingeholt!
Beispielausgabe:
Erläuterung
(Etwas veraltet, wird später aktualisiert)
"444046402"
codiert die Zeilen, wobei sich jede Ziffer auf den Startindex der entsprechenden 2-Zeichen-Teilzeichenfolge von bezieht'--==\/<>'
. Jede einzelne Zeile wird durch wiederholtes Mischen der beiden Zeichen (unter Verwendung vonsample(...,2)
, darandom.shuffle
leider vorhanden) und Verbinden der Zeichenfolgen von innen nach außen aufgebaut .Ein vereinfachtes Beispiel dafür, wie die Erweiterung für die vierte Zeile aussehen könnte, ist:
was ergeben würde
><>><><<><
:Die Gesamtsteppdecke ist ebenfalls von innen nach außen gebaut, da der Bau mit der 9./10. Reihe beginnt und nach außen abläuft. Zu diesem Zweck beginnen wir mit einer leeren Liste
L
, in die wir beim Durchlaufen der Liste Zeilen vorne und hinten einfügenDie
n<"5"
Bedingung ist, zu überprüfen, ob wir eine Reihe haben, die aus><
besteht. In diesem Fall hängen wir eine identische Reihe an die Rückseite an, ansonsten ist es umgekehrt.Schließlich
*_,=
soll die Auswertungmap
erzwungen werden, damit das Drucken erfolgt, und es ist nur ein kürzerer Weg, dies zu tunprint("\n".join(L))
.Ich hatte lange Zeit die Funktion
die nimmt einen string und konvertiert
/\><
in\/<>
jeweils, aber ich habe es endlich geschafft, es loszuwerden :)quelle
Python 2, 300 Bytes
Dieses Programm verwendet
join, lambda, replace, sample, import
und andere ausführliche Funktionen, so dass es keine Golfpreise gewinnt.Der Code, bevor der Autogolfer ihn bekam:
Eine Beispielausgabe:
quelle
APL (
5358)Es ist leider nicht ganz so symmetrisch wie ich dachte. Fix hat mich 5 Charaktere gekostet und jetzt bin ich raus.
Erläuterung:
L←+,3-⌽
: L ist eine Funktion, die das Argument gefolgt von 3 zurückgibt - die Umkehrung des ArgumentsL{L?12⍴2}¨⍳9
: Erzeugt 9 Zeilen mit 12 Zufallswerten aus [1,2] plus deren Umkehrung, dann die Umkehrung dieser 9 Zeilen732451451260688⊤⍨18/8
: Liste generieren0 2 4 6 4 2 4 4 4 4 4 4 2 4 _7_ 4 2 0
(hier liegt die verdammte Asymmetrie)+
: Addieren Sie für jede Zeile die entsprechende Zahl zu jedem Wert↑
: Format als Matrix'==--/\<><'[
...]
: Wählen Sie für jede der Zahlen in der Matrix das Zeichen aus der Zeichenfolge an dieser Position ausAusgabe:
quelle
<>
Linien nicht vertikal symmetrisch sind, da Sie Ihre Swap-Tabelle verwenden, um auch den vertikalen Spiegel zu erstellen. (Danke, dass Sie übrigens die Ausgabe gepostet haben, um herauszufinden, ob APL viel einfacher funktioniert; p)<
am Ende der Zeichenfolge und erneutes Inkrementieren der zweiten Zeile, wodurch sie zweimal ausgetauscht wird). Musste nicht einmal das ganze Ding verschrotten, obwohl es jetzt nicht mehr gewinnen wird. (Vielleicht beim nächsten Mal , wenn ich should't die Ausgabe schreiben: P)PHP,
408,407,402,387, 379 BytesIch bin kein guter Golfer, aber dieses Problem klang lustig, also habe ich es ausprobiert.
Ungolfed Code
Die ungolfed-Version hat einen kleinen Bonus: Sie können eine Ganzzahl an seed übergeben
rand()
und jedes Mal den gleichen Quilt für einen seed erhalten:Das ergibt zum Beispiel diese schöne, handgewebte Steppdecke:
Bearbeiten : Es stellte sich heraus, dass meine erste Version keinen korrekten Quilt zurückgegeben hat. Also habe ich es behoben. Komischerweise ist der Fix noch kürzer.
quelle
['/','<','\\','>','a','b']
kann ersetzt werden['/','<','\\','>',a,b]
( man beachte die fehlenden Anführungszeichena
undb
),@$s
ersetzt werden kann$s
, können Sie speichernstr_repeat('-',12)
undstr_repeat('=',12)
in globalen Variablen / Konstanten,for($b=8;$b>=0;$b--)
können ersetzt werdenfor($b=9;$b--;)
,str_repeat
und wiederholte Funktionen können , indem sie verkürzt werden Ihr Name für eine globale Variable (zBglobal$R,$V;$R=str_repeat;$V=strrev;$V($R('=',12))
:) und Newlines (\n
) kann durch eine mehrzeilige Zeichenfolge ersetzt werden.strrev
unverändert, entfernte 1 Leerzeichen und ein paar kleine Änderungen.<>><><
Linien) gleich sein.JavaScript (ES6) 169
195 201Bearbeiten Sie 6 Bytes, die in @nderscore gespeichert wurden. Achtung, der Zeilenvorschub in Anführungszeichen ist signifikant und wird gezählt.
Edit2 vereinfachte Zeilenerstellung , ohne
reverse
undconcat
Führen Sie das Snippet zum Testen aus (in Firefox)
quelle
z
. Definition desQ
Anrufinneren verschiebenMath.random
. Ersetzen Sie'\n'
mit Schablonenzeichenfolge von Newline.|0
Ganzzahl-Casting ist nicht erforderlich, da die Werte später korrigiert werden.for(_ of-z+z)
bedeuten?z
ist nicht numerisch, also -z ist NaN (keine Zahl) NaN in Zeichenfolge umgewandelt ist "NaN" und 3 Zeichen + 9 Zeichen sind 12.Ruby,
162,155Ich mag dieses, weil es mich dazu brachte, Backslashes in beiden Stringliteralen und zu missbrauchen
String#tr
. Ansonsten ist der Code nicht besonders clever, nur kompakt.quelle
/
ina
und entkommen müssenb
. Der erstetr
kann wohl auch ohne Klammern auskommen. Es können einzelne Zeichenketten wie'='
geschrieben werden?=
. Und.join
kann durch ersetzt werden*
.join
Synonym sparen mir 6 Bytes. Ich kann die Klammern nicht entfernen,x+x.reverse.tr(a,b)
da sie+
Vorrang haben,
. Ich bin auch nicht wirklich entkommen die Schrägstriche in meinen Saiten - ich andernfalls ein Backslash in jedem zu entkommen. Eine Sekunde\
istb
aufgrund der Funktionsweise erforderlichtr
, obwohl ich jetzt feststelle, dass die erste\
ina
überflüssig ist, sodass es ein weiteres Byte gibt.Pyth, 57,
59, 61Vielen Dank an @Jakube für die Entwicklung dieser 57-Byte-Versionen.
Algorithmus sehr ähnlich zu Martins. (Überarbeitet) Erläuterung folgt.
Probieren Sie es online aus
Erläuterung:
quelle
"<>"
-GK
J"\<>/"K"\/"L+b_mXdK_Kbjbym+d_XdJ_JmsmOk12[\=\-K-JKK\-KKK
oderJ"\<>/"K"\/"jbu++HGXHK_Km+d_XdJ_JmsmOk12[KKK\-K-JKK\-\=)Y
J,
5654 BytesVerwendung:
1 Byte dank @FUZxxl.
Erklärung folgt in Kürze.
Probieren Sie es hier online aus.
quelle
5 1 3 1 5 1 1 1
durch(3(2})8$5,3#1)
.Python
295287227 BytesNicht so toll, aber ich werde es trotzdem posten:
Wenn Sie eine Erklärung wünschen, fragen Sie mich einfach.
quelle
=
und-
ind
.Javascript ( ES7-Entwurf )
174168146Einige Inspirationen von @ edc65
Edit: Danke an edc65 für einige Ideen zur Optimierung des Zeilenaufbaus.
Demonstration: ( nur Firefox )
Kommentiert:
quelle
Pharo 4, 236
oder normal formatiert:
Erläuterung:
Die Zeichenfolge
s:='====----/\/\/<><<>'
zusammen mit dem Block dientf:=[:c|s at:(s indexOf:c)+i]
hier sowohl zum Werfen der Zeichen als auch zum Umkehren der Muster ...Für i = 1 führt es eine horizontale Umkehrung durch (
/
<->\
,<
<->>
).Für i = 3 führt es eine vertikale Umkehrung durch (
/
<->\
)Für i 1 oder 2 atRandom =, werfen Sie es unter
/
oder\
,<
oder>
'=-/</-///'
codiert den Zeichentypc
, der den Blockf
für die 9 ersten Zeilen speist .#() , '=-/</-///'
ist ein Verkettungstrick zum Umwandeln des Strings in ein Array und somit zum Sammeln in ein Array.Der Rest ist eine einfache Verkettung nach dem Anwenden der horizontalen / vertikalen Symmetrie.
quelle
Quietschen 4.X, 247
Oder formatiert:
Erklärungen:
s:='==--/\<>'.
codiert offensichtlich die vier möglichen Paare.r:=(1<<108)atRandom.
Wirf 108 Bits (in einer LargeInteger) für 9 Zeilen * 12 Spalten (wir werfen die == und - unnötigerweise, aber die Leistung ist nicht unser Problem).h:=''
ist die Zeichenkette, in der wir verketten werden (Schlemiel-Maler, weil ein Stream in Zeichen zu kostspielig wäre).(16to:0by:-2),(0to:16by:2)do:[:i|
iteriert in den Zeilen (* 2)(11to:0by:-1),(0to:11) do:[:j|
iteriert auf den Spalten28266
ist eine magische Zahl, die das in den ersten 9 Zeilen zu verwendende Paar codiert.Es ist das Bitmuster
00 01 10 11 10 01 10 10 10
, bei dem 00 '==', 01 '-', 10 '/ \' und 11 '<>' codiert.101
ist eine magische Zahl, die die horizontale und vertikale Umkehrung codiert.Es ist das Bitmuster
0000 0000 0110 1010
, das codiert, wann das erste (0) oder zweite (1) Zeichen jedes Paares '==' '-' '/ \' und '<>' umgekehrt (1) oder nicht (0) werden soll. für die vertikale symetrie und horizontale symetrie.n:=3 bitAnd: 28266>>i
gibt die Kodierung des Zeichenpaares für die Zeile i / 2 an (0 für '==', 1 für '-', 2 für '/ \' und 3 für '<>').(r-1 bitAt: 6*i+j+1)
Wählen Sie das Zufallsbit für die Zeile i / 2, Spalte j (1 ist der Rang des niedrigsten Bits, daher haben wir ein +1, k atRandom-Wurf im Intervall [1, k], daher haben wir ein -1).(101 bitAt: 3-n*4+m+p)
Wählen Sie das Umkehrbit: (3-n) * 4 ist der Versatz für die Gruppe von 4 Bits entsprechend dem Paarcode n, m ist der vertikale Umkehrversatz (0 für die ersten 9, 2 für die letzten 9 Zeilen), p ist der Versatz horizontaler Umkehrversatz (0 für die ersten 12, 1 für die letzten 12 Spalten) +1, weil der niedrige Bitrang 1 ist.bitXor:
führt die Umkehrung durch (sie beantwortet einen Versatz von 0 oder 1) unds at:2*n+1+bitXor_offset
wählt das richtige Zeichen in s aus.Kostet aber
(A>>a)+(B>>b) bitAnd: 1
weniger Bytes, als(A bitAt:a+1)bitXor:(B bitAt:b+1)
damit das BitXor umgeschrieben wurde und Offset +1 auf p weg ist ...h,#[13]
Ist ein hässlicher Quietschismus, können wir einen String mit einem ByteArray verketten (der Code für den Wagenrücklauf enthält).quelle