การปรับปรุง Caesar Pig Latin Cipher


32

ปัญหาเกี่ยวกับ Caesar cipher คือคำที่เป็นผลลัพธ์มักไม่สามารถออกเสียงได้ ปัญหากับ Pig Latin คือการถอดรหัสง่าย ทำไมไม่รวมพวกเขา?

อินพุต

คำที่ประกอบด้วยตัวอักษรภาษาอังกฤษ 26 ตัว

เอาท์พุต

ขั้นแรกให้เปลี่ยนพยัญชนะทุกตัวในคำเป็นพยัญชนะตัวถัดไปในตัวอักษร ดังนั้น b ไปที่ c, d ไปที่ f และ z ไปที่ b จากนั้นเปลี่ยนเสียงสระทุกตัวเป็นเสียงสระถัดไปในตัวอักษร (คุณไปที่ a) สุดท้ายหากตัวอักษรตัวแรกของคำเป็นตัวอักษรให้ย้ายตัวอักษรนั้นไปยังท้ายคำและเพิ่ม "ay" ไปยังตอนท้ายของคำ

ตัวอย่าง:

cat -> evday  
dog -> uhfay   
eel -> iim
  • นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ
  • กรณีไม่สำคัญ
  • สระที่จะใช้คือ A, E, I, O และ U

2
ไม่ แต่คุณสามารถทำได้ถ้าคุณต้องการ
qazwsx

6
ยินดีต้อนรับสู่ PPCG! ความท้าทายที่ดีมากนำเสนออย่างชัดเจน
Jonathan Allan

6
กรณีทดสอบที่แนะนำ: z → bay
Arnauld

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

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

Ruby , 96 69 ไบต์

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

ลองออนไลน์!

ข้อเท็จจริงที่สนุกสนานของวันนี้: tr () จับคู่สตริงจากขวาไปซ้าย ฉันคิดเสมอว่ามันเป็นจากซ้ายไปขวา


6

R , 86 85 ไบต์

วิธีง่ายๆ chartrมีคุณสมบัติที่มีเสน่ห์และมีประโยชน์ที่สามารถระบุช่วงตัวอักษรซึ่งบันทึกไม่กี่ไบต์

-1 ไบต์โดยการขโมยสตริงการแปลของโซลูชัน Rubyของ GB @ - โหวตขึ้น!

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

ลองออนไลน์!

เครดิต

  • -7 ไบต์ขอบคุณKevin Cruijssenโดยใช้ประเภทที่ดีกว่า
  • -1 ไบต์ขอบคุณที่ceilingcat


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'

ลองออนไลน์!

การระบุเสียงสระ

โวลต์

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

และ:

(2130466 >> n) & 1

n

ให้shiftCountเป็นผลมาจากการปิดบังทั้งหมด แต่rnumที่มีนัยสำคัญน้อย 5 บิตนั่นคือคำนวณ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 ไบต์ถูกลบเนื่องจากคำแนะนำโดยMatthew Jensen


คุณสามารถบันทึก 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

อินพุตคือผ่านตารางที่มีอยู่แล้วตามมาตรฐาน IO ของเราตามมาตรฐาน

ดำเนินการแทนอักขระก่อนโดยใช้ ( ใหม่กับ 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 ไบต์ขอบคุณJonathan Allan (ใช้ไวยากรณ์สองตัวอักษรแทนที่จะใช้เครื่องหมายคำพูด)


น่าเสียดายที่มีสติยาวกว่ารุ่นที่ไม่ใช่ส่อเสียด ( เทียบเท่ากับส่อเสียดที่สั้นลง 1 ไบต์) ฉันจะไม่สามารถอัปเดตสิ่งนี้ภายในไม่กี่ชั่วโมงข้างหน้า แต่จะชี้ให้เห็นหากคุณพบการปรับปรุง
Mr. Xcoder

ใช้⁾ayสำหรับไบต์ ©สามารถไปหลังจากที่eนับว่าเป็นสิ่งที่คุณกำลังจัดเก็บ ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋฉันมี
Jonathan Allan

2

> <> , 94 92 ไบต์

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

ลองออนไลน์!

แก้ไข: บันทึก 2 ไบต์โดยการรับอินพุต mod 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
คุณต้อง-อยู่ระหว่างcและdหรือgและh?
Neil

@ ไม่มีเลยฉันทำไม่ได้ ฉันเขียนโปรแกรมเพื่อบีบอัดช่วง ... และผิดตรรกะ :) ขอบคุณ
ฮอบส์

โดยปกติในกรณีเช่นนี้คุณเขียน<s>58</s> 56 bytesในส่วนหัวและหลายคนเพิ่ม "แก้ไข: 2 ไบต์ที่บันทึกไว้ขอบคุณ @Neil" หรือบางอย่างเมื่อพวกเขาได้รับความช่วยเหลือในความคิดเห็น
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'จากนั้น piglatinify สิ่งใดด้วยพยัญชนะเริ่มต้น


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)ได้เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.