Ulepszony łaciński szyfr świni Cezara

32

Problem z szyfrem Cezara polega na tym, że powstałe słowa są często nieprzekraczalne. Problem z Pig Latin polega na tym, że łatwo go rozszyfrować. Dlaczego nie połączyć ich?

Wkład

Słowo składające się z 26 angielskich liter.

Wydajność

Najpierw zmień każdą spółgłoskę w słowie na następną spółgłoskę w alfabecie. Więc b przechodzi do c, d przechodzi do f, a z przechodzi do b. Następnie zmień każdą samogłoskę na następną samogłoskę w alfabecie (u przechodzi do a). Na koniec, tylko jeśli pierwsza litera słowa jest spółgłoską, przenieś tę literę na koniec słowa i dodaj „ay” na końcu słowa.

Przykłady:

cat -> evday  
dog -> uhfay   
eel -> iim
  • To jest , więc wygrywa najkrótszy kod.
  • Sprawa nie ma znaczenia.
  • Samogłoski, które zostaną zastosowane, to A, E, I, O i U
qazwsx
źródło
2
nie, ale możesz, jeśli chcesz
qazwsx
6
Witamy w PPCG! Bardzo fajne wyzwanie, jasno przedstawione.
Jonathan Allan,
6
Sugerowany przypadek testowy:z → bay
Arnauld
1
jot ot e wisz opvisitvoph dupdiqv cav o fu puv vjopl ov jimqt xovj vji ecomovz vu qsupuapdi vji xusftvay
Shadow
4
Sugerowana przypadek testowy: the → jivay? (To znaczy, jeśli słowo zaczyna się od wielu spółgłosek, czy poruszamy tylko jedną z nich?)
DLosc

Odpowiedzi:

3

Stax , 20 bajtów

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

Uruchom i debuguj

Wyjaśnienie

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)

Przeszedłem kilka iteracji i ostatecznie sprowadziłem do 20. Moje oryginalne rozwiązanie miało 53 bajty.

Wielo
źródło
7

Rubin , 96 69 bajtów

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

Wypróbuj online!

Zabawny fakt dnia: tr () dopasowuje ciągi znaków od prawej do lewej. Zawsze zakładałem, że jest od lewej do prawej.

GB
źródło
6

R , 86 85 bajtów

Prosta droga. chartrma uroczą i przydatną właściwość, dzięki której może określać zakresy liter , które oszczędzają kilka bajtów.

-1 bajtów kradnąc ciągi tłumaczenia rozwiązania Ruby @ GB - oceń go!

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

Wypróbuj online!

J.Doe
źródło
5

Java (JDK) , 167 bajtów

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;}

Wypróbuj online!

Kredyty

Olivier Grégoire
źródło
1
168 bajtów
Kevin Cruijssen,
4

05AB1E , 21 bajtów

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

Wypróbuj online!

Wyjaśnienie

ž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
źródło
4

Node.js 10.9.0 , 121 116 bajtów

Oczekuje, że ciąg wejściowy pisany małymi literami.

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'

Wypróbuj online!

Identyfikacja samogłosek

Aby zidentyfikować samogłoski, funkcja pomocnika używa następującej maski bitów:v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

I robi:

(2130466 >> n) & 1

Nie musimy maskować odpowiednich bitów , ponieważ odbywa się to niejawnie. Poniżej znajduje się odpowiedni cytat ze specyfikacji ECMAScript :n

Niech shiftCount będzie wynikiem maskowania wszystkich oprócz 5 najmniej znaczących bitów rnum , czyli obliczenia rnum i 0x1F.

Skomentował

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
źródło
4

Python 2 , 153 121 110 99 91 bajtów

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

Wypróbuj online!

Ogolono 8 bajtów dzięki sugestii Matthew Jensena

Chas Brown
źródło
Możesz zapisać 8 bajtów za pomocą funkcji string.translate ():lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen
@MatthewJensen Clever! Zwykle unikam translatew Pythonie 2 ...
Chas Brown
Nawiasem mówiąc, teraz działa również dla wielkich liter
Matthew Jensen
3

T-SQL, 169 bajtów

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

Dane wejściowe pochodzą z wcześniej istniejącej tabeli, zgodnie z naszymi standardami IO .

Najpierw wykonuje zamianę znaków za pomocą funkcji ( nowość w SQL 2017 ) TRANSLATE, a następnie sprawdza pierwszy znak.

Długo denerwujące głównie ze względu na długość słowa kluczowego SQL.

BradC
źródło
3

Skrypt powłoki, 70 bajtów

tr a-z b-{|tr eiou{bfjpv fjpvbeioua|sed -E 's/^([^aeiou])(.*)/\2\1ay/'

Wypróbuj online!

Anioł
źródło
3

Haskell , 102 97 bajtów

h(c:r)|elem c"aeiou"=c:r|True=r++c:"ay"
f s=h["ecdfighjoklmnpuqrstvawxyzb"!!(fromEnum y-97)|y<-s]

Wypróbuj online!

Curtis Bechtel
źródło
2

Retina 0.8.2 , 50 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Podobne podejście do odpowiedzi R. Wyjaśnienie:

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

oodnosi się do innego zestawu, tzn. aei\oub-df-hj-np-tv-zbktóry rozwija się aeioubcdfghjlkmnpqrstvwxyzb, a więc uorozwija się do uaeioubcdfghjlkmnpqrstvwxyzb. Powoduje to następującą transliterację:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

Drugi ui bsą ignorowane, ponieważ nigdy nie można ich dopasować, więc zapewnia to pożądany szyfr. (Pamiętaj, że w Retina 1 możesz oczywiście użyć vzamiast aei\ouoszczędzania 5 bajtów.)

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

Jeśli pierwsza litera nie jest samogłoską, obróć ją do końca i przyrostek ay.

Neil
źródło
2

Galaretka , 24 bajty

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

Wypróbuj online!

Oszczędność 1 bajtu dzięki Jonathanowi Allanowi (użyj składni dwóch znaków zamiast cudzysłowów).

Pan Xcoder
źródło
Niestety o wiele dłuższa rozsądna, nieskrywana wersja (1 bajt krótszy podstępny odpowiednik). Nie będę w stanie zaktualizować tego w ciągu najbliższych kilku godzin, ale zwróć uwagę, jeśli znajdziesz ulepszenia.
Pan Xcoder,
Użyj ⁾aydla bajtu. ©Może pójść po eponieważ to jest to, czego przechowywania. Mam ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ.
Jonathan Allan,
2

> <> , 94 92 bajty

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

Wypróbuj online!

Edycja: Zapisano 2 bajty, przyjmując mod wprowadzania 97 zamiast 32, aby słownik mógł rozpocząć się na początku wiersza. Poprzednia wersja:

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

Czerwony , 149 bajtów

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]

Wypróbuj online!

Jak (prawie) zawsze najdłuższy wpis

Galen Iwanow
źródło
1

F # (mono) , 197 bajtów

let f(s:string)=
 let a="aeiouabcdfghjklmnpqrstvwxyzb"
 new string(s|>Seq.map(fun c->a.[a.IndexOf(c)+1])|>Seq.toArray)|>(fun x->if a.IndexOf(x.[0])>5 then x.Substring(1)+(string x.[0])+"ay"else x)

Wypróbuj online!

Henrik Hansen
źródło
1

Perl 5 , 56 bajtów

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

Wypróbuj online!

Hobbs
źródło
1
Czy potrzebujesz -s pomiędzy ci dlub ga h?
Neil
@Neil nie ja nie. Napisałem program do kompresji zakresów ... i pomyliłem logikę :) Dzięki.
hobbs
Zwykle w takich przypadkach piszesz <s>58</s> 56 bytesw nagłówku i wiele osób dodaje „Edytuj: Zapisano 2 bajty dzięki @Neil”. lub niektóre takie, gdy pomagają im w komentarzu.
Neil
1

Dyalog APL (SBCS), 57 bajtów

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

Wypróbuj online!

Pobiera dane tylko dużymi literami! (Ponieważ ⎕Ato wielkie litery)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Wektor spółgłosek i samogłosek
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Wykorzystuje indeksy każdej litery słowa w normalnym alfabecie ( ⊂⍵⍳⍨∊a) do indeksowania ( ) do szyfru ∊1⌽¨a.
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): Przenosi pierwszą literę na koniec i dodaje „AY”, jeśli pierwsza litera jest spółgłoską.

Dzięki za fajne wyzwanie!

akhmorn
źródło
0

JavaScript (SpiderMonkey) , 107 bajtów

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

Wypróbuj online!

Oczekuje wprowadzania małymi literami.

Zastępuje każdy znak łańcucha na 'aeiouabcdfghjklmnpqrstvwxyzb'następny znak w łańcuchu , a następnie piglatynuje cokolwiek za pomocą początkowej spółgłoski.

Yair Rand
źródło
0

PHP, 112 bajtów

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

lub

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

zakładaj małe litery. Uruchom jako potok z -nRlub wypróbuj je online .


Równie dobrze możesz użyć
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z))zamiast
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb).

Tytus
źródło