Deux mots sont isomorphes s'ils ont le même motif de répétition de lettre. Par exemple, les deux ESTATE
et DUELED
ont un motifabcdca
ESTATE
DUELED
abcdca
parce que les lettres 1 et 6 sont identiques, les lettres 3 et 5 sont identiques et rien d’autre. Cela signifie également que les mots sont liés par un chiffre de substitution, ici avec la correspondance E <-> D, S <-> U, T <-> E, A <-> L
.
Écrivez un code qui prend deux mots et vérifie s’ils sont isomorphes. Le moins d'octets gagne.
Entrée: deux chaînes de lettres majuscules non vides A..Z
. Si vous le souhaitez, vous pouvez les prendre comme une collection de deux chaînes ou comme une seule chaîne avec un séparateur.
Sortie: une valeur de vérité cohérente pour les paires qui sont des isomorphes et une valeur de Falsey cohérente si elles ne le sont pas. Les chaînes de différentes longueurs sont des entrées valides qui ne sont jamais isomorphes.
Cas de test:
Vrai:
ESTATE DUELED
DUELED ESTATE
XXX YYY
CBAABC DEFFED
RAMBUNCTIOUSLY THERMODYNAMICS
DISCRIMINATIVE SIMPLIFICATION
Faux:
SEE SAW
ANTS PANTS
BANANA SERENE
BANANA SENSES
AB CC
XXY XYY
ABCBACCBA ABCBACCAB
ABAB CD
N'hésitez pas à ajouter d'autres cas de test que vous jugez utiles.
Classement
Voici un extrait de pile permettant de générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
ABAB CD
(pour les approches de type zip)Réponses:
J, 4 octets
Usage
Explication
=
avec 1 argument crée un tableau d'égalité comparant les éléments de l'entrée et son nub.-:
avec 2 arguments vérifie leur égalité (comme le fait==
généralement). Cela fonctionne aussi pour les matrices de tailles différentes (ou même de types différents).f&g
applique g aux deux entrées séparément puis applique f aux deux résultats ensemble ainsix f&g y == f(g(x), g(y))
.Donc, dans notre cas, nous comparons les deux tables d’égalité.
Essayez-le en ligne ici.
la source
&
, la chose la plus proche que vous puissiez faire à K serait probablement la suivante~/{x=/:x}'
: elle est un peu plus longue.=
je ne pensais pas que la classification aurait un autre usage que celui de compter les occurrences.K, 5 octets
Cela a une solution délicieusement élégante dans K!
L'opérateur "group" (monadique
=
) crée précisément la signature que nous voulons pour l'isomorphisme des mots; regroupement des vecteurs des indices de chaque élément d'un vecteur, avec les groupes ordonnés par apparence:En prenant une paire de chaînes comme vecteur, il suffit d’appliquer un groupe à chaque élément (
=:'
) puis de réduire avec "match" (~
), l’opérateur d’égalité profonde:la source
Python 2, 41 octets
la source
CJam, 9 octets
Imprime
1
si les mots sont isomorphes et0
s'ils ne le sont pas.Essayez-le en ligne dans l' interprète CJam .
Comment ça fonctionne
la source
JavaScript, ES7,
62 55 54 5251 octetsLa logique est simple. Je convertis simplement les deux entrées en leurs valeurs d'index de caractères correspondantes, convertis ce tableau en chaîne et comparons.
Essayez le code ci-dessus en utilisant l'extrait ci-dessous.
Afficher l'extrait de code
2 octets enregistrés grâce à @ edc65
la source
+0
au lieu de+""
?Bash + coreutils, 38
Notez que nous utilisons ici l’idée habituelle de vérité / fausseté: zéro signifie SUCCÈS ou VRAI et non nul signifie erreur ou FAUX:
la source
Haskell,
33 ans29MODIFIER:
c'est beaucoup trop tard, mais j'ai trouvé cette amélioration en utilisant des applications, qui n'ont été ajoutées à prélude qu'en mars 2015.
Ancienne version:
la fonction de vérification est
(%)
cela fonctionne en générant pour chaque chaîne son "enregistrement d'égalité": pour chaque deux index ij, il enregistre s'ils ont des caractères égaux. l'enregistrement est ordonné de sorte que l'enregistrement de deux index i, j soit toujours au même endroit * et que, par conséquent, le fait de vérifier l'égalité des enregistrements renverrait si les chaînes ont le même motif.
Par exemple, l'enregistrement d'égalité de "ABC" est
[1,0,0,0,1,0,0,0,1]
(1 pour vrai, 0 pour faux) - il existe unTrue
endroit où tout index est comparé à lui-même. n'importe où ailleurs est un faux. (sauter ces vérifications pourrait être plus efficace, mais est plus difficile en termes de golf)* si les cordes ont la même longueur. sinon, il retourne false simplement parce que les enregistrements ont des longueurs différentes
la source
Haskell,
4541 octetsRetourne
True
ouFalse
, par exemple"ESTATE" ! "DUELED"
->True
.Utilise la méthode map-char-to-first-index, comme le montrent de nombreuses autres réponses. Les listes d'associations sont pratiques, car les entrées précédentes ont l'avantage.
"aba"
devient[(a,1),(b,2),(a,3)]
oùlookup
va toujours cherchera
->1
.Edit: @Mauris a trouvé 4 octets à sauvegarder.
la source
(flip lookup$zip l[1..])
par(`lookup`zip l[1..])
.Brainfuck,
169168162144140131130Compatible avec le bff d' Alex Pankratov (interprète brainfuck utilisé sur SPOJ et idéone) et le BFI de Thomas Cort (utilisé sur Anarchy Golf).
L'entrée attendue est deux chaînes séparées par un onglet, sans nouvelle ligne après la deuxième chaîne. La sortie
1
concerne les isomorphes et les0
non-isomorphes, ce qui est pratique pour vérifier les résultats visuellement, bien que ce ne soit pas l'option la plus courte. ( Mise à jour: version plus courte avec\x01
et\x00
comme sortie et\x00
comme séparateur au bas de la réponse.)Démonstration sur ideone.
Ce problème s'avère être très gentil pour un brainfuck.
L'idée de base de l'indexation est de revenir en arrière à partir de la fin du préfixe de chaîne actuel. Si le caractère ne s'est pas déjà produit, nous pouvons prendre la longueur du préfixe de chaîne. Par exemple:
L'indexation dans le code est en fait légèrement différente mais utilise le même principe.
La disposition de la mémoire est en blocs de 5:
c
représente le caractère,i
index etp
précédent (index). Lorsque la première chaîne est en cours de traitement, tous lesp
emplacements sont nuls. La cellule située à gauche dec
contient une copie du caractère actuel dont nous essayons de trouver l'index. La cellule située à gauche du couranti
sert à contenir un-1
pointeur pour faciliter la navigation.Il y a beaucoup de conditions qui doivent être considérées avec soin. À la fin, nous vérifions les isomorphes en comparant les
(i,p)
paires et nous atteignons le groupe de cellules zéro situé à gauche de la(i,p)
paire la plus à gauche si et seulement si les chaînes sont des isomorphes. Voici une version commentée du code pour le rendre plus facile à suivre:Mise à jour:
Voici une version qui s’imprime
\x01
pour les isomorphes et\x00
pour les non-isomorphes. C'est sans doute une interprétation plus précise de Truthy et Falsey pour un brainfuck, à cause du chemin[
et du]
travail. La seule différence est à la toute fin.Supplémentaire: utilisez maintenant
\x00
comme séparateur pour économiser 10 octets.la source
JavaScript (ES6), 62
Utilisation d'une fonction aux
h
qui mappe chaque mot à un tableau contenant la position de chaque lettre du mot, par exemple: PASS -> [1,2,3,3]. Renvoie true si la fonctionh
appliquée aux deux mots donne le même résultat.la source
R, 78
De-golfé:
la source
all( (g=...)(x)==g(y))
c'est plus court queidentical
...Ruby, 83 octets
C'est une fonction
f
qui prend deux arguments et retournetrue
oufalse
.Explication:
la source
t=->x{z=?`;x.chars.to_a.uniq.map{|c|x.gsub!(c,z.succ!)};x};f=->a,b{t[a]==t[b]}
t=->x{h={};i=9;x.gsub!(/./){|c|h[c]||h[c]=i+=1}};f=->a,b{t[a]==t[b]}
Java, 107
Mappe chaque caractère de
s
ett
à son emplacement, et vérifie l'égalité.Étendu:
la source
Python 3, 85 octets
la source
g
est la fonction principale,f
est une aide. Il y a un choix déroutant de variable à l'g
intérieurf
, mais c'est une variable liée non liée. Leg=
choix est facultatif, selon la décision autorisant les fonctions anon, qui enregistre deux caractères. 'Pyth, 9 octets
Prend les entrées sous la forme suivante:
Si ce n'est pas acceptable, le code suivant est 10 octets:
et utilise ce formulaire de saisie:
Utilise l'index de char dans la représentation sous forme de chaîne.
la source
F
marche. C'est quoi<binary>F
?<binary>F<seq>
est<binary>
replié<seq>
. Cela équivaut à intercaler<binary>
chaque paire d'éléments de<seq>
. Ainsi,<binary>F
sur une séquence de 2 éléments, la fonction est simplement appliquée à la séquence, ce qui équivaut à.*
Pyth ou*
à Python.Q
était implicite dans Pyth?Matlab, 50 octets
La fonction est définie comme anonyme pour économiser de l'espace.
Exemple:
la source
Octave, 26 octets
la source
==
correspond à l'élément matrice, et depuiss
ets'
sont de tailles différentes, la "diffusion" d'octave essaie automatiquement de faire fonctionner des matrices de la même taille - ce qui dans ce cas signifie répéter la lignes
et la colonnes'
05AB1E , 6 octets
Essayez-le en ligne!
Prend les entrées sous forme de liste:
['ESTATE', 'DUELED']
Explications:
la source
APL (Dyalog) ,
5 à4 octets-1 grâce à l'allusion de ngn.
Fonction de préfixe tacite anonyme qui prend comme argument une liste de deux chaînes.
Essayez-le en ligne!
Ceci est un produit interne, mais au lieu de l'habituel
+
et×
il utilise≡
identité.
et⍳
le ɩ ndex (la première occurrence de chaque élément)⍨
avec la liste complète de mots à deux éléments utilisés comme deux argumentsSi nous appelons les mots
A
etB
, alors nous pouvons déduire la solution précédente comme suit:≡.⍳⍨ A B
A B ≡.⍳ A B
(A⍳A) ≡ (B⍳B)
(⍳⍨A) ≡ (⍳⍨B)
≡/ ⍳⍨¨ A B
Solution précédente
Fonction de préfixe tacite anonyme qui prend comme argument une liste de deux chaînes.
Essayez-le en ligne!
≡
identité/
à travers⍳
le ɩ ndex (la première occurrence de chaque élément…)⍨
selfie (… en soi)¨
de chaquela source
Mathematica, 46 octets
la source
Ruby, 50 octets
Code ruby plus court de 30 octets. Ecrit avant de jeter un coup d'œil aux solutions, vérifie pour chaque caractère des deux chaînes si l'index de la première occurrence de ce caractère correspond; c'est à dire. transforme une chaîne en sa forme normalisée,
01121
etc. et les compare.Cas de test sur ideone En tant que bonus supplémentaire, cela interrompt la mise en surbrillance du code de l'idéone.
la source
Husk , 5 octets
Essayez-le en ligne!
Explication
la source
PCRE, 84 octets
Le sujet doit être composé de deux mots séparés par des espaces, comme dans le PO. Voici une explication superficielle:
la source
Ruby, 31 octets
Un Proc qui prend un tableau de chaînes et vérifie si certaines sont isomorphes les unes par rapport aux autres.
tr s,'a-z'
avec ces arguments, normalise une chaînes
en remplaçant chaque lettre par la nième lettre de l'alphabet, oùn
est le plus grand indice avec lequel cette lettre apparaît dans la chaîne. Par exemple,estate
devientfbedef
, comme le faitdueled
.la source
Cobra, 72 octets
la source
AB CC
cas test False?JavaScript (ES5),
14298C'est assez gros, mais je n'ai pas encore vu de version ES5.
for(l=j=2;j--;){c=prompt();for(i=c.length;i--;)c=c.replace(RegExp(c[i],"g"),i);b=l==c;l=c}alert(b)
Remplace simplement chaque occurrence de la première lettre par sa valeur d'index inverse. Répète ceci pour chaque personnage.
Il fait la même chose pour les deux entrées et compare le motif généré.
La comparaison est assez moche, mais je ne voudrais pas utiliser un tableau pour le stocker et le comparer.
la source
;l=c
àfor(l=j=2;j--;
et enregistrer un octet?Perl, 38 octets
Courir comme
perl -E '($_,$a)=@ARGV;eval"y/$_/$a/";say$_~~$a' RAMBUNCTIOUSLY THERMODYNAMICS
Imprime 1 si vrai, rien si faux.
la source
Common Lisp, 76 octets
Essayez-le en ligne!
la source
C ++,
213196162 octets-51 octets grâce à Zacharý
Pour appeler le lambda, vous devez passer 2 arguments de
std::string
type données.Code à tester:
pour le code qui teste, y compris
iostream
et lestring
fichier d'en-tête est requisla source
e
argument defind
, oui, cela fonctionneJavaScript (ES6),
525150 octetsCette version n'utilise pas la compréhension des tableaux et accepte les entrées en utilisant la syntaxe de currying.
Afficher l'extrait de code
la source