Соревнование
Ваша программа или функция будет принимать однострочный ввод из STDIN или параметр функции. Вы можете предполагать, что ввод будет содержать только буквенные символы (a-zA-Z), пробелы и точки остановки. Ввод нечувствителен к регистру, поэтому вы должны обращаться с «a» точно так же, как с «A».
Для каждого символа в строке вы будете выводить представление здания согласно следующей спецификации.
Каждое здание должно иметь крышу, обозначенную подчеркиванием в верхней строке, затем косой чертой, пробелом, обратной косой чертой во второй строке.
_
/ \
Затем у вас будет несколько этажей, соответствующих буквенному номеру (a = 1, b = 2, c = 3 и т. Д.), Которые представлены стеной (|) с каждой стороны и пробелом в середине. Нижний этаж (и только нижний этаж) должен иметь фундамент, который является подчеркиванием между стенами. Так...
|_|
Так, например, «б» будет выглядеть так
_
/ \
| |
|_|
Теперь мы знаем, что очень высокие узкие здания не могут стоять и должны становиться шире у основания, поэтому ни одно здание не может стоять более трех этажей без какой-либо дополнительной поддержки. Таким образом, каждые три уровня (не меньше) вы должны добавить «расширяющийся слой». Расширяющийся слой состоит из косой черты и обратной косой черты непосредственно над стенками секции под ним, а секция внизу должна быть на два пространства шире, чем секция выше. Дополнительный слой не учитывается по высоте здания.
Здания не должны пересекаться, но между ними не должно быть лишних пространств, а земля всегда плоская, поэтому все здания должны располагаться на одном уровне.
Например, abcdefga будет выглядеть следующим образом.
_
/ \
_ | |
_ / \ | |
_ / \ | | | |
/ \ | | | | / \
_ | | | | | | | |
_ / \ | | | | / \ | |
_ / \| | | | / \| | | | _
/ \| || |/ \| || |/ \/ \
|_||_||_||___||___||___||_____||_|
Пробелы в строке ввода должны быть представлены двойным пробелом.
Полные остановки в строке ввода должны быть представлены как щебень.
/\/\
Дальнейшие примеры
Вход = Hello world.
Выход =
_
/ \
| |
| |
| |
/ \
| |
| | _
| | / \
/ \ | |
| | | |
_ | | _ | |
/ \ | | / \ / \
| | / \ | | | |
| | | | | | | |
_ _ | | | | | | | | _
/ \ / \ / \ | | / \ / \ / \
| | | | | | / \ | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
_ / \ / \ / \ | | / \ / \ / \
/ \ | | | | | | / \ | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | _ / \ / \ / \ | | / \ / \ / \
/ \ / \ | | | | | | / \ | | | | | | _
| | | | | | | | | | | | | | | | | | / \
| | | | | | | | | | | | | | | | | | | |
| | | | / \/ \/ \ | | / \/ \/ \ | |
/ \/ \| || || | / \| || || | | |
| || || || || | | || || || |/ \
|_____||___||_______||_______||_________| |_______________||_________||___________||_______||___|/\/\
Вход = lorem ipsum
_
/ \
_ | |
/ \ | |
_ | | | |
/ \ | | / \
| | _ | | | |
| | / \ / \ | |
_ | | | | | | | |
/ \ / \ | | | | / \
| | | | _ | | | | | | _
| | | | / \ / \ / \ | | / \
_ | | | | | | | | | | | | | |
/ \ / \ / \ | | | | | | / \ | |
| | | | | | | | | | | | | | | |
| | | | | | / \ / \ / \ | | / \
| | | | | | | | _ | | | | | | | |
/ \ / \ / \ | | / \ | | | | / \ | |
| | | | | | | | | | | | | | | | | |
| | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | |
/ \ / \ / \ _ | | / \ | | | | / \ | |
| | | | | | / \ | | | | | | | | | | | |
| | | | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | | | |
/ \/ \/ \ | | | | / \ | | | | / \ | |
| || || |/ \ | | | | | | | | | | | |
| || || || |/ \ | |/ \/ \| |/ \
|_______||_________||___________||___||_________| |_____||___________||_____________||_____________||_________|
Вход = a.a.a.x.x.x.a.a.a
_ _ _
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
_ _ _ | | | | | | _ _ _
/ \ / \ / \ | | | | | | / \ / \ / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|
правила
- Конечно, это кодовый гольф, выигрывает самая низкая оценка в байтах
- Применяются стандартные правила лазейки
- Допускается любое количество дополнительных пустых строк до или после вывода
- Вы можете выбрать вывод всего результата в одну строку или предложить вывод в виде массива, где каждый элемент представляет одну строку вывода, или отправить в STDOUT
Заметка
Это мой первый пост в PPCG, поэтому, пожалуйста, будьте осторожны со мной. Это было через песочницу. Любые негативные моменты или возможные улучшения, пожалуйста, напишите в качестве комментария, и я сделаю все, что могу
[a,z]
и[A,Z]
в[1,26]
кажется бессмысленным требование. Было бы намного лучше просто использовать целые числа списка в качестве входных данных (имея в0
качестве входных данных для щебня). Кроме того, публикация вашего запроса после того, как он находился в Песочнице в течение всего 21 часа , без ожидания получения каких-либо голосов или отзывов от более чем одного пользователя, не засчитывается как «прошедший через песочницу». Рекомендуется оставлять задания в Песочнице минимум на 48-72 часа, чтобы у людей было достаточно времени для их рассмотрения.[a,z]
,[1.26]
частей , на Mego упоминается. Наличие его необязательно часто является лучшим (если только это не ключевая часть задачи (ее здесь нет).Ответы:
JavaScript (ES6),
330326...315309 байтРекурсивно создает искусство ASCII, начиная с нижнего этажа и применяя несколько регулярных выражений между каждым этапом:
Как это работает
1) Нижний этаж
Мы начнем с перевода входной строки на нижний этаж, такой как:
где:
y
более короткий псевдоним для обратной косой черты (которая требует экранирования)0
,1
или2
) непосредственно перед последовательностью_
является левой стеной здания. Он представляет количество стен, которые должны быть размещены над ним перед следующим «расширяющимся слоем»._
является правой стеной здания и всегда установлена на0
.2) Регулярные выражения применяются между каждым этапом
Рекурсивный процесс состоит из применения 9 замен на предыдущем этаже с использованием следующих регулярных выражений:
/\/y/g
=>" "
(убрать обломки)/_/g
=>"x"
(заменить фундамент или верхнюю часть здания сплошным блоком)/\/xy/g
=>" _ "
(заменить последний расширяющийся слой на верхнюю часть здания)/1/g
=>"3"
(временно заменить1
на3
- см. последний шаг)/2/g
=>"1"
(заменить2
на1
)/\/xx(x+)y/g
=>" 2$10 "
(заменить расширяющийся слой новой, более узкой стенкой)/0(x+)0/g
=>"/$1y"
(заменить верхнюю часть стены расширяющимся слоем)/3/g
=>"0"
(заменить3
на0
)Например, вот последовательные преобразования
2___0
(нижний этаж, сгенерированный a'f'
):Примечание : верхняя часть здания затем заменяется на
x
. Это не показано на диаграмме выше.3) Регулярные выражения применяются к конечному результату
Рекурсия прекращается, когда больше нечего заменить, а это означает, что мы находимся за пределами вершины самого высокого здания.
Теперь нам нужно очистить все с помощью еще нескольких регулярных выражений:
/\d/g
=>"|"
(заменить цифры на трубы)/x/g
=>" "
(заменить сплошные блоки пробелами)/y/g
=>"\"
(заменитьy
на обратную косую черту)Например:
демонстрация
Авторы:
4 байта сохранены благодаря Hedi
8 байтов сохранены благодаря Not that Charles
источник
.charCodeAt()
, хотя.new
вnew RegExp(e,'g')
y
который не требует экранирования для прямого слеша. 2. если вы используете_
для первого этажа, вы можете отличить вершину с регулярным выражением:/_ /
.PHP,
386376367364362358356 байтпервый подход; может все еще быть пригодным для игры в гольф.
PHP,
366362361360357 байтаналогичный подход с подфункцией:
разбивка для второго подхода
+16 байт, если начальные символы новой строки не разрешены:
заменить
echo"$o[$y]\n;
наif($s=rtrim($o[$y]))echo"$s\n";
.-3 байта для любого из
;<=>?[\]^_{|}~
камней: Заменить 1)($n=31&ord($c))
на$n
, 2)$n=28,$w='.'!=$c
на($n=31&ord($c))<27
и 3)4
на($n=28)/7
.Другой -8 для
>
,^
или ,~
как щебень: Отменить 3)источник
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}
-2 байта для скобокfor($y=36;$y--;)echo"$o[$y]\n";
; но у меня есть новый подход, который сохраняет другие 2 байта.use
работает только для анонимных функций. это сэкономит 2 байта; но мне нужно было бы сохранить эту функцию в переменной$a=
вместо присвоения ей имени (+3 байта) и добавить a$
к каждому из четырех вызовов.Pyth,
9379 байтовПопробуйте онлайн. Тестирование.
объяснение
Я скрыл это по умолчанию, так как это слишком долго.
Показать фрагмент кода
источник
Perl,
147146 байтВключает +1 для
-p
Запуск с вводом на STDIN, например
citysky.pl
:Работает, как показано, но заменяет
\xhh
escape-символы их буквальными значениями, чтобы получить заявленную оценку. Вы можете сделать это с помощью этой командной строки:На самом деле я не исследовал никаких других подходов, так что это может быть очень легко ...
источник
Haskell, 289 байт
источник
Рубин, 245
Вы разрешаете столько новых строк, сколько хотите, поэтому я позволю себе это. Помимо этого, процесс выглядит следующим образом:
a
.a[0]
/\/\
кa[0]
c.upcase.ord + (c.upcase.ord-1)/3
)a
:a[t]+=w*(a[0].size-a[t].size)
h
, центр_
| |
или/ \
правильной ширины (1+2*((h-t)/4
), в зависимости от того,h-t%4==0
"|___|"
правильную ширинуa[0]
a.reverse
Могу поспорить, я могу получить его меньше, если я отработаю математику, чтобы избежать
reverse
источник
PHP, 297 байт
Более читаемая версия:
источник