Давайте зашифруем это!


12

Вызов

Задача состоит в том, чтобы зашифровать данную строку, используя правила, указанные ниже. Строка будет содержать только строчные буквы , цифры и / или пробелы .

Эквивалент персонажа

Теперь, во-первых, вам нужно знать, как найти «эквивалент» каждого персонажа.

Если символ является согласной, это способ найти его эквивалент:

1) List all the consonants in alphabetical order
    b c d f g h j k l m n p q r s t v w x y z
2) Get the position of the consonant you are finding the equivalent of.
3) The equivalent is the consonant at that position when starting from the end.

Например: «h» и «t» являются эквивалентами друг друга, потому что «h», «t» находятся в 6-й позиции от начала и конца соответственно.

Для поиска эквивалента гласных / цифр используется та же процедура. Вы перечисляете все гласные или цифры (начиная с 0) по порядку и находите эквивалент.

Ниже приведен список эквивалентов всех символов:

b <-> z
c <-> y
d <-> x
f <-> w
g <-> v
h <-> t
j <-> s
k <-> r
l <-> q
m <-> p
n <-> n

a <-> u
e <-> o
i <-> i

0 <-> 9
1 <-> 8
2 <-> 7
3 <-> 6
4 <-> 5

Правила шифрования

1) Вы начинаете двигаться слева и идете вправо.

2) Если символ является согласной / цифрой, то берется его эквивалент, а если это пробел, то пробел.

3) Если персонаж гласный, вы берете его эквивалент и начинаете двигаться в противоположном направлении. Например, если вы двигаетесь вправо и встречаете гласный, зашифруйте этот символ, затем перейдите к крайнему правому незашифрованному символу и начните шифрование в левом направлении, и наоборот.

4) Вы не должны рассматривать персонажа в одной и той же позиции дважды. Шаги должны быть выполнены, пока все символы на входе не будут покрыты.

5) Общее количество символов на входе (включая пробелы) должно быть равно общему количеству символов на выходе.

Обратите внимание, что зашифрованные символы появляются в выводе в том порядке, в котором они были зашифрованы.

Теперь позвольте мне зашифровать строку для вас.

String = "tre d1go3t is"
Moving left to right
"t" -> "h"
"r" -> "k"
"e" -> "o"
Vowel encountered. Now moving right to left.
"s" -> "j"
"i" -> "i"
Vowel encountered. Now moving left to right.
" " -> " "
"d" -> "x"
"1" -> "8"
"g" -> "v"
"o" -> "e"
Vowel encountered. Now moving right to left.
" " -> " "
"t" -> "h"
"3" -> "6"

Output -> "hkoji x8ve h6"

Примеры

"flyspy" -> "wqcjmc"
"hero" -> "toek"
"heroic" -> "toyike"
"ae" -> "uo"
"abe" -> "uoz"
"the space" -> "htoo jmuy"
"a d1g13t" -> "uh68v8x "
"we xi12" -> "fo78i d"
"this is a code" -> "htioj ixej uy "

Вы также можете использовать прописные буквы вместо строчных.

счет

Это , поэтому выигрывает самый короткий код!


1
Шаг 3 немного неясен в отношении переключения направлений. Я думаю, что вы должны сказать что-то вроде: «Если вы двигаетесь вправо и встречаете гласную, зашифруйте этот символ, затем перейдите к самому правому незашифрованному символу и начните шифрование в левом направлении». (Если это то, что вы имеете в виду). Я думаю, вам также следует явно указать, что зашифрованные символы появляются в выходных данных в том порядке, в котором они были зашифрованы.
Дилнан

@dylnan добавил это.
Маниш Кунду

Просто из любопытства. Можете ли вы описать процедуру расшифровки? Потому что функция шифрования не является собственной обратной (как в алгоритме ROT13). Поэтому, если мы передадим зашифрованные данные в одну и ту же процедуру шифрования - мы не получим оригинальный текст. Спасибо
Агниус Василяускас

1
@AgniusVasiliauskas: Один из способов сделать это: применить те же преобразования символов. Держите 2 расшифровать строки. Зациклите строку слева направо. Чередуйте добавление символов к первой строке и добавление ко второй при каждом обращении с гласным. Слить строки в конце.
Emigna

3
Скоро будет тот же процесс расшифровки, в котором я попытаюсь объяснить процесс
Маниш Кунду

Ответы:


4

JavaScript (Node.js) , 173 ... 166 156 ... 124 123 байта

-28 байт благодаря арно

f=([q,...s])=>q?(c="aeioubcdfghjklmpqrstvwxyz",t=c.search(q),q=="0"|+q?9-q:~t?c[(t<5?4:29)-t]:q)+f(~t&&t<5?s.reverse():s):s

Попробуйте онлайн!

На первой итерации переменная Stringбудет изменена на Array, а последующие итерации продолжат использовать Array. Вуаля!

Оригинальный подход (166 байт):

f=(s,i=0,r=s.length,d=1,c="bcdfghjklmnpqrstvwxyz",v="aeiou")=>(d^=!!(t=~v.search(q=s[d?i:r])),q<"0"|q>"9"?c[20-c.search(q)]||v[5+t]||q:9-q)+(i<r-1?f(s,i+d,r-!d,d):"")

&не работал для некоторых номеров, но &&работал. Благодарю.
Шиеру Асакото

О да, я не нашел способа оптимизировать это, и вы сделали это! Благодарность!
Шиеру Асакото

3
124 байта , используя одну и ту же строку для всех букв и применяя еще немного игры в гольф.
Арно

Вау, гениально! Я не думал о соединении струн ВСЕ
Shieru Asakoto

q=="0"|+qна самом деле на 1 байт короче q>" "&&1/q.
Арно

3

05AB1E , 22 байта

vćžN‡žM‡žh‡D?žMsåiR

Попробуйте онлайн! или как тестовый набор

объяснение

v                        # for each char in input
 ć                       # extract the head of the current string (initially input)
  žN‡                   # transform consonants
      žM‡               # transofrm vowels
          žh‡           # transform numbers
              D?         # print a copy of the current char
                žMsåi    # if the current char is a vowel
                     R   # reverse the rest of the string

žhžMžN)UvćXJXíJ‡D?žMsåiRбыло то, что я думал об улучшении, но не могу сократить XJXiJдостаточно.
Волшебная Урна Осьминога

@MagicOctopusUrn: У меня была похожая идея, DJsíJкоторая тоже не была очень эффективной.
Emigna


1

J , 132 байта

f=:3 :0
c=.(u:97+i.26)-.v=.'aeiou'
d=.u:48+i.10
g=.;"0|.
a=.''
while.*#y do.a=.a,{.y rplc(g c),(g d),g v
y=.|.^:({:a e.v)}.y
end.a
)

Попробуйте онлайн!

На этот раз подробный явный глагол.

Объяснение:

c=.(u:97+i.26) делает список аз

v=.'aeiou' составляет список гласных

-. убирает гласные из списка букв

d=.u:48+i.10 составляет список цифр

g=.;"0|. служебный глагол для создания списка в штучной упаковке пар символов замены

   g d
┌─┬─┐
│0│9│
├─┼─┤
│1│8│
├─┼─┤
│2│7│
├─┼─┤
│3│6│
├─┼─┤
│4│5│
├─┼─┤
│5│4│
├─┼─┤
│6│3│
├─┼─┤
│7│2│
├─┼─┤
│8│1│
├─┼─┤
│9│0│
└─┴─┘

a=.'' список для сохранения результата

while.*#y do.a=.a,{.y rplc(g c),(g d),g v длина списка> 0, взять символ, заменить его и добавить к результату

y=.|.^:({:a e.v)}.y удалить один символ из начала списка и, если символ является гласным, перевернуть список

end.заканчивает whileцикл

a возвращает результат



0

Сетчатка , 78 байт

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b
/[aeiou]/{*>0L`.*?[aeiou]
0`.*?[aeiou]

V`

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b

Поменяйте местами каждый символ с его эквивалентом.

/[aeiou]/{

Повторите, пока гласная остается.

*>0L`.*?[aeiou]

Вывести текст до гласной.

0`.*?[aeiou]

Удалить текст до гласной.

V`

Переверните оставшийся текст. Когда не осталось гласных, это затем неявно выводится, однако для целей тестовых случаев заголовок выводит текст в конце каждой строки.


0

Stax , 24 байта

╥j•td╢Ä;Sµ*ûⁿvÉ╫î▓J o╩π╗

Запустить его

Вот представление ascii той же программы.

VcGVdGVvGwB]qVvs#!Hv*c}cr\$|t

Сначала он переводит каждый класс символов, а затем начинает цикл while. В цикле он выводит следующий символ и условно переворачивает остальную часть строки, если встречается гласная.

VcG                             Push lowercase consonants and jump to trailing }
   VdG                          Push digits and jump to trailing }
      VvG                       Push lowercase vowels and jump to trailing }
         wB]qVvs#!Hv*c          While; run this block until popped value is falsy
          B]                    Split first character off string 
            q                   Output with no newline; keep on the stack
             Vvs#               1 if letter is a vowel, 0 otherwise
                 !Hv            Not, Double, then Decrement
                                    -1 for vowels, 1 otherwise
                    *           Multiply string. -1 causes reversal       
                     c          Copy value to be popped as while condition
                      }         Jump target from above.  Return when done.
                       cr\$     Copy, reverse, zip, and flatten.
                           |t   Translate: use string as a character map
                                    for replacements
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.