改良されたシーザー豚ラテン暗号


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
jot ot e wisz opvisitvoph dupdiqv cav o fu puv vjopl ov jimqt xovj vji ecomovz vu qsupuapdi vji xusftvay
シャドウ

4
推奨されるテストケース:the → jivay?(つまり、単語が複数の子音で始まる場合、そのうちの1つだけを移動しますか?)
DLosc

回答:


3

スタックス、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バイトでした。





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

n

してみましょう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

パイソン2153の 121 110 99 91バイト

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

オンラインでお試しください!

マシュー・ジェンセンの提案により、8バイト削り取られました


:あなたはstring.translate()関数を使用して8つのバイトを保存することができますlambda s:[s[1:]+s[0]+"ux",s][s[0]in'aeiou'].translate(8*".ecdfighjoklmnpuqrstvawxyzb.....")
マシュー・ジェンセン

@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

Retina 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

2番目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

オンラインでお試しください!

編集:32ではなく入力mod 97を使用して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
and またはand -の間にs が必要ですか?cdgh
ニール

@Neilいいえ。範囲を圧縮するプログラムを作成しました...そして、ロジックが間違っていました:)ありがとう。
ホッブズ

通常、このような場合<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.