Tor
Dies ist eine einfache Herausforderung. Ihr Ziel ist es, eine Zeichenfolge zu entschlüsseln, indem Sie jeden Buchstaben mit dem nächsten Buchstaben derselben Groß- / Kleinschreibung vertauschen, während Sie Nicht-Buchstaben-Zeichen unverändert lassen.
Schritt für Schritt Erklärung
Das erste Zeichen ist a
E
. Wir suchen nach dem nächsten Buchstaben in Großbuchstaben: aC
. Wir tauschen diese Zeichen aus, was zu führtCdoE!
.Wir rücken zum nächsten Zeichen vor: Dies ist ein
d
. Wir suchen den nächsten Buchstaben in Kleinbuchstaben: ao
. Wir tauschen diese Zeichen aus, was zu führtCodE!
.Wir rücken zum nächsten Charakter vor: Dies ist der
d
, den wir gerade hierher gezogen sind. Wir ignorieren es, weil es bereits verarbeitet wurde.Wir gehen zum nächsten Zeichen über: Dies ist das Zeichen
E
, das hier in Schritt 1 verschoben wurde. Wir ignorieren es, weil es bereits verarbeitet wurde.Wir rücken zum nächsten Zeichen vor: Dies ist ein
!
. Wir ignorieren es, weil es kein Brief ist.
Regeln
Sie können davon ausgehen, dass die Eingabezeichenfolge ausschließlich aus druckbaren ASCII-Zeichen im Bereich von 32 bis 126 besteht.
Sie können entweder ein vollständiges Programm oder eine Funktion schreiben, die das Ergebnis entweder ausgibt oder zurückgibt.
Wenn die Eingabezeichenfolge eine ungerade Anzahl von Buchstaben enthält, kann der letzte verbleibende Buchstabe nicht mit einem anderen ausgetauscht werden und sollte an Ort und Stelle bleiben, unabhängig von der jeweiligen Schreibweise. Dieselbe Logik gilt, wenn die Zeichenfolge eine gerade Anzahl von Buchstaben enthält, jedoch eine ungerade Anzahl von Großbuchstaben und eine ungerade Anzahl von Kleinbuchstaben.
Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes. Standardlücken sind verboten.
Testfälle
Input : lLEhW OroLd!
Output: hELlO WorLd!
Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf
Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!
Nicht so zufällige Testfälle:
Input : (^_^)
Output: (^_^)
Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP
Input : hwn oeesd acsp nawyya
Output: who needs caps anyway
Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken
Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.
Antworten:
Jelly ,
21201918 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Netzhaut , 53 Bytes
Nicht wirklich clever, aber eine saubere und gut lesbare Lösung
Probieren Sie es online!
quelle
MATL , 22 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Bash + Unix-Dienstprogramme,
7762575654 ByteEingabe in stdin. Ausgabe in Standardausgabe.
(In dieser letzten Version wird stderr auch geschrieben, aber PPCG-Konsens scheint zu sein, dass das in Ordnung ist - stderr wird einfach ignoriert. )
Edit 1: Danke an @Dennis für 15 Bytes! Verbesserungen: (a) Eingabe über stdin; (b) Kombinieren von 2 sed-Skripten zu einem; und (c) Ersetzen von tr durch Ersetzen durch Bash-Parameter-Erweiterung; (b) und (c) sind in Edit 2 verschwunden.
Edit 2: 5 zusätzliche Bytes kürzer. Verwendete einen Funktionsaufruf, um sowohl (b) als auch (c) in Edit 1 zu ersetzen.
Edit 3: Ein weiteres Byte übergeben] als Teil der Funktionsargumente.
Edit 4: Ersetzt die beiden Funktionsaufrufe durch Aufrufe des Programms selbst, wenn es keine Argumente enthält.
Testbed und Beispielausgabe:
quelle
ES6,
18595 BytesLösung mit Hilfe von @Neil, @Arnauld und @ edc65 stark verkürzt
Erläuterung
quelle
/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
[o[b],o[j]]=[c,o[b]]
könnte seino[o[j]=o[b],b]=c
Python , 82 Bytes
Probieren Sie es online!
quelle
QBasic, 229 Bytes
Strategie
Wir durchlaufen die Eingabezeichenfolge. Wenn wir auf einen Großbuchstaben stoßen, speichern wir ihn und seine Position. Wenn wir zum zweiten Mal auf einen Großbuchstaben stoßen, verwenden wir diese gespeicherten Werte, um ihn gegen den vorherigen auszutauschen. Gleiches gilt für Kleinbuchstaben.
(Ich wollte gerade eine längere Version veröffentlichen, in der ein Array verwendet wurde, da ich dachte, dass QBasic-Strings unveränderlich sind. Dann bin ich auf die Tatsache gestoßen, dass
MID$(strng$, index, length) = replacement$
alles gut funktioniert. Lebe und lerne.)Ungolfed + kommentiert
quelle
C ++ 11 (GCC),
154149 Bytesquelle
#include<string>
oder zu C ++ 14 wechseln und ein generisches Lambda deklarieren[](auto s)
und annehmens
, dass es von iststd::string
. Das Deklarieren[](auto&s)
erspart Ihnen außerdem die Rückgabe der Zeichenfolge als modifizierende Eingabeargumente, die als Ausgabe dienen sollen.Qbasic,
436408 BytesDank DLosc ein Byte gespart. Weitere Einsparungen durch Änderung der Behandlung von Nicht-Buchstaben-Zeichen.
Dies besteht im Wesentlichen aus drei Teilen:
Eine ausführlichere Erklärung (beachten Sie, dass dies eine frühere Version des Codes ist, das Prinzip jedoch weiterhin gilt):
quelle
PHP,
1089383 BytesVorherige Version (93 Bytes)
Vielen Dank an @ user59178, der mich daran erinnert hat, dass
preg_replace()
Arrays von Strings als Argumente verwendet werden können.Die ursprüngliche Antwort (108 Bytes)
Der Code wird hier eingepasst, um dem verfügbaren Platz zu entsprechen.
Es kann von der Kommandozeile ausgeführt werden:
Eine um 1 Byte kürzere Version ist unter PHP 7 möglich, indem die Zuweisung
$f
innerhalb des ersten Aufrufs unterdrückt wird:Beide Lösungen, mit Testfällen und ungolfed Versionen, sind auf Github zu finden .
quelle
preg_replace
Sie können eine Reihe von Ersetzungen vornehmen, damit Sie nur einen Anruf benötigen. Außerdem ist es kürzer zu bedienen<?=
alsecho
. Mit diesen ist es einfach, Ihre Antwort auf 93 Bytes zu reduzieren.preg_replace()
. Ich habe es vergessen. Ich mag es nicht<?=
(meiner Meinung nach<?
ist es nicht Teil der Sprache, es ist nur ein Marker) und ich schreibe gerne kurze einzeilige Programme, die über die Befehlszeile ausgeführt werden könnenphp -r
. Aber für den Code Golf sind Sie wieder richtig. Ich kann mit 1 Byte sparen<?=
.Mathematica, 96 Bytes
Ein Port von Leos Retina-Antwort , der reguläre Ausdrücke verwendet.
quelle
Python 2 , 124 Bytes
Nicht so kurz wie meine auf Regex basierende Lösung , aber ich finde sie immer noch interessant.
Probieren Sie es online!
quelle
Bohne , 83 Bytes
Hexdump:
Entsprechendes JavaScript:
Erläuterung:
Implizit die erste Eingabezeile als unformatiert
a
annehmen (da Zeilenumbrüche nicht Teil einer verschlüsselten Zeichenfolge sein können) und implizit die unverschlüsselte Zeichenfolge durch sequentielles Ersetzen von Paaren aus Großbuchstaben und Kleinbuchstaben ausgeben.Probieren Sie die Demo hier aus.
Probieren Sie hier die Testsuite aus.
quelle
Ruby, 81 Bytes
quelle
JavaScript (ES6), 80 Byte
Basierend auf der Antwort von Leo auf Retina .
Das funktioniert , weil das nur Großbuchstaben in dem Code
.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')
sindA
undZ
, die verwendet werden , um die Zeichenbereiche zu beschreiben. Genau das müssen wir in Kleinbuchstaben umwandeln, um den zweiten Durchgang zu verarbeiten.Testfälle
Code-Snippet anzeigen
quelle
ES6 155 - 195 Bytes
Ich weiß, dass es bereits eine bessere Antwort gibt, aber ich wollte es ohne Regex versuchen. Dieser arbeitet auch an Interpunktion, aber das scheint den
(^_^)
Test zu verletzen . In diesem Fall habe ich eine anderec()
Funktion, die unten angegeben ist.Erläuterung
quelle
Perl 6 , 56 Bytes
Nimmt eine Zeichenfolgenvariable als Argument und ändert sie direkt, sodass die Variable nach dem Aufrufen des Lambda das Ergebnis enthält.
Länger als in Perl, weil:
<[A..Z]>
statt[A-Z]
.EVAL
, das mehr Flexibilität ermöglichen würde, erfordert das golfunfreundlicheuse MONKEY-SEE-NO-EVAL;
Pragma.Ein Array in einer
@
Variablen kann direkt in einem regulären Ausdruck referenziert werden und wird als Alternative behandelt.Perl 6 , 65 Bytes
Funktionsversion (gibt das Ergebnis als Rückgabewert des Lambda aus).
quelle
R, 343 Bytes
Schrecklich ungeschickte R-Lösung:
quelle
Python 2, 181 Bytes
Viel länger als es sein sollte aber trotzdem:
Dadurch werden zunächst zwei Listen erstellt: eine der Indizes für die Großbuchstaben und eine für die Kleinbuchstaben. Jede dieser Listen wird in Indexpaaren durchlaufen, und die Zeichen an diesen Indizes werden umgeschaltet.
Ich werde morgen Golf spielen
, aber jetzt ist es Zeit zu schlafen.quelle
Pip , 28 Bytes
Übernimmt die Eingabe als Befehlszeilenargument. Probieren Sie es online!
Erläuterung
Dies ist eine Regex-Lösung, die die integrierten Regex-Variablen
XL
(Kleinbuchstaben`[a-z]`
) undXU
(Großbuchstaben`[A-Z]`
) verwendet.Wenn das zweite Argument
R
eine Liste ist, werden die Ersetzungen in Reihe durchgeführt. Daher stören sich die Ersetzung von Kleinbuchstaben und die Ersetzung von Großbuchstaben nicht gegenseitig.quelle
Perl 5 , 48 + 1 (-p) = 49 Bytes
Probieren Sie es online!
quelle
AWK ,
121129 BytesProbieren Sie es online! Hinweis: Link verfügt über 8 zusätzliche Bytes, um eine mehrzeilige Eingabe zu ermöglichen
Die Verwendung ist recht typisch, erfordert jedoch eine Version
AWK
, die eine leere Zeichenfolge als Feldtrennzeichen akzeptiert (die meisten Versionen von,gawk
aber ich bin mir ziemlich sicher, dass das OriginalAWK
fehlschlagen würde :()Es ist sehr einfach, da es einfach jedes Zeichen durchläuft und prüft, ob es zuvor einen dieser Fälle gefunden hat. In diesem Fall werden die Zeichen ausgetauscht und der aktivierte Index zurückgesetzt. Auf der Lernseite habe ich in nie eine Zuweisungsanweisung innerhalb einer Zuweisungsanweisung verwendet
AWK
. Aus irgendeinem Grund war es nie aufgetaucht. :)Möglicherweise kann ich ein paar Bytes rasieren, indem ich OFS und FS außerhalb eines
BEGIN
Blocks über eine Befehlszeilenzuweisung oder Ähnliches zuordnete, aber auf diese Weise ist es "sauberer".Das Hinzufügen des TIO-Links zeigte mir, dass ich einen Transkriptionsfehler hatte, für dessen Behebung 8 Bytes erforderlich waren :( (habe ich ausgelassen
0*(U=a):
)quelle
C (GCC) ,
212206 BytesProbieren Sie es online!
quelle
Stax , 18 Bytes
Führen Sie es aus und debuggen Sie es
Der allgemeine Ansatz basiert auf Regex.
[a-z].*?[a-z]
.quelle
R ,
223163 Bytes148 BytesEDIT: -60 Bytes durch Implementierung einer for-Schleife
EDIT: -15 Bytes von Giuseppe
Probieren Sie es online!
Testet, ob Zeichen in Klein- oder Großbuchstaben geschrieben sind, platziert sie in einer Matrix und invertiert die Matrix, um die Werte in einem vertauschten Format zu extrahieren. Dann mit ausgeben
cat
. Versuchen Sie es online mit Kämpfen,scan(,'')
wenn der Code mehr als eine Zeile ist, daher die Semikolons in der einzelnen Codezeile.quelle
x
Fummeln ist das Schlaue, aber es hat auchm=matrix
4 Bytes gekostet.scan(,'')
Problem? Und die Reduzierung der "LLEHW OROLD!" in tio zuscan(,'')
oder auf andere weise eingabe bekommen?Java 7, 117 Bytes
EDIT: Ich habe gerade bemerkt, dass ich eine ähnliche Antwort wie @Leos Retina-Antwort habe , obwohl ich selbstständig darüber nachgedacht habe.
Ungolfed:
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle