Это одуванчики ASCII:
\|/ \ / |
/|\ | \|/ |
| | | _\|/_
| | | /|\
У одуванчиков ASCII есть три параметра: длина стебля (положительное число от 1 до 256, количество семян (положительное число от 0 до 7) и ориентация (^ или v). Вышеуказанные одуванчики имеют длину, семена и ориентацию, ( 3,5, ^), (3,2, ^), (2,3, ^) и (3,7, v) соответственно.
Семена заправляются в следующем порядке (перевернутый вверх дном для одуванчиков с опущенными головами), показан на одуванчике длиной 2:
seeds: 0 1 2 3 4 5 6 7
| \ / \|/ \ / \|/ _\ /_ _\|/_
| | | | /|\ /|\ /|\ /|\
| | | | | | | |
Соревнование:
Напишите программу / функцию, которая, когда в качестве входных данных передается одуванчик ASCII, возвращает его длину, количество семян и ориентацию, отформатированные аналогично вышеприведенным примерам, и когда заданные параметры в этом формате возвращают одуванчик ASCII с этими параметрами. Вы можете игнорировать круглые скобки и предполагать, что ввод / вывод будет числом, запятой, числом, запятой и любым из них ^
или v
. Вы можете заменить другие символы на ^
/, v
если они все еще могут легко интерпретироваться как «вверх» / «вниз» (например, u
/ d
). Вам не нужно различать одуванчики, которые выглядят одинаково, такие как (2,1, ^) и (3,0, ^) или (2,1, ^) и (2,1, v). Учитывая искусство ASCII, любой набор параметров будет приемлемым выводом, и оба набора параметров могут дать один и тот же рисунок ASCII.
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Пример программы на C # (даже не слегка в гольф):
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() + ",^";
}
}
^
иv
?Ответы:
Бин , 321 байт
Принимает ввод как одну строку в стандартном вводе без завершающей строки. Параметры будут взяты таким же образом, но отформатированы как
Выходные параметры программы при вводе одуванчика будут в том же формате, что и выше.
HexDump:
Эквивалентный JavaScript:
Неявно принимает stdin в качестве массива неотформатированных строк, разделенных символом новой строки,
_
и неявно выводит параметры в виде триплета. Тестовый набор ниже и демо здесь :источник
Javascript
513391379355 байтСпасибо @Neil за помощь в выводе из игры 134 байта и @Kritixi Lithos за помощь в выводе из игры 13 байтов. Эта программа предполагает, что все одуванчики ASCII, которые она пытается идентифицировать, имеют ширину линии 5 для всех строк строки. то есть: основа - 2 пробела, вертикальная линия тогда еще 2 пробела. (Он не может классифицировать одуванчики, которые он создает из-за этой проблемы)
Как это устроено
Функция проверяет, имеет ли первый аргумент, который ей дан, длину> 1 (является строкой). Если первый аргумент является строкой, он идентифицирует детали одуванчика ASCII.
Чтобы получить высоту одуванчика, он разбивает строку вокруг символов новой строки и подсчитывает количество элементов - 1. Чтобы получить количество семян, он подсчитывает количество непробельных символов в двух верхних и двух нижних строках. если в верхней части находится больше символов, он объявляется вертикальным и использует верхний счетчик-1, в противном случае он объявляется перевернутым и использует нижний счетчик-1. Если общая высота составляет только 2, он определяет вертикальность, проверяя количество каждой строки в отдельности и выбирая сторону с большим количеством непробельных символов.
В противном случае функция использует побитовую математику для присвоения значений от 0 до 7 в соответствии с формой каждого уровня одуванчика, который нужно нарисовать перед преобразованием каждого уровня в соответствующую строку.
Попробуйте онлайн
источник
(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
потому что выif
все равно возвращаетесь в детали. Кроме того, пока я здесь, я просто хотел указать, что некоторые функции, такие какsplit
иjoin
не нуждаются в()
s, когда вы вызываете их`
для строковых литералов в кавычках, поэтому я не включил их в свой предыдущий комментарий.`
s, а не'
с s или"
s.\n
вjoin`\n`
к новой строке (как в характере). Кроме того, вы можете изменить(h>2?1:0)
толькоh>2
и(h>2?2:1)
до(h>2)+1
. tio.run/#IRiKFPython 3,6,
476453448413394 байтаРешение :
Результат
Открываются
источник