Eine Caesar-Schicht ist wahrscheinlich etwas, mit dem wir alle vertraut sind.
(Vielleicht machen Sie es sogar als Hausaufgabe. Wenn ja, kopieren Sie diese Antworten bitte nicht, Ihr Lehrer möchte mit ziemlicher Sicherheit nichts Ähnliches wie die Antworten hier.)
Nur für den Fall, dass Sie es nicht sind, ist eine Caesar-Verschiebung eine sehr einfache Form der Verschlüsselung. Es wird eine Zeichenfolge und eine Ganzzahl benötigt, um verschlüsselt zu werden. Führen Sie dann für jedes alphabetische Zeichen in der Zeichenfolge die folgende Transformation durch:
- Ermitteln Sie die Position des Zeichens im Alphabet (0-basiert).
- Addieren Sie zu dieser Zahl die Ganzzahl, die Sie am Anfang erhalten haben.
- Wenn die Zahl größer als 25 ist, subtrahieren Sie 26 davon.
- Ermitteln Sie die Position des Alphabets, in dem es sich befindet.
Lassen Sie den Rest der Zeichen unverändert.
Großbuchstaben müssen respektiert werden, denn was ist Englisch ohne Großbuchstaben?
Beispiele:
abcdefghijklmnopqrstuvwxyz 1 -> bcdefghijklmnopqrstuvwxyza
Spam spam spam sausage and spam! 13 -> Fcnz fcnz fcnz fnhfntr naq fcnz!
abcdefghijklmnopqrstuvwxyz 52 -> abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz -1 -> zabcdefghijklmnopqrstuvwxy
ABCxyz 3 -> DEFabc
Annahmen
- Sie können jedes druckbare ASCII-Zeichen erhalten
- Die eingegebene Zahl kann negativ sein und ist immer größer als -128 und kleiner als 128 (
-128<x<128
).
- Sie müssen in der Lage sein, Großbuchstaben und Nicht-Großbuchstaben reversibel zu kodieren.
- Sie müssen ein vollständiges Programm erstellen, nicht nur eine Funktion oder ein Snippet
- Sie erhalten Ihre Eingabe von STDIN oder der nächstgelegenen Alternative
- Sie können das Format für Ihre Eingabe auswählen, bitte geben Sie dies in Ihrer Antwort an
Die Zeichen, die verschoben werden müssen, sind ASCII-Codepunkte 0x41 - 0x5A
und 0x61-0x7A
- Groß- und Kleinbuchstaben
- Großbuchstaben sollten groß bleiben
- Kleinbuchstaben sollten kleiner bleiben
- Zeichen, die nicht in diesem Bereich liegen, sollten so belassen werden, wie sie sind
Hinweis für diese Herausforderung, müssen Sie nur auf Chiffre - Strings haben, müssen Sie sie nicht in der Lage automatisch zu lösen (aber geben -x
umkehren wird die Chiffre)
Da es sich um einen Katalog handelt, dürfen Sprachen, die nach dieser Herausforderung erstellt wurden, miteinander konkurrieren. Beachten Sie, dass ein Dolmetscher vorhanden sein muss, damit die Einreichung getestet werden kann. Es ist erlaubt (und sogar empfohlen), diesen Dolmetscher für eine zuvor nicht implementierte Sprache selbst zu schreiben. Ansonsten müssen alle Standardregeln des Code-Golfs eingehalten werden. Einsendungen in den meisten Sprachen werden in Bytes in einer geeigneten, bereits vorhandenen Codierung (normalerweise UTF-8) bewertet.
Katalog
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:
## [<><](https://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><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="language-list"> <h2>Shortest Solution 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> <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> <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><script>var QUESTION_ID = 67044; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 32686; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Antworten:
Pyth, 13 Bytes
Testsuite
Grundsätzlich beginnen wir mit den beiden Zeichenfolgen, die wir verschieben möchten, dem Kleinbuchstaben und dem Großbuchstaben. Die Liste, die diese beiden Elemente enthält, wird durch
rBG1
Bifurkieren in Großbuchstaben erstellt. Dann reduzieren wir diese Liste, indem wir mit der Eingabezeichenfolge beginnen und zuerst Kleinbuchstaben und dann Großbuchstaben um die entsprechende Verschiebung übersetzen.quelle
Pyth, 16
Probieren Sie es online aus oder führen Sie eine Test Suite aus
quelle
Bash + BSD-Spiele-Paket, 21
Builtins FTW! Fühlt sich fast wie Mathematica an. Pyth-Antworten sind jedoch immer noch kürzer.
Eingabezeichenfolge, die von STDIN und Ganzzahl von der Befehlszeile gelesen wird. z.B:
Oder wenn Sie das eingebaute nicht mögen:
Bash + Coreutils, 63
quelle
JavaScript (ES6),
122118114111 Byte4 Bytes gespart dank @Neil !
Erläuterung
Die erste Eingabeaufforderung übernimmt die Eingabezeichenfolge. Die zweite ist die Zahl, um die jeder Buchstabe verschoben werden soll.
quelle
"abcdefg", -26
. Dies kann durch Ändern der Formel in behoben werden(x-a+n+130)%26
.a=x&96,(x-a+n+129)%26+a+1
?CJam,
34222120 BytesVielen Dank an FryAmTheEggman für das Speichern von 1 Byte.
Teste es hier.
Die Eingabe ist die Zeichenfolge, die in der ersten Zeile fünf und in der zweiten Zeile die Verschiebung sein soll.
Erläuterung
quelle
'[,_el^
ist ein Tipp von Dennis. Ich weiß aber nicht, was du meinstf
, es scheint ziemlich normal zu sein?@
. :)Java, 249 Bytes
Dies ist so kurz wie ich es bekommen könnte. Das Lesen von stdin isst eine Tonne Bytes. Eine Lösung, die Befehlszeilenargumente verwendet, ist merklich kürzer, aber diese Aufgabe gab stdin für die Eingabe an.
Das Eingabeformat ist der String, gefolgt von der Schichtnummer in einer neuen Zeile.
Mit Befehlszeilenargumenten beträgt diese Lösung nur 188 Byte. Eingabe ist der String als erstes Argument und die Verschiebung als zweites.
quelle
R, 111 Bytes
Code
ungolfed
Dieses Programm verwendet die Benutzereingabe von STDIN, zuerst den Integer-Shifter und dann die Zeichenfolge, Zeichen für Zeichen.
quelle
Perl, 81 Bytes
(+1 für die
-p
Flagge)Ich arbeite immer noch daran, es runter zu spielen ...
Prüfung:
quelle
Japt,
4543 BytesProbieren Sie es online!
quelle
Python 2,
163160 BytesIch bin mir nicht sicher, ob ich noch Golf spielen kann.
Da es ziemlich unleserlich ist, gibt es hier eine unbenutzte Version:
In Bezug auf die Eingabe: Es werden zwei Argumente erwartet, das erste muss eine Zeichenfolge und das zweite eine Ganzzahl (der Verschiebungsbetrag) sein. Beispiele (Datei heißt
csr.py
):Hinweis: Im zweiten Beispiel werden ein Escape-Zeichen und
""
benötigtquelle
Python 2,
118116 Bytesquelle
if/else
Instanzen verwenden ( codegolf.stackexchange.com/a/62/36885 ). Zum Beispielprint''.join([[c,chr((ord(c)-97+n)%26+97)]['~'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)
ist etwas kürzer und sollte genauso funktionieren. (Mit der Ausnahme, dass Sie die Tilde in ein Backtick wie zuvor geändert haben - ich konnte das Backtick nicht richtig anzeigen.)Mathematica, 117 Bytes
Übernimmt die Zeichenfolge, gefolgt von einer neuen Zeile, gefolgt vom Verschiebungsfaktor. Könnte noch golffähig sein ...
quelle
Perl 6 , 73 + 1 = 74 Bytes
Die erste Eingabezeile gibt die Anzahl der Zeichen an, um die die Buchstaben nach oben verschoben werden sollen.
Verwendung:
quelle
C ++,
163154152 BytesVerwendung:
quelle
k4, 80 Bytes
Das Programm akzeptiert die Schichtnummer als Befehlszeilenargument und liest Text aus stdin.
Aus technischen Gründen müssen negative Verschiebungen mit einem Unterstrich anstelle eines Bindestrich-Minus codiert werden. (Ohne den Parser zum Interpretieren dieser Codierung wäre die Lösung 64 Byte.)
Hier sind die ausgeführten Beispiele:
Und hier ist ein albernes kleines Testgeschirr, das sowohl das Kodieren als auch das Dekodieren überprüft. (Dies ist
zsh
; fürbash
oderksh
, ändern Sie diefor
Schleifenindizierung in((i=0;i<5;i++))
. Einbasierte Arrays, ugh ....)quelle