Wielki Szyfr

15

Twoim zadaniem jest rozszyfrowanie niepustego łańcucha składającego się z drukowalnych znaków ASCII z zakresu [32..126] .

Odczytywanie ciągu znaków na znak:

  • za każdym razem, gdy napotkasz małą literę, skojarz ją z następną wielką literą, zaczynając od „A”
  • za każdym razem, gdy napotkasz wielką literę, zamień ją na małą literę, z którą jest skojarzona
  • inne postacie nie wymagają specjalnego przetwarzania i pozostały bez zmian

Przykład

Dla ciągu wejściowego "endlAsEBAEE":

  • Skojarz ez A, ndo B, ddo Ci ldoD
  • wymienić Aze
  • Associate stoE
  • wymienić EBAEEzsness

Ostateczne wyjście to "endlessness".

Wyjaśnienia i zasady

  • Gwarantowany ciąg wejściowy zawiera każdą małą literę maksymalnie raz. Wszystkie dalsze wystąpienia zostaną zastąpione odpowiednią wielką literą.
  • Gwarantowany ciąg wejściowy. (Nie napotkasz dużej litery, która nie jest jeszcze powiązana z małą literą).
  • Gdy wielka litera zostanie powiązana z małą literą, może, ale nie musi być użyta później w ciągu. Na przykład Ci Dnie są używane w powyższym przykładzie.
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach!

Przypadki testowe

Wejścia:

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?

Odpowiedzi:

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
źródło
1
Myślę, że odwrotność tego zadania - kodowanie ciągu małych liter + interpunkcji - stanowiłaby również interesujące wyzwanie.
Chas Brown,

Odpowiedzi:

8

Galaretka , 8 7 bajtów

fØaØA,y

Wypróbuj online!

Jak to działa

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
źródło
4

05AB1E , 6 bajtów

Kod:

AÃAus‡

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Adnan
źródło
Twoje odpowiedzi zwykle mnie zawstydzają ʒ.l}Aus‡.
Magic Octopus Urn
3

JavaScript (ES6), 62 bajty

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

Każda wielka litera jest konwertowana na wartość podstawową 36, pomniejszoną o 10.

Następnie dopasowujemy małą literę o tym indeksie.

Rick Hitchcock
źródło
2

Pyth, 36 bajtów

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

Wypróbuj tutaj

Wyjaśnienie

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.

źródło
2

R , 79 bajtów

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

Wypróbuj online!

digEmAll
źródło
Bardzo dobrze ! Prawdopodobnie możesz zaoszczędzić kilka bajtów, używając scan(,"" pełnego programu zamiast funkcji, poza tym staram się znaleźć jakąkolwiek poprawę ...
JayCe
2

Perl 5 z -p, 27 bajtów

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

Wypróbuj online!

-2 bajty dzięki @breadbox !

Dom Hastings
źródło
1
Zaoszczędzić kilka bajtów przez zastąpienie s///grz y///cdr.
breadbox
@breadbox oczywiście, dziękuję!
Dom Hastings,
2

Z80Golf , 37 bajtów

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#..

Wypróbuj online!

z80 radzi sobie całkiem nieźle! Oto demontaż:

  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

Wskazujemy zarówno HL, jak i BC na $ff00zasięg deci używamy rst $38jako krótkiej alternatywy dla call $8000, ale poza tym nie dzieje się wiele sztuczek.

Lynn
źródło
1

Siatkówka , 25 bajtów

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

Wypróbuj online! Wyjaśnienie:

[a-z]

Dopasuj małe litery.

$`
$&-$&

Zastąp każdą literę zdegenerowanym zakresem. (Zapobiega to traktowaniu go przez klasę znaków późniejszą transliteracją; odwrotnego ukośnika nie można używać, ponieważ niektóre małe litery mają specjalne znaczenie po odwrotnym ukośniku).

["T`L`"|""L

Wymień zdegenerowane zakresy, ale bez separatorów linii i poprzedzające T`L`.

~

Oceń wynikowy program transliteracji na oryginalnym wejściu.

Neil
źródło
1

Python 2 , 78 bajtów

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

Wypróbuj online!

Chas Brown
źródło
1

C (gcc) , 105 bajtów

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;}

Wypróbuj online!

Jonathan Frech
źródło