Considérons une grammaire sur l'alphabet { 0
, 1
, ?
, :
} défini par la règle de production
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Étant donné une chaîne générée à partir de s , analysez-la comme une expression où ?:
est associative à droite (par exemple, a?B?X:Y:c?d:e?f:g
signifie a?(B?X:Y):(c?d:(e?f:g))
) et évaluez-la avec la sémantique suivante:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Si le résultat est 0 , sortez une valeur fixe; si la sortie est 1 , émettez une valeur fixe différente. Spécifiez les valeurs de sortie que vous avez choisies (par exemple 0
/ 1
, ou False
/ True
) dans votre réponse.
Cas de test
0 -> 0
1 -> 1
0?0:1 -> 1
0?1:0 -> 0
1?0:1 -> 0
1?1:0 -> 1
0?1?0:1:1 -> 1
1?0?1:1:1 -> 1
1?0:1?0:1?1:1 -> 0
1?1?1:0?1?0:0:0:0 -> 1
1?0:1?0?1:1?1:0:1?1?1:1:1?0:1 -> 0
1?1?1:0?0?1:1:0?1:0:1?1?0?0:0:1?1:0:0?1?0:1:1?0:1 -> 1
0?0?1?0?0:1:0?0:0:0?0?1:1:1?0:1:0?0?0?1:0:0?1:1:1?1?0:1:1 -> 0
Règles
- Vous ne pouvez pas utiliser de langage intégré qui interprète les chaînes comme du code dans certains langages de programmation et les exécute (comme JavaScript / Perl / Ruby / Python
eval
). - Cela dit, votre code ne fait avoir à analyser et évaluer la chaîne d'entrée. Vous pouvez adopter n'importe quelle approche pour obtenir des résultats équivalents et ne pas enfreindre la règle précédente.
- Votre programme sera vérifié
perl -le 'print eval<>'
. - Le code le plus court (en octets) gagne.
S → T | T ? S : S
,T → 0 | 1
, en supprimant la nécessité de parler associativité?Réponses:
GolfScript, 21 octets
Cela génère
0
ou1
. L'entrée est supposée avoir une seule nouvelle ligne de fin. L'utilisation de~
(qui évalue les chaînes) sauverait un octet:Ceci est basé sur http://golf.shinh.org/reveal.rb?The+B+Programming+Language/tails_1462638030&gs .
la source
Rétine , 23 octets
Essayez-le en ligne! (La première ligne active une suite de tests séparés par un saut de ligne.)
Explication
C'est assez simple en fait. L'entrée est réduite au résultat en
+
évaluant à plusieurs reprises ( ) les ternaires qui ne contiennent que des littéraux. Pour nous assurer que cela se fait de manière associative à droite, nous recherchons les correspondances de droite à gauche (r
) et ne remplaçons que la dernière correspondance trouvée (-1=
).Le regex lui-même correspond
0\?.:
et le supprime (ne laissant que les éléments après:
) ou le1\?.:.
remplace par la valeur après le?
.la source
1
correspondance de st au lieu de la-1
st?Haskell,
106101100 9083 octetsCela s'appuie fortement sur les capacités de correspondance de motifs de Haskell. Tout d'abord, nous inversons la chaîne de sorte que nous puissions simplement rechercher la première occurrence de
b:a?x
(qui se lirait normalement commex?a:b
) et la remplacer par sa valeur. Cela fournit automatiquement la bonne associativité . Ici, nous utilisons lex:xs
modèle. C'est ce que fait la fonctionf
. Ensuite, nous appliquons essentiellementf
à sa sortie maintes et maintes fois, jusqu'à ce qu'il ne nous reste qu'un seul numéro (0 ou 1).Merci @Lynn pour 12 octets!
la source
Brainfuck,
826463 octetsLa sortie est
\xff
pour0
et\x00
pour1
. L'implémentation brainfuck doit permettre d'aller à gauche de la cellule de départ.Cela utilise essentiellement la même approche que la réponse Python de xsot , mais la ramification est probablement plus difficile à suivre par rapport à ma soumission initiale de 82 octets:
(Pour cette solution, la sortie est
\xfe
pour0
et\xff
pour1
, et une compatibilité plus large est obtenue lorsque l'entrée se termine par une nouvelle ligne.)Si vous ne pouvez pas vous soucier d'analyser la solution de xsot, l'idée est la suivante: procédez de gauche à droite. Si vous voyez,
1?
jetez-le avec avidité. Si vous voyez0?
alors jetez tout entre cela et le correspondant:
. Lorsque?
n'apparaît pas comme deuxième caractère, arrêtez la boucle et imprimez le premier caractère de la chaîne restante.Ainsi, la solution de 82 octets reflète en fait ce schéma de très près. La boucle intérieure gère
0?
, tout comme la boucle intérieure de xsot. Un certain soin est pris pour entrer dans la boucle principale sans vérifier les caractères saisis; c'est-à-dire, nous voulons vérifier si le deuxième caractère est?
juste une fois à la fin de la boucle principale, et pas aussi au début avant d'entrer dans la boucle principale.La solution de 63 octets combine essentiellement les boucles internes et externes en une seule, ce qui, je le soupçonnais, était possible compte tenu de la similitude entre ces boucles. La disposition de la mémoire dans la boucle principale peut être décrite comme suit:
où
[x]
signifie cellule actuelle - les
début sous la forme d'une valeur fictive non nulle qui indique simplement que nous bouclons toujours et est immédiatement remplacé par un caractère d'entrée (soit0
ou1
). Lad
cellule détient la profondeur (négative) au cas où nous serions au milieu de a0?
, sinon0
. Lec
va être ou?
ou:
ou nouvelle ligne ou EOF.Après la mise à jour
s
etc
, nous traitons le0?
cas en mettant à jour end
conséquence et en ajustant le pointeur, sinon nous utilisons la valeur actuelle dec
comme valeur ded
dans la prochaine itération, ou nous arrêtons si nous avons terminé.la source
Python 2,
76747372 octetsAvec entrée comme chaîne littérale à éviter
raw_
.La sortie est
0
ou1
suivie de<built-in function id>
.la source
3>>int(c)
`id`
astuce…! Bravo :)Python 2, 89 octets
L'entrée est prise comme un littéral de chaîne.
la source
Grime ,
3431 octetsImprime
1
pour les entrées véridiques et0
pour les fausses. Essayez-le en ligne! Le dernier cas de test manque malheureusement de mémoire sur TIO.Explication
L'associativité droite signifie essentiellement que dans
a?b:c
,a
est toujours soit0
ou1
, jamais une expression plus longue. Je vais simplement définir de manière récursive un modèle qui correspond à une expression véridique comme celle-ci, et vérifier l'entrée en fonction de celle-ci. Il n'est pas non plus nécessaire de vérifier que tout:
est vraiment un:
, si tous les?
s sont vérifiés: il y a un nombre égal de?
s et de:
s dans l'entrée, et si certains?
sont incorrectement classés comme a:
, le correspondant:
ne correspondra pas et la correspondance de Grime le moteur fera marche arrière.la source
Haskell,
79 71 70 62 6056 octetsEdit: Merci à @Zgarb pour 3 octets et à @nimi pour 4 octets!
Il s'agit d'une approche récursive
qui abuse quelque peu de la règle de sortie "une certaine valeur fixe". Edit: Se débarrasser des tuples n'économise pas seulement 8 octets, il donne également une sortie plus agréable:"0"
ou"1"
.Version non golfée:
Comment ça marche?
La
eval
fonction parcourt l'arbre implicite des expressionset renvoie un tuple du formulaire
(result, rest)
.Le premier motif
(x:'?':r1)
correspondx
à'1'
etr1
à"0?0:1:0?1:0"
. L'application récursiveeval
àr1
évalue la sous-expression0?0:1
et renvoie(0,":0?1:0")
. Faire correspondre cela au modèle(a,':':r2)
donnea=0
etr2=0?1:0
. Cette sous-formule est également évaluée récursivement de sorte queb='0'
etr3=""
. Vérifiez six
est'1'
ou'0'
et le retour soit(a, r3)
ou(b, r3)
.la source
x>'0'
à la place dex=='1'
?':'
par_
.:
. Merci encore!if .. then .. else
parlast$e s:[a:tail(e s)|x>'0']
.JavaScript (ES6), 53 octets
Renvoie
0
ou1
pour une entrée valide; se bloque pour une entrée non valide. Explication: comme inverser une chaîne est gênant en JavaScript, ma première tentative de 71 octets a fonctionné en utilisant une impasse négative pour un?
qui autrement perturberait l'associativité:Comme cela était un peu long, je me demandais si je pouvais améliorer les choses en incorporant la prise de décision dans l'expression rationnelle. Il s'est avéré que ce n'était pas un succès immédiat, car cela a également pris 71 octets:
Ensuite, il m'est venu à l'esprit que
0?0:
et0?1:
sont toujours sans opération, sans souci d'associativité. Cela m'a fait économiser près de 25%.la source
f=
. Je n'ai pas vérifié si votre nombre d'octets en tient compte ou non.Perl, 32 + 1 (
-p
indicateur) = 33 octetsPlein crédit à @Mitch Swartch , car sa solution était de 14 octets plus courte que la mienne!
Merci également à @Neil qui a proposé une solution 1 octet de plus que Mitch.
Besoin d'un
-p
drapeau, ainsi que-M5.010
ou-E
pour courir. Par exemple :Explications : Il réduit essentiellement les blocs de
a?b:c
(à partir de la fin pour être sûr qu'aucun suivi ne?
suit) dansb
ou enc
fonction de la justesse dea
, encore et encore jusqu'à ce que la chaîne ne contienne que1
ou0
.la source
-
ne compte- t-il pas dans votre score? Hrm. Intéressant ... Bonne réponse!perl -e '<code>'
ajoutant ainsi unp
seul coût de 1 octetperl -pe '<code>'
.?
, j'ai pu réduire cela à 34 octets de cette façon.s/.*\K(1\?(.)..|0\?..)/\2/&&redo
Python 3,
9369 octetsL'entrée est la chaîne sous forme de liste de caractères, la sortie est soit
"0"
ou"1"
Version non golfée:
Un autre essai, mais avec beaucoup plus d'octets:
la source
def f(s):x=s.pop(0);return[]<s<s.pop(0)>'>'and(f(s),f(s))[x<'1']or x
, et pour Python 3 avec une petite distance d'édition par rapport au vôtre, il y en adef f(s):z=s.pop;r=z(0);return s and':'<z(0)and(f(s),f(s))[r<'1']or r
.SED,
75 74 68(40 + 1 pour -r) 41la source
(.*)
et ajouter un terme de remplacement supplémentaire.\3
au lieu de\2
. Vous pouvez également joindre les lignes avec;
pour obtenir:;s/(.*)(1\?(.):.|0\?.:)/\1\3/;t
.\3
donc cela signifie que j'ai accidentellement copié une version précédente. Je connais les points-virgules. Mais beurk, pourquoi voudriez-vous utiliser des points-virgules.Utilitaires Bash + GNU, 42
Idée similaire à la plupart des autres réponses d'appariement de motifs.
Ideone .
la source
0
boîtier, ce qui vous fait économiser 5 octets.