В Соединенных Штатах два противоположных направления движения на дороге разделены пунктирной желтой линией, если проезд разрешен, и двумя сплошными желтыми линиями, если проезд не разрешен.
(Только одна сторона может быть разбита, чтобы разрешить проход на этой стороне, и желтые линии могут означать другие вещи, такие как центральные или обратимые полосы, но нас не касается ни один из этих случаев.)
Напишите программу, которая в перспективе длины кодируются строки P
для прохождения и N
для не прохождения , и выводит версию ASCII соответствующей дороги. За исключением центральной линии, дорога всегда имеет один и тот же рисунок, что легко можно понять из приведенных ниже примеров.
Перед каждым P
и N
во входной строке будет положительное десятичное число . Это число определяет длину зоны прохождения или отсутствия зоны прохождения текущей части дороги.
Примеры
Ввод 12N
будет производить 12 столбцов без проезжей части (все линии центра =
):
____________
============
____________
На входе 12P
будет получено 12 столбцов проходящей дороги ( -
повторение центральной линии ):
____________
- - - - - -
____________
Передача и отсутствие прохождения могут быть объединены, например 4N4P9N7P1N1P2N2P
:
______________________________
====- - =========- - - -=-==-
______________________________
Это 4 столбца без проходов, затем 4 без проходов , затем 9 без проходов и т. Д.
Обратите внимание, что зона прохождения всегда начинается с тире ( -
) с левой стороны, а не с пробела ( ). Это обязательно.
Детали
- На входе никогда не будет двух
N
зон или двухP
зон подряд. например4P5P
, никогда не произойдет. - Вам не нужно поддерживать буквы без начального положительного числа. Обычная
P
всегда будет1P
, простаяN
всегда будет1N
. - Могут быть задние пробелы, если они не выходят за пределы последней колонны дороги. Там может быть один дополнительный завершающий перевод строки.
- Вместо программы вы можете написать функцию, которая принимает закодированную строку длины строки и печатает или возвращает дорогу ASCII.
- Принимает ввод любым стандартным способом (stdin, командная строка, функция arg).
Самый короткий код в байтах побеждает. Tiebreaker - более ранний пост.
Ответы:
CJam, 38 байт
Как это устроено
Мы сначала назначить правильный столбец дороги к переменным
N
и ,P
а затем просто оценить строку ввода. Это оставляет пару длины и столбца в стеке. Мы группируем их, запускаем для них RLD, чтобы получить полные столбцы, транспонируем, чтобы присоединиться к ним, и, наконец, преобразуем непрерывные--
в-
.Попробуйте онлайн здесь
источник
JavaScript (ES6), 114
Используя строки шаблона , 5 строк являются значительными и должны быть подсчитаны.
источник
RS , 252 символа
Хотя это может и не учитываться, потому что я добавил оператора сходимости в качестве грабежа Retina Мартина Бюттнера час назад ... Я не собираюсь здесь соревноваться. Это просто весело - создавать решения на основе регулярных выражений.
Я получил строку 2 из ответа Retina Мартина «Языки программирования на протяжении многих лет» .
объяснение
Это делает много магии. См. Ответ я связал выше для получения дополнительной информации.
В основном, с вводом
4N4P9N7P1N1P2N2P
, это будет результат:Следующий:
Это заменяет числа, предшествующие непроходному символу (N), на знаки равенства. Результат с предыдущего ввода:
Это:
заменяет первое число, предшествующее проходящему символу (P), на первую черту. Результат:
Следующие две строки продолжают тот же шаблон:
Первая строка заменяет остальную часть строки шаблоном черточки. Второй обрабатывает нечетное число; он заменяет последнюю черту, за которой следует единственное целое число (например,
-5
), тире-пробел (-
). Теперь вывод:Теперь вещи начинают становиться на свои места. Следующая строка:
просто удаляет
#N
и#P
.установите подчеркивание сверху и снизу, чтобы получить:
Наконец, мы удалим
A
:источник
Haskell, 165 байт
Пример выполнения (
f
возвращает строку, поэтому для лучшего отображения выведите ее):Как это работает:
p
возвращает среднюю строку путем рекурсивного анализа входной строки и конкатенации заданного числа символов, найденных функцией поискаk
. Основная функцияf
объединяет список из пяти элементов с символами новой строки, состоящими из верхней строки (каждый символ средней строки заменен на_
), новой строки, средней строки, пустой строки и нижней строки (аналогично верхней).источник
Python 3,
169168 байт. (167 с Python 2)Изрядно не одураченный
Попробуйте это онлайн здесь .
источник
p+=['='*v,('- '*v)[:v]][_[-1]=='P']
в конец предыдущей строки предыдущей точкой с запятой экономит один байт.print
.Python 2, 136 байт
Удивительно, но импорт
re
здесь действительно имеет смысл.источник
PHP, 187 байт
Код может оставаться на одной строке; он отображается здесь на нескольких строках, чтобы быть более читабельным (пробелы и символы новой строки, использованные для форматирования, не учитывались).
Два байта можно сохранить, не печатая завершающий символ новой строки. Еще пять байтов можно сохранить, используя настоящие символы новой строки на
echo()
:Шесть дополнительных байтов можно сохранить, пропустив инициализацию
$o
($o='';
), но это вызовет уведомление. Уведомление можно подавить, запустив скрипт с помощью командной строки:Это приносит 174 байта.
источник
Рубин,
137135 байтовНе самое короткое, что я мог придумать, но близко к самому хорошему. Частично заимствовано из ответа Оптимизатора.
Ungolfed:
источник
(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '
.C 155 байт
Более читабельно:
Внешний цикл считает строки от 5 до 0.
Средний цикл перебирает части кодированной строки:
Внутренний цикл декодирует часть, например,
7P
и выполняет итерацию необходимое количество раз (например, 7).Каждая итерация печатает один
char
. Значениеchar
описывается кодомl%5?l^2?32:c^78?++x&1?45:32:61:95
:_
)=
)x
на 1 (оно было инициализировано до 2 с помощьюsscanf
)-
), иначе выведите 32 (пробел)источник
Scala, 163 байта
Первая попытка, может быть, игра в гольф еще немного.
источник
Рубин, 94 байта
Заимствует
gsub'--','- '
идею от ответа 14mRh4X0r в . Я думаю, что ответ более интересен, хотя это короче.Тестирование:
Производит:
источник
позвольте мне включить мою версию Matlab
MATLAB (267 б)
вход
Строка в формате ascii, заключенная в пробел (поскольку в matlab нет конца цепочки '\ 0')
пример V = '12N13P'
выход
образец представления дороги
функция
функция должна вызываться из его tail-1 (пустой символ удаляется)
пример : p (V, цифра (V) -1)
моделирование
попробуйте это онлайн здесь
источник
R, 132 байта
Не очень доволен этим, но это было немного забавно делать :) Пытался избавиться от множества
gsub
s, но мои усилия были напрасны. Я подозреваю, что есть намного лучший способ сделать это.scan
получает строки из STDIN и берет 4-й. Обратите внимание, что пустые строки требуют пробела (или чего-то) в них для сканирования, чтобы продолжить получать ввод.=
s наN
s, на-
ина
P
s.NP
иPN
rbind
) с первым символом каждой строкиcat
.Тестовый забег
источник