Uma cifra de capital

15

Sua tarefa é decifrar uma string não vazia que consiste em caracteres ASCII imprimíveis no intervalo [32..126] .

Lendo o caractere de string por caractere:

  • sempre que encontrar uma letra em minúscula, associe-a à próxima letra em maiúscula, começando com 'A'
  • sempre que encontrar uma letra maiúscula, substitua-a pela letra minúscula à qual está associado
  • outros caracteres não requerem processamento especial e permanecem inalterados

Exemplo

Para a sequência de entrada "endlAsEBAEE":

  • Associado ea A, na B, da Cel paraD
  • Substituir A pore
  • Associado s aE
  • SubstituaEBAEE porsness

A saída final é "endlessness".

Esclarecimentos e regras

  • A sequência de entrada é garantida para conter cada letra minúscula no máximo uma vez. Todas as instâncias adicionais serão substituídas pela letra maiúscula correspondente.
  • A sequência de entrada é garantida como válida. (Você não encontrará uma letra maiúscula que ainda não esteja associada a uma letra minúscula.)
  • Uma vez que uma letra maiúscula tenha sido associada a uma letra minúscula, ela pode ou não ser usada posteriormente na string. Por exemplo, Ce Dnão são usados ​​no exemplo acima.
  • Isso é , então a resposta mais curta em bytes vence!

Casos de teste

Entradas:

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?

Respostas:

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
fonte
1
Eu acho que o inverso dessa tarefa - codificar uma sequência de letras minúsculas + pontuação - também seria um desafio interessante.
quer

Respostas:

8

Geléia , 8 7 bytes

fØaØA,y

Experimente online!

Como funciona

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
fonte
4

05AB1E , 6 bytes

Código:

AÃAus‡

Usa a codificação 05AB1E . Experimente online!

Adnan
fonte
Suas respostas me envergonham normalmente ʒ.l}Aus‡.
Magic Octopus Urn
3

JavaScript (ES6), 62 bytes

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

Cada letra maiúscula é convertida em seu valor base 36, menos 10.

Em seguida, correspondemos à letra minúscula que está nesse índice.

Rick Hitchcock
fonte
2

Pitão, 36 bytes

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

Experimente aqui

Explicação

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.

fonte
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)}

Experimente online!

digEmAll
fonte
Muito agradável ! Provavelmente, você pode economizar alguns bytes usando scan(,"" para torná-lo um programa completo em vez de uma função, além do que eu estou lutando para encontrar qualquer melhoria ...
Jayce
2

Perl 5 com -p, 27 bytes

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

Experimente online!

-2 bytes graças a @breadbox !

Dom Hastings
fonte
1
Salve alguns bytes substituindo s///grpor y///cdr.
breadbox
@breadbox é claro, obrigado!
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#..

Experimente online!

O z80 faz muito bem nisso! Aqui está uma desmontagem:

  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

Apontamos HL e BC no $ff00intervalo com dec, e usamos rst $38como uma alternativa curta a call $8000, mas, caso contrário, não há muita coisa acontecendo.

Lynn
fonte
1

Retina , 25 bytes

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

Experimente online! Explicação:

[a-z]

Combine letras minúsculas.

$`
$&-$&

Substitua cada letra por uma faixa degenerada de si mesma. (Isso impede que a transliteração posterior trate-a como uma classe de caractere; a barra invertida não pode ser usada porque algumas letras minúsculas têm um significado especial após uma barra invertida.)

["T`L`"|""L

Liste os intervalos degenerados, mas sem separadores de linha e com um precedente T`L`.

~

Avalie o programa de transliteração resultante na entrada original.

Neil
fonte
1

Python 2 , 78 bytes

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

Experimente online!

Chas Brown
fonte
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;}

Experimente online!

Jonathan Frech
fonte