Geliştirilmiş Sezar Domuz Latin Şifresi


32

Sezar şifresi ile ilgili sorun, ortaya çıkan sözcüklerin çoğu zaman anlaşılmaz olması. Pig Latin ile ilgili sorun çözülmesinin kolay olmasıdır. Neden onları birleştirmiyorsun?

Giriş

26 ingilizce harften oluşan bir kelime.

Çıktı

İlk olarak, sözcükteki her ünsüz harfini alfabedeki bir sonraki ünsüz ile değiştirin. Böylece, b c'ye gider, d f'ye ve z b'ye gider. Daha sonra, her ünlü harfini alfabedeki bir sonraki ünlüle değiştir (u a). Son olarak, yalnızca kelimenin ilk harfi bir ünsüz ise, o harfi kelimenin sonuna taşıyın ve kelimenin sonuna "ay" ekleyin.

Örnekler:

cat -> evday  
dog -> uhfay   
eel -> iim
  • Bu , yani en kısa kod kazanır.
  • Davanın önemi yok.
  • Kullanılacak sesli harfler A, E, I, O ve U'dur.

2
hayır, ama sen istersen yapabilirsin
qazwsx

6
PPCG'ye Hoşgeldiniz! Açıkça sunulan çok güzel bir meydan okuma.
Jonathan Allan

6
Önerilen test davası:z → bay
Arnauld,

1
yazarı: jotz opvisitvoph dupdiqv cav o fu puv vjopl ov jimqt xovj vji ecomovz vu qsupuapdi vji xusftvay
Shadow

4
Test vakası Önerilen: the → jivay? (Kelime birden fazla
ünsüzle başlarsa

Yanıtlar:


3

Stax , 20 bayt

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

Koş ve hata ayıkla

açıklama

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)

Birkaç yinelemeden geçtim ve sonunda 20'ye düştüm. Orijinal çözümüm 53 bayttı.


7

Ruby , 96 69 bayt

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

Çevrimiçi deneyin!

Günün eğlenceli gerçeği: tr (), sağdan sola dizeleriyle eşleşir. Her zaman soldan sağa olduğunu varsaydım.


6

R , 86 85 bayt

Basit yol. birkaç bayttan tasarruf sağlayan chartrharf aralıklarını belirleyebilecek büyüleyici ve kullanışlı bir özelliğe sahiptir .

GB by Ruby çözümünün çeviri dizeleri - stealing by -1 bytes - oy ver!

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

Çevrimiçi deneyin!



4

05AB1E , 21 bayt

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

Çevrimiçi deneyin!

açıklama

ž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 bayt

Giriş dizesini küçük harflerle bekler.

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'

Çevrimiçi deneyin!

Ünlülerin belirlenmesi

v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

Ve yapar:

(2130466 >> n) & 1

n

Let shiftCount hepsini maskeleme sonucu ancak en önemli 5 bit olmak rnum olduğunu, hesaplama rnum & 0x1F.

Yorumlananlar

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 bayt

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

Çevrimiçi deneyin!

Matthew Jensen tarafından yapılan öneri nedeniyle 8 byte tıraş oldu


String.translate () işlevini kullanarak 8 bayt kaydedebilirsiniz:lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen

@MatthewJensen Zeki! Genellikle translatePython 2'den kaçınırım ...
Chas Brown

Tesadüfen, şimdi de büyük harf için de çalışıyor
Matthew Jensen

3

T-SQL, 169 bayt

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

Girdi, IO standartlarımıza göre önceden var olan bir tablo üzerinden yapılır .

İlk önce ( SQL 2017'de yeni ) TRANSLATEişlevini kullanarak karakter değiştirme işlemini gerçekleştirir , ardından ilk karakteri kontrol eder.

SQL anahtar kelime uzunluğu nedeniyle çoğunlukla can sıkıcı.




2

Retina 0.8.2 , 50 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. R cevabına benzer bir yaklaşım. Açıklama:

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

odiğer gruba, yani aei\oub-df-hj-np-tv-zbgenişleyen aeioubcdfghjlkmnpqrstvwxyzb, uogenişleyen anlamına gelir uaeioubcdfghjlkmnpqrstvwxyzb. Bu, aşağıdaki harf çevirisi ile sonuçlanır:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

İkincisi uve basla eşleştirilemeyecekleri için göz ardı edilirler, böylece bu istenen şifreyi sağlar. (Retina 1’de elbette 5 byte tasarruf vyerine kullanabileceğinizi unutmayın aei\ou.)

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

İlk harf bir ünlü değilse, sonuna kadar döndürün ve sonek ay.


2

Jöle , 24 bayt

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

Çevrimiçi deneyin!

Jonathan Allan sayesinde 1 bayt kaydedildi (tırnak işaretleri yerine iki karakterli sözdizimini kullanın).


Ne yazık ki çok daha uzun aklı başında, sinsi olmayan sürüm (1 bayt daha kısa sinsi eşdeğeri). Önümüzdeki birkaç saat içinde bu bilgiyi güncelleyemem, ancak iyileştirmeler bulursanız bunu işaret edin.
Bay Xcoder

⁾ayBir bayt için kullanın . O zamandan beri ©gidebilirsin e, sakladığın şey bu. Benim var ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ.
Jonathan Allan

2

> <> , 94 92 bayt

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

Çevrimiçi deneyin!

Düzenleme: 32 yerine giriş modunu 97 alarak 2 bayt kaydedildi, böylece sözlük satırın başında başlayabilirdi. Önceki versiyon:

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

1

Kırmızı , 149 bayt

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]

Çevrimiçi deneyin!

(Neredeyse) her zaman olduğu gibi, en uzun giriş


1

F # (Mono) , 197 bayt

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)

Çevrimiçi deneyin!


1

Perl 5 , 56 bayt

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

Çevrimiçi deneyin!


1
İhtiyacınız mı -arasındaki s cve dya gve h?
Neil

@Hayır hayır yapmıyorum. Aralıkları sıkıştırmak için bir program yazdım ... ve mantığı yanlış yaptım :)
hobbs

Normalde bu gibi durumlarda <s>58</s> 56 bytesbaşlığa yazarsınız ve birçok kişi "Düzenleme: Kaydedilen 2 bayt @Neil sayesinde" ekler. veya bir yorumda yardımcı olunca böyle.
Neil

1

Dyalog APL (SBCS), 57 bayt

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

Çevrimiçi deneyin!

Sadece büyük harflerle giriş yapar! (Çünkü ⎕Abüyük harfli alfabedir)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Ünsüzlerin ve ünlülerin vektörü
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Normal alfabedeki kelimenin her harfinin ⊂⍵⍳⍨∊aindeksini ( ) index'e ( ) dizin içine kullanır ∊1⌽¨a.
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): İlk harfi bir ünsüz ise, ilk harfi sonuna kadar hareket ettirir ve 'AY' ekler.

Güzel meydan okuma için teşekkürler!


0

JavaScript (SpiderMonkey) , 107 bayt

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

Çevrimiçi deneyin!

Küçük harflerle girişi bekler.

Dizenin her karakterini dizede ondan sonra bir karakter ile değiştirir 'aeiouabcdfghjklmnpqrstvwxyzb've ardından ilk ünsüz ile herhangi bir şeyi piglatileştirir.


0

PHP, 112 bayt

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

veya

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

küçük harfli giriş varsayalım. Pipe ile çalıştırın -nRveya çevrimiçi deneyin .


Sen de kullanabilirsiniz
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z)) yerine
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb) .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.