Вы несете ответственность за строительство новой автострады. Однако он ведет через гористые земли и поэтому нуждается в многочисленных мостах и туннелях. Само шоссе должно оставаться на одном уровне.
вход
Вам дается грубое ASCII-описание того, как горы выглядят при стандартном вводе, например:
/\
/ \
/\ / \
/\ / \/ \
/ \ / \ /\
/ \/ \ / \
_ / \ /\ / \
\ / \ / \ / \ /\
\ / \ / \/ \/ \
\ / \ /
\/ \/
В _
первом столбце отмечены начало и уровень дороги. Горный массив является смежным, и если последний сегмент будет мостом, он будет иметь четное количество символов.
Вы можете предположить, что строка ввода никогда не длиннее 100 символов и что в ней не более 15 строк. Каждая строка имеет одинаковую длину, которая может быть дополнена пробелом в конце. Дорога никогда не начинается внутри горы или моста. Первое, что следует за дорожной плиткой на входе, это либо наклон вниз, либо вверх.
Выход
Выходом является тот же горный массив, за исключением того, что сейчас есть дорога, где раньше было только его начало. Вывод дан на стандартный вывод.
Для этого существует множество правил:
Дорога должна начинаться с места, указанного на входе, и оставаться на одном уровне. Чтобы было проще, мы подготовили несколько готовых дорожных плиток, которые выглядят так
_
:_______ \ / \/\/
Дорога должна простираться до дальнего конца горного хребта (т. Е. Длина входных линий определяет, насколько далеко дорога идет).
Туннели должны быть пробурены всякий раз, когда гора должна идти туда, куда должна идти дорога. Туннели проходят прямо через гору и оставляют дыры в начале и конце (т. Е. Туннель заменяет склон горы закрывающей скобкой в начале и открывающей скобкой в конце).
Туннели выходят из туннеля в гору, у которого обычно есть потолок. К счастью, наши готовые дорожные плитки можно использовать для усиления потолка, чтобы туннель не разрушался (линия над туннелем должна использоваться
_
для усиления туннеля):/\ / \ /____\ ___)______(__ \/ \/
Туннель не нуждается в укреплении, когда гора недостаточно высоко над ней. Для меня это тоже звучит странно, но мне сказали, что готовые дорожные плитки достаточно прочные, чтобы их можно было удерживать даже в таком случае, если они находятся на некотором расстоянии (потолок туннеля не рисуется, если прямо над туннелем имеется уклон):
/\ /\/__\ ___)______(__ \/ \/
Мосты нужны всякий раз, когда дорога должна пересечь пропасть. Для коротких мостов предварительно изготовленные дорожные плитки достаточно прочные, но все же нуждаются в небольшой поддержке в начале и в конце моста (первый нисходящий уклон под мостом и последний восходящий уклон заменены на
Y
так, чтобы была опорная балка для моста ):_____ Y Y \/
Более длинные мосты нуждаются в дополнительной поддержке. Длинный мост - это тот, который имеет более шести неподдерживаемых дорожных плиток подряд. Длинные мосты нуждаются в столбе в их центре. Столпы легко встраивается с нашими скомпилированным столпом балками , которые выглядят следующим образом :
|
. Каждому столбу нужны два из них, и они простираются до основания пропасти:_____________________________ Y || Y \ /\ || /\ /\/ \ /\ / \||/ \ /\/ \/ \/ \/ \/
Поскольку входные данные представляют только часть всей горной цепи, через которую необходимо проложить автостраду, она может внезапно закончиться в середине моста или туннеля. Правило длинного моста все еще применяется к последнему сегменту, и вы можете предположить, что первая часть за заданным входом снова поддерживает мост.
Следуя приведенным выше правилам, мы получаем следующее для нашего ввода:
/\
/ \
/\ / \
/\ / \/ \
/ \ / \ /\
/____\/______________\ /__\
_________)______________________(________)(____)____(______
Y Y Y Y Y Y Y YY
\ / \ / \/ \/ \
\ / \ /
\/ \/
Самый короткий код по количеству символов выигрывает. Конечные пробелы в строках игнорируются для проверки.
Пример ввода 1
_
\ /\
\ / \
\ / \
\ /\ / \ /\ /
\ /\ / \ / \ /\ /\/ \ /
\ / \ / \/ \ / \/ \/\ /
\/ \ / \ / \/
\ / \/
\/
Пример вывода 1
____________________________________________________________
Y || YY ||
\ || / \ ||
\ || / \ ||
\ || /\ / \ || /\ /
\ /\ || / \ / \ /\ |/\/ \ /
\ / \ || / \/ \ / \/ \/\ /
\/ \ || / \ / \/
\||/ \/
\/
Пример ввода 2
/\ /\
/ \/ \ /
/\ / \ /\ /
/\ / \ / \/ \ /
/ \ / \/\ / \ /\ /
/ \/ \ / \ / \ /
_/ \ / \/ \/
\ /
\ /\/
\ /\ /
\/ \ /
\ /
\/
Пример вывода 2
/\ /\
/ \/ \ /
/\ / \ /\ /
/\ / \ / \/ \ /
/ \ / \/\ / \ /\ /
/____\/________\ /__________________\ /__\ /____
_)________________(__________________)____________________()____()_____
Y || Y
\ || /\/
\ /\ || /
\/ \|| /
\| /
\/
Заметка
Конечные пробелы в выводе игнорируются для сравнения с эталонными решениями.
Выигрышное условие
Самый короткий код выигрывает, как это принято в гольфе. В случае ничьей победит более раннее решение.
Контрольные примеры
Существует два сценария тестирования, содержащие идентичные тестовые случаи:
Вызов в обоих случаях: <test script> <my program> [arguments]
например, ./test ruby bridges.rb
или ./test.ps1 ./bridges.exe
.
Еще одна заметка
Эта задача была частью соревнования по гольфу, проводимого в моем университете в течение 2011-W24. Баллы и языки наших конкурсантов были следующими:
- 304 - Perl
- 343 - С
- 375 - С
- 648 - Питон
Наше собственное решение (благодаря Ventero) было
- 262 - Рубин
Ответы:
Perl,
210195194193 символовОбновить
Те же идеи, но применяются по-разному, по большей части.
Запуск с
perl -p0
(4 символа рассчитаны для переключателей).Это также требует изменения скрипта bash test, чтобы не переоценивать аргументы:
Кстати, я очень ценю тестовые сценарии, @Joey.
прокомментировал:
редактирует :
{3,}
" на 3 буквенных пробела и+
квантификатор, чтобы сохранить другой символ1while(...)
форму, где я могу опустить точку с запятой в конце скриптаоригинал (см. историю закомментированной версии)
Я сознательно не смотрел на решение Perl @ Howard's, пока мое не заработало, но я смог улучшить свою игру в гольф, посмотрев потом.
В частности, помогли регулярные выражения для туннельных потолков и расширяющихся столбов. Отлично сделано, Говард.
И наоборот, моя альтернатива для получения длины строки, использования неявного $ _ для печати, удаления последней точки с запятой и удаления новых строк, может сократить число Говарда до 222 символов.
источник
bash
тестовый скрипт спасибо Ventero. Я просто взял то, что он создал, и ударил по нему, пока это не сработало ;-)Perl, 234 символа
Это решение Perl только для регулярных выражений. Он проходит все данные тесты.
Идентичная, но более читаемая версия показывает шаги, предпринятые для получения результата:
источник
C ++,
662622598 символов, 4 строкиЭто должно быть, я проверил это с помощью скрипта powershell, так что все должно быть в порядке ...
Редактировать 1
Заменены все символьные константы числами, удалены последовательные вызовы std :: cout + несколько других незначительных изменений.
Редактировать 2
Последнее редактирование, просто чтобы получить меньше 600. Взял g [t] [f] как #define и переместил несколько вещей.
источник
#define
std::
?Рубин,
382356353 символовЯ подумал дать шанс не-регулярному выражению.
Самая большая экономия пространства здесь заключается в использовании условного
||
оператора вместоif - elsif - end
. Поэтому вместо того, чтобы писать,if(a) lorem_ipsum end
я написал!a||lopem_ipsum
. Большие блоки могут быть включены с помощью круглых скобок!a||(block)
. Если условие включает в себя&&
операторы, то они должны быть отменены с помощью круглых скобок и /!
или с использованием законов Де Моргана.И вот то же самое с большим количеством слов
источник
Скала, 462 персонажа
Не особенно конкурентоспособный, но я много узнал о регулярных выражениях сегодня. :-)
источник
Эрланг, 1182 персонажа
Не конкурентоспособен вообще. Честно говоря, я просто был заинтересован в создании какого-то хорошего ascii искусства, а не в гольфе. Обратите внимание, что здесь не используются регулярные выражения, вместо этого я сам написал конечный автомат. Это также потребует исправления излишнего цитирования в сценарии оболочки, упомянутого в решении perl выше.
источник
Powershell,
300295 287 байтИсправлено -8 байт, что видно из ответа DCharness .
Неуправляемый тестовый скрипт:
Выход:
Объяснение комиксов:
источник