Рассмотрим эти семь вагонов ASCII.
Двигатель (E)
__
====== \/
| [] |=========
| )
================
O-O-O O-O-O \\
Легковой автомобиль (P)
===============
| [] [] [] [] |
===============
O-O O-O
Вагон (B)
===============
|-|-| | |-|-|
===============
O-O O-O
Танкер (T)
_____---_____
( )
===============
O-O O-O
Бункер (H)
_______________
\ | | | | | | /
===============
O-O O-O
Планшетный (F)
===============
O-O O-O
Камбуз (С)
=====
====| |====
| [] [] |
=============
O-O O-O
Напишите программу, которая при задании последовательности символов EPBTHFC
выводит представление поезда ASCII, используя --
для автомобильных соединений. Самые левые вводимые символы становятся самыми правыми вагонами. Поезд всегда направлен направо.
Например, вход EEHTBPFC
должен производить
__ __
===== ====== \/ ====== \/
====| |==== =============== =============== _____---_____ _______________ | [] |========= | [] |=========
| [] [] | | [] [] [] [] | |-|-| | |-|-| ( ) \ | | | | | | / | ) | )
=============--===============--===============--===============--===============--===============--================--================
O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O O-O-O O-O-O \\ O-O-O O-O-O \\
подробности
- Это код гольф; самая короткая программа в байтах побеждает.
- Любая последовательность из одной или нескольких букв
EPBTHFC
является допустимым вводом. - Ваша программа должна иметь возможность выводить все 7 типов автомобилей в точности так, как они указаны выше.
- Возьмите ввод из командной строки или непосредственно от пользователя (например, окно сообщения). Вывод на стандартный вывод. (Кавычки вокруг ввода в порядке.)
- Высота выхода должна быть либо 6, либо максимальная высота, необходимая для прорисовки вагонов.
- Не устанавливайте муфты (
--
) в передней части первого автомобиля или в задней части последнего автомобиля.
code-golf
ascii-art
kolmogorov-complexity
Кальвин Хобби
источник
источник
E
впереди и может ли бытьE
где-то посередине?Ответы:
Perl, 265 байт
Поскольку эта запись содержит байты, которые не соответствуют печатным символам ASCII, она не может быть вставлена здесь напрямую. Вместо этого я предоставляю это как шестнадцатеричный дамп. Пользователи в системах Unix-ish могут восстановить сценарий, введя в команду следующий шестнадцатеричный дамп
xxd -r
:Сценарий использует
say
функцию Perl 5.10 , поэтому его необходимо запускатьperl -M5.010
. Он принимает один аргумент командной строки, состоящий из букв,EPBTHFC
и выводит соответствующее расположение вагонов. Например, входFEH
производит следующий вывод:Читаемый код в начале скрипта просто распаковывает сжатую zlib строку, содержащую тело скрипта, и уничтожает ее. Распакованный код, в свою очередь, выглядит следующим образом:
Обратите внимание, что все вагоны имеют свои линии, заполненные пробелами одинаковой длины, и включают в себя муфту (которая снимается с крайней правой вагонетки выходным контуром). Сжатие DEFLATE, используемое zlib, очень хорошо сжимает такие повторяющиеся данные, поэтому нет необходимости пытаться сжимать их вручную.
Обратите внимание, что это первая быстрая попытка. Я уверен, что было бы возможно сократить несколько байтов от длины, играя с вариациями, такими как изменение порядка вагонов в источнике.
источник
Python, 464
Я пошел на подход, используя проклятия. Это не может реально конкурировать, но я немного повеселился (~ 630 байт):
источник
sl
2,0Python (
582488476450 символов)ASCII-салат - это сжатая zlib строка в кодировке base64, содержащая цифры ...
источник
string.decode('base64')
2.j=lambda y:y==4and'--'or' '
3.for c in A[::-1]:i.append(C[c][y])
f.append(j(y).join(i)
for l in((y==4and'--'or' ').join(C[c][y]for c in A[::-1])for y in range(6-h,6)):print l
for y in range(6-h,6):print(y==4and'--'or' ').join(C[c][y]for c in A[::-1])
Питон,
402369Спасибо тебе за улучшения, угорен!
источник
range(6)
,for x,y in zip("EPBTHFC",range(0,42,6)):
JavaScript,> 471 байт
Ну дерьмо, уже за лучший счет, а я до сих пор не успел распечатать все по порядку. Но я провел день на этом и все еще хотел показать это.
Просто так
console.log(c(L)); // L=train car letter
и будет печататься один автомобиль в консоли. Я знаю, что я могу сделать многое, чтобы справиться даже с этим, но я сдаюсь. :Писточник
<marquee>
ты дьявольский дьявол. Почему они когда-либо осуждали тебя?Java (583 символа)
С базовым самодельным сжатием - не уверен, что оно настолько эффективно :-) Строка поезда (например
EEHTBPFC
) должна быть передана как параметр.Развернутая:
источник
C #,
758664603562 байтаНе лучший результат, 200 или около того байтов в плохо закодированной строке, и около 80 байтов, предназначенных для ее декодирования. Расстраивающее количество кода потратило на разборку муфты на двигателе! Теперь он оставляет пробел в конце поезда, что неопрятно, но в рамках правил, и у него также есть жестко запрограммированные размеры строки данных, что я неохотно делал на начальном этапе.
Отформатирован немного:
Строка сжимается очень просто путем замены повторяющегося символа на строковое представление числа символов, за которым следует символ (минус 1), или только символа, если есть только один из них (я хотел придерживаться ASCII и избегать каких-либо действий на уровне субчаров). Кодировщик (не входит в оценку):
источник
Вот мое решение на PHP (v5.4 совместимый), 512 байт. Может быть короче, но просто сделал быструю сборку, чтобы попробовать это.
Это разложенная версия для удобного чтения:
источник
Python, 491 байт
Мне нравится, как это получилось, хотя это не будет победителем.
источник
if j==5...x[j]+=y[w[i]][j]+k
чтобыx[j]+=y[w[i]][j]+('\\ 'if j==5 and w[i]=='E'else'--'if j==4 and i!=u-1 else' ')
сэкономить немного. (Также вы можете поставить табуляцию вместо двух пробелов передx[j]...
.)GNU sed , 491 байт
Попробуйте онлайн!
объяснение
По сути, это очень наивная пользовательская схема сжатия. Первая строка добавляет к каждой букве во вводе пробел и
#
, чтобы отметить конец каждой части:Следующие 7 строк заменяют каждую букву сжатым представлением соответствующего изображения ASCII:
Следующие 14 строк делают «декомпрессию». Например,
S
декомпрессия до шестиs
эс иs
декомпрессия до двух пробелов, таким образом,S
становится 12 пробелами.Распакованный, линиям каждой машины предшествует номер строки, и каждая машина заканчивается
#
. Остальная часть кода добавляется0123456;
(номера строк и разделитель) в пространство шаблона, а затем в цикле заменяет каждую цифру соответствующей строкой каждого автомобиля.Наконец, он разбивает пространство шаблона на строки, разбивая цифры и убирая посторонние символы:
Здесь много возможностей для улучшения. Я совсем не был строг в поиске оптимального набора компрессий, и использование таблицы поиска вместо 14 отдельных
s///g
с было бы легкой победой. Я могу или не могу лапшу с этим еще немного.источник
Python 3 , 529 байт
Попробуйте онлайн!
Я решил опубликовать его, потому что он не использует сжатие, в отличие от большинства других ответов здесь.
источник
C (gcc) ,
501499490489484 байта-2 -9 -1 -5 байт, благодаря потолочной кошке .
Попробуйте онлайн!
источник