Défi
Pour ce défi, une chaîne montagneuse est celle qui est conforme à la règle de grammaire M: x(Mx)*
où à chaque production, tous les x sont du même caractère. En retrait, une chaîne montagneuse pourrait ressembler à ceci:
A
B
C
D
C
E
F
E
C
B
A
Comme vous pouvez le voir, cela ressemble un peu à une montagne de côté.
Définition formelle
- Tout personnage
a
est montagneux. - Si
S
est une chaîne montagneuse eta
est un caractère, alorsaSa
est montagneux, où la juxtaposition représente la concaténation de chaînes. - Si
aSa
etaTa
sont des cordes montagneuses, alorsaSaTa
est une chaîne montagneuse. Notez que cette règle implique que ce modèle est valable pour un nombre illimité de répétitions. (c.-àaSaTaUa
- d .aSaTaUaVa
,aSaTaUaVaWa
... sont tous montagneux.)
Exemples
Tous les palindromes de longueur impaire sont montagneux, par exemple:
t
a
c
o
c
a
t
qwertytrasdfdgdsarewqjklkjq
est un exemple moins 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
Exemples de sorties
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
Règles
- Ceci est un problème de décision, donc toute représentation de vrai ou faux est une sortie valide tant qu'elle est correcte, cohérente, sans ambiguïté et que le programme se termine dans un laps de temps fini. Assurez-vous d'indiquer votre convention de sortie avec votre solution.
- Il devrait être trivial de déterminer si la sortie indique vrai ou faux sans avoir à connaître la chaîne d'entrée. Notez que cela ne signifie pas que les sorties véridiques ou fausses doivent être constantes, cependant la convention de "imprimer une chaîne montagneuse si la chaîne est montagneuse et une chaîne non montagneuse sinon montagneuse" est une échappatoire interdite pour des raisons évidentes.
- D'un autre côté, une convention comme «lève une exception pour faux et quitte silencieusement pour vrai» serait bien, ainsi que «imprime un seul caractère pour vrai et rien d'autre pour faux»
- C'est le golf de code, donc le programme le plus court gagne.
- Les failles standard sont interdites.
code-golf
string
decision-problem
Beefster
la source
la source
aaa
serait bien, où le même personnage doit être utilisé à plusieurs niveaux.wasitacaroraratisaw
? Cela me semble ridiculewasitacaroraratisaw
est en effet montagneux AFAICTaaa
ça ne fonctionnent pas.Réponses:
Japt v2 ,
1413 octetsTestez-le en ligne!
la source
Nettoyer ,
94898780 octetsEssayez-le en ligne!
la source
Perl, 22 octets
Comprend
+
pourp
Imprime 1 pour vrai, rien pour faux
la source
Brain-Flak , 78 octets
Essayez-le en ligne!
Imprime 1 pour vrai, rien pour faux.
Pour vérifier un mot montagneux, il suffit de supposer que le mot descend "la montagne" chaque fois que possible.
la source
Python 2 ,
8983 octetsEssayez-le en ligne!
Merci aux ovs pour 6 octets.
la source
Prolog (SWI) , 29 octets
Essayez-le en ligne!
Ce programme définit une règle DCG
a//0
qui correspond à n'importe quelle chaîne (liste de caractères) qui est une chaîne montagneuse.Explication
Pour ce programme, j'utilise une définition légèrement différente mais équivalente pour les chaînes montagneuses de ce qui est décrit dans le défi: Une chaîne montagneuse est un caractère
c
suivi d'un nombre (pouvant être zéro) de chaînes montagneuses avecc
clouées aux extrémités. Dans une notation dérivée d'expressions plus concises, une chaîne montagneuse doit correspondre au modèlec(Mc)*
où seM
trouve une chaîne montagneuse et*
signifie que l'expression entre parenthèses est répétée zéro ou plusieurs fois. Notez que bien que chacunc
doive être le même caractère, chacunM
n'a pas besoin d'être la même chaîne montagneuse.Preuve d'équivalence
Il est clair que les règles 1 et 2 du défi sont équivalentes à ma règle où
Mc
se produisent respectivement zéro et une fois.Dans le cas où la chaîne montagneuse a
Mc
eu desn
moments oùn > 1
alors la chaîne peut être réécrite commecMcSc
oùS
sont les derniersn - 1
temps quiMc
se produisent à l'exclusion du dernierc
(notez qu'ilM
s'agit de n'importe quelle chaîne montagneuse et pas nécessairement la même que les autresM
). PuisqueM
est une chaîne montagneuse, selon la règle 2,cMc
doit être une chaîne montagneuse. SoitS
est une chaîne montagneuse, auquel cas ilcSc
s'agit d'une chaîne montagneuse, soitS
peut être réécrite commecMcTc
oùT
se trouvent les derniersn - 2
temps quiMc
se produisent en excluant le dernierc
. Ce raisonnement peut continuer à être appliqué jusqu'à ce que la chaîne non garantie soit montagneuse contienneMc
une fois ce qui signifierait qu'il devrait être également montagneux. Ainsi,cMc
étant montagneux et sicMc
etcM'c
sont montagneux, alorscMcM'c
doit être montagneux, la chaîne entière doit être montagneuse.Pour l'inverse, pour une chaîne
cScTc
oùcSc
etcTc
sont montagneuses, alors soitcSc
une chaîne montagneuse selon la règle 2, soit selon la règle 3. Si c'est une chaîne montagneuse selon la règle 2, alors elleS
doit également être une chaîne montagneuse. S'il s'agit d'une chaîne montagneuse selon la règle 3, ellecSc
doit être de la formecUcVc
oùcUc
etcVc
sont des chaînes montagneuses. Étant donné que le plus long decUc
etcVc
doit toujours être au moins deux caractères plus court quecSc
et la règle 3 nécessite au moins 5 caractères à appliquer, puis après un nombre fini d'applications de la règle 3, chaque chaîne entre lesc
s sélectionnés par les applications de la règle 3 doit être montagneuse. chaîne. Le même raisonnement peut être appliqué àcTc
ainsi la corde est montagneuse par ma définition.Étant donné que toute chaîne qui correspond à ma définition est montagneuse et ma définition correspond à toutes les chaînes montagneuses, elle est équivalente à celle donnée dans la question.
Explication du code
Dans l'ensemble, la
a//0
règle DCG, définie sur la première ligne, correspond à n'importe quelle chaîne montagneuse. La+//1
règle DCG (comme les prédicats, les règles DCG peuvent donner des noms d'opérateur ), définie à la ligne deux, correspond à toute chaîne composée d'une séquence de zéro ou plusieurs chaînes montagneuses avec le caractère transmis lorsque ses arguments sontX
collés aux extrémités de ceux-ci . Ou d'emprunter la notation semblable à regex j'ai utilisé ci - dessus, lesa//0
matchsc(Mc)*
mais externalise le travail de correspondant en fait le(Mc)*
à+//1
qui prendc
comme argumentX
.Ligne par ligne, les codes se comportent comme suit:
Cette ligne définit la règle DCG
a
. Les[X]
états que le premier caractère doit être égale à la variable actuellement non définiX
. Cela se traduit parX
être mis égal au premier caractère. Le+X
indique ensuite que le reste de la chaîne doit correspondre à la règle DCG+//1
avec le caractèreX
défini comme argument.Cette ligne définit la
+//1
règle DCG. Le;
représente un ou dans Prolog, ce qui signifie que la chaîne peut correspondre à[]
oua,[X],+X
. Le[]
représente la chaîne vide et+//1
est donc toujours capable de correspondre à la chaîne vide. Si la chaîne n'est pas vide, le début de celle-ci doit correspondrea//0
et doit donc être une chaîne montagneuse. Celui-ci doit ensuite être suivi du caractèreX
défini. Enfin, le reste de la chaîne doit correspondre+X
.la source
Husk , 15 octets
Essayez-le en ligne! L'inférence de type prend environ 40 secondes, alors soyez patient.
Explication
L'idée est de remplacer à plusieurs reprises une sous-chaîne du formulaire
aba
para
jusqu'à ce que ce ne soit plus possible. L'entrée est montagneuse si et seulement si cela se traduit par une chaîne à un seul caractère (qui est ce quiε
teste). La seule situation dangereuse est lorsque nous avons une chaîne comme celle-ci, oùaba
ne semble pas être un pic:Heureusement, nous pouvons toujours le transformer en un seul:
la source
true
cas et non autrement serait "cohérent".Retina 0.8.2 , 15 octets
Essayez-le en ligne! Port trivial de la réponse Japt de @ETHproductions.
la source
JavaScript (Node.js) , 53 octets
Je suppose que c'est presque la méthode la plus simple pour le faire?
Essayez-le en ligne!
JavaScript (Node.js) , 72 octets
Moins trivial, mais beaucoup plus long.
Essayez-le en ligne!
la source