Mật mã Latin Caesar Pig cải tiến


32

Vấn đề với mật mã Caesar là các từ kết quả thường không thể phát âm được. Vấn đề với Pig Latin là rất dễ giải mã. Tại sao không kết hợp chúng?

Đầu vào

Một từ bao gồm 26 chữ cái tiếng Anh.

Đầu ra

Đầu tiên, thay đổi mọi phụ âm trong từ thành phụ âm tiếp theo trong bảng chữ cái. Vì vậy, b đi đến c, d đi đến f và z đi đến b. Sau đó, thay đổi mọi nguyên âm thành nguyên âm tiếp theo trong bảng chữ cái (u đi đến a). Cuối cùng, chỉ khi chữ cái đầu tiên của từ là phụ âm, hãy di chuyển chữ cái đó đến cuối từ và thêm "ay" vào cuối từ.

Ví dụ:

cat -> evday  
dog -> uhfay   
eel -> iim
  • Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng.
  • Trường hợp không quan trọng.
  • Nguyên âm sẽ được sử dụng là A, E, I, O và U

2
không, nhưng bạn có thể nếu bạn muốn
qazwsx

6
Chào mừng đến với PPCG! Thử thách rất hay, trình bày rõ ràng.
Jonathan Allan

6
Trường hợp thử nghiệm được đề xuất:z → bay
Arnauld

1
jot ot e wisz opvisitvoph dupdiqv kỵ o fu puv vjopl ov jimqt xovj vji ecomovz vu qsupuapdi vji xusftvay
Bóng

4
Đề nghị kiểm tra trường hợp : the → jivay? (Nghĩa là, nếu từ bắt đầu bằng nhiều phụ âm, chúng ta chỉ di chuyển một trong số chúng chứ?)
DLosc

Câu trả lời:


3

Stax , 20 byte

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

Chạy và gỡ lỗi nó

Giải trình

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)

Tôi đã trải qua một vài lần lặp lại và cuối cùng đã giảm xuống còn 20. Giải pháp ban đầu của tôi là 53 byte.


7

Ruby , 96 69 byte

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

Hãy thử trực tuyến!

Sự thật thú vị trong ngày: tr () khớp các chuỗi từ phải sang trái. Tôi luôn cho rằng nó là từ trái sang phải.


6

R , 86 85 byte

Cách đơn giản. chartrcó thuộc tính quyến rũ và hữu ích mà nó có thể chỉ định phạm vi chữ cái , giúp lưu một vài byte.

-1 byte bằng cách đánh cắp các chuỗi dịch của giải pháp Ruby của @ GB - nâng cấp nó!

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

Hãy thử trực tuyến!



4

05AB1E , 21 byte

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

Hãy thử trực tuyến!

Giải trình

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

Mong đợi chuỗi đầu vào trong trường hợp thấp hơn.

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'

Hãy thử trực tuyến!

Xác định nguyên âm

v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

Và làm:

(2130466 >> n) & 1

n

Đặt shiftCount là kết quả của việc che giấu tất cả trừ 5 bit rnum có ý nghĩa nhỏ nhất , nghĩa là tính toán rnum & 0x1F.

Đã bình luận

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 byte

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

Hãy thử trực tuyến!

8 byte bị loại bỏ do một đề nghị của Matthew Jensen


Bạn có thể lưu 8 byte bằng cách sử dụng hàm string.translate ():lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen

@MatthewJensen Thông minh! Thông thường tôi tránh translatetrong Python 2 ...
Chas Brown

Thật trùng hợp, giờ đây nó cũng hoạt động cho cả chữ hoa
Matthew 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

Đầu vào là thông qua một bảng có sẵn, theo các tiêu chuẩn IO của chúng tôi .

Thực hiện thay thế các ký tự trước, sử dụng hàm ( mới cho SQL 2017 ) TRANSLATE, sau đó kiểm tra ký tự đầu tiên.

Khó chịu lâu chủ yếu là do độ dài từ khóa SQL.




2

Võng mạc 0.8.2 , 50 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Cách tiếp cận tương tự với câu trả lời R. Giải trình:

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

ođề cập đến tập hợp khác, tức là aei\oub-df-hj-np-tv-zbmở rộng ra aeioubcdfghjlkmnpqrstvwxyzb, do đó uomở rộng ra uaeioubcdfghjlkmnpqrstvwxyzb. Điều này dẫn đến việc chuyển ngữ sau:

uaeioubcdfghjlkmnpqrstvwxyzb
aeioubcdfghjlkmnpqrstvwxyzb

Thứ hai ubđược bỏ qua vì chúng không bao giờ có thể được khớp, vì vậy điều này cung cấp mật mã mong muốn. (Lưu ý rằng trong Retina 1, tất nhiên bạn có thể sử dụng vthay vì aei\ouđể tiết kiệm 5 byte.)

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

Nếu chữ cái đầu tiên không phải là nguyên âm, hãy xoay nó đến cuối và hậu tố ay.


2

Thạch , 24 byte

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

Hãy thử trực tuyến!

Đã lưu 1 byte nhờ Jonathan Allan (sử dụng cú pháp hai ký tự thay vì dấu ngoặc kép).


Thật không may, phiên bản dài hơn, không lén lút ( tương đương lén lút ngắn hơn 1 byte ). Tôi sẽ không thể cập nhật thông tin này trong vài giờ tới, nhưng hãy chỉ ra nếu bạn tìm thấy sự cải thiện.
Ông Xcoder

Sử dụng ⁾aycho một byte. Có ©thể đi sau evì đó là những gì bạn đang lưu trữ. Tôi có ØẹØḄ,żṙ€¥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

Hãy thử trực tuyến!

Chỉnh sửa: Đã lưu 2 byte bằng cách lấy mod đầu vào 97 thay vì 32, vì vậy từ điển có thể bắt đầu ở đầu dòng. Phiên bản trước:

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



1

Perl 5 , 56 byte

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

Hãy thử trực tuyến!


1
Bạn có cần các -s giữa cdhay gh?
Neil

@ Không, tôi không có. Tôi đã viết một chương trình để nén các phạm vi ... và đã logic sai :) Cảm ơn.
hobbs

Thông thường trong những trường hợp như vậy, bạn viết <s>58</s> 56 bytestrong tiêu đề và nhiều người thêm "Chỉnh sửa: Đã lưu 2 byte nhờ @Neil." hoặc một số như vậy khi họ được giúp đỡ trong một bình luận.
Neil

1

APL Dyalog (SBCS), 57 byte

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

Hãy thử trực tuyến!

Chỉ nhập bằng chữ hoa! (Vì ⎕Alà bảng chữ cái viết hoa)

  • ⎕A{(⍺~⍵)⍵}'AEIOU': Vector của phụ âm và nguyên âm
  • (⊂⍵⍳⍨∊a)⌷∊1⌽¨a: Sử dụng các chỉ số của từng chữ cái của từ trong bảng chữ cái bình thường ( ⊂⍵⍳⍨∊a) để lập chỉ mục ( ) vào mật mã ∊1⌽¨a.
  • ('AY',⍨1⌽⊢)⍣(∊/⊃¨⍵a): Di chuyển chữ cái đầu tiên đến cuối và nối thêm 'AY', nếu chữ cái đầu tiên là phụ âm.

Cảm ơn vì thử thách tuyệt vời!


0

JavaScript (SpiderMonkey) , 107 byte

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

Hãy thử trực tuyến!

Mong đợi đầu vào bằng chữ thường.

Thay thế từng ký tự của chuỗi bằng một ký tự sau chuỗi trong chuỗi 'aeiouabcdfghjklmnpqrstvwxyzb', và sau đó piglatin hóa bất cứ thứ gì với một phụ âm đầu tiên.


0

PHP, 112 byte

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

hoặc là

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

giả sử trường hợp đầu vào thấp hơn. Chạy như ống với -nRhoặc thử chúng trực tuyến .


Bạn cũng có thể sử dụng
strtr($s,uzbcadfgehjklminpqrsotvwxy,range(a,z))thay vì
strtr($s,range(a,z),ecdfighjoklmnpuqrstvawxyzb).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.