Betrachten Sie die Atbash-Transformation :
A|B|C|D|E|F|G|H|I|J|K|L|M
Z|Y|X|W|V|U|T|S|R|Q|P|O|N
Wo A ⇔ Z und L ⇔ O, zB gibt es eine interessante Eigenschaft, die einige Wörter teilen. Wenn einige Zeichenfolgen in ihr atbash-Äquivalent übersetzt werden, ist die Übersetzung das umgekehrte Originalwort. Ich nenne diese Atbash Self Palindromes .
Lassen Sie uns als Beispiel WIZARD übersetzen :
W → D
I → R
Z → A
A → Z
R → I
D → W
Das Ergebnis ist DRAZIW ( WIZARD) . Somit ist WIZARD ein Atbash-Selbst-Palindrom.
Ziel Wenn eine Zeichenfolge mit druckbaren ASCII-Zeichen angegeben wird, wird ein wahrer Wert ausgegeben oder zurückgegeben, wenn die Zeichenfolge ein atbash-Selbst-Palindrom und andernfalls ein falscher Wert ist. (Dies erfolgt über STDIN, das nächstgelegene Äquivalent, eine funktionale Eingabe usw. Wenn Ihre Sprache keine dieser Eingaben ausführen kann, ziehen Sie in Betracht, eine andere Sprache auszuwählen, in der Sie die Eingabe möglicherweise fest codieren.) Dies sollte unabhängig von Groß- und Kleinschreibung erfolgen. Wenn die Eingabe ein Palindrom ist und von der Atbash-Sequenz nicht betroffen ist, sollten Sie trotzdem true ausgeben, da ein Palindrom + selbst ein Palindrom ist. Dies ist ein Code-Golf , also gewinnt das kürzeste Programm in Bytes.
Testfälle
"Input" => true, false
"WIZARD" => true
"Wizard" => true // case doesn't matter
"wIzArD" => true
"W I Z A R D" => true
"W IZ ARD" => false // the atbash of this is D RA ZIW, which is not a palindrome of W IZ ARD
"ABCXYZ" => true // ZYXCBA
"345 09%" => false // is not a palindrome
"ev" => true // ve
"AZGDFSSF IJHSDFIU HFIA" => false
"Zyba" => true
"-AZ" => false // -ZA is not a reverse of -AZ
"Tree vvig" => true // Givv eert
"$%%$" => true // palindrome
"A$&$z" => true // z$&$A
Bestenliste
Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=68757,OVERRIDE_USER=44713;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
code {Comment-symbol}{Atbash'ed Comment-symbol} Atbash'ed code
...Antworten:
RX ,
98 BytesStark von Retina inspiriert, habe ich das vor einigen Tagen gemacht. Code:
Erläuterung:
Probieren Sie es hier aus !
quelle
Pyth,
109 BytesProbieren Sie diese Geige online aus oder überprüfen Sie alle Testfälle auf einmal.
Erläuterung
quelle
rz0
es nicht kürzer, es in einer Variablen zu speichern, da Sie es zweimal verwenden?q_Jrz0XJG
ist ein Byte kürzer.Julia, 96 Bytes
Dies ist eine Lambda-Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Ungolfed:
quelle
Bash + Linux-Utils, 56
Gibt den leeren String für Truthy und so etwas wie
- /dev/fd/63 differ: byte 1, line 1
für Falsey aus. Wenn dies nicht akzeptabel ist, können wir-s
3 zusätzliche Bytes hinzufügen und die Standard-Unix-Rückkehrcodes 0 für Erfolg (Wahrheit) und 1 für Fehler (Falsch) verwenden.quelle
Retina , 44 Bytes
Druckt
1
oder0
. Die Byteanzahl setzt voraus, dass die Datei gemäß ISO 8859-1 codiert ist.Probieren Sie es online!
Diese Antwort wurde größtenteils von der sed-Antwort von DigitalTrauma inspiriert , aber ich denke, es gibt zunächst nicht so viele Ansätze für diese Herausforderung.
Erläuterung
Wann immer Sie ein sehen
¶
, besteht das erste, was Retina nach dem Aufteilen des Codes in Zeilen tut, darin, alle diese Pilcrows durch Zeilenvorschübe zu ersetzen. Dies ermöglicht die Einbeziehung von Zeilenvorschüben für ein einzelnes Byte, obwohl Zeilenvorschübe das Phasentrennzeichen von Retina sind.Wir beginnen mit dem Duplizieren der Eingabe. Wir stimmen das Ende der Eingabe mit ab
$
und fügen einen Zeilenvorschub zusammen mit der Eingabe selbst ein (using$_
).Eine Transliterationsphase. Beginnen wir mit dem regulären Ausdruck starten:
.+$
. Es stimmt mit der zweiten Kopie der Eingabe überein (indem sichergestellt wird, dass die Übereinstimmung bis zum Ende der Zeichenfolge reicht). Daher werden nur die Zeichen in der zweiten Kopie transliteriert. Die Transliteration selbst nutzt einige sehr aktuelle Funktionen.l
undL
sind Zeichenklassen für Groß- und Kleinbuchstaben.o
verweist auf den anderen Zeichensatz der Transliteration undR
kehrt ihn um. Die beiden Zeichensätze erweitern sich also zu:Sie werden feststellen, dass dies den Fall vertauscht, während Sie den Atbash-Chiffriervorgang ausführen, aber der abschließende Vergleich wird trotzdem ohne Berücksichtigung der Groß- und Kleinschreibung durchgeführt.
Nun kehren wir die zweite Kopie um. Leider hat Retina noch keine bequeme Möglichkeit, dies zu tun, daher müssen wir jeweils einen Charakter vom Ende nach vorne verschieben. Dies geschieht, indem der Zeilenvorschubtrenner als Markierung verwendet wird, deren Teil noch nicht umgekehrt wurde. Wir stimmen mit diesem Teil überein, erfassen jedoch das letzte Zeichen separat. Dieses Zeichen steht vorne und der Rest bleibt unverändert. Das
+
sagt Retina, dies wiederholt zu tun, bis es nicht mehr möglich ist (weil¶
es am Ende der Zeichenkette ist).Schließlich prüfen wir, ob die beiden Zeichenfolgen identisch sind. Das
i
macht das Muster unabhängig von Groß- und Kleinschreibung - in .NET bedeutet dies, dass Rückverweise auch unabhängig von Groß- und Kleinschreibung sind. Möglicherweise stellen Sie fest, dass zwischen der ursprünglichen Eingabe und der geänderten Kopie kein Trennzeichen mehr vorhanden ist. Wir brauchen aber keine, weil sie gleich lang sind, und wenn die Zeichenfolge jetzt genau zweimal (bis auf Groß- / Kleinschreibung) aus derselben Zeichenfolge besteht, müssen dies die ursprüngliche und die geänderte Zeichenfolge sein. Wenn Sie sich fragen, was mit dem nachfolgenden Zeilenvorschub geschehen ist, den wir als Markierung verwendet haben, ist er immer noch vorhanden. In vielen Regex-Varianten wird jedoch$
auch vor dem letzten Zeichen der Zeichenfolge eine Übereinstimmung gefunden, wenn es sich bei diesem Zeichen um einen Zeilenvorschub handelt.Da diese Phase nur aus einer einzigen Zeile besteht, wird sie als Match-Phase betrachtet, in der die Anzahl der Matches gezählt wird. Wenn die Eingabe ein Atbash-Palindrom ist, erhalten wir genau eine Übereinstimmung und die Ausgabe ist
1
. Wenn nicht, stimmt dieser reguläre Ausdruck nicht überein und die Ausgabe erfolgt0
.quelle
\n
in Regex und$n
in Substitution einfügen , dies ist jedoch eine Verschwendung von Byte für das Golfen. ;)GNU Sed, 105
Gibt 1 für wahr und 0 für falsch aus.
Ich habe versucht, dies in Retina zu tun, konnte aber nicht herausfinden, wie der String vor der Atbash-Transliteration für den umgekehrten Vergleich mit after gespeichert werden kann. Vielleicht gibt es einen besseren Weg.
Der
y
Transkriptionsbefehl von Sed lässt zu wünschen übrig.quelle
T
- ich habe angenommen, dass er für jedes Zeichen der Reihe nach gilt, aber wenn ich es richtig verstehe, gilt er für den gesamten Musterraum, was viel nützlicher ist[\s\S]+
so, dass Sie alles transliterieren, indem Sie ihn weglassen.-r
Flag für die Backslashes in\(
und tauschen\)
. Ich stimme dir in demy
Befehl zu!𝔼𝕊𝕄𝕚𝕟 15 Zeichen / 30 Bytes
Try it here (Firefox only).
Erläuterung
quelle
Parenthetic, 658 Bytes
Funktioniert derzeit nur für Großbuchstaben ohne Leerzeichen. Verwenden Sie dazu diese geänderte Version des Skripts, sodass das Lesen von stdin unterstützt wird:
Erläuterung
quelle
Python 3,
9085 BytesWir konvertieren die Eingabe in Großbuchstaben und berechnen dann den String Atbashed, indem wir alle Ordinalzahlen von 155 subtrahieren, wenn sie im Großbuchstabenbereich liegen.
quelle
Kerf , 73 Bytes
Kerf ist eine proprietäre Sprache in derselben allgemeinen Familie wie APL, J und K. Es ist möglich, kryptische, kompakte Oneliners zu schreiben und die Verwendung expliziter Schleifen zu vermeiden:
Die Verwendung der buchstabierten Aliase für Befehle anstelle der Kurzsymbole und der Verwendung aussagekräftiger Bezeichner macht das Programm jedoch viel übersichtlicher und relativ einfach zu befolgen, selbst wenn Sie mit Kerf nicht vertraut sind:
In Aktion:
Kerf wird wahrscheinlich nicht viele Codegolfwettbewerbe gewinnen, insbesondere nicht gegen speziell entwickelte Sprachen, aber es könnte sich lohnen, daran zu basteln, wenn Sie die Idee von Sprachen der APL-Familie mögen, die Syntax aber zu seltsam finden. ( Haftungsausschluss: Ich bin der Autor des Referenzhandbuchs für Kerf. )
quelle
Prolog, 121 Bytes
Dies wird mit einem Atom als Eingabe bezeichnet, z
a('WIZARD').
.quelle
JavaScript (ES6), 91
PRÜFUNG
quelle
C
10197 BytesDa die Frage ASCII-Zeichen angibt, werden keine anderen Codierungen verarbeitet.
Erläuterung
Wir machen einen Zeiger
p
, der am Ende der Zeichenkette beginnt. Wir machen dann eine Schleife und bewegen uns beides
undp
aufeinander zus
bis zum Ende. Dies bedeutet, dass jedes Zeichenpaar zweimal überprüft wird, dies spart jedoch ein paar Bytes im Vergleich zum Anhalten, sobald die Zeiger überkreuzen.Bei jeder Iteration prüfen wir, ob
*p
es sich um einen Buchstaben handelt. Ist dies der Fall, prüfen Sie, ob*s
der Buchstabenbereich (ASCII 64 aufwärts)*p
und der*s
Wert 27 (Mod 32) beträgt . Nicht-Buchstaben über 64 bestehen diesen Test nicht, sodass wir nicht prüfen müssenisalpha(*s)
.Wenn
*p
es sich nicht um einen Buchstaben handelt, testen wir einfach, ob er gleich ist*s
. In beiden Fällen beenden wir die Schleife vors
undp
kreuzen über.Wenn
s
undp
gekreuzt haben, stimmen alle Buchstabenpaare überein, sodass wir true zurückgeben. Andernfalls geben wir false zurück.Testprogramm
Übergeben Sie die zu testenden Zeichenfolgen als Befehlszeilenargumente. Dies führt zu einer korrekten Ausgabe für alle Testfälle. Für die leere Zeichenfolge ist keine Angabe erforderlich. Meine Implementierung gibt für diese Eingabe false zurück.
quelle
f
f(char*s)
Perl 5, 70 Bytes
Ein Unterprogramm:
Sehen Sie es in Gebrauch:
quelle
MATL, 23 Bytes
Verwendet die aktuelle Version .
Beispiele
quelle
CJam, 18 Bytes
Probieren Sie es online aus
Konvertiert Eingaben in Großbuchstaben, führt die Übersetzung von Buchstaben durch, dreht die Zeichenfolge um und überprüft die Gleichheit.
quelle
Japt,
3027 BytesProbieren Sie es online!
Wie es funktioniert
Dies basiert größtenteils auf meiner Japt-Antwort auf Swap the Alphabet.
quelle
Python,
156112 BytesGrundsätzlich wird ein Wörterbuch der Übersetzung mit Großbuchstaben erstellt und die Eingabe wird in Großbuchstaben geschrieben (wenn stattdessen alles in Kleinbuchstaben geschrieben wäre, würden 5 Bytes hinzugefügt). Führen Sie dann für jedes Zeichen in der Eingabe mit Großbuchstaben die Übersetzung durch und hängen Sie es an eine Liste an, es sei denn, das Zeichen befindet sich nicht im Alphabet. In diesem Fall hängen Sie das Zeichen so an, wie es ist. Trete der gesamten Liste bei und vergleiche mit der umgekehrten Liste.
Schreiben Sie an @Artyer, dass Sie fast genau das gepostet haben, was ich vor mir gepostet habe. Aber ich muss bestätigen, das ist meine Arbeit und ich habe dies unabhängig gemacht .
Basierend auf der Julia-Antwort von Alex A. Probieren Sie es hier aus
quelle
.get(i,i)
. +1.05AB1E , 8 Bytes (nicht konkurrierend)
Diese Sprache verwendet Funktionen, die die Herausforderung nachträglich bearbeiten und daher nicht konkurrieren.
Code:
Erläuterung:
Probieren Sie es online!
quelle
Faktor
118113 BytesDies ist eine anonyme Funktion.
Ich kenne keinen kürzeren Weg, um ein assoziatives Array des Alphabets zu erzeugen: c
quelle
Clojure, 100 Bytes
Es sollte möglich sein, es auf eine einzige anonyme Funktion zu beschränken, die etwa 10 weitere Bytes (Deklarationen) schneidet, aber ich habe noch keinen Weg gefunden.
quelle
Ruby,
7977 BytesAkzeptiert das zu testende Wort als Befehlszeilenargument. Beendet mit Code 0 (der der Shell entspricht), wenn das Argument ein atbash-Selbst-Palindrom ist, oder mit Code 1, wenn dies nicht der Fall ist.
quelle
puts
das Ergebnis nicht kürzer als ein Exit mit einem Ternary?$*
ist ein Alias fürARGV
.Ruby, 56 Bytes
Es ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und
true
oder zurückgibtfalse
. Es ist ziemlich umständlich: Um ein paar Bytes zu sparen, verwendet es die destruktive Variante vonupcase
(mit einem!
danach).upcase!
Gibt leider zurück,nil
wenn nichts geändert wird (wie bei allen numerischen Eingaben), sodass einige Bytes verloren gehen, wenn versucht wird, damit umzugehen. Funktioniert immer noch :)quelle
MATLAB, 61 Bytes
Nicht die kürzeste Lösung, aber trotzdem interessant
quelle