Zwei Zeichenfolgen sind "Caesar-Äquivalent", wenn der Abstand (Aufwärtszählen) zwischen den entsprechenden Zeichen gleich ist. Ja, ich habe diesen Begriff erfunden. Hier ist ein Beispiel:
"Abc" und "Cde" sind gleichbedeutend damit
distance from a-c == 2
distance from b-d == 2
distance from c-e == 2
Die Großschreibung macht keinen Unterschied.
"Hallo" und "Welt" sind da nicht gleichbedeutend mit Caesar
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" und "Yzab" sind Caesar-Äquivalent, weil
distance from a-y = 24
distance from b-z = 24
distance from c-a = 24 (it wraps around)
distance from d-b = 24
Sie müssen ein vollständiges Programm schreiben, das zwei Zeichenfolgen aus STDIN entnimmt und einen Wahrheitswert ausgibt, wenn diese Caesar-Äquivalent sind, und einen falschen Wert, wenn sie nicht sind.
Gültige Eingabe
Da die Groß- und Kleinschreibung keine Rolle spielt, ist es akzeptabel, wenn für Ihr Programm die Eingabe nur in Kleinbuchstaben, in Großbuchstaben oder in einer beliebigen Mischung erfolgen muss, sofern dies in Ihrer Antwort angegeben ist.
Die Eingabe enthält keine Leerzeichen oder Satzzeichen.
Die Eingaben sind gleich lang.
Antworten:
Pyth, 9 Bytes
Es wird erwartet, dass die beiden Zeichenfolgen in Kleinbuchstaben und durch Zeilenumbrüche getrennt sind.
Demonstration.
Wie es funktioniert:
.r
ist die Drehübersetzungsfunktion von Pyth. Es ordnet jedes Element im ersten Argument von seinem ersten Vorkommen im zweiten Argument bis zum nächsten Eintrag im zweiten Argument zu. In diesem Fall ist das zweite ArgumentG
das Kleinbuchstaben-Alphabet. Dies entspricht also einer Caesar-Verschiebung von 1.Wenn Sie
=
der Funktion eine voranstellen, wird sie eingefügt. Damit=.rzG
ordnet Caesar die Verschiebungz
um eins zuz
. Beachten Sie, dassz
in Pyth die erste Eingabezeile initialisiert wird.Dieser Ausdruck wird in einer Karte verwendet.
m=.rzGG
Wendet diese Transformationz
26 Mal für jedes Element vonG
an und speichert die Ergebnisse in einer Liste. Dies gibt die Liste aller möglichen Caesar-Verschiebungen vonz
.Prüft
}w
abschließend, ob sich die nächste Eingabezeile in dieser Liste befindet.quelle
CJam,
171211 Bytes1 Byte von Dennis gespeichert.
Teste es hier.
Erwartet, dass die erste Zeichenfolge in Kleinbuchstaben und die zweite in Großbuchstaben geschrieben wird. Drucke
1
für Caesar-äquivalente Zeichenfolgen und0
andere.Erläuterung
Der Grund, warum wir die erste Zeichenfolge in Kleinbuchstaben und die zweite in Großbuchstaben benötigen, besteht darin, sicherzustellen, dass die Differenz immer positiv ist. Andernfalls könnte das Modulo etwas Negatives zurückgeben und wäre selbst für Caesar-äquivalente Saiten nicht unbedingt eindeutig.
quelle
26f%
ein Byte speichern.!
hätte ich auch keine 0 oder 1, sondern ein leeres oder nicht leeres Array.Python2,
68677069 BytesPython3,
6766 BytesEs ist ein bisschen schwer, Golf zu spielen, also erkläre einfach die Teile:
zip(*raw_input().split())
Nimmt die Eingabe und teilt sie in eine Liste mit zwei Wörtern auf, vorausgesetzt, Wörter werden durch Leerzeichen getrennt. Danach wird jedes Wortzip
unter Verwendung des*
Operators als Parameter der Funktion übergeben . Diezip
Funktion erstellt eine Liste von Buchstabenpaaren für Buchstaben an derselben Position.(ord(y)-ord(x))%26for x,y in ...
Dies transformiert nur die Liste von 2 Buchstaben in einen Generatorausdruck der Abstände zwischen diesen Buchstaben.{...}
reduziert diesen Ausdruck auf eine Menge und wirft im Wesentlichen Duplikate auslen(...)<2
prüft, ob nur noch ein Element in der Menge vorhanden ist (oder 0 für leere Zeichenfolgen), was im Wesentlichen bedeutet, dass alle Buchstaben den gleichen Abstand hatten.print
gibt diesen Wert ausDank xnor für die Erinnerung
set(...)
kann ich mit ersetzt werden{...}
und der Platz davorfor
wird nicht benötigt. Auch dank Josay für die<=1
zur<2
Optimierung.quelle
<=1
auf <2 reduzieren .{...}
anstatt tunset((...))
. Ihr Code muss das Ergebnis tatsächlich drucken.lambda
Schreibenprint
oder Speichern zu verwendenreturn
.for
; Der Python-Lexer teilt sich korrekt26for
.APL (15)
Die Buchstaben müssen in Großbuchstaben geschrieben sein und werden entweder
1
oder0
wie folgt gedruckt :Erläuterung:
↑⍞⍞
: Lesen Sie zwei Zeilen von der Tastatur und ordnen Sie die Zeichen in einer N × 2-Matrix an.⎕A⍳
: Finden Sie für jedes Zeichen, an welcher Position es vorkommt⎕A
(Großbuchstaben).-⌿
: Subtrahieren Sie für jede Spalte den zweiten Wert vom ersten Wert26|
: nimm den Mod-26 jeder dieser Nummern.≢∪
: Finden Sie die Anzahl der eindeutigen Werte in der Liste1=
: Vergleichen Sie das mit1
.quelle
J, 19 Bytes
Briefe an derselben Position sollten die gleiche Groß- und Kleinschreibung haben.
Nachdem
&(3&u:)
wir beide Eingabezeichenfolgen in ihre Codepunktdarstellung konvertiert haben, vergleichen wir1
mit der Länge#
des Nubs~.
des Modulo 2626|
die Differenz-
der beiden Arrays. Der Knoten wird sein,1
wenn alle Caesar-Abstände gleich sind.Verwendung:
Probieren Sie es hier online aus.
quelle
Julia,
918783 BytesUngolfed + Erklärung:
Dies nutzt die Tatsache aus, dass Zeichenfolgen in Julia als Zeichenarrays behandelt werden können und dass arithmetische Operationen für Zeichenwerte ausgeführt werden können. Die Eingabezeichenfolgen können eine beliebige Mischung aus Groß- und Kleinschreibung aufweisen, sofern die Groß- und Kleinschreibung an jeder Position zwischen den Zeichenfolgen übereinstimmt.
quelle
C99,
92 Bytes mit Fehler101,92 BytesZiemlich einfach; Nimmt an, dass Wörter als erstes bzw. zweites Argument kommen. Kompiliert mit
-std=c99
.quelle
Javascript ( ES7-Entwurf ), 87 Byte
Erfordert, dass die Eingaben dem gleichen Fall entsprechen.
quelle
CJam, 13 Bytes
Das erste Zeichen in jedem Wort muss in Großbuchstaben geschrieben werden, andere in Kleinbuchstaben.
Probieren Sie es hier aus . ( Firefox hier .)
Schade, dass die APL-Varianten keine Zeichenarithmetik unterstützen ...
Erläuterung
quelle
Perl, 80
Bearbeiten : Eine fehlgeschlagene Optimierung war in den Golfcode gerutscht. Jetzt passt es zur ungolften Version. (Die Anzahl der Bytes war jedoch korrekt.)
Führen Sie mit Perl Version 5.10 (
perl -M5.10.0
oderperl -E …
) fürsay()
. Leicht erweiterte Version:Der Code gibt
1
(wahrheitsgemäß in Perl) aus, wenn die Zeichenfolgen Caesar-äquivalent sind, und die leere Zeichenfolge (falsch in Perl), wenn dies nicht der Fall ist. Wenn dies eine zu lose Interpretation ist, muss ich 2 Bytes hinzufügen, fürsay$p+0
die1
oder gedruckt wird0
.Die Groß- und Kleinschreibung muss zwischen den Eingaben übereinstimmen.
quelle
-i
, um den zweiten String aufzunehmen, der ihn in der Variablen speichern würde$^I
. Auch die Verwendung-E
statt ,-e
wenn auf der Kommandozeile ausgeführt werden Sie erhaltensay
kostenlos, so dass Sie es ohne Zugabe von Bytes verwenden können. Versuchen Sie Folgendes:perl -iteststring -E'say$^I'
Möglicherweise können Sie dies mit dem-i
Trick verkürzen .-i
Trick ist ordentlich (und ich wusste es nicht!). In diesem Fall glaube ich nicht, dass es hilft, weil$^I
es länger ist als<>
.-M5.10.0
sowieso nicht gezählt. (Aber ich erwähnte den-E
Wechsel in der Bearbeitung)Matlab,
4948 BytesDas war sehr schnell. Leider ist es ziemlich teuer, eine Saite von stdin zu bekommen.
Beachten Sie, dass wie bei den meisten Antworten zwischen Groß- und Kleinschreibung unterschieden wird.
BEARBEITEN: ein Byte durch Definition einer anonymen Funktion abgeschnitten!
quelle
Prolog, 56 Bytes
Es werden nicht alle Fallkombinationen unterstützt.
Verwendung
Probieren Sie es hier online aus
quelle
C 97 Bytes
quelle
d
dena
Typ außerhalb der Parameter wied,r;main(int c,char**a){
r;main(d,a)char**a;{
Scala, 57 Bytes
Etwas länger als die anderen und im Wesentlichen gleichwertig, aber es ist in einer unterschiedlichen Art der Sprache!
Ich habe auch diese Version (56 Bytes):
Aber ich weiß nicht, ob die Funktion von x $ 1 zufällig oder beabsichtigt ist ...
quelle
x$1
, ohnex
jemals definiert zu werden?Python 2, 80 Bytes
Nimmt 2 ähnlich umhüllte Saiten von stdin, die durch ein Leerzeichen getrennt sind:
Getestet in folgenden Testfällen:
quelle
Python 2 -
241237188147 BytesNimmt die Eingabe als in Anführungszeichen eingeschlossene Zeichenfolge in Kleinbuchstaben und mit Leerzeichen. Es muss einen besseren Weg geben.
Ungolfed (260 ungerade Bytes)
quelle
"
Sekunden mehr für Ihre Eingabe erwarten .R 83
84Ziemlich genau wie die anderen Lösungen. Konvertieren Sie die Zeichenfolgen in einen Vektor aus ganzen Zahlen. Ändern Sie die Differenz der Vektoren um 26. Geben Sie einen eindeutigen Wert für die Liste ein, da die Länge 1 ist. Es wird erwartet, dass der Fall in den entsprechenden Zeichen in jeder Zeichenfolge gleich ist.
Es wartet auf die Eingabe der beiden Zeichenfolgen
quelle
<2
anstatt verwenden==1
.1
0
Matlab / Octave,
5352Die Eingabe sollte immer vom selben Typ sein.
Leider ist Matlab nicht sehr gut mit Benutzereingaben. Als anonymes Handle können dies nur 35 Bytes sein:
Matlab behandelt die Zeichen einer Zeichenfolge als einen Vektor von Zahlen. Durch Subtraktion erhalten wir ihre Differenz und
unique
wandeln diesen Vektor in einen Vektor um, der nur eindeutige Werte enthält. Wenn es nur eine Zahl gibt, sind die Wörter caeser-äquivalent und isscalar gibt 1 zurück, andernfalls wird 0 zurückgegeben.quelle
Bash,
7148Verwenden des "Standard" -Unix-Programms
caesar(6)
.Neue Version (mit viel Hilfe von @DigitalTrauma):
1
für wahr oder nichts für falsch.Wenn die Eingabe über Befehlszeilenargumente zulässig ist, kann sie auf 39 Byte verkürzt werden :
Alte Version für den Datensatz:
quelle
read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
Das Ergebnis befindet sich in der$?
eingebauten Variablen, wobei 0 == FALSE und 1 == TRUE laut Standard-Shell-Semantik.seq -f | bash
bisschen. Das Ergebnis in$?
ist nicht gültig, wenn ich die Challenge lese, aber genau wie mein Code gibt yours nichts für false und etwas für true aus (außer im Grenzfall zweier leerer Eingabezeichenfolgen). Wie auch immer, es würde mich betrügen, wenn ich all dies in meiner Antwort verwenden würde. Vielleicht solltest du deine eigene einreichen.[ 0 == 0 ] ; echo $?
and[ 0 == 1 ] ; echo $?
> <> (Fisch) , 50 Bytes
Erwartet, dass Briefe an derselben Position die gleiche Groß- / Kleinschreibung haben.
Erläuterung
i:3b*(?v
Liest das erste Wort in den Stapel, wobei88+0.
der Schleifensprung bereitgestellt wird~ri-&
Entfernt~
das Trennzeichen vom Stapel, kehrt den Stapel umr
(der erste Buchstabe steht oben), liest den ersten Buchstaben des zweiten Wortes eini
, berechnet den Versatz zum ersten Buchstaben des ersten Wortes-
und speichert ihn im Register&
.l?!^i-&:&-2d*%0)?v
Liest jeden nächsten Buchstaben des zweiten Wortes und subtrahiert ihn vom entsprechenden Buchstaben des ersten Wortes, der sich oben auf dem Stapel befindet. Subtrahiert den&:&-
im Register gespeicherten Versatz und prüft, ob das Ergebnis 0 mod 26 ist2d*%
. Wenn nicht, wird 0 ausgegeben und beendet0n;
.c1.
liefert den Schleifensprung.1n;
.quelle
KDB (Q), 35 Bytes
Erläuterung
Prüfung
quelle
Java 281
erweitert:
Ich könnte 14 Bytes einsparen, wenn ich nicht mehr alles in Großbuchstaben umwandeln müsste, aber ich denke, es ist vollständiger, wenn ich es belasse.
quelle
Gelee , 5 Bytes
Probieren Sie es online!
Gibt eine positive Ganzzahl für Äquivalent aus, ansonsten 0
Wie es funktioniert
quelle