Votre tâche est simple . Déterminer si une chaîne est égale à l'autre (pas d' adresse, la valeur) sans l'utilisation des opérateurs d'égalité ( par exemple ==
, ===
ou .equal()
) ou l' inégalité ( !=
, !==
) quelque chose de semblable pour d' autres langues. Cela signifie partout! Vous ne pouvez utiliser ces opérateurs nulle part dans le code. Vous pouvez cependant utiliser des bascules telles !exp
que vous ne comparez pas directement le exp != with something else
.
De plus, vous ne pouvez utiliser aucune fonction telle que strcmp , strcasecmp , etc.
En ce qui concerne les opérateurs de comparaison ( >=
, <=
, >
, <
), ils sont également refusées . Je me rends compte que certaines réponses incluent cela, mais j'aimerais vraiment voir plus de réponses qui ne limitent pas l'opérateur d'égalité.
Un exemple utilisant PHP est montré:
<?php
$a = 'string';
$b = 'string';
$tmp = array_unique(array($a, $b));
return -count($tmp) + 2;
Renvoyez simplement vrai ou faux (ou quelque chose qui est évalué dans le langage comme vrai ou faux comme 0 ou 1) pour indiquer si les chaînes correspondent. Les chaînes doivent être codées en dur comme dans l'exemple ci-dessus. Les chaînes ne doivent pas être comptées dans le golf, donc si vous déclarez la variable avant la main, ne comptez pas la déclaration.
Réponses:
Python
49 45 18 22 1514(+ 3 si les variables de chaîne sont prises en compte)
La chaîne doit être codée en dur aux deux occurrences dea
et une occurrence deb
entouré de guillemets.a
etb
doit être pré-initialisé aux chaînes.Coque en python, 9
(+ 3 si les variables de chaîne sont prises en compte)
Sortie en shell
Explication
Crée un dict (table de hachage) avec la clé de la première et de la deuxième chaîne. Si la deuxième chaîne est la même, la valeur de la première est remplacée par celle de la seconde. Enfin, nous imprimons la valeur de la première clé.
EDIT: OP a permis 0/1 au lieu de False / True ainsi que l'utilisation de variables pré-initialisées.
la source
a
etb
ne doivent pas être inclus, les chaînes doivent y être codées en dur, c'est pourquoi j'ai ajouté + 2 * len (str1) + len (str2) + 6 (')Python (
1711):(Vérifie si b est contenu dans a et a est contenu dans b, si cela ne ressort pas clairement du code.)
Python alternatif: (
87)dérivé de la solution Go de Tom Verelst:
Bonus: cela fonctionne pour tout type.
MODIFIER:
Attendez une seconde, lisez simplement que vous pouvez également programmer directement dans les chaînes, et ne pas avoir à compter les guillemets ... (ou du moins, ce que fait golfscript). Alors ... Python à égalité avec golfscript? Oh mon!
Alternative alternative Python (
54):(merci Claudiu)
original:
Alternative Alternative Alternative Bendy-ruly Python (2):
Rien n'a été dit sur les mots clés de comparaison (ce n'est pas une soumission sérieuse, juste quelque chose qui m'est venu à l'esprit ...)
la source
b in a in b
. Le et un n'est pas nécessaire ...in
et[a]
. c'est à direb in[a]
devrait fonctionner.JavaScript,
1110Les chaînes doivent être stockées dans a et b.
Edit: merci Danny de l'avoir souligné, cela
|
suffit au lieu de||
la source
|
?Rubis, 11
Vérifie si chaque chaîne est contenue dans l'autre.
la source
!(a<b||b<a)
serait le même ...Python - 11 (sans les chaînes)
la source
a<=b<=a
qui ne fait que 7 caractères. Même si je ne sais pas si la comparaison<=
serait considérée comme une "inégalité". D'après la question, il apparaît que toute comparaison qui n'est pas un contrôle d'égalité est correcte, ce qui permettrait<=
.GolfScript (5 caractères)
Port assez simple de l'implémentation de référence PHP. Laisse
0
(= false) sur la pile si les chaînes sont identiques, ou1
(= true) si elles sont différentes.la source
1
si la chaîne est la même et2
si elle est différente.'string1''string1'].&,1&
travauxJavascript (45 octets):
Voici une autre solution en Javascript.
L'espace est important.
c
devrait êtretrue
.la source
!a.replace(b,'')
est compté. Le nombre de caractères doit donc être 16. En fait, certaines personnes le comptent même 14, car vous pouvez spécifier directement la chaîne.C ++,
635856la source
auto
au lieu deconst char*
?coreutils: uniq -d
Entrez simplement vos deux chaînes comme entrée standard d'un tuyau et
uniq -d | grep -q .
n'imprimera rien mais aura une valeur de retour de succès ou d'erreur. Si vous souhaitez imprimer le booléen, remplacez simplement paruniq -d | grep -c .
Combien de personnages? Je vous laisse compter;
uniq -d|grep -q .
sans espaces supplémentaires contient 17 caractères, mais comme tout le travail est effectué par uniq, je dirais que cette solution est à 0 caractères dans ... sauniq
propre langue!En fait,
uniq -d
imprime une ligne si les deux chaînes sont identiques et rien si les sont différentes.la source
Les chaînes doivent être stockées dans a et b. Ne fonctionnera pas si l'un ou l'autre l'est
null
.C #, 53
C #, 28
la source
PHP - 49 caractères
la source
!strlen(str_replace($a,'',$b));
il devrait retourner 1 si deux chaînes sont égales?$a == 'foo'
et$b = 'foofoo'
:)!strlen(preg_replace("/{$a}/", '', $b, 1));
et fait 45 caractères?APL (
89)Mise à jour: l'ancienne ne fonctionne pas pour les chaînes de longueurs différentes.
↑⍺⍵
: faire une matrice avec⍺
sur la première ligne et⍵
sur la deuxième ligne, en remplissant les espaces vides.∊⌿
: Pour chaque colonne, vérifiez si la ligne supérieure contient la ligne inférieure (comme dans l'ancienne version).∧/
: Prenez la logiqueand
de toutes les valeurs.Le vieux:
⍺∊¨⍵
: pour chaque combinaison d'éléments dans⍺
et⍵
, voyez si l'élément from⍺
contient l'élément from⍵
. Étant donné que dans une chaîne, ce seront tous des caractères uniques et qu'une chaîne se contient, il s'agit essentiellement de comparer chaque paire de caractères.∧/
: prendre la logique et toutes les valeurs (si tous les caractères correspondent, les chaînes sont égales)la source
Python - 12
Cette solution utilise des ensembles. La soustraction d'ensembles égaux se traduira par un ensemble vide, qui a une valeur booléenne False. La négation qui se traduira par une valeur vraie pour a et b étant des chaînes égales.
Edit: Merci à Peter Taylor pour avoir souligné les espaces inutiles.
la source
a="s", b="ss"
t-il?"s"!="ss"
, il sortiraFalse
. La sensibilité à la casse est également préservée. Cela fonctionne même poura="", b="s"
. Le code ne convertit pas les chaînes en ensembles, mais crée des ensembles contenant les chaînes.{}
n'est pas pareilset()
. Vous pouvez enregistrer 1 caractère en supprimant les espaces.{a}
est équivalent àset([a])
.not {a}-{b}
?C - 62
Testé. Appelez en tant que
e(str1, str2)
À bien y penser, si vous ne comptez pas le
char*p,char*q
, ce qui semble juste, ce n'est que 49 octets :)la source
np
etnq
. Une boucle fera l'affaire, car si vous atteignez la fin d'une chaîne avant l'autre, elles auront une valeur différente.*p&*q
peut arrêter la boucle trop tôt (par exemple'0'&'A'==0
)*p=='0'
&*q=='A'
, nous voulons que la boucle s'arrête tôt, car nous savons que les chaînes ne sont pas égales.Haskell - 9
Notez que, comme beaucoup d'entrées ici, ce n'est qu'une expression. Ce n'est pas un programme Haskell.
la source
Java -
162147 caractèresL'idée est de comparer la différence de chaque octet, les mêmes octets auront la différence 0. Le programme lancera
java.lang.ArrayIndexOutOfBoundsException
quand les octets sont différents (essayez d'accéder à un index négatif) ou lorsque les chaînes sont de longueur différente. Il interceptera l'exception et renverra 0 (chaînes non égales), ou renverra 1 sinon (chaînes égales).Comprimé:
Ordinaire:
la source
PHP
Ce script peut ne pas avoir d'utilité, mais au moins cela fournit un moyen de comparer les chaînes.
PHP
Un autre:
la source
Prolog 7
Cela utilise la fonction de correspondance de motifs dans Prolog pour unifier les 2 arguments au prédicat, qui teste efficacement l'équivalence égale lorsqu'il n'y a pas de variable non liée .
Exemple d'utilisation:
Techniquement parlant, le comportement de cette solution est celui de l'opérateur d'unification
=/2
, plutôt que celui de==/2
, qui vérifie l'équivalence des termes. La différence montre quand des variables non liées sont impliquées. Dans cette solution, lorsque la variable non liée est fournie, le prédicat est renvoyétrue
lorsque l'unification est réussie. En comparaison,==/2
comparera l'ordre des termes sans unification.la source
PHP, 21
Celui-ci fait le travail en utilisant l'indirection variable.
Ou, si vous n'en avez pas besoin pour être booléen
EDIT : J'ai oublié de gérer le cas où vous essayez de comparer deux chaînes vides, donc le code est maintenant
qui est de 21 caractères.
la source
CPython: 6
L'utilisation de
is
est évidemment assez suspecte, mais comme la tâche appelle spécifiquement à déterminer l'égalité de valeur plutôt que l'égalité de référence, etis
ne compare que l'identité d'objet, j'ai l'impression que cela ne peut pas entrer dans la liste des opérateurs interdits.Bien sûr, il est également question de savoir si cela est même valable; il fonctionne sur tous mes systèmes, mais il est spécifique à l'implémentation et ne fonctionnera probablement pas toujours si les chaînes ne sont pas définies à la main dans l'interpréteur interactif.
la source
Langage Mathematica / Wolfram, 15 octets
Assez explicite, définit chaque chaîne comme un ensemble, puis vérifie la longueur de l'union des deux ensembles. Si les chaînes sont les mêmes, renvoie 1, sinon retourne 0. Si je suis autorisé à retourner «2» pour «différent» et «1» pour «même», soustrayez deux octets.
la source
C 342 golfé
Remarque: Visual Studio se plaint si vous n'utilisez pas leurs méthodes sûres, par exemple gets_s. CodeBlocks avec mingw compile sans avertissements.
C 655 non golfé
Le code crée une somme pondérée de caractères pour chaque chaîne. Si la différence est nulle, elles sont égales, y compris 2 chaînes vides:
la source
Python
C'est long et ce n'est pas beau, mais c'est ma première entrée!
la source
PHP, 68 octets
Je suppose qu'il vous est interdit d'utiliser des opérateurs de comparaison. Alors
<
ou>
sont inclus.L'idée est d'utiliser XOR au niveau du bit. Dans différentes langues, cet opérateur a une syntaxe différente - je vais montrer un exemple pour PHP. Là, il est disponible avec
^
. Malheureusement, son comportement avec les chaînes n'est pas aussi bon qu'il pourrait l'être, vous devrez donc vérifier la longueur des chaînes avant. En effet, en PHP, xor supprimera la chaîne la plus longue jusqu'à la longueur de la chaîne la plus courte.La prochaine chose est de travailler correctement avec les chaînes, car un seul
xor
ne produira pas de résultat, disponible pour d'autres opérations en PHP. Voilà pourquoi aunpack()
été utilisé. Ainsi, le code serait:C'est plus long que l'option avec
<
/>
mais il ne les utilisera pas. En outre, l'important concerne le jonglage de type PHP (donc le tableau vide sera converti enfalse
). Ou peut-être qu'il existe un moyen plus simple de vérifier si un tableau contient des membres non nuls ( Edit : pendant que je tape ceci, il y a un bon hic avectrim()
une autre réponse, afin que nous puissions nous débarrasser des opérations de tableau)Mais je crois qu'il y a des langues, où nous pouvons faire juste
a ^ b
- littéralement, obtenir le résultat. Si c'est0
(traité à partir de tous les octets résultants) - alors nos chaînes sont égales . C'est très facile et encore plus simple que<
ou autre>
.la source
grep 14 caractères
Bien sûr, je ne compte que le code grep; les deux chaînes sont sur deux lignes consécutives en entrée (soit un pipe soit un fichier ou même une session interactive).
la source
Matlab: 12 caractères (après que les chaînes soient dans des variables)
Le code incluant les affectations serait:
la source
La manière très folle
Juste pour le plaisir, mais de nombreuses façons de le faire échouer si on y pense. De plus, n'oubliez pas que les cordes seront EXÉCUTÉES par le shell.
Un bon contre-exemple compare la "chaîne" comme première chaîne et "rm -Rf /" comme deuxième chaîne; vérifiez simplement en tant que root et voyez: il dira "vrai" bien que les deux chaînes ne soient évidemment pas identiques.
la source
JavaScript [18 octets]
OU
Cela reviendra
true
sia == b
etfalse
sia =/= b
. La logique derrière est de créer un objet avec une valeur dea
comme propriété et de retourner1
ouundefined
au cas où une propriété deb
valeur existe ou n'existe pas dans cet objet.la source
!!
n'est pas nécessaire1
ouundefined
(ou object /undefined
pour le second cas).18-2 = 16 bytes
.JavaScript [15 octets]
Cela reviendra
true
sia == b
etfalse
sia =/= b
. Le script recherche la valeur deb
dans le tableau qui contient un seul élément de valeur dea
.la source
C -
8683Évidemment, ce n'est pas le plus court, mais cela ne fonctionne pas avec les variables de chaîne et prend à la place les chaînes en entrée de la console. De plus, j'aime un peu le principal récursif, même si ce n'est évidemment pas la version la plus courte. Mais certainement le moins conseillé.
la source
char** v
peut être écrit commechar**v
. Il existe quelques exceptions (comme42 / *pointer
), mais dans la plupart des cas, les espaces peuvent être supprimés en toute sécurité à proximité de caractères spéciaux.