Obrigado a esta pergunta por alguma inspiração
Neste desafio, representaremos uma linha de dominó como uma sequência de |
, /
e \
. Você receberá uma sequência de dominós como entrada e deverá determinar como eles se parecerão quando se estabelecerem. Aqui estão as regras de como os dominós caem
Um dominó em pé
|
, à esquerda de um dominó caído à esquerda\
, também se tornará um dominó caído à esquerda.Um dominó em pé
|
, à direita de um dominó caído à direita/
, também se tornará um dominó caído à direita.Se um dominó em pé estiver entre um dominó caído à esquerda
\
e um/
dominó caído à direita , ele permanecerá em pé.
Essas regras são aplicadas repetidamente até que o arranjo não seja mais alterado.
Aqui está um exemplo de como uma única entrada pode chegar à sua conclusão
|||||||\/|||||||\||\|||/||||||\|||||
||||||\\//|||||\\|\\|||//||||\\|||||
|||||\\\///|||\\\\\\|||///||\\\|||||
||||\\\\////|\\\\\\\|||////\\\\|||||
|||\\\\\////|\\\\\\\|||////\\\\|||||
||\\\\\\////|\\\\\\\|||////\\\\|||||
|\\\\\\\////|\\\\\\\|||////\\\\|||||
\\\\\\\\////|\\\\\\\|||////\\\\|||||
Sua tarefa é escrever um código que encontre e produz o resultado final de uma entrada. Você pode assumir que a entrada é sempre válida e contém pelo menos 2 caracteres.
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
|||/|||| -> |||/////
|||\|||| -> \\\\||||
|/||||\| -> |///\\\|
||/|||\| -> ||//|\\|
||\|||/| -> \\\|||//
fonte
Respostas:
Retina , 32 bytes
Experimente online!
Explicação
Ele
+
informa ao Retina para executar a substituição em um loop até que ele não mude a string. Cada substituição calcula uma etapa dos dominós em queda. A substituição em si é realmente três substituições em uma, mas isso garante que elas ocorram simultaneamente:Isso apenas corresponde
/|\
(bem como/\\
e/\\
, mas não importa) e reinsere-o inalterado. O objetivo disso é pular|
com dominó caído de ambos os lados, porque isso é mais curto do que excluir os casos com olhares separados nos outros dois casos.Isso corresponde
/|
e o transforma//
.Isso corresponde
|\
e o transforma\\
.fonte
$1$2$2$3$3
superam os idiomas do golfe.Python 2 ,
1151141111089895 bytes-1 byte graças a ovs
Experimente online!
fonte
b=0;
e substituir ocorrências deb
porid
para salvar dois bytes!V , 23 bytes
Experimente online!
Realmente, isso é muito semelhante à resposta da retina, apenas que parece mais feia. Usa compactação regex.
Hexdump:
Explicação:
ò
diz ao V para executar até que a string não mude. O restante é um regex compactado. Vamos convertê-lo no equivalente vim ...fonte
SNOBOL4 (CSNOBOL4) ,
117115112111 bytesExperimente online!
Agradecemos à resposta python de Rod pela idéia da condição de parada com uma segunda variável para ver as alterações em vez de testar
D '/|' | '|\'
.fonte
Haskell ,
114107 bytesExperimente online! A primeira linha define uma função anônima.
Explicação:
until=<<((==)=<<)$g
é uma função de ponto de correção (veja aqui para obter uma explicação) que aplica a funçãog
à sequência de entrada até que o resultado não seja mais alterado.zip3('|':s)s(tail s++"|")
cria para cada dominó, que é caractere na sequências
, um triplo com o dominó anterior e posterior, preenchendo|
as bordas. Por exemplo,/\|
torna-se[(|,/,\),(/,\,|),(\,|,|)]
(ignorando a fuga).t
é aplicada a cada um dos triplos para calcular a nova posição da peça central do triplo.fonte
Perl 5 , 39 + 1 (
-p
) = 40 bytesExperimente online!
fonte
Prolog (SWI) , 132 bytes
Experimente online!
Este programa define um predicado
+/2
verdadeiro se o segundo argumento for a versão estabelecida do primeiro. Ambos os argumentos são listas de códigos de caracteres.Explicação
Esta solução usa um DCG para descobrir qual é o próximo passo e, em seguida, calcula repetidamente o próximo passo até que o próximo seja o mesmo que o passo atual.
O DCG
Essas cinco linhas de código definem uma regra DCG (gramática de cláusula definida)
+
usada no programa para calcular uma única etapa de tombamento do dominó. Os DCGs do Prolog trabalham localizando o primeiro caso da regra cujo lado direito corresponde à sequência e determinando o argumento da regra no lado esquerdo durante esse processo. Se um caso não corresponder, ele retornará e tentará um caso posterior.Esta linha representa o caso base da
+
regra. Simplesmente afirma que, se não houver dominó atualmente, na próxima etapa ainda não haverá dominó.Uma vez que este programa trata exclusivamente com listas de códigos de caracteres, é importante notar que os códigos de caracteres para
/
,\
e|
são 47, 92, e 124, respectivamente. Este caso da+
regra lida com a/|\
sequência.Este gabinete lida com um dominó caindo à direita, derrubando o dominó à sua direita. Como vem após o caso de manuseio
/|\
, não será usado para essa possibilidade.Lida com o caso de um dominó caindo à esquerda, derrubando o dominó à esquerda dele.
Este é o caso curinga. Como nada mais muda além do descrito acima, enquanto houver texto na string de entrada, ele será copiado para a saída, desde que não corresponda a nenhum dos casos acima.
O Predicado
O predicado principal recebe dois argumentos, o primeiro é a configuração inicial do dominó, o segundo é o dominó estabelecido. Como este é o Prolog, o segundo pode ser indeterminado e o programa o calculará. O predicado em si é bastante simples:
+(N,X,[])
chama o DCG e calcula a próxima etapa dos dominós que o armazenamN
.(X=N,Y=N;N+Y)
verifica se o próximo passo do dominó é o mesmo que o atual e se for definidoY
, pois os dominós devem ter se estabelecido e, se não for, ele se repete, chamando o mesmo predicado com o próximo passo do dominó emN
vez deX
.fonte
APL (Dyalog) , 36 bytes
Experimente online!
-3 parcialmente graças ao Cows Quack .
Parece tão ungolfed ... :(
fonte
face , 166 bytes
Recebe a entrada como argumento da linha de comando e gera para STDOUT. Isso funciona apenas na confirmação 86494f6 e além devido a uma correção de bug nessa confirmação.
Embrulhado para estética:
E ungolfed / comentou:
Há alguns truques sutis aqui que eliminam alguns bytes extras, como
a nomeação das variáveis | e /, cujos valores ASCII são acessados via introspecção posteriormente no código
o
'|
na primeira linha do loop principal, que é chamado lá em vez de na segunda linha para definir o | ponteiro para uso na segunda seção do loop principalfonte
Perl 5 , 52 + 1 (-p) = 53 bytes
-6 bytes graças a mik
Provavelmente não é o melhor possível para Perl, mas é o que eu poderia fazer.
Explicação
Experimente online!
fonte
-p
em vez de-a
eliminar a necessidadeprint;
; utilizandowhile
como um sufixo de uma expressão simulado (por exemplo0
) irão poupar mais 2 bytesPerl 5 , 44 (código) + 1 (
-p
) = 45 bytesExperimente online!
Explicação
fonte
Limpo , 98 bytes
Experimente online!
fonte
Ruby , 83 bytes
Tecnicamente enganável com
9.times
, ou mesmo apenas,999.times
mas não sinto vontade de ser barato :)Ainda tem um enorme potencial de golfe. (Nota:
y while undone
é muito mais longo quex.size.times
)Experimente online!
fonte
R , 114 bytes
Experimente online!
Retorna uma string de escape.
fonte
C (gcc) , 183 bytes
Experimente online!
fonte