Капітальний шифр


15

Ваше завдання - розшифрувати непорожній рядок, що складається з друкованих символів ASCII в діапазоні [32..126] .

Читання символу рядка на символ:

  • щоразу, коли ви зустрічаєте букву з малої літери, пов'язуйте її з наступною літерою з великої літери, починаючи з «А»
  • щоразу, коли ви стикаєтесь з великої літери, замінюйте її на літеру з малої літери, з якою вона пов’язана
  • інші символи не потребують спеціальної обробки та залишаються без змін

Приклад

Для рядка введення "endlAsEBAEE":

  • Асоційований eз A, nдо B, dдо Cі lдоD
  • Замініть Aнаe
  • Асоційований sдоE
  • Замініть EBAEEнаsness

Кінцевий вихід - "endlessness".

Роз'яснення та правила

  • Рядок введення гарантовано містить кожну малу літеру максимум одночасно. Усі подальші екземпляри будуть замінені відповідною великою літерою.
  • Введений рядок гарантовано є дійсним. (Ви не зіткнетесь з великої літери, яка ще не пов'язана з малої літери.)
  • Після того, як велика літера була пов'язана з малої літери, вона може бути, а може і не використовуватись пізніше в рядку. Наприклад, Cі Dне використовуються у наведеному вище прикладі.
  • Це , тому найкоротша відповідь у байтах виграє!

Тестові справи

Вхідні дані:

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?

Відповіді:

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?

1
Я думаю, що зворотне завдання цього - кодування рядка малих і пунктуаційних - також складе цікавий виклик.
Час Браун

Відповіді:


8

Желе , 8 7 байт

fØaØA,y

Спробуйте в Інтернеті!

Як це працює

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


3

JavaScript (ES6), 62 байти

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

Кожна велика літера перетворюється на її базове значення 36, менше 10.

Потім ми співставляємо малу літеру, яка знаходиться в цьому індексі.


2

Pyth, 36 байт

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

Спробуйте тут

Пояснення

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.


2

R , 79 байт

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

Спробуйте в Інтернеті!


Дуже хороша ! Ви, ймовірно, можете зберегти кілька байтів, використовуючи scan(,"" для того, щоб зробити його повноцінною програмою замість функції, крім того, що я намагаюся знайти якісь покращення ...
JayCe,


2

Z80Golf , 37 байт

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

Спробуйте в Інтернеті!

z80 робить дуже добре в цьому! Ось демонтаж:

  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

Ми вказуємо і HL, і BC на $ff00діапазон dec, і використовуємо rst $38як коротку альтернативу call $8000, але в іншому випадку не дуже багато хитрощів.


1

Сітківка , 25 байт

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

Спробуйте в Інтернеті! Пояснення:

[a-z]

Збігайте малі літери.

$`
$&-$&

Замініть кожну букву виродженим діапазоном. (Це запобігає подальшій транслітерації трактувати її як клас символів; зворотний косий рисок не можна використовувати, оскільки деякі літери нижнього регістру мають спеціальне значення після зворотної косої риси.)

["T`L`"|""L

Перелічіть вироджені діапазони, але без роздільників ліній та з попереднім T`L` .

~

Оцініть отриману програму транслітерації на вихідному вході.






Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.