Są to mlecze ASCII:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\
Mniszek lekarski ASCII ma trzy parametry: długość łodygi (liczba dodatnia od 1 do 256, liczba nasion (liczba dodatnia od 0 do 7) oraz orientacja (^ lub v). Powyższe mlecze mają długość, nasiona i orientację ( Odpowiednio 3,5, ^), (3,2, ^), (2,3, ^) i (3,7, v).
Nasiona są wypełniane w następującej kolejności (odwrócone do góry nogami w przypadku dmuchawek z głową w dół), zilustrowane na mniszku lekarskim o długości 2:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |
Wyzwanie:
Napisz program / funkcję, która po podaniu mniszka lekarskiego ASCII jako danych wejściowych zwraca jego długość, liczbę nasion i orientację sformatowane podobnie do powyższych przykładów, a gdy podane parametry w tym formacie zwracają mniszka lekarskiego ASCII z tymi parametrami. Możesz zignorować nawias i przyjąć, że wejście / wyjście będzie liczbą, przecinkiem, liczbą, przecinkiem i jednym ^
lub drugim v
. Możesz zastępować inne znaki przez ^
/ v
, o ile nadal można je łatwo interpretować jako „góra” / „dół” (na przykład u
/ d
). Nie musisz rozróżniać mniszek lekarskich, które wyglądają tak samo, takich jak (2,1, ^) i (3,0, ^) lub (2,1, ^) i (2,1, v). Biorąc pod uwagę sztukę ASCII, każdy zestaw parametrów byłby akceptowalnym wyjściem, a oba zestawy parametrów mogą dawać tę samą sztukę ASCII.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Przykładowy program w języku C # (nawet nieznacznie golfowym):
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() + ",^";
}
}
^
iv
?Odpowiedzi:
Fasola , 321 bajtów
Akceptuje wprowadzanie jako pojedynczy ciąg w stdin bez końcowego znaku nowej linii. Parametry będą pobierane w ten sam sposób, ale sformatowane jako
Parametry wyjściowe programu, gdy wejściem jest mniszek lekarski, będzie miało taki sam format jak powyżej.
Hexdump:
Odpowiednik JavaScript:
Pośrednio przyjmuje stdin jako separowaną od nowej linii tablicę niesformatowanych ciągów
_
i niejawnie wyprowadza parametry jako tryplet. Pakiet testowy poniżej i demo tutaj :źródło
JavaScript
513391379355 bajtówDzięki @Neil za pomoc w golfie przy 134 bajtach i @Kritixi Lithos za pomoc w golfie przy 13 bajtach Ten program zakłada, że wszystkie mlecze ASCII, które próbuje zidentyfikować, mają szerokość linii 5 dla wszystkich linii łańcucha. tzn .: trzon ma 2 spacje, linię pionową, a następnie kolejne 2 spacje. (Nie można sklasyfikować mlecze, które tworzy z powodu tego problemu)
Jak to działa
Funkcja sprawdza, czy pierwszy podany argument ma długość> 1 (jest łańcuchem). Jeśli pierwszy argument jest ciągiem, identyfikuje on szczegóły mniszka lekarskiego ASCII.
Aby uzyskać wysokość mniszka lekarskiego, dzieli łańcuch wokół znaków nowego wiersza i liczy liczbę elementów - 1. Aby uzyskać liczbę nasion, zlicza liczbę znaków spacji w dwóch górnych i dolnych dwóch wierszach. jeśli na górze znajduje się więcej znaków, deklaruje się, że jest pionowy i używa górnego licznika-1, w przeciwnym razie deklarowany jest do góry nogami i używa dolnego licznika-1. Jeśli całkowita wysokość wynosi tylko 2, określa ona pionowość, sprawdzając liczbę poszczególnych linii indywidualnie i wybierając stronę z większą liczbą znaków spacji.
W przeciwnym razie funkcja korzysta z matematyki bitowej w celu przypisania wartości od 0 do 7 zgodnie z kształtem każdego poziomu mniszka lekarskiego, który ma zostać narysowany przed przekształceniem każdego poziomu w odpowiedni ciąg.
Wypróbuj online
źródło
(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
ponieważ i tak wracasz wif
części. Również będąc tutaj, chciałem tylko podkreślić, że niektóre funkcje, takie jaksplit
ijoin
nie potrzebują ich,()
gdy wywołuje się je w`
cudzysłowach ciągów znaków, dlatego nie uwzględniłem ich w poprzednim komentarzu.`
s, nie'
s lub"
s.\n
injoin`\n`
na nowy wiersz (jak w znaku). Ponadto można zmienić(h>2?1:0)
tylkoh>2
i(h>2?2:1)
do(h>2)+1
. tio.run/#IRiKFPython 3.6,
476453448413394 bajtówRozwiązanie :
Wynik
Rozwijać się
źródło