Bei einer positiven Ganzzahl N ("Viralität") sollte Ihr Programm eine ASCII-Zeichnung eines Baums mit zwei Zweigen der Länge N erstellen, die sich von der oberen linken Ecke nach unten und / oder rechts erstrecken.
Die Richtung, die jeder Zweig nach dem ersten Sternchen einnimmt, kann entweder nach rechts oder nach unten sein, und diese Auswahl sollte bei jedem nächsten Schritt zufällig 1 getroffen werden.
Bei einer Eingabe von 5 könnte die Ausgabe beispielsweise folgendermaßen aussehen:
***
* ***
**
**
Die beiden Zweige dürfen sich berühren (sich in benachbarten Zellen befinden), dürfen sich jedoch nicht überlappen (sich in derselben Zelle befinden), sodass Folgendes nicht zulässig ist:
***
* *
*****
*
*
Beispiele
Für die Eingabe 1
ist die einzig mögliche Ausgabe:
**
*
(Dies ist in allen gültigen Ausgaben vorhanden, da sich die beiden Zweige überlappen, wenn sie denselben Pfad nehmen.)
Mögliche Ausgaben für eine Eingabe von 3
umfassen:
***
* *
**
**
***
*
*
Zur Eingabe 7
:
****
* **
* **
*
***
*
Zur Eingabe 10
:
****
* *
*********
*
*****
Dies ist Code-Golf , daher gewinnt die kürzeste gültige Antwort (in Bytes).
1. Dies sollte gleichmäßig zufällig sein (dh eine 50/50-Chance für jede Richtung) oder so gleichmäßig zufällig sein, wie es mit normaler Hardware möglich ist.
0
s und1
s anstelle von Leerzeichen und Sternchen zurückgeben?Antworten:
CJam ,
5851 BytesProbieren Sie es online aus!
Die Grundidee ist, dass wir mit
[0 0]
jedem Element beginnen und dann wiederholt entweder 0 oder 1 hinzufügen (wobei sichergestellt wird, dass sie nur zu Beginn gleich sind, um Überlappungen zu vermeiden), um alle Zwischenergebnisse zu sammeln.Wir erstellen dann ein großes Array von Arrays, in denen jedes Subarray
*
Indizes enthält , die durch das entsprechende Paar im ursprünglichen Array angegeben sind, und überall sonst Leerzeichen.Dies ergibt diagonale Schichten der Ausgabematrix (wobei das Verschieben von links nach rechts dem Verschieben von oben rechts nach unten links in der tatsächlichen Matrix entspricht).
Wir können dann verwenden,
::a:.+
um "zu diagonalisieren" und die resultierenden Linien zu erhalten:quelle
Holzkohle ,
3124 BytesProbieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Ursprünglich dachte ich, es wäre einfacher, den ersten Schritt zufällig zu machen, aber es stellte sich als Golfspiel heraus, den ersten Zweig vorhersehbar zu machen. Erläuterung:
Schleife zweimal mit Indexvariable
i
. (Dies iteriert tatsächlich über eine implizite Liste, sodass es sicher ist,i
innerhalb der Schleife zu mutieren .)Springe zum Ursprung der Leinwand.
Schleifenzeiten
N+1
.Drucken Sie a
*
, aber lassen Sie den Cursor je nach Wert von entweder rechts oder unterhalb des Cursorsi
.Randomisieren Sie den Wert von
i
für die nächste Iteration der inneren Schleife.Wenn das aktuelle Zeichen a ist
*
, bedeutet dies, dass wir der zweite Zweig sind und statt rechts nach unten gegangen sind. Bewegen Sie sich also nach rechts, um dies zu korrigieren. (Der erste Zweig beginnt immer nach unten, sodass der zweite Zweig immer darüber liegt, was bedeutet, dass wir nur nach einer vertikalen Kollision suchen müssen.)quelle
N
große Zweige, aberN-1
Größe :)Java 10,
273272268239 BytesProbieren Sie es hier online aus .
Vielen Dank an Kevin Cruijssen für das Golfen von 29 Bytes.
Ungolfed Version:
quelle
do{}
ein wenig geändert (und die Ints im ersten Teil der for-Schleife platziert). PS: In Ihrer ersten Antwort0.5
hätte man auch Golf spielen können.5
.Perl 5 ,
208124122118 Bytes118 Bytes ohne Zeilenumbrüche, Einrückungen und Kommentare. Nimmt N von stdin:
Probieren Sie es online aus!
quelle
2..$N
auf1..shift
jetzt geändert und auch ein paar Bytes rasiert.<>
und anstelle vonshift
und Argumenten speichern sowie die von Ihnen aufgerufene Neuanordnungrand
, um die Parens zu vermeiden. Sie sollten Ihre Aufgabe auch nicht abschließen müssen@o
. Ich habe versucht,@b=([],[]);
das zu verwenden, was zu funktionieren scheint, aber ich habe nicht zu viel experimentiert, sodass ich dort möglicherweise einen Randfall verpasst habe. Hoffe sie helfen ein wenig!Python 2 , 204 Bytes
Probieren Sie es online aus!
quelle
Perl 5
-a
,97969392 BytesHat keine rechte, untere oder nicht diagonale Vorspannung.
Probieren Sie es online aus!
quelle
PHP, 118 Bytes
erfordert PHP 5.4 oder höher für den Elvis-Operator. Ersetzen Sie
?:
durch?1:
für älteres PHP.Laufen Sie als Pipe mit
-nR
oder probieren Sie es online aus .quelle
$argBak=$argn=
$argn
. In einer realen Umgebung$argn
kommt von STDIN, wenn Sie es als Pipe mit ausführen-R
. Es wird dann den Code für jede Eingabezeile ausführen (aber ich bin mir ziemlich sicher, dass PHP die Variablen dazwischen nicht deaktiviert; explizite aufeinanderfolgende Läufe vermeiden eher böse Überraschungen.)Rot ,
195190 BytesProbieren Sie es online aus!
Lesbar:
quelle
Gelee ,
504341 BytesProbieren Sie es online aus!
Es hat wirklich Spaß gemacht, dies zu schreiben. Es könnte eine viel optimalere Methode geben. Es gibt wahrscheinlich auch einige Möglichkeiten zum Golfen innerhalb dieser Methode.
Gleich nachdem ich dies gepostet hatte, wurde mir klar, dass ich
,þ`
stattdessen verwenden könnteaþ,""oþ`Ɗ
.quelle
R ,
148142 BytesProbieren Sie es online aus!
Obwohl es nicht der Ausgabespezifikation entspricht, können Sie die beiden Zweige unterscheiden: Probieren Sie es online aus!
Erläuterung:
Ausgehend von Index
1
wählen wir zufällig eine rechts oder links für Zweigr
durch Hinzufügenn
oder1
sind. Dann wählen wir eine andere Rechts- oder Linksbewegung für den Zweig ausk
, und wenn sie sich überschneidenr
würde, wählen wir die andere Richtung. Dann verwenden wirr
undk
als Indizes inm
und setzen diese Werte als"*"
. Durchlaufzeitenn-1
drucken wir dann das Ergebnis.quelle
Gelee ,
3938 BytesProbieren Sie es online aus!
Obwohl dies scheinbar nichts miteinander zu tun hat,
d
ist es hier nützlich, ein Byte zu speichern (gegenüber meinem vorherigen Ansatz).quelle
Python 2 ,
191187176 BytesProbieren Sie es online aus!
Python bietet native Unterstützung für komplexe Zahlen des Formulars
a+bj
. Dies macht einige 2-D-Probleme ein bisschen leichter zu handhaben ...quelle