改良的凯撒猪拉丁密码


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!非常好的挑战,明确提出。
乔纳森·艾伦,

6
建议的测试用例:z → bay
Arnauld

1
随时随地查看dupdiqv cav o fu puv vjopl ov jimqt xovj vji ecomovz vu qsupuapdi vji xusftvay
Shadow

4
建议的测试案例:the → jivay?(也就是说,如果单词以多个辅音开头,我们是否只移动其中一个?)
DLosc

Answers:


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

R86 85字节

简单的方法。chartr具有迷人而有用的属性,可以指定字母范围,从而节省了几个字节。

通过窃取@GB 的Ruby解决方案的翻译字符串来获得-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.0121 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为掩盖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.....")

在线尝试!

由于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使用Python 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中,您当然可以使用v而不是aei\ou节省5个字节。)

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

如果第一个字母不是元音,请将其旋转到末尾并加后缀ay


2

果冻,24字节

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

在线尝试!

多亏了Jonathan Allan节省了1个字节(使用2字符语法而不是引号)。


不幸的是,更长久的理智的,非偷偷摸摸的版本(相当于1个字节的偷偷摸摸的短)。在接下来的几个小时内,我将无法进行更新,但指出是否有改进。
Xcoder先生

使用⁾ay一个字节。在©后可以去e,因为这是你存储的东西。我有ØẹØḄ,żṙ€¥1ẎyṙḢe©ØḄƊ®⁾ayẋ
乔纳森·艾伦

2

> <>94 92字节

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

在线尝试!

编辑:通过采用输入mod 97而不是32保存了2个字节,因此字典可以从该行的开头开始。先前版本:

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
您是否需要-cdg和之间的h
尼尔

@尼尔,不,我不知道。我写了一个程序来压缩范围...并弄错了逻辑:)谢谢。
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

JavaScript(SpiderMonkey),107字节

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

在线尝试!

要求输入小写。

将字符串中的每个字符替换为字符串中的每个字符'aeiouabcdfghjklmnpqrstvwxyzb',然后使用初始辅音对所有字符进行猪尾钉化。


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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.