Desafio
Para esse desafio, uma cadeia montanhosa é aquela que se ajusta à regra gramatical, M: x(Mx)*
onde em cada produção, todos os x são o mesmo caractere. Quando recuado, uma cadeia montanhosa pode se parecer com isso:
A
B
C
D
C
E
F
E
C
B
A
Como você pode ver, parece um pouco com uma montanha do lado.
Definição formal
- Qualquer caractere único
a
é montanhoso. - Se
S
é uma cadeia montanhosa ea
é um caractere, entãoaSa
é montanhosa, onde a justaposição representa concatenação de cadeias. - Se
aSa
eaTa
são cadeias montanhosas, entãoaSaTa
é uma cadeia montanhosa. Observe que esta regra implica que esse padrão é válido para qualquer número de repetições. (ou sejaaSaTaUa
,aSaTaUaVa
,aSaTaUaVaWa
... são todos montanhosa.)
Exemplos
Todos os palíndromos de comprimento ímpar são montanhosos, por exemplo:
t
a
c
o
c
a
t
qwertytrasdfdgdsarewqjklkjq
é um exemplo menos trivial:
q
w
e
r
t
y
t
r
a
s
d
f
d
g
d
s
a
r
e
w
q
j
k
l
k
j
q
Saídas de exemplo
a ==> true
aaa ==> true
mom ==> true
tacocat ==> true
qwertytrasdfdgdsarewqjklkjq ==> true
wasitacaroraratisaw ==> true
abcbcbcbcba ==> true
aaaaabcbbba ==> true
<empty string> ==> false
aa ==> false
pie ==> false
toohottohoot ==> false
asdfdghgfdsa ==> false
myhovercraftisfullofeels ==> false
Regras
- Esse é um problema de decisão; portanto, qualquer representação de true ou false é válida, desde que seja correta, consistente, inequívoca e o programa seja finalizado em um período finito de tempo. Certifique-se de indicar sua convenção de saída com sua solução.
- Deve ser trivial determinar se a saída indica verdadeiro ou falso sem precisar saber qual é a sequência de entrada. Observe que isso não significa que as saídas verdadeiras ou falsas devam ser constantes; no entanto, a convenção de "imprimir uma cadeia montanhosa se a cadeia for montanhosa e uma cadeia não montanhosa se não montanhosa" é uma brecha proibida por razões óbvias.
- Por outro lado, uma convenção como "lança uma exceção para falso e sai silenciosamente para verdadeiro" seria boa, além de "imprime um único caractere para verdadeiro e qualquer outra coisa para falso"
- Isso é código de golfe, então o programa mais curto vence.
- As brechas padrão são proibidas.
code-golf
string
decision-problem
Beefster
fonte
fonte
aaa
seria bom, onde o mesmo caractere precisa ser usado em vários níveis.wasitacaroraratisaw
? Parece montagem para mimwasitacaroraratisaw
é realmente montanhoso AFAICTaaa
isso não funcionam.Respostas:
Japonês v2 ,
1413 bytesTeste online!
fonte
Limpo ,
94898780 bytesExperimente online!
fonte
Perl, 22 bytes
Inclui
+
parap
Imprime 1 para verdadeiro, nada para falso
fonte
Brain-Flak , 78 bytes
Experimente online!
Imprime 1 para verdadeiro, nada para falso.
Para verificar uma palavra montanhosa, é suficiente assumir que a palavra desce a montanha sempre que possível.
fonte
Python 2 ,
8983 bytesExperimente online!
Graças a ovs por 6 bytes.
fonte
Prolog (SWI) , 29 bytes
Experimente online!
Este programa define uma regra do DCG
a//0
que corresponde a qualquer sequência (lista de caracteres) que seja uma sequência montanhosa.Explicação
Para este programa, utilizo uma definição ligeiramente diferente, mas equivalente, para as cordas montanhosas do que é descrito no desafio: Uma corda montanhosa é um caractere
c
seguido por um número (poderia ser zero) de cordas montanhosas comc
tachinhas nas extremidades delas. Em uma notação derivada de regex mais concisa, uma cadeia montanhosa deve corresponder ao padrão emc(Mc)*
queM
é uma cadeia montanhosa e*
significa que a expressão entre parênteses é repetida zero ou mais vezes. Observe que, embora cada umc
deva ter o mesmo caractere, cada umM
não precisa ter a mesma cadeia montanhosa.Prova de Equivalência
É claro que as regras 1 e 2 do desafio são equivalentes à minha regra, onde
Mc
ocorre zero e uma vez, respectivamente.No caso de que a cadeia montanhosa tem
Mc
ocorrendon
vezes em quen > 1
, em seguida, a corda pode ser reescrita comocMcSc
ondeS
é o últimon - 1
vezes queMc
ocorre com excepção do últimoc
(note queM
é qualquer cadeia montanhosa e não necessariamente o mesmo que outroM
). ComoM
é uma cadeia montanhosa, pela regra 2,cMc
deve ser uma cadeia montanhosa. OuS
é uma cadeia montanhosa; nesse caso,cSc
é uma cadeia montanhosa ouS
pode ser reescrita comocMcTc
ondeT
são as últimasn - 2
vezes queMc
ocorre excluindo a últimac
. Essa linha de raciocínio pode continuar sendo aplicada até que a cadeia que não é garantida como montanhosa contenhaMc
uma vez que significaria que teria que ser montanhoso também. Assim, comocMc
é montanhosa e secMc
ecM'c
montanhosa,cMcM'c
deve ser montanhosa, toda a cadeia deve ser montanhosa.Para o inverso, para uma cadeia
cScTc
ondecSc
ecTc
são montanhosas, entãocSc
é uma cadeia montanhosa pela regra 2 ou pela regra 3. Se for uma cadeia montanhosa pela regra 2,S
também deve ser uma cadeia montanhosa. Se for uma cadeia montanhosa pela regra 3,cSc
deverá ser da formacUcVc
ondecUc
ecVc
são cadeias montanhosas. Como o maior decUc
ecVc
ainda deve ter pelo menos dois caracteres a menos que acSc
regra 3, é necessário aplicar pelo menos 5 caracteres, depois de um número finito de aplicativos da regra 3, cada sequência entre osc
s selecionados pelos aplicativos da regra 3 deve ser montanhosa corda. A mesma linha de raciocínio pode ser aplicada acTc
assim, a corda é montanhosa pela minha definição.Como qualquer sequência que corresponda à minha definição é montanhosa e minha definição corresponde a todas as sequências montanhosas, é equivalente à fornecida na pergunta.
Explicação do Código
No geral, a
a//0
regra do DCG, definida na primeira linha, corresponde a qualquer cadeia montanhosa. A+//1
regra do DCG (como predicados, as regras do DCG podem receber nomes de operadores ), definida na linha dois, corresponde a qualquer sequência composta de uma sequência de zero ou mais sequências montanhosas com o caractere passado quando seus argumentos seX
apegam às extremidades deles . Ou, para emprestar a notação do tipo regex que usei acima,a//0
corresponde ,c(Mc)*
mas terceiriza, o trabalho de realmente corresponder(Mc)*
ao+//1
que levac
como argumentoX
.Linha por linha, os códigos se comportam da seguinte maneira:
Esta linha define a regra do DCG
a
. Os[X]
estados que o primeiro caractere deve ser igual à variável indefinida no momentoX
. Isso resulta emX
ser definido igual ao primeiro caractere. O+X
afirma que o restante da sequência deve corresponder à regra DCG+//1
com o caractereX
definido como argumento.Esta linha define a
+//1
regra do DCG. O;
representa um ou no Prolog, o que significa que a cadeia pode corresponder a[]
oua,[X],+X
. O[]
representa a sequência vazia, portanto,+//1
é sempre capaz de corresponder à sequência vazia. Se a sequência não estiver vazia, o início dela deve correspondera//0
e, portanto, deve ser uma sequência montanhosa. Isso deve ser seguido por qualquer caractereX
definido. Finalmente, o restante da string deve corresponder+X
.fonte
Casca , 15 bytes
Experimente online! A inferência de tipo leva cerca de 40 segundos, portanto, seja paciente.
Explicação
A idéia é substituir repetidamente uma substring do formulário
aba
pora
até que isso não seja mais possível. A entrada é montanhosa se, e somente se, resultar em uma cadeia de caracteres únicos (que é o queε
testa). A única situação perigosa é quando temos uma string como esta, ondeaba
não parece um pico:Felizmente, sempre podemos transformá-lo em um:
fonte
true
casos e não seria "consistente".Retina 0.8.2 , 15 bytes
Experimente online! Porta trivial da resposta japonesa do @ETHproductions.
fonte
JavaScript (Node.js) , 53 bytes
Suponho que esse seja o método mais simples de fazer isso?
Experimente online!
JavaScript (Node.js) , 72 bytes
Menos trivial, mas muito mais longo.
Experimente online!
fonte