Eine Hauptchiffre

15

Ihre Aufgabe ist es, eine nicht leere Zeichenfolge zu entschlüsseln, die aus druckbaren ASCII-Zeichen im Bereich [32..126] besteht .

Zeichenfolge pro Zeichen lesen:

  • Jedes Mal, wenn Sie auf einen Buchstaben in Kleinbuchstaben stoßen, verknüpfen Sie ihn mit dem nächsten Buchstaben in Großbuchstaben, beginnend mit 'A'.
  • Jedes Mal, wenn Sie auf einen Buchstaben in Großbuchstaben stoßen, ersetzen Sie ihn durch den Buchstaben in Kleinbuchstaben, mit dem er verknüpft ist
  • andere Zeichen erfordern keine besondere Verarbeitung und bleiben unverändert

Beispiel

Für die Eingabezeichenfolge "endlAsEBAEE":

  • Assoziiere ezu A, nzu B, dzu Cund lzuD
  • Ersetzen Adurche
  • Assoziiere szuE
  • Ersetzen EBAEEdurchsness

Die endgültige Ausgabe ist "endlessness".

Erläuterungen und Regeln

  • Die Eingabezeichenfolge darf garantiert höchstens einmal jeden Kleinbuchstaben enthalten. Alle weiteren Instanzen werden durch den entsprechenden Großbuchstaben ersetzt.
  • Die Eingabezeichenfolge ist garantiert gültig. (Sie werden keinen Großbuchstaben finden, der noch keinem Kleinbuchstaben zugeordnet ist.)
  • Sobald ein Großbuchstabe einem Kleinbuchstaben zugeordnet wurde, kann er später in der Zeichenfolge verwendet werden oder nicht. Zum Beispiel Cund Dwerden im obigen Beispiel nicht verwendet.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes!

Testfälle

Eingänge:

abcd
honk! ABCD!
abrAcAdABCA
endlAsEBAEE
helCo wDrCd!
dermatoglyphics
progBamFinD AuzJles & cCdL DCKf
sphinx of black quKrtz, jOdge my vGw. K NODLM IPGZE HGF SOWBA GYVP QCV JKRX TGU.
petBr AiABD AEckBd a ABFG of AEFGlBH ABAABDs. hJw mIny AEFGLBH ABAABDM HEH ABCBD AEABD AEFG?

Antworten:

abcd
honk! honk!
abracadabra
endlessness
hello world!
dermatoglyphics
programming puzzles & code golf
sphinx of black quartz, judge my vow. a quick brown fox jumps over the lazy dog.
peter piper picked a peck of pickled peppers. how many pickled peppers did peter piper pick?
Arnauld
quelle
1
Ich denke, die Umkehrung dieser Aufgabe - Codieren einer Zeichenfolge aus Kleinbuchstaben und Interpunktion - wäre ebenfalls eine interessante Herausforderung.
Chas Brown

Antworten:

8

Gelee , 8 7 Bytes

fØaØA,y

Probieren Sie es online!

Wie es funktioniert

fØaØA,y  Main link. Argument: s (string)

 Øa      Yield the lowercase alphabet.
f        Filter; keep only characters that appear in the lowercase alphabet.
          Call the result r.
   ØA    Yield the uppercase alphabet (u).
     ,   Pair; yield [u, r].
      y  Translate s, using the substitutions in [u, r].
Dennis
quelle
4

05AB1E , 6 Bytes

Code:

AÃAus‡

Verwendet die 05AB1E- Codierung. Probieren Sie es online!

Adnan
quelle
Deine Antworten beschämen mich normalerweise ʒ.l}Aus‡.
Magic Octopus Urn
3

JavaScript (ES6), 62 Byte

s=>s.replace(/[A-Z]/g,c=>s.match(/[a-z]/g)[parseInt(c,36)-10])

Jeder Großbuchstabe wird in seinen Basiswert 36 minus 10 umgewandelt.

Wir stimmen dann mit dem Kleinbuchstaben überein, der sich an diesem Index befindet.

Rick Hitchcock
quelle
2

Pyth, 36 Bytes

JKr1GVQI&}NG!}NH=XHNhK=tK)p?}NJ@_HNN

Probieren Sie es hier aus

Erläuterung

JKr1GVQI&}NG!}NH=XHNhK=tK)p?}NJ@_HNN
JKr1G                                  Let J and K be the uppercase alphabet.
     VQ                                For each character in the input...
       I&}NG!}NH         )             ... if the character is lowercase and not
                                       yet in H, ...
                =XHNhK                 ... add the letter and the next uppercase
                                       letter to H...
                      =tK              ... and move to the next uppercase letter.
                          p?}NJ@_HNN   Print either the next character or the
                                       letter it represents.

quelle
2

R , 79 Bytes

function(x){s=utf8ToInt(x)
s[j]=s[s>96&s<123][s[j<-s>64&s<91]-64]
intToUtf8(s)}

Probieren Sie es online!

digEmAll
quelle
Sehr schön ! Sie können wahrscheinlich ein paar Bytes sparen, indem Sie scan(,"" es zu einem vollständigen Programm anstatt einer Funktion machen.
Ansonsten
2

Perl 5 mit -p27 Bytes

eval"y/A-Z/".y/a-z//cdr."/"

Probieren Sie es online!

-2 Bytes dank @breadbox !

Dom Hastings
quelle
1
Speichern Sie ein paar Bytes durch Ersetzen der s///grmit y///cdr.
Brotkasten
@breadbox natürlich danke!
Dom Hastings
2

Z80Golf , 37 Bytes

00000000: 2505 cd03 8030 0176 fe7b 300c fe61 3011  %....0.v.{0..a0.
00000010: fe5b 3004 fe41 3003 ff18 e7d6 414f 0a18  .[0..A0.....AO..
00000020: f777 2318 f3                             .w#..

Probieren Sie es online!

Z80 macht das ziemlich gut! Hier ist eine Demontage:

  dec h         ; HL = cipher write pointer
  dec b         ; BC = cipher read pointer
                ; meaning of 'A'..'Z' is written to $ff00~$ff19
next:
  call $8003    ; getchar
  jr nc, ok     ; not EOF?
  halt
ok:
  cp '{'
  jr nc, other  ; a ≥ '{'
  cp 'a'
  jr nc, lower  ; 'a' ≤ a ≤ 'z'
  cp '['
  jr nc, other  ; '[' ≤ a ≤ '`'
  cp 'A'
  jr nc, upper  ; 'A' ≤ a ≤ 'Z'
other:
  rst $38
  jr next
upper:
  sub 'A'
  ld c, a
  ld a, (bc)
  jr other
lower:
  ld (hl), a
  inc hl
  jr other

Wir weisen sowohl HL als auch BC auf den $ff00Bereich mit decund verwenden ihn rst $38als kurze Alternative zu call $8000, aber ansonsten gibt es nicht viel Trick.

Lynn
quelle
1

Retina , 25 Bytes

~["T`L`"|""L$`[a-z]
$&-$&

Probieren Sie es online!Erläuterung:

[a-z]

Match Kleinbuchstaben.

$`
$&-$&

Ersetzen Sie jeden Buchstaben durch einen entarteten Bereich. (Dies verhindert, dass die spätere Transliteration sie als Zeichenklasse behandelt. Backslash kann nicht verwendet werden, da einige Kleinbuchstaben nach einem Backslash eine besondere Bedeutung haben.)

["T`L`"|""L

Listen Sie die entarteten Bereiche auf, jedoch ohne Zeilentrennzeichen und mit vorangestelltem T`L` .

~

Bewerten Sie das resultierende Transliterationsprogramm für die ursprüngliche Eingabe.

Neil
quelle
1

Python 2 , 78 Bytes

lambda s:''.join('@'<c<'['and filter(str.islower,s)[ord(c)-65]or c for c in s)

Probieren Sie es online!

Chas Brown
quelle
1

C (gcc) , 105 Bytes

C;f(char*Z){for(char*z=--Z,c,*s;c=*++z;putchar(c))for(C=64,s=Z;*z>64&91>*z&&C^*z;c=*s)C+=*++s>96&*s<123;}

Probieren Sie es online!

Jonathan Frech
quelle