Спасибо за этот вопрос для вдохновения
В этих проблемах мы будем представлять линию домино в виде строки |
, /
и \
. Вам дадут строку домино в качестве входных данных, и вы должны определить, как они выглядят, когда они обосновались. Вот правила того, как домино падает
Постоянное домино,
|
оставленное левым упавшим домино\
, также станет левым упавшим домино.Постоянное домино,
|
справа от правого падшего домино/
, также станет правым падшим домино.Если стоящее домино находится между левым
\
и правым упавшим/
домино, оно останется стоять.
Эти правила применяются неоднократно, пока договоренность больше не изменится.
Вот пример того, как один вход может прийти к своему выводу
|||||||\/|||||||\||\|||/||||||\|||||
||||||\\//|||||\\|\\|||//||||\\|||||
|||||\\\///|||\\\\\\|||///||\\\|||||
||||\\\\////|\\\\\\\|||////\\\\|||||
|||\\\\\////|\\\\\\\|||////\\\\|||||
||\\\\\\////|\\\\\\\|||////\\\\|||||
|\\\\\\\////|\\\\\\\|||////\\\\|||||
\\\\\\\\////|\\\\\\\|||////\\\\|||||
Ваша задача - написать код, который находит и выводит конечный результат ввода. Вы можете предположить, что ввод всегда действителен и содержит не менее 2 символов.
Это код-гольф, поэтому ответы будут оцениваться в байтах, причем меньшее количество байтов будет лучше.
Контрольные примеры
|||/|||| -> |||/////
|||\|||| -> \\\\||||
|/||||\| -> |///\\\|
||/|||\| -> ||//|\\|
||\|||/| -> \\\|||//
источник
Ответы:
Сетчатка , 32 байта
Попробуйте онлайн!
объяснение
+
Говорит Retina запустить замену в цикле до тех пор, пока не сможет изменить строку. Каждая замена вычисляет один шаг падающего домино. Сама замена - это три замены в одной, но это гарантирует, что они происходят одновременно:Это просто соответствует
/|\
(так же как/\\
и/\\
, но это не имеет значения) и вставляет его без изменений. Цель этого состоит в том, чтобы пропустить|
падающие домино с обеих сторон, потому что это короче, чем исключение тех случаев с отдельными обходными путями в двух других случаях.Это соответствует
/|
и превращает это в//
.Это соответствует
|\
и превращает это в\\
.источник
$1$2$2$3$3
чтобы превзойти языки игры в гольф.Python 2 ,
1151141111089895 байт-1 байт благодаря овсу
Попробуйте онлайн!
источник
b=0;
и заменить вхожденияb
,id
чтобы сохранить два байта!V , 23 байта
Попробуйте онлайн!
На самом деле, это очень похоже на ответ на сетчатку, просто выглядит уродливее. Использует регулярное выражение.
HexDump:
Объяснение:
ò
говорит V запускаться до тех пор, пока строка не изменится. Остальное - сжатое регулярное выражение. Давайте преобразовать его в эквивалент vim ...источник
SNOBOL4 (CSNOBOL4) ,
117115112111 байтПопробуйте онлайн!
Благодарим Питона за ответ Родона за идею условия остановки со второй переменной, чтобы увидеть изменения, а не тестирование
D '/|' | '|\'
.источник
Haskell ,
114107 байтПопробуйте онлайн! Первая строка определяет анонимную функцию.
Объяснение:
until=<<((==)=<<)$g
является функцией фиксированной точки (см. здесь для объяснения), которая применяет функциюg
к входной строке, пока результат больше не изменяется.zip3('|':s)s(tail s++"|")
создает для каждого домино, то есть символа в строкеs
, тройку с пре- и последующим домино с отступами|
по краям. Например,/\|
становится[(|,/,\),(/,\,|),(\,|,|)]
(игнорируя побег).t
применяется к каждой из троек, чтобы вычислить новую позицию центральной части тройки.источник
Perl 5 , 39 + 1 (
-p
) = 40 байтПопробуйте онлайн!
источник
Пролог (SWI) , 132 байта
Попробуйте онлайн!
Эта программа определяет предикат,
+/2
который является истинным, если второй аргумент является установленной версией первого. Оба аргумента являются списками кодов символов.объяснение
В этом решении используется DCG для определения следующего шага, а затем многократно рассчитывается следующий шаг, пока следующий шаг не станет таким же, как текущий шаг.
DCG
Эти пять строк кода определяют правило DCG (Грамматика определенного предложения)
+
, которое используется в программе для расчета одного шага свертывания домино. DCG в Прологе работают, находя первый случай правила, правая часть которого совпадает со строкой, и определяя аргумент правила в левой части этого процесса. Если случай не совпадает, он будет возвращен и попробует более поздний случай.Эта строка представляет базовый вариант
+
правила. В нем просто говорится, что если в настоящее время нет домино, то на следующем шаге все еще не будет домино.Поскольку эта программа имеет дело исключительно со списками кодов символов, важно отметить , что коды символов для
/
,\
и|
в 47, 92 и 124 соответственно. Этот случай+
правила обрабатывает/|\
строку.Этот случай обрабатывает правильное падение домино, опрокидывая домино справа от него. Так как он идет после случая для обработки,
/|\
он не будет использоваться для этой возможности.Обрабатывает случай, когда домино падает слева, опрокидывая домино слева от него.
Это случайный символ. Поскольку больше ничего не меняется, кроме того, что описано выше, до тех пор, пока во входной строке остается текст, он просто копирует его в выходные данные, если он не соответствует ни одному из указанных выше случаев.
Предикат
Основной предикат принимает два аргумента, первый - начальная настройка домино, второй - установленное домино. Поскольку это Пролог, второе может быть неопределенным, и программа его вычислит. Сам по себе предикат довольно прост,
+(N,X,[])
вызывает DCG и вычисляет следующий шаг домино, в котором он хранитсяN
.(X=N,Y=N;N+Y)
проверяет, совпадает ли следующий шаг домино с текущим и устанавливаетY
ли он его, поскольку домино должно быть установлено, и если это не так, повторяется, вызывая тот же предикат со следующим шагом доминоN
вместоX
.источник
APL (Dyalog) , 36 байт
Попробуйте онлайн!
-3 частично благодаря Корове Кря .
Чувствую себя таким невежливым ... :(
источник
лицо , 166 байт
Принимает ввод в качестве аргумента командной строки и выводит в STDOUT. Это работает только в коммите 86494f6 и выше из-за исправления в этом коммите.
Обернутый для эстетики:
И разглазил / прокомментировал:
Здесь есть несколько тонких уловок, которые сбрасывают несколько дополнительных байтов, таких как
именование переменных | и /, чьи значения ASCII доступны через интроспекцию позже в коде
в
'|
первой строке основного цикла, которая вызывается там, а не во второй строке, чтобы установить | указатель для использования во втором разделе основного циклаисточник
Perl 5 , 52 + 1 (-p) = 53 байта
-6 байт благодаря мику
Наверное, не лучший вариант для Perl, но это то, что я мог придумать.
объяснение
Попробуйте онлайн!
источник
-p
вместо того, чтобы-a
устранить необходимость вprint;
; используя вwhile
качестве суффикса к выражению манекена (например0
) сохранит еще 2 байтаPerl 5 , 44 (код) + 1 (
-p
) = 45 байтПопробуйте онлайн!
объяснение
источник
Чисто , 98 байт
Попробуйте онлайн!
источник
Рубин , 83 байта
Технически читерство
9.times
, или даже просто,999.times
но я не чувствую себя дешевым :)По-прежнему имеет огромный гольф-потенциал. (Примечание:
y while undone
гораздо дольше, чемx.size.times
)Попробуйте онлайн!
источник
R , 114 байт
Попробуйте онлайн!
Возвращает экранированную строку.
источник
C (gcc) , 183 байта
Попробуйте онлайн!
источник