Вы живете внутри терминала шириной 80 символов. Вам скучно, поэтому вы решили играть в домино. Нет, не скучный вид, похожий на Скрэббл, забавный вид, где вы проводите час, заставляя их смотреть, как они падают за секунду.
В терминалах домино выглядит так:
| upright domino
\ left-tilted domino
/ right-tilted domino
__ fallen domino
Как мы все знаем, если наклонное домино касается вертикального, второе домино также наклоняется. Единственное исключение из этого, если два наклонных домино касаются этого:
|\ --> \\ /| --> // /|\ --> /|\
Настройте гравитационную постоянную вашего терминала так, чтобы этот переход занимал 100 мс.
Если наклонное домино поддерживается другим домино или стенами терминала, его путешествие заканчивается.
Ни одно из наклоненных домино в
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
(80 символов) будет двигаться, так как два самых наклонных домино поддерживаются стенами терминала, а все остальные поддерживаются другими домино.
Однако, если пространство в направлении наклона пусто, домино падает:
| \\ --> |__\ // | --> /__|
Терминал. Гравитационная постоянная. Вы понимаете, суть ...
Наконец, слева слегка дует ветер, поэтому домино с правым наклоном падают быстрее, чем левое:
|/ \| --> |__\|
задача
Напишите программу / функцию, которая показывает анимацию игры в домино в терминале.
Ваш код должен сделать следующее:
Прочитайте строку из ввода, представляющую начальное состояние домино.
Эта строка будет содержать не более 80 символов и состоит исключительно из описанных выше домино и пустых мест.
Напечатайте состояние и подождите 100 мс.
Измените состояние, как описано выше.
Если состояние изменилось, вернитесь к 2.
Дополнительные правила
Длина входной строки не влияет на ширину терминала; даже если строка короче 80 символов, стены терминала по-прежнему находятся на расстоянии 80 символов.
Каждый раз, когда выполняется шаг 2, состояние должно быть напечатано в том же месте, перезаписывая предыдущее состояние.
Поскольку некоторые языки не могут ждать ровно 100 мс, не стесняйтесь ждать любую сумму от 50 до 1000 мс.
Применяются стандартные правила игры в гольф .
Примеры
Для начального состояния
||\/||
напечатать следующее (одно поверх другого):
||\/|| |\\//| \\\/// __\\//__
Для начального состояния
/||||\
напечатать следующее
/||||\ //||\\ ///\\\
Для начального состояния
/|||\
напечатать следующее
/|||\ //|\\
Для начального состояния
|/ \|/ \|/ \|/ \|
распечатайте следующее:
|__\|__\|__\|__\|
Для начального состояния (80 символов)
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
напечатать следующее
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
/
или,/|
и вы увидите, что плитка не падает полностью, как следует.\033
его буквенным байтом ESC, сохранив 3 байта.Perl 5,
154146Пришлось использовать временного персонажа для поддержания состояния между 2 регулярными выражениями.
Чтобы справиться с риском, что-то вроде / | | | \ закончится как / / / \ \ вместо / / | \ \.
Тест
источник
s, \\|/ ,__,g
вместоs/ \\|\/ /__/g
.ES6 ,
220218195 байтМинимизированный
Более читаемый
источник
() = > {
и}()
может быть просто удален из вашего кода. 2. Я не думаю, что окна предупреждений являются приемлемым выходным форматом для анимации. Вы можете встраивать свой JS в HTML или вносить необходимые изменения, чтобы он работал из командной строки. 3. В любом случае ваш код должен ждать ок. 100 мс между печатью одного состояния и следующего.console.log("^[c"+d)
вместо этого^[
символ ESC (один байт)..replace
на[R='replace']
, а затем на каждый последующий[R]
, это немного сократится. Вы также можете сохранить несколько байтов, используяsetTimeout(f,100,d)
вместо текущей настройки.C #, 335 байт
Не большой выбор языка.
Я злоупотреблял разрешенной задержкой между 50 и 1000, чтобы выбрать двузначное число.
Добавлены новые строки и отступы для ясности:
источник
PHP, 175 байт
Un-уменьшенная:
В основном, regex golf. Сначала сглаживаются все падающие домино, у которых есть место (и из-за порядка соответствия слева направо «дует ветер»). Затем наступает уродливая часть (проклинаю тебя, косая черта!)
/|\
, затем пропускаем.(/)|
и заменить на//
|(\)
и заменить на\\
Это заставляет домино падать. Наконец, просто подождите 100 мс до следующего шага.
Использование в
()
качестве разделителя в регулярном выражении означает, что/
s не нужно экранировать, что помогает минимально!источник
POSIX shell + sed, 144
Это в двух частях. Основная работа по свержению домино - это
sed
замена стандартного паттерна, накопление линий в трюме. Мы временно превращаемся/|\
в/:\
его защиту, выздоравливаем в конце.Поскольку
sed
у меня нет способа вставки задержек (я посмотрел на terminfo / termcap, но не смог найти никакого стандартного способа), я обертываю каждую строку,printf "...\r"; sleep .1
чтобы печатать строку каждые 100 мс. Я фактически делаю это сначала, когда у нас есть только одна строка, так как символы в команде не будут затронуты никакими заменами toppling.Все проверено с использованием
dash
и GNUcoreutils
, сPOSIXLY_CORRECT
установленным в среде.источник