Dies sind ASCII-Löwenzahn:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\
ASCII-Löwenzahn hat drei Parameter: Länge des Stängels (positive Zahl zwischen 1 und 256, Anzahl der Samen (positive Zahl zwischen 0 und 7) und Orientierung (^ oder v). Die obigen Löwenzahn hat für Länge, Samen und Orientierung ( 3,5, ^), (3,2, ^), (2,3, ^) bzw. (3,7, v).
Die Samen werden in der folgenden Reihenfolge (bei kopfüber gedrehtem Löwenzahn mit Kopf nach unten) gefüllt, die auf einem Löwenzahn mit der Länge 2 abgebildet ist:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |
Die Herausforderung:
Schreiben Sie ein Programm / eine Funktion, die bei Eingabe eines ASCII-Löwenzahns dessen Länge, Anzahl der Startwerte und Ausrichtung zurückgibt, die ähnlich wie in den obigen Beispielen formatiert sind, und bei Angabe von Parametern in diesem Format einen ASCII-Löwenzahn mit diesen Parametern zurückgibt. Sie können die Klammern ignorieren und davon ausgehen, dass die Eingabe / Ausgabe eine Zahl, ein Komma, eine Zahl, ein Komma und entweder ^
oder ist v
. Sie können ^
/ durch andere Zeichen ersetzen v
, solange diese leicht als 'hoch' / 'runter' interpretiert werden können (z. B. u
/ d
). Sie müssen nicht zwischen Löwenzahn, der gleich aussieht, wie (2,1, ^) und (3,0, ^) oder (2,1, ^) und (2,1, v) unterscheiden. In Anbetracht der ASCII-Grafik wäre jeder Parametersatz eine akzeptable Ausgabe, und beide Parametersätze können dieselbe ASCII-Grafik ergeben.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Ein Beispielprogramm in C # (nicht einmal leicht golfen):
string Dandelion(string s)
{
if (s.Contains(','))
{
//got parameters as input
string[] p = s.Split(',');
//depth and width (number of seeds)
int d = int.Parse(p[0]);
int w = int.Parse(p[1]);
//draw stem
string art = " |";
while (d > 2)
{
d--;
art += "\n |";
}
//draw head
string uhead = (w % 2 == 1 ? "|" : " ");
string dhead = uhead;
if (w > 1)
{
uhead = "\\" + uhead + "/";
dhead = "/" + dhead + "\\";
if (w > 5)
{
uhead = "_" + uhead + "_\n /|\\";
dhead = "_\\|/_\n " + dhead;
}
else if (w > 3)
{
uhead = " " + uhead + " \n /|\\";
dhead = " \\|/ \n " + dhead;
}
else
{
uhead = " " + uhead + " \n |";
dhead = " |\n " + dhead;
}
}
else
{
uhead = " " + uhead + "\n |";
dhead = " |\n " + dhead;
}
//add head to body
if (p[2] == "^")
{
return uhead + "\n" + art;
}
return art + "\n" + dhead;
}
else
{
//ASCII input
string[] p = s.Split('\n');
int l = p.Length - 1;
int offset = 0;
//find first non-' ' character in art
while (p[0][offset] == ' ')
{
offset++;
}
int w = 0;
if (p[0][offset] == '|')
{
//if '|', either head-down or no head.
if (offset == 0 || p[l][offset - 1] == ' ')
{
//if no space for a head to the left or no head at the bottom, no head.
return l.ToString() + ",1,^";
}
//head must have at least size 2, or else indistinguishable from no head case
w = 6;
if (p[l][offset] == '|')
{
//odd sized head
w = 7;
}
if (offset == 1 || p[l - 1][offset - 2] == ' ')
{
//not size 6 or 7
w -= 2;
if (p[l - 1][offset - 1] == ' ')
{
//not size 4 or 5
w -= 2;
}
}
return l.ToString() + "," + w.ToString() + ",v";
}
else if (p[0][offset] == '\\')
{
//head at least size 2 and not 6/7, or indistinguishable from no head.
w = 4;
if (p[0][offset + 1] == '|')
{
w = 5;
}
if (p[1][offset] == ' ')
{
w -= 2;
}
}
else
{
w = 6;
if (p[0][offset + 2] == '|')
{
w = 7;
}
}
return l.ToString() + "," + w.ToString() + ",^";
}
}
^
und auch andere unterschiedliche Symbole verwendenv
?Antworten:
Bean , 321 Bytes
Akzeptiert die Eingabe als einzelne Zeichenfolge in stdin ohne Zeilenumbruch. Die Parameter werden auf die gleiche Weise übernommen, jedoch formatiert wie
Die Ausgabeparameter des Programms, wenn die Eingabe ein Löwenzahn ist, haben dasselbe Format wie oben.
Hexdump:
Entsprechendes JavaScript:
Nimmt stdin implizit als durch Zeilenumbrüche getrenntes Array unformatierter Zeichenfolgen auf
_
und gibt die Parameter implizit als Triplett aus. Test Suite unten und Demo hier :quelle
Javascript
513391379355 BytesVielen Dank an @Neil für die Unterstützung beim Golfspielen von 134 Bytes und @Kritixi Lithos für die Unterstützung beim Golfspielen von 13 Bytes. Dieses Programm geht davon aus, dass alle ASCII-Löwenzahnlinien, die es zu identifizieren versucht, eine Linienbreite von 5 für alle Linien der Zeichenfolge haben. Das heißt: Der Stamm besteht aus 2 Feldern, die vertikale Linie aus 2 weiteren Feldern. (Löwenzahn, der aufgrund dieses Problems entsteht, kann nicht klassifiziert werden.)
Wie es funktioniert
Die Funktion prüft, ob das erste angegebene Argument eine Länge> 1 hat (ein String ist). Wenn das erste Argument eine Zeichenfolge ist, werden die Details des ASCII-Löwenzahns identifiziert.
Um die Höhe des Löwenzahns zu ermitteln, wird die Zeichenfolge um Zeilenumbrüche herum aufgeteilt und die Anzahl der Elemente gezählt. Wenn oben mehr Zeichen stehen, wird es als aufrecht deklariert und verwendet die obere Anzahl-1. Andernfalls wird es als verkehrt herum deklariert und verwendet die untere Anzahl-1. Wenn die Gesamthöhe nur 2 beträgt, wird die Aufrichtigkeit bestimmt, indem die Anzahl der Zeilen einzeln überprüft und die Seite mit mehr Zeichen ohne Leerzeichen ausgewählt wird.
Andernfalls verwendet die Funktion bitweise Mathematik, um Werte von 0 bis 7 entsprechend der Form jeder Ebene des zu zeichnenden Löwenzahns zuzuweisen, bevor jede Ebene in die entsprechende Zeichenfolge konvertiert wird.
Probieren Sie es online aus
quelle
(x,y,z,a=[...Array(x+1)].fill(1))=>a.map(n=>', |, \\ /, \\|/,_\\ //,_\\|/_, / \\, /|\\'.split`,`[n],z<'v'?(a[0]=y&4?y-2:y,a[1]=y&4?7:1):(a[x-1]=1+(y>4)*2+(y>4)*(y&2),a[x]=y&1+(y>2)*6)).join`\n`
else
weil Sie dasif
Teil trotzdem zurückgeben. Auch während ich hier bin, wollte ich nur darauf hinweisen, dass einige Funktionen wiesplit
undjoin
nicht das()
s benötigen, wenn Sie sie in`
String-Literalen mit Anführungszeichen aufrufen , weshalb ich sie in meinem vorherigen Kommentar nicht aufgenommen habe.`
s, nicht mit'
s oder"
s.\n
injoin`\n`
eine neue Zeile ändern (wie im Zeichen). Auch Sie können das(h>2?1:0)
zu geradeh>2
und das(h>2?2:1)
zu ändern(h>2)+1
. tio.run/#IRiKFPython 3.6,
476453448413394 BytesLösung :
Ergebnis
Entfalten
quelle