개선 된 시저 돼지 라틴 암호


32

시저 암호의 문제는 결과 단어가 종종 발음 할 수 없다는 것입니다. Pig Latin의 문제점은 해독하기 쉽다는 것입니다. 왜 결합하지 않습니까?

입력

26 개의 영어 문자로 구성된 단어.

산출

먼저 단어의 모든 자음을 알파벳의 다음 자음으로 변경하십시오. 따라서 b는 c로, d는 f로, z는 b로갑니다. 그런 다음 모든 모음을 알파벳의 다음 모음으로 변경하십시오 (u는 a로갑니다). 마지막으로, 단어의 첫 문자가 자음 인 경우에만 해당 문자를 단어의 끝으로 옮기고 단어의 끝에 "ay"를 추가하십시오.

예 :

cat -> evday  
dog -> uhfay   
eel -> iim
  • 이것은 이므로 가장 짧은 코드가 승리합니다.
  • 사건은 중요하지 않습니다.
  • 사용될 모음은 A, E, I, O 및 U입니다.

2
아니,하지만 당신은 당신이 원하는 수있는 경우
qazwsx '와

6
PPCG에 오신 것을 환영합니다! 아주 좋은 도전, 명확하게 제시.
Jonathan Allan

6
제안 된 테스트 사례 :z → bay
Arnauld

1
간단히 메모 하다며 전자 wisz opvisitvoph dupdiqv CAV 오 쿵푸 puv vjopl 오븐 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

루비 , 96 69 바이트

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

온라인으로 사용해보십시오!

오늘의 재미있는 사실 : tr ()은 문자열을 오른쪽에서 왼쪽으로 찾습니다. 나는 항상 왼쪽에서 오른쪽이라고 가정했습니다.


6

R , 86 85 바이트

간단한 방법. chartr문자 범위를 지정할 수있는 매력적이고 유용한 속성을 가지고 있어 몇 바이트를 절약 할 수 있습니다.

@GB 의 루비 솔루션의 번역 문자열 을 훔쳐서 -1 바이트 -공감하십시오!

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

온라인으로 사용해보십시오!



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'

온라인으로 사용해보십시오!

모음 식별

v

2130466 = 000001000001000001000100010
               ^     ^     ^   ^   ^
          zyxwvutsrqponmlkjihgfedcba-

그리고 않습니다 :

(2130466 >> n) & 1

하자 shiftCount를가 모두를 마스킹 결과이지만의 최하위 5 비트 일 rnum 인, 컴퓨팅 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

파이썬 (2) , 153 (121) 110 99 91 바이트

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

온라인으로 사용해보십시오!

Matthew Jensen 의 제안으로 8 바이트가 줄었습니다.


string.translate () 함수를 사용하여 8 바이트를 절약 할 수 있습니다.lambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
Matthew Jensen

@MatthewJensen 영리한! 보통 translate파이썬 2에서는 피합니다 ...
Chas Brown

우연히도 이제 대문자로도 작동합니다
Matthew Jensen

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

두 번째 ub그들이 일치하지 않을 수이 원하는 암호를 제공하므로, 무시됩니다. (Retina 1에서는 물론 5 바이트 절약 v대신 사용할 수 있습니다 aei\ou.)

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

첫 글자가 모음이 아닌 경우 끝과 접미사로 회전하십시오 ay.


2

젤리 , 24 바이트

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

온라인으로 사용해보십시오!

Jonathan Allan 덕분에 1 바이트가 절약되었습니다 (따옴표 대신 2 문자 구문 사용).


불행하게도 훨씬 더 길고 제정되지 않은 비 음성 버전 (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

온라인으로 사용해보십시오!

편집 : 32가 아닌 입력 모드 97을 사용하여 2 바이트를 절약하여 사전이 줄의 시작 부분에서 시작할 수 있습니다. 이전 버전:

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



1

펄 5 , 56 바이트

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

온라인으로 사용해보십시오!


1
and 와 and -사이 에 s가 필요 합니까? cdgh

@ 닐 아니에요. 나는 범위를 압축하는 프로그램을 작성했으며 논리가 잘못되었습니다 :) 감사합니다.
hobbs

일반적으로 이러한 경우 <s>58</s> 56 bytes헤더에 쓰고 많은 사람들이 "편집 : @Neil 덕분에 2 바이트 절약"을 추가합니다. 또는 의견에 도움이 될 때 그러한 일부.

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

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.