Давайте шифруємо це!


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 рядки розшифрування. Проведіть петлю над рядком зліва направо. По черзі додайте символи до першого рядка і додаючи до другого кожен раз, коли ви обробляєте голосну. З'єднайте рядки в кінці.
Емінья

3
Незабаром виникне завдання для розшифровки для того ж, в якому я спробую пояснити процес
Manish Kundu

Відповіді:


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 байти , використовуючи однаковий рядок для всіх букв і застосовуючи ще декілька гольфу.
Арнольд

Нічого блискуче! Я не думав поєднувати струни ВСЕ
Шиеру Асакото

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яка теж не була дуже ефективною.
Емінья


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

Стакс , 24 байти

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

Виконати його

Ось представлення тієї ж програми ascii.

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

Він спочатку переводить кожен клас символів, потім починає цикл. У циклі він видає наступний символ і умовно перевертає решту рядка, якщо зустрічається голосний.

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.