Улучшенный латинский шифр Цезарь Свинья

32

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

вход

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

Выход

Сначала измените каждую согласную в слове на следующую согласную в алфавите. Итак, b переходит к c, d переходит к f, а z переходит к b. Затем измените каждую гласную на следующую гласную в алфавите (вы переходите к a). Последнее, только если первая буква слова является согласной, переместите эту букву в конец слова и добавьте «ay» в конец слова.

Примеры:

cat -> evday  
dog -> uhfay   
eel -> iim
  • Это , поэтому выигрывает самый короткий код.
  • Дело не имеет значения.
  • Будут использоваться гласные: A, E, I, O и U
qazwsx
источник
2
нет, но вы можете, если хотите
qazwsx
6
Добро пожаловать в PPCG! Очень хороший вызов, четко представленный.
Джонатан Аллан
6
Предлагаемый тестовый пример:z → bay
Арнаулд
1
йота ВЗ е wisz opvisitvoph dupdiqv кавалерия о фу PUV vjopl ов jimqt xovj vji ecomovz вю qsupuapdi vji xusftvay
Shadow
4
Похожие тестовый пример: the → jivay? (То есть, если слово начинается с нескольких согласных, мы можем переместить только одну из них?)
DLosc

Ответы:

3

Stax , 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 байта.

много
источник
7

Рубин , 96 69 байт

->s{/^[^aeiou]/=~(r=s.tr'zb-yadehinotu','b-zefijopuva')?$'+$&+'ay':r}

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

Интересный факт дня: tr () соответствует строкам справа налево. Я всегда предполагал, что это было слева направо.

гигабайт
источник
6

R , 86 85 байт

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

-1 байт, украдя строки перевода @ GB для Ruby-решения - подтвердите!

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

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

j.doe
источник
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"
Emigna
источник
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
Arnauld
источник
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.....")
Мэтью Дженсен,
@ MatthewJensen Умный! Обычно я избегаю translateв Python 2 ...
Час Браун
По совпадению, теперь это также работает и в верхнем регистре
Мэтью Дженсен
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

Ввод осуществляется через уже существующую таблицу в соответствии с нашими стандартами ввода-вывода .

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

Раздражает долго в основном из-за длины ключевого слова SQL.

BradC
источник
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\ou5-байтового сохранения.)

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

Если первая буква не является гласной, поверните ее до конца и добавьте суффикс ay.

Нил
источник
2

Желе , 24 байта

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

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

Сохранено 1 байт благодаря Джонатану Аллану (используйте синтаксис из двух символов вместо кавычек).

Мистер Xcoder
источник
К сожалению, намного длиннее вменяемой, не подлый версии (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
Sok
источник
1

Красный , 149 байт

func[s][c:"aeioua.bcdfghjklmnpqrstvwxyzb"t: copy""foreach p s[append t c/(1
+ index? find c p)]if 7 < index? find c t/1[move t tail t append t"ay"]t]

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

Как (почти) всегда самая длинная запись

Гален Иванов
источник
1

Perl 5 , 56 байт

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

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

Hobbs
источник
1
Нужно ли вам -между cи dили gи и h?
Нил
@ Нет, нет, нет. Я написал программу для сжатия диапазонов ... и неправильно понял логику :) Спасибо.
Хоббс
Обычно в таких случаях вы пишете <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», если первая буква является согласной.

Спасибо за классный вызов!

akhmorn
источник
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).

Titus
источник