Écrivez du code pour évaluer si une chaîne d'inégalités est vraie ou fausse. Un exemple d'entrée est la chaîne
3<=4!=9>3==3
Cela est vrai car chacun de ses composants est vrai:
(3<=4) and (4!=9) and (9>3) and (3==3)
Contribution:
Une chaîne qui représente une chaîne d'une ou plusieurs inégalités. Les opérateurs de comparaison autorisés sont
== equals
!= does not equal
> is greater than
>= is greater than or equal to
< is less than
<= is less than or equal to
Les numéros autorisés sont des numéros à un chiffre 0
jusqu'à 9
. Il n'y aura pas d'espaces, de parenthèses ou d'autres symboles.
Production:
La justesse de l'inégalité en tant que valeur cohérente de Truthy ou Falsey . Cohérent signifie que chaque sortie Truthy est la même et que chaque sortie Falsey est la même.
Restriction:
Le but de ce défi est que vous écriviez du code qui traite les inégalités, plutôt que de les évaluer en tant que code, même pour une seule inégalité dans la chaîne. En tant que tel, les méthodes comme Python eval
et exec
qui évaluent ou exécutent du code sont interdites. Il en va de même pour les fonctions qui recherchent une méthode ou un opérateur en fonction de son nom sous forme de chaîne. Il n'est pas non plus permis de lancer des processus ou des programmes pour faire l'évaluation pour vous.
Cas de test:
3<=4!=9>3==3
True
3<=4!=4
False
5>5
False
8==8<9>0!=2>=1
True
Réponses:
Rubis, 71 + 1 = 72
Avec l'indicateur de ligne de commande
-n
, exécutezGénère toutes les expressions régulières pouvant échouer et vérifie si la chaîne d'entrée correspond à l'une d'entre elles. Sorties
true
si aucun ne le fait, sinonfalse
. Prend entrée via STDIN, séparé par des retours à la ligne.Des trucs:
a<=>b
, qui renvoie -1,0, ou 1 pour inférieur à, égal ou supérieur. Tous ces éléments se répartissent en différents éléments d'un tableau à trois chaînes, trouvant l'expression régulière pour les comparaisons qui ne correspondent pas.la source
Perl, 82
Imprime 1 lorsqu'elle est vraie et une ligne vierge lorsqu'elle est fausse, car la chaîne vide est la valeur de falsey principale de Perl.
La boucle while parcourt la chaîne correspondant à l'expression régulière
\d(.)(=?)
. Ensuite, les variables$1
et$2
correspondent aux caractères de l'opérateur, et les variables spéciales$&
et$'
se comporteront comme les deux opérandes dans un contexte numérique. Les opérandes sont comparés<=>
et le résultat est comparé au premier caractère de l'opérateur. Ensuite, l'égalité et l'inégalité sont traitées spécialement.la source
CJam, 60 octets
Ce code semble un peu moche et potentiellement pas entièrement optimisé, mais c'est le meilleur que j'ai eu jusqu'à présent.
Essayez-le en ligne.
Explication
la source
JavaScript (ES6) 110
116Simple: chaîne de balayage, c est le chiffre actuel, l est le dernier chiffre, o est l'opérateur.
Test dans la console Firefox / FireBug
la source
Haskell, 156 octets
Exemple d'utilisation:
Version non golfée:
eval
prend deux arguments: la chaîne à analyser (en commençant toujours par un opérateur de comparaison) et un nombrei
qui est l'argument de gauche pour la comparaison (et qui était l'argument de droite au tour précédent). L'opérateur est retourné parlookup2
s'il s'agit d'un opérateur à deux caractères (ne cochez que le 1er caractère, car le 2e l'est toujours=
) et parlookup1
s'il ne s'agit que d'un seul caractère.eval
s'appelle de manière récursive et combine toutes les valeurs de retour avec logique et&&
.la source
Lisp commun -
300185169165Exemple
Explication
ppcre:split
se divise en chiffres; par exemple:Remarquez la première chaîne vide, qui est supprimée à l'aide de
cdr
Le mappage
read-from-string
à cette liste appelle laread
fonction pour chaque chaîne, qui renvoie des symboles et des nombres.loop for (a op b) on '(3 < 5 > 2) by #'cddr
itère la liste par une étape de 2 et lie ainsia
,op
etb
comme suit, pour chaque passage successif.always
vérifie si l'expression suivante est toujours vraie: soit l'opérateur estnil
(voir ci-dessus), soit le résultat de la comparaison est valide (voir ci-dessous).le
case
sélectionne une fonction de comparaison Common-Lisp, selon le symbole lu précédemment; puisque certains opérateurs sont identiques en Lisp et dans le langage donné, nous pouvons simplement retournero
dans le cas par défaut.la source
Python 2,
95102La boucle est un passage simple à travers la chaîne un caractère à la fois. C'est
t&=...
là que la magie opère. Fondamentalement, je hache l'opérateur avec la valeur decmp(lhs,rhs)
(-1, 0 ou 1 selon que iflhs
est inférieur, égal ou supérieur àrhs
). Le résultat est une clé dans une table de recherche qui donne 0 ou 1 selon que les nombres se comparent correctement en fonction de cet opérateur. Quelle table de consultation, demandez-vous? C'est le nombre 627 =0001001110011
en binaire. Les opérateurs au niveau du bit font le reste.Cela fonctionne sur les quatre cas de test donnés; faites-moi savoir si vous trouvez une erreur pour un autre cas. Je ne l'ai pas testé très rigoureusement.
la source
a
entrée.Javascript 101 octets
une approche différente de la solution js publiée ici
la source
Java 8, 283 octets
Explication:
Essayez-le ici.
la source