Peningkatan Cipher Latin Babi Caesar

32

Masalah dengan cipher Caesar adalah kata-kata yang dihasilkan seringkali sulit diucapkan. Masalah dengan Babi Latin adalah mudah untuk memecahkan kode. Mengapa tidak menggabungkannya?

Memasukkan

Sebuah kata yang terdiri dari 26 huruf bahasa Inggris.

Keluaran

Pertama, ubah setiap konsonan pada kata menjadi konsonan berikutnya dalam alfabet. Jadi, b pergi ke c, d pergi ke f, dan z pergi ke b. Kemudian, ubah setiap vokal ke vokal berikutnya dalam alfabet (Anda pergi ke a). Terakhir, hanya jika huruf pertama dari kata itu adalah konsonan, pindahkan huruf itu ke akhir kata dan tambahkan "ay" ke akhir kata.

Contoh:

cat -> evday  
dog -> uhfay   
eel -> iim
  • Ini , jadi kode terpendek menang.
  • Kasus tidak masalah.
  • Vokal yang akan digunakan adalah A, E, I, O, dan U
qazwsx
sumber
2
tidak, tetapi Anda bisa jika mau
qazwsx
6
Selamat datang di PPCG! Tantangan yang sangat bagus, disajikan dengan jelas.
Jonathan Allan
6
Case test yang disarankan:z → bay
Arnauld
1
Saya tidak akan men-download duplikasi duplikat untuk membuat Anda lebih baik dan lebih baik dengan menambahkan lebih dari satu
Shadow
4
Disarankan kasus uji: the → jivay? (Yaitu, jika kata itu dimulai dengan banyak konsonan, apakah kita hanya memindahkan salah satunya?)
DLosc

Jawaban:

3

Stax , 20 byte

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

Jalankan dan debug itu

Penjelasan

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)

Saya melewati beberapa iterasi dan akhirnya turun ke 20. Solusi asli saya adalah 53 byte.

Multi
sumber
7

Ruby , 96 69 byte

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

Cobalah online!

Fakta menyenangkan hari ini: tr () cocok dengan string kanan-ke-kiri. Saya selalu menganggap itu dari kiri ke kanan.

GB
sumber
6

R , 86 85 byte

Cara sederhana. chartrmemiliki properti yang menarik dan berguna yang dapat menentukan rentang huruf , yang menghemat beberapa byte.

-1 byte dengan mencuri string terjemahan Ruby dari @ GB - upvote it!

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

Cobalah online!

J.Apakah
sumber
5

Java (JDK) , 167 byte

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

Cobalah online!

Kredit

Olivier Grégoire
sumber
1
168 byte
Kevin Cruijssen
4

05AB1E , 21 byte

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

Cobalah online!

Penjelasan

ž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
sumber
4

Node.js 10.9.0 , 121 116 byte

Mengharapkan string input dalam huruf kecil.

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'

Cobalah online!

Mengidentifikasi vokal

v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

Dan ya:

(2130466 >> n) & 1

n

Biarkan shiftCount menjadi hasil dari masking semua kecuali 5 bit rnum yang paling signifikan , yaitu compute rnum & 0x1F.

Berkomentar

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
sumber
4

Python 2 , 153 121 110 99 91 byte

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

Cobalah online!

8 byte dicukur karena saran oleh Matthew Jensen

Chas Brown
sumber
Anda dapat menyimpan 8 byte dengan menggunakan fungsi string.translate ():lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen
@MatthewJensen Pintar! Biasanya saya hindari translatedengan Python 2 ...
Chas Brown
Secara kebetulan, sekarang juga berfungsi untuk huruf besar
Matius Jensen
3

T-SQL, 169 byte

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

Input melalui tabel yang sudah ada sebelumnya, sesuai standar IO kami .

Melakukan substitusi karakter terlebih dahulu, menggunakan fungsi ( baru ke SQL 2017 ) TRANSLATE, lalu memeriksa karakter pertama.

Mengganggu panjang sebagian besar karena panjang kata kunci SQL.

BradC
sumber
3

Script shell, 70 byte

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

Cobalah online!

Malaikat
sumber
3

Haskell , 102 97 byte

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

Cobalah online!

Curtis Bechtel
sumber
2

Retina 0.8.2 , 50 byte

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

Cobalah online! Tautan termasuk kasus uji. Pendekatan serupa dengan jawaban R. Penjelasan:

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

omerujuk ke set lainnya, yaitu aei\oub-df-hj-np-tv-zb, yang mengembang aeioubcdfghjlkmnpqrstvwxyzb, sehingga uomengembang uaeioubcdfghjlkmnpqrstvwxyzb. Ini menghasilkan transliterasi berikut:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

Yang kedua udan bdiabaikan karena mereka tidak pernah bisa dicocokkan, jadi ini memberikan sandi yang diinginkan. (Perhatikan bahwa dalam Retina 1 Anda tentu saja dapat menggunakan valih-alih aei\ouuntuk penghematan 5 byte.)

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

Jika huruf pertama bukan vokal, putar hingga akhir dan sufiks ay.

Neil
sumber
2

Jelly , 24 byte

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

Cobalah online!

Disimpan 1 byte berkat Jonathan Allan (gunakan sintaks dua-char daripada tanda kutip).

Tuan Xcoder
sumber
Sayangnya jauh lebih waras, versi non-licik (1 byte lebih pendek setara licik ). Saya tidak akan dapat memperbarui ini dalam beberapa jam ke depan, tapi jangan menunjukkan jika Anda menemukan perbaikan.
Tn. Xcoder
Gunakan ⁾ayuntuk satu byte. The ©bisa pergi setelah ekarena itu adalah apa yang Anda menyimpan. Saya punya ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ.
Jonathan Allan
2

> <> , 94 92 byte

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

Cobalah online!

Sunting: Disimpan 2 byte dengan mengambil input mod 97 daripada 32, sehingga kamus bisa dimulai pada awal baris. Versi sebelumnya:

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

Merah , 149 byte

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]

Cobalah online!

Seperti (hampir) selalu, entri terpanjang

Galen Ivanov
sumber
1

F # (Mono) , 197 byte

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)

Cobalah online!

Henrik Hansen
sumber
1

Perl 5 , 56 byte

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

Cobalah online!

hobbs
sumber
1
Apakah Anda memerlukan -antara cdan datau gdan h?
Neil
@Neil tidak, saya tidak. Saya menulis sebuah program untuk mengompres rentang ... dan mendapatkan logika yang salah :) Terima kasih.
hobbs
Biasanya dalam kasus seperti itu Anda menulis <s>58</s> 56 bytes di header dan banyak orang menambahkan "Edit: Disimpan 2 byte terima kasih kepada @Neil." atau semacamnya ketika mereka dibantu dalam komentar.
Neil
1

Dyalog APL (SBCS), 57 byte

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

Cobalah online!

Hanya mengambil input dalam huruf besar! (Karena⎕A adalah huruf besar)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Vektor konsonan dan vokal
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Menggunakan indeks setiap huruf dari kata dalam alfabet normal ( ⊂⍵⍳⍨∊a) untuk mengindeks ( ) ke dalam sandi ∊1⌽¨a.
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): Memindahkan huruf pertama ke akhir dan menambahkan 'AY', jika huruf pertama adalah konsonan.

Terima kasih atas tantangan kerennya!

akhmorn
sumber
0

JavaScript (SpiderMonkey) , 107 byte

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

Cobalah online!

Mengharapkan input dalam huruf kecil.

Ganti setiap karakter string dengan karakter setelahnya dalam string 'aeiouabcdfghjklmnpqrstvwxyzb', dan kemudian piglatinify apapun dengan konsonan awal.

Yair Rand
sumber
0

PHP, 112 byte

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

atau

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

anggap input huruf kecil. Jalankan sebagai pipa dengan -nRatau coba online .


Anda juga bisa menggunakan
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z))bukan
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb).

Titus
sumber