Deux chaînes sont "équivalentes à César" si la distance (comptage) entre les caractères correspondants est la même. Oui, j'ai inventé ce terme. Voici un exemple:
"Abc" et "Cde" sont équivalents car
distance from a-c == 2
distance from b-d == 2
distance from c-e == 2
La capitalisation ne fait aucune différence.
"Bonjour" et "Monde" ne sont pas équivalents à César car
distance from h-w == 15
distance from e-o == 10
distance from l-r == 6
distance from l-l == 0
distance from o-d == 15
"Abcd" et "Yzab" sont des équivalents César car
distance from a-y = 24
distance from b-z = 24
distance from c-a = 24 (it wraps around)
distance from d-b = 24
Vous devez écrire un programme complet qui prend deux chaînes de STDIN et imprime une valeur véridique si elles sont équivalentes à César et une valeur falsifiée si elles ne le sont pas.
Entrée valide
Étant donné que la capitalisation n'a pas d'importance, il est acceptable si votre programme nécessite que les entrées soient toutes en minuscules, en majuscules ou quel que soit le mélange souhaité, tant que cela est spécifié dans votre réponse.
L'entrée n'aura ni espaces ni ponctuation.
Les entrées auront la même longueur.
Réponses:
Pyth, 9 octets
Les deux chaînes sont attendues en minuscules, séparées par des sauts de ligne.
Manifestation.
Comment ça marche:
.r
est la fonction de traduction rotative de Pyth. Il mappe chaque élément du premier argument depuis sa première occurrence dans le deuxième argument jusqu'à l'entrée suivante dans le deuxième argument. Dans ce cas, le deuxième argument estG
l'alphabet minuscule, ce qui équivaut donc à un décalage César de 1.Mettre un
=
devant la fonction le met en place. Ainsi,=.rzG
affecte le décalage César dez
un àz
. Notez qu'ilz
est initialisé à la première ligne d'entrée en Pyth.Cette expression est utilisée dans une carte.
m=.rzGG
applique cette transformation àz
26 fois, une fois pour chaque élément deG
, et enregistre les résultats dans une liste. Cela donne la liste de tous les changements de César possiblesz
.Enfin,
}w
vérifie si la ligne d'entrée suivante se trouve dans cette liste.la source
CJam,
171211 octets1 octet enregistré par Dennis.
Testez-le ici.
Attend que la première chaîne soit en minuscules et la seconde en majuscules. Imprime
1
pour les chaînes équivalentes à César et0
autres.Explication
La raison pour laquelle nous avons besoin de la première chaîne en minuscules et de la seconde en majuscules est de garantir que la différence est toujours positive. Sinon, prendre le modulo pourrait retourner quelque chose de négatif et ne serait pas nécessairement unique, même pour les cordes équivalentes à César.
la source
26f%
pour enregistrer un octet.!
je n'aurais pas 0 ou 1 mais un tableau vide ou non vide.Python2,
68677069 octetsPython3,
6766 octetsIl est un peu difficile de ne pas jouer au golf, alors expliquez simplement les pièces:
zip(*raw_input().split())
prend l'entrée, la divise en une liste de deux mots, en supposant que les mots sont séparés par des espaces. Après cela, chaque mot est passé en tant que paramètre de lazip
fonction, à l'aide de l'*
opérateur. Lazip
fonction créera une liste de paires de lettres, pour les lettres dans la même position.(ord(y)-ord(x))%26for x,y in ...
Cela transforme simplement la liste de 2 lettres en une expression génératrice des distances entre ces lettres.{...}
réduit cette expression à un ensemble, jetant essentiellement des doublonslen(...)<2
vérifie s'il ne reste qu'un seul élément dans l'ensemble (ou 0 pour les chaînes vides), ce qui signifie essentiellement que toutes les lettres ont la même distance.print
sort cette valeurMerci à xnor de me le rappeler
set(...)
peut être remplacé par{...}
et l'espace avantfor
n'est pas nécessaire. Grâce aussi à Josay pour l'<=1
à l'<2
optimisation.la source
<=1
en «<2».{...}
plutôt queset((...))
. Votre code doit réellement imprimer le résultat.lambda
pour économiser sur l'écritureprint
oureturn
.for
; le lexer Python se divise correctement26for
.APL (15)
Il a besoin que les lettres soient en majuscules et imprime soit
1
ou0
, comme ceci:Explication:
↑⍞⍞
: lisez deux lignes sur le clavier et organisez les caractères dans une matrice N × 2.⎕A⍳
: pour chaque caractère, trouvez à quelle position il se trouve⎕A
(l'alphabet majuscule).-⌿
: pour chaque colonne, soustrayez la deuxième valeur de la première valeur26|
: prenez le mod-26 de chacun de ces nombres.≢∪
: trouver le nombre de valeurs uniques dans la liste1=
: comparer cela à1
.la source
J, 19 octets
Les lettres à la même position devraient avoir le même cas.
Après avoir converti les deux chaînes d'entrée en leur représentation de point de code avec
&(3&u:)
nous comparons1
à la longueur#
du nœud~.
du modulo 2626|
de la différence-
des deux tableaux. Le nœud sera1
si toutes les distances de César sont les mêmes.Usage:
Essayez-le en ligne ici.
la source
Julia,
918783 octetsNon golfé + explication:
Cela tire parti du fait que les chaînes de Julia peuvent être traitées comme des tableaux de caractères et que des opérations arithmétiques peuvent être effectuées sur des valeurs de caractères. Les chaînes d'entrée peuvent avoir n'importe quelle combinaison de majuscules que vous souhaitez, tant que la capitalisation à chaque position correspond entre les chaînes.
la source
C99,
92 octets avec bug10192 octetsAssez simple; suppose que les mots viennent respectivement comme premier et deuxième arguments. Compilé avec
-std=c99
.la source
Javascript ( ES7 Draft ), 87 octets
Nécessite que les entrées soient identiques.
la source
CJam, 13 octets
Il faut que le premier caractère de chaque mot soit en majuscule, les autres en minuscule.
Essayez-le ici . ( Firefox ici .)
Dommage que les variantes APL ne prennent pas en charge l'arithmétique des personnages ...
Explication
la source
Perl, 80
Edit : une optimisation échouée s'était glissée dans le code du golf. Maintenant, il correspond à la version non golfée. (Le nombre d'octets était correct, cependant.)
Exécutez avec Perl version 5.10 (
perl -M5.10.0
ouperl -E …
) poursay()
. Version légèrement élargie:Le code
1
génère (véridique en Perl) si les chaînes sont équivalentes à César et la chaîne vide (fausse en Perl) si elles ne le sont pas. Si c'est une interprétation trop lâche, je dois ajouter 2 octets poursay$p+0
, qui imprime1
ou0
.La casse des caractères doit correspondre entre les entrées.
la source
-i
pour prendre la deuxième chaîne, qui la stockera dans la variable$^I
. En outre, utiliser-E
au lieu de-e
lors de l'exécution sur la ligne de commande vous permettra d'obtenirsay
gratuitement, vous pouvez donc l'utiliser sans ajouter d'octets. Essayez d'exécuter ceci:perl -iteststring -E'say$^I'
vous pourriez être en mesure de raccourcir cela avec l'-i
astuce.-i
astuce est soignée (et je ne le savais pas!). Dans ce cas, je ne pense pas que cela aide car$^I
est plus long que<>
.-M5.10.0
toute façon pas compté les octets . (Mais j'ai mentionné le-E
changement dans le montage)Matlab,
4948 octetsCe fut très rapide. Malheureusement, obtenir une chaîne de stdin est assez cher.
Notez qu'il est, comme la plupart des réponses sinon toutes, sensible à la casse.
EDIT: rasé d'un octet en définissant une fonction anonyme!
la source
Prolog, 56 octets
Toutes les combinaisons de cas ne sont pas prises en charge.
usage
Essayez-le en ligne ici
la source
C, 97 octets
la source
d
et déclareza
le type de paramètres extérieurs comme celui-ci:d,r;main(int c,char**a){
→r;main(d,a)char**a;{
Scala, 57 octets
Un peu plus long que les autres, et essentiellement équivalent, mais il est dans un style de langue différent!
J'ai également cette version (56 octets):
Mais je ne sais pas si le fonctionnement de x $ 1 est une coïncidence ou par conception ...
la source
x$1
marche sansx
jamais être défini?Python 2, 80 octets
Prend 2 chaînes similaires de stdin séparées par un espace:
Testé sur les cas de test suivants:
la source
Python 2 -
241237188147 octetsPrend l'entrée sous forme de chaîne minuscule entre guillemets, séparée par des espaces. Il doit y avoir une meilleure façon..
Non golfé (260 octets impairs)
la source
"
s supplémentaires dans votre entrée.R, 83
84À peu près la même chose que les autres solutions. Convertissez les chaînes en un vecteur d'entiers. Modifiez la différence des vecteurs par 26. Faites un unique sur la liste car vérifiez que la longueur est 1. Il s'attend à ce que la casse soit la même en caractères correspondants dans chaque chaîne.
Il attend que les deux chaînes soient entrées
la source
<2
plutôt que==1
.1
ou0
Matlab / Octave,
5352Les entrées doivent toutes être du même cas.
Malheureusement, Matlab n'est pas très bon avec les commentaires des utilisateurs. En tant que descripteur anonyme, cela ne peut représenter que 35 octets:
Matlab traite les caractères d'une chaîne comme un vecteur de nombres. Faire la soustraction nous fait leur différence, et
unique
convertit ce vecteur en un vecteur contenant uniquement des valeurs uniques. S'il n'y a qu'un seul nombre, les mots sont équivalents céser et isscalar renvoie 1, sinon il retournera 0.la source
bash,
7148Utilisation du programme Unix «standard»
caesar(6)
.Nouvelle version (avec beaucoup d'aide de @DigitalTrauma):
1
pour vrai ou rien pour faux.Si l'entrée via des arguments de ligne de commande est autorisée, elle peut être raccourcie à 39 octets :
Ancienne version pour le dossier:
la source
read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
Le résultat est dans la$?
variable intégrée, où 0 == FAUX et 1 == VRAI, selon la sémantique standard du shell.seq -f | bash
morceau. Le résultat$?
n'est pas valide par ma lecture du défi, mais tout comme mon code, le vôtre ne produit rien pour faux et quelque chose pour vrai (sauf dans le cas limite de deux chaînes d'entrée vides). Quoi qu'il en soit, ce serait comme tricher d'utiliser tout cela dans ma réponse, peut-être devriez-vous soumettre le vôtre.[ 0 == 0 ] ; echo $?
et[ 0 == 1 ] ; echo $?
> <> (Poisson) , 50 octets
S'attend à ce que les lettres au même endroit aient la même casse.
Explication
i:3b*(?v
lit le premier mot dans la pile en88+0.
fournissant le saut en boucle~ri-&
supprime~
l'espace de séparation de la pile, inverse la piler
(la première lettre sera en haut), lit la première lettre du deuxième moti
, calcule le décalage par rapport à la première lettre du premier mot-
et le stocke dans le registre&
.l?!^i-&:&-2d*%0)?v
lit chaque lettre suivante du deuxième mot en la soustrayant de la lettre correspondante du premier mot qui est en haut de la pile soustrait l'offset&:&-
stocké dans le registre et vérifie si le résultat est 0 mod 262d*%
. Sinon, imprime 0 et se termine0n;
.c1.
fournit le saut en boucle.1n;
.la source
KDB (Q), 35 octets
Explication
Tester
la source
Java 281
étendu:
Je pourrais économiser 14 octets si je me débarrassais de tout convertir en majuscules, mais j'ai l'impression qu'il est plus complet de le laisser.
la source
Gelée , 5 octets
Essayez-le en ligne!
Génère un entier positif pour l'équivalent, 0 sinon
Comment ça marche
la source