Prelude est un langage de programmation ésotérique, qui a très peu de restrictions, mais inhabituelles, sur ce qui constitue un programme valide. Tout bloc de texte ASCII imprimable ("bloc" signifiant que les lignes ASCII imprimables sont séparées par des sauts de ligne - 0x0A) est valide à condition que:
- Chaque colonne (verticale) de texte contient au plus un
(
et)
. - En ignorant leur position verticale, les
(
et)
sont équilibrés, c'est-à-dire que chacun(
est jumelé avec exactement un)
à sa droite, et vice versa.
Écrivez un programme ou une fonction qui, étant donné une chaîne contenant de l'ASCII imprimable et des sauts de ligne, détermine si elle constitue un programme Prelude valide. Vous pouvez saisir des données via STDIN (ou l'alternative la plus proche), l'argument de ligne de commande ou l'argument de fonction. Le résultat peut être retourné ou imprimé à STDOUT, en utilisant deux valeurs fixes de vérité / fausse de votre choix.
Vous ne devez pas supposer que l'entrée est rectangulaire.
Il s'agit du code golf, donc la soumission la plus courte (en octets) l'emporte.
Exemples
Les programmes Prelude suivants sont valides (en fait, ce sont même de vrais programmes Prelude):
?1-(v #1)-
1 0v ^(# 0)(1+0)#)!
(#) ^#1-(0 #
1(# 1) v # - 1+)
vv (##^v^+
? v-(0 # ^ #)
?
1+ 1-!
Et voici un certain nombre d'entrées, qui sont toutes invalides :
#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)
la source
)
et 2(
. Cela ne devrait-il pas être seulement 1 par ligne?Réponses:
CJam,
5756 octetsTrop long, peut être beaucoup joué au golf. Explication à ajouter une fois que je jouerai au golf.
Brève explication
Il y a deux contrôles dans le code:
Number of "(" - Number of ")"
) devrait se compléter. Ainsi, lorsque vous les additionnez, cela devrait donner 0. Toute partie qui échoue à cette propriété fait que l'entrée entière a des crochets qui ne correspondent pas.Number of "(" - Number of ")"
ne peut pas être négative pour le bloc de droite.Essayez-le en ligne ici
la source
Python 2,
128119105 octetsSaviez-vous que vous pouvez mapper None dans Python 2?
Explication
Nous voulons commencer par transposer le Prélude pour que les colonnes deviennent des lignes. Habituellement, nous le ferions avec
zip
, mais commezip
tronqué à la longueur de ligne la plus courte etitertools.zip_longest
beaucoup trop long pour le code-golf, il semble qu'il n'y ait pas de moyen court de faire ce que nous voulons ...Sauf pour la cartographie
None
:Malheureusement (ou plutôt, heureusement pour toutes les utilisations non liées au golf), cela ne fonctionne qu'en Python 2.
Quant à
n
etv
:n
agit comme une pile, en comptant1 - <number of unmatched '(' remaining>
. Pour tout ce que(
nous voyons, nous soustrayons 1, et pour tout ce que)
nous voyons, nous ajoutons 1. Par conséquent, sin >= 2
à tout moment, nous avons vu trop de)
s et le programme n'est pas valide. Sin
ne se termine pas sur 1, il nous en reste au moins un inégalé(
.v
vérifie la validité et commence à 1. Si le programme est jamais invalide (n >= 2
ouA+B >= 2
),v
devient alors 0 pour marquer l'invalidité.Par conséquent, si le programme est valide, à la fin, nous devons l'avoir
n = 1, v = 1
. Si le programme n'est pas valide, à la fin, nous devons soit avoirv = 0
, soitv = 1, n <= 0
. Par conséquent, la validité peut être exprimée succinctement parn*v>0
.(Merci à @feersum pour une multitude de bonnes suggestions qui ont pris 14 octets!)
Soumission précédente, plus lisible:
la source
map
...def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
or
chaînage en comparaison, mais je n'ai pas pensé à changer|=
en*=
. A pris un autre octet cependant, en rendant les choses encore plus en arrière :)J, 64 octets
L'entrée est une chaîne avec une nouvelle ligne de fin. La sortie est 0 ou 1.
Exemple d'utilisation
La méthode est la suivante
];.2
(
/)
/anything else
dans1
/-1
/0
1 _1 0{~[:'()'&i.]
s=.+/@:
adverbe qui ajouté à un verbe résume la sortie du tableau de verbesajouter des valeurs dans les colonnes
]s
()
solde positif dans chaque préfixe[:(0>])s)[:+/\]
()
équilibre égal dans toute la liste (c'est-à-dire dans le dernier préfixe)|@{:@]
ajouter des abs (valeurs) dans les colonnes et vérifier chaque élément pour une valeur maximale de 1
(1<|s)s
comme toutes les vérifications précédentes ont donné un résultat positif à l'échec, nous les additionnons et les comparons à 0 pour obtenir la validité de l'entrée
0=]
la source
J, 56 octets
Il s'agit d'une fonction anonyme acceptant une chaîne avec un retour à la ligne de fin et retournant 0 ou 1. Lecture de droite à gauche:
];.2 y
, comme dans l'autre soumission J, coupe la chaîney
à toutes les occurrences de son dernier caractère (c'est pourquoi l'entrée a besoin d'un retour à la ligne) et crée une matrice rectangulaire dont les lignes sont les morceaux, complétée par des espaces si nécessaire.'()'=/
compare d'abord chaque caractère de cette matrice avec(
puis en)
renvoyant une liste de deux matrices 0-1.+.^:_1]0|:
transforme cette liste de deux matrices en une seule matrice de nombres complexes. Jusqu'à présent, le programme transforme chaque(
entrée en 1, chaque)
en i et chaque autre caractère en 0.b=.+/
affecte la somme des lignes de cette matrice complexe àb
.-.|b
fait une liste de 1- | z | pour chaque zb
. La condition que chaque colonne contienne au plus une seule parenthèse se traduit par tous ces nombres 1- | z | étant non négatif.+/\*:b
est le vecteur des sommes cumulées des carrés des nombres enb
. Si chaque colonne contient au plus une parenthèse, les carrés des nombresb
sont tous 0, 1 ou -1. Le,
concatène ce vecteur avec le vecteur de 1- | z |.maintenant tout ce que nous devons faire est de tester que les entrées de notre vecteur concaténé
v
sont des nombres réels non négatifs, c'est presque*/0<:v
, sauf que cela provoque une erreur si certaines entrées dev
ne sont pas réelles, donc nous remplaçons<:
par<: ::0:
qui retourne simplement 0 en cas d'erreur .la source
0={:+/\*:b
par exemple,(
n'est pas valide.0=(-|)v
est de 2 octets plus court pour vérifier les réels non négatifs. (Battons CJam!: P)inv
au lieu d'^:_1
enregistrer un autre octet.3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'
.