Ce sont des pissenlits ASCII:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\
Les pissenlits ASCII ont trois paramètres: Longueur de la tige (nombre positif entre 1 et 256, nombre de graines (nombre positif entre 0 et 7) et orientation (^ ou v). Les pissenlits ci-dessus ont pour longueur, graines et orientation, ( 3,5, ^), (3,2, ^), (2,3, ^) et (3,7, v) respectivement.
Les graines sont remplies dans l'ordre suivant (retourné à l'envers pour les pissenlits tête en bas), illustré sur un pissenlit de longueur 2:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |
Le défi:
Écrivez un programme / une fonction qui, lorsqu'il reçoit un pissenlit ASCII en entrée, renvoie sa longueur, son nombre de graines et son orientation formatés de la même manière que dans les exemples ci-dessus et lorsque des paramètres donnés dans ce format renvoient un pissenlit ASCII avec ces paramètres. Vous pouvez ignorer les parenthèses et supposer que l'entrée / sortie sera un nombre, une virgule, un nombre, une virgule et soit ^
ou v
. Vous pouvez remplacer d'autres caractères par ^
/ v
tant qu'ils peuvent toujours être facilement interprétés comme «haut» / «bas» (par exemple, u
/ d
). Vous n'avez pas besoin de distinguer les pissenlits qui se ressemblent, tels que (2,1, ^) et (3,0, ^) ou (2,1, ^) et (2,1, v). Étant donné l'art ASCII, l'un ou l'autre ensemble de paramètres serait une sortie acceptable, et les deux ensembles de paramètres peuvent donner le même art ASCII.
C'est le code-golf , donc le code le plus court en octets l'emporte.
Un exemple de programme en C # (pas même légèrement golfé):
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() + ",^";
}
}
^
etv
?Réponses:
Bean , 321 octets
Accepte l'entrée en tant que chaîne unique dans stdin sans retour à la ligne. Les paramètres seront pris de la même manière, mais formatés comme
Les paramètres de sortie du programme lorsque l'entrée est un pissenlit seront au même format que ci-dessus.
Hexdump:
JavaScript équivalent:
Prend implicitement stdin comme un tableau de chaînes non formatées séparées par des sauts de ligne et génère
_
implicitement les paramètres sous forme de triplet. Suite de tests ci-dessous et démonstration ici :la source
Javascript
513391379355 octetsMerci à @Neil pour avoir aidé le golf sur 134 octets et @Kritixi Lithos pour avoir aidé le golf sur 13 octets. Ce programme suppose que tous les pissenlits ASCII qu'il essaie d'identifier ont une largeur de ligne de 5 pour toutes les lignes de la chaîne. soit: la tige est de 2 espaces, la ligne verticale puis encore 2 espaces. (Il ne peut pas classer les pissenlits qu'il crée en raison de ce problème)
Comment ça fonctionne
La fonction vérifie si le premier argument qui lui est donné a une longueur> 1 (est une chaîne). Si le premier argument est une chaîne, il identifie les détails du pissenlit ASCII.
Pour obtenir la hauteur du pissenlit, il divise la chaîne autour des caractères de nouvelle ligne et compte le nombre d'éléments - 1. Pour obtenir le nombre de graines, il compte le nombre de caractères non spatiaux sur les deux lignes du haut et du bas. s'il y a plus de caractères en haut, il est déclaré vertical et il utilise le décompte supérieur-1, sinon il est déclaré à l'envers et utilise le décompte inférieur-1. Si la hauteur totale n'est que de 2, elle détermine la droiture en vérifiant les nombres de chaque ligne individuellement et en choisissant le côté avec plus de caractères non espace.
Sinon, la fonction utilise des mathématiques au niveau du bit afin d'affecter des valeurs de 0 à 7 en fonction de la forme de chaque niveau du pissenlit à dessiner avant de convertir chaque niveau dans la chaîne appropriée.
Essayez-le en ligne
la source
(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
car vous revenezif
quand même dans la pièce. De plus, pendant que je suis ici, je voulais simplement souligner que certaines fonctions telles quesplit
etjoin
n'ont pas besoin des()
s lorsque vous les invoquez sur`
des littéraux de chaîne entre guillemets, c'est pourquoi je ne les ai pas incluses dans mon commentaire précédent.`
s, pas'
s ou"
s.\n
dansjoin`\n`
une nouvelle ligne (comme dans le caractère). Vous pouvez également changer le(h>2?1:0)
en justeh>2
et le(h>2?2:1)
en(h>2)+1
. tio.run/#IRiKFPython 3.6,
476453448413394 octetsSolution :
Résultat
Se dérouler
la source