Удосконалений лазерний шифр Цезаря Свині


32

Проблема з шифром Цезаря полягає в тому, що отримані слова часто не вимовляються. Проблема з Pig Latin полягає в тому, що її легко розшифрувати. Чому б не поєднати їх?

Вхідні дані

Слово, що складається з 26 англійських букв.

Вихідні дані

По-перше, змініть кожен приголосний у слові на наступний приголосний в алфавіті. Отже, b іде до c, d - до f, а z - до b. Потім змініть кожну голосну на наступну голосну в алфавіті (u переходить до a). Останнє, лише якщо перша літера слова є приголосною, перенесіть цю букву в кінець слова і додайте "ай" до кінця слова.

Приклади:

cat -> evday  
dog -> uhfay   
eel -> iim
  • Це , тому виграє найкоротший код.
  • Справа не має значення.
  • Голосні звуки, які будуть використовуватися, - це A, E, I, O і U

2
ні, але ви можете, якщо хочете
qazwsx

6
Ласкаво просимо до PPCG! Дуже приємний виклик, чітко представлений.
Джонатан Аллан

6
Пропонований тестовий випадок:z → bay
Арнольд

1
jot ot e wisz opvisitvoph dupdiqv cav o fu puv vjopl ov jimqt xovj vji ecomovz vu qsupuapdi vji xusftvay
Тінь

4
Схожі тестовий приклад: the → jivay? (Тобто, якщо слово починається з декількох приголосних, чи рухаємо ми лише один з них?)
DLosc

Відповіді:


3

Стакс , 20 байт

ù≥±╘├*Lâ■8O±âΓ║Θæ%º•

Запустіть і налагоджуйте його

Пояснення

Vc:tVv:tBcVc#{sL"ay"+}ML             #Full program, unpacked, implicit input
Vc:t                                 #Push consonants and ring translate input
    Vv:t                             #Push vowels and ring translate input
        BCvc#                        #Push first letter and tail of word, find number 
                                     #of occurrences to consonants
             {sL"ay"+}M              #If truthy (word starts with consonant)
                                     #swap stack, listify, add "ay"
                       L             #Listify stack (combines words that start with vowel)

Я пройшов кілька ітерацій і, нарешті, знизився до 20. Моє оригінальне рішення було 53 байти.



6

R , 86 85 байт

Простий спосіб. chartrмає чарівну та корисну властивість, що може задавати діапазони літер , які заощаджують кілька байтів.

-1 байт, викравши рядки перекладу рішення GBy @ GB's - підсиліть це!

function(s)sub("^([^aeiou])(.*)","\\2\\1ay",chartr('zb-yadehinotu','b-zefijopuva',s))

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


5

Java (JDK) , 167 байт

s->{String r="",a="aeiouabcdfghjklmnpqrstvwxyzb",c=s.split("")[0];s=a.indexOf(c)>5?s.substring(1)+c+"ux":s;for(var d:s.split(""))r+=a.charAt(a.indexOf(d)+1);return r;}

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

Кредити



4

05AB1E , 21 байт

žMDÀ‡žNDÀ‡¬žNsåiÀ…ÿay

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

Пояснення

žMDÀ‡                   # replace each vowel with the next vowel in the alphabet
     žNDÀ‡              # replace each consonant with the next consonant in the alphabet
          ¬žNsåi        # if the first letter is a consonant
                À…ÿay   # rotate the word left and add "ay"

4

Node.js 10.9.0 , 121 116 байт

Очікує введення рядка в малому регістрі.

s=>(v=n=>2130466>>n&1)((a=Buffer(s).map(n=>(g=i=>v(n=n%61?n+1:97)^i?g(i):n)(v(n))))[0],a+='')?a:a.slice(1)+a[0]+'ay'

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

Визначення голосних

Для ідентифікації голосних голосна функція використовує наступну бітову маску:v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

І робить:

(2130466 >> n) & 1

n

Нехай shiftCount є результатом маскування всіх, але найменш значущих, 5 біт rnum , тобто обчислення rnum & 0x1F.

Прокоментував

s =>                      // s = input string
  ( v = n =>              // v = helper function taking n = ASCII code in [97..122]
    2130466 >> n & 1      //     and returning 1 if the corresponding character is a vowel
  )                       //     or 0 otherwise (see the previous paragraph)
  (                       // this statement will ultimately invoke v on a[0]
    ( a = Buffer(s)       //   convert s to a Buffer, holding ASCII codes
      .map(n =>           //   for each ASCII code n in there:
        ( g = i =>        //     g = recursive function taking i = vowel flag
          v(              //       update n and invoke v on the new value:
            n = n % 61 ?  //         if n is less than 122 (meaning less than 'z'):
              n + 1       //           increment n
            :             //         else:
              97          //           wrap around by setting n to 97 (meaning 'a')
          ) ^ i ?         //       if v(n) is not equal to i:
            g(i)          //         do recursive calls until it is
          :               //       else:
            n             //         stop recursion and return the new n
        )(v(n))           //     initial call to g with i = v(n)
      )                   //   end of map()
    )[0],                 //   invoke v on a[0]
    a += ''               //   coerce the updated Buffer back to a string
  ) ?                     // if a[0] is a vowel:
    a                     //   return the string as-is
  :                       // else:
    a.slice(1) + a[0]     //   move the leading consonant to the end
    + 'ay'                //   and append the 'ay' suffix

4

Python 2 , 153 121 110 99 91 байт

lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")

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

8 байт поголилися через пропозицію Метью Дженсена


Ви можете зберегти 8 байт за допомогою функції string.translate ():lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen

@MatthewJensen Розумний! Зазвичай я уникаю translateв Python 2 ...
Chas Brown

Випадково він тепер працює і для верхньої справи
Меттью Йенсен

3

T-SQL, 169 байт

SELECT IIF(CHARINDEX(LEFT(a,1),'aeiou')=0,SUBSTRING(a,2,99)+LEFT(a,1)+'ay',a)FROM
(SELECT TRANSLATE(v,'aeioubcdfghjklmnpqrstvwxyz','eiouacdfghjklmnpqrstvwxyzb')a FROM t)s

Введення здійснюється за допомогою попередньо існуючої таблиці відповідно до наших стандартів введення-виведення .

Спочатку виконує заміну символів, використовуючи функцію ( new для SQL 2017 ) TRANSLATE, потім перевіряє перший символ.

Дратівливий довгий, в основному через довжину ключових слів SQL.




2

Сітківка 0,8,2 , 50 байт

T`uo`aei\oub-df-hj-np-tv-zb
^([^aeiou])(.*)
$2$1ay

Спробуйте в Інтернеті! Посилання включає тестові випадки. Аналогічний підхід до відповіді R. Пояснення:

T`uo`aei\oub-df-hj-np-tv-zb

oпосилається на інший набір, тобто на aei\oub-df-hj-np-tv-zbякий розширюється aeioubcdfghjlkmnpqrstvwxyzb, так uoрозширюється на uaeioubcdfghjlkmnpqrstvwxyzb. Це призводить до такої транслітерації:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

Другі uі bігноруються, оскільки їх ніколи не можна зіставити, тому це забезпечує бажаний шифр. (Зверніть увагу, що в Retina 1 ви, звичайно, можете використовувати vзамість aei\ouекономії 5 байт.)

^([^aeiou])(.*)
$2$1ay

Якщо перша літера не є голосною, поверніть її до кінця та суфіксу ay.


2

Желе , 24 байти

,ṙ¥1y
ØẹçØḄçṙḢe©ØḄƊ®⁾ayx

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

Збережено 1 байт завдяки Джонатану Аллану (використовуйте синтаксис з двома знаками, а не лапки).


На жаль, набагато довший розумний, не підлий варіант (на 1 байт коротший підлий еквівалент). Я не буду мати можливість оновлювати це в протягом найближчих декількох годин, але дійсно вказують, якщо ви знайдете поліпшень.
Містер Xcoder

Використовувати ⁾ayдля байта. Можливо, ©підеш за тим, eщо саме ти зберігаєш. Я маю ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ.
Джонатан Аллан

2

> <> , 94 92 байт

i:0(?v"a"%
2%?!v\~r:5g
a2r}<vr+ad*
ol?!;>4g
ecdfighjoklmnpuqrstvawxyzb
1   1   1     1     1

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

Редагувати: збережено 2 байти, взявши вхідний модуль 97, а не 32, щоб словник міг розпочатись на початку рядка. Попередня версія:

i:0(?v84*%
2%?!v\~r:5g
37r}<vr*46*
ol?!;>4g
 ecdfighjoklmnpuqrstvawxyzb
 1   1   1     1     1



1

Perl 5 , 56 байт

y/a-z/ecdfighjok-npuq-tvaw-zb/;s/^([^aeiou])(.*)/$2$1ay/

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


1
Вам потрібні -s між cі dабо gта h?
Ніл

@Neil ні, я ні. Я написав програму для стиснення діапазонів ... і помилився логікою :) Дякую.
варення

Зазвичай у таких випадках ви пишете <s>58</s> 56 bytesу заголовку, і багато людей додають "Правка: збережено 2 байти завдяки @Neil." або щось таке, коли їм допомагають у коментарі.
Ніл

1

Dyalog APL (SBCS), 57 байт

{a←⎕A{(⍺~⍵)⍵}'AEIOU'⋄('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a)⊢(⊂⍵⍳⍨∊a)⌷∊1⌽¨a}

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

Вводить лише великі регістри! (Тому що ⎕Aце великий алфавіт)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Вектор приголосних і голосних
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Використовує індекси кожної літери слова в звичайному алфавіті ( ⊂⍵⍳⍨∊a) для індексу ( ) в шифрі ∊1⌽¨a.
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): Переміщує першу букву до кінця та додає "AY", якщо перша літера є приголосною.

Дякую за класний виклик!


0

JavaScript (SpiderMonkey) , 107 байт

x=>x.replace(/./g,y=>(z='aeiouabcdfghjklmnpqrstvwxyzb')[z.search(y)+1]).replace(/^([^aeiou])(.+)/,'$2$1ay')

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

Очікує введення з малої літери.

Замінює кожен символ рядка на один після нього в рядку 'aeiouabcdfghjklmnpqrstvwxyzb', а потім піглатифікує що-небудь початковим приголосним.


0

PHP, 112 байт

<?=strtr(($s=strstr(aeiou,($s=$argn)[0])?$s:substr($s,1).$s[0].ux),join(range(a,z)),ecdfighjoklmnpuqrstvawxyzb);

або

<?=strtr(($s=strstr(aeiou,($argn)[0])?$argn:substr($s,1).$s[0].ux),join(range(a,z)),ecdfighjoklmnpuqrstvawxyzb);

припустимо введення малих регістрів. Запустіть як трубу -nRабо спробуйте їх в Інтернеті .


Ви можете також використовувати
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z))замість цього
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb).

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