暗号化しましょう!


12

チャレンジ

課題は、以下に指定されているルールを使用して、特定の文字列を暗号化することです。文字列には、小文字のアルファベット数字、および/または空白のみが含まれます

キャラクターと同等

さて、まず、各キャラクターの「同等」を見つける方法を知る必要があります。

文字が子音である場合、これは同等の検索方法です。

1) List all the consonants in alphabetical order
    b c d f g h j k l m n p q r s t v w x y z
2) Get the position of the consonant you are finding the equivalent of.
3) The equivalent is the consonant at that position when starting from the end.

例:「h」と「t」はそれぞれ開始と終了から6番目の位置にあるため、「h」と「t」は互いに同等です。

母音/数字に相当するものを見つけるには、同じ手順に従います。すべての母音または数字(0から始まる)を順番にリストし、同等のものを見つけます。

以下は、すべての文字に相当するもののリストです。

b <-> z
c <-> y
d <-> x
f <-> w
g <-> v
h <-> t
j <-> s
k <-> r
l <-> q
m <-> p
n <-> n

a <-> u
e <-> o
i <-> i

0 <-> 9
1 <-> 8
2 <-> 7
3 <-> 6
4 <-> 5

暗号化のルール

1)左から移動を開始し、右に向かいます。

2)文字が子音/数字の場合、それと同等のものが取得され、空白の場合は空白が取得されます。

3)キャラクターが母音の場合、それと同等のものを取り、反対方向に動き始めます。たとえば、右に移動して母音に遭遇した場合、その文字を暗号化してから、右端の暗号化されていない文字にスキップし、左方向の暗号化を開始します。

4)同じ位置にいるキャラクターを2回考慮するべきではありません。入力のすべての文字がカバーされるまで、この手順に従う必要があります。

5)入力(空白を含む)の合計文字数は、出力の合計文字数と等しくなければなりません。

暗号化された文字は、暗号化された順序で出力に表示されることに注意してください。

では、文字列を暗号化してみましょう。

String = "tre d1go3t is"
Moving left to right
"t" -> "h"
"r" -> "k"
"e" -> "o"
Vowel encountered. Now moving right to left.
"s" -> "j"
"i" -> "i"
Vowel encountered. Now moving left to right.
" " -> " "
"d" -> "x"
"1" -> "8"
"g" -> "v"
"o" -> "e"
Vowel encountered. Now moving right to left.
" " -> " "
"t" -> "h"
"3" -> "6"

Output -> "hkoji x8ve h6"

"flyspy" -> "wqcjmc"
"hero" -> "toek"
"heroic" -> "toyike"
"ae" -> "uo"
"abe" -> "uoz"
"the space" -> "htoo jmuy"
"a d1g13t" -> "uh68v8x "
"we xi12" -> "fo78i d"
"this is a code" -> "htioj ixej uy "

小文字の代わりに大文字のアルファベットを使用することもできます。

得点

これはなので、最短のコードが勝ちです!


1
手順3は、方向の切り替えに関して少し不明瞭です。「右に移動して母音に出会ったら、その文字を暗号化してから、右端の暗号化されていない文字にスキップして左方向に暗号化を開始する」などのことを言うべきだと思います。(それがあなたが意味するものである場合)。また、暗号化された文字が暗号化された順序で出力に表示されるように明示的に指定する必要があると思います。
ディルナン

@dylnanはそれを追加しました。
マニッシュクン

好奇心から外れた-復号化手順を説明できますか?暗号化関数はそれ自身の逆関数ではないため(ROT13アルゴのように)。したがって、暗号化されたデータを同じ暗号手順に渡すと、元のテキストは取得されません。ありがとう
Agnius Vasiliauskas

1
@AgniusVasiliauskas:その方法の1つは、同じ文字変換を適用することです。2つの解読文字列を保持します。文字列を左から右にループします。母音を処理するたびに、最初の文字列に文字を追加し、2番目に文字列を追加することを交互に行います。最後に文字列をマージします。
エミグナ

3
すぐに同じものに対する復号化の課題があり、そこでプロセスを説明しようとします
マニッシュクン

回答:


4

JavaScript(Node.js)173 ... 166 156 ... 124 123バイト

-28バイトありがとうArnauld

f=([q,...s])=>q?(c="aeioubcdfghjklmpqrstvwxyz",t=c.search(q),q=="0"|+q?9-q:~t?c[(t<5?4:29)-t]:q)+f(~t&&t<5?s.reverse():s):s

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

最初の反復ではStringがに変更されArray、後続の反復は引き続き使用されますArray。ほら!

元のアプローチ(166バイト):

f=(s,i=0,r=s.length,d=1,c="bcdfghjklmnpqrstvwxyz",v="aeiou")=>(d^=!!(t=~v.search(q=s[d?i:r])),q<"0"|q>"9"?c[20-c.search(q)]||v[5+t]||q:9-q)+(i<r-1?f(s,i+d,r-!d,d):"")

&一部の数字では機能しませんでしたが、&&機能しました。ありがとう。
朝琴シエル

そうそう、私はそれを最適化する方法を見つけられなかったので、あなたはそれをしました!ありがとう!
朝琴シエル

3
すべての文字に同じ文字列を使用し、さらにいくつかのゴルフを適用することにより、124バイト
アーナルド

素晴らしい!私は文字列をすべて結合することを考えていませんでした
浅本シエル

q=="0"|+qは実際には1バイトよりも短いq>" "&&1/q
アーナウド

3

05AB1E、22バイト

vćžN‡žM‡žh‡D?žMsåiR

オンラインでお試しください! またはテストスイートとして

説明

v                        # for each char in input
 ć                       # extract the head of the current string (initially input)
  žN‡                   # transform consonants
      žM‡               # transofrm vowels
          žh‡           # transform numbers
              D?         # print a copy of the current char
                žMsåi    # if the current char is a vowel
                     R   # reverse the rest of the string

žhžMžN)UvćXJXíJ‡D?žMsåiR私は改善のために考えていましたが、XJXiJ十分に削減することはできませんでした。
魔法のタコ

@MagicOctopusUrn:同様のアイデアがDJsíJありましたが、どちらもあまり効果的ではありませんでした。
エミグナ


1

J、132バイト

f=:3 :0
c=.(u:97+i.26)-.v=.'aeiou'
d=.u:48+i.10
g=.;"0|.
a=.''
while.*#y do.a=.a,{.y rplc(g c),(g d),g v
y=.|.^:({:a e.v)}.y
end.a
)

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

今回は冗長な明示的動詞。

説明:

c=.(u:97+i.26) リストa〜zを作成します

v=.'aeiou' 母音のリストを作成します

-. 文字のリストから母音を削除します

d=.u:48+i.10 数字のリストを作成します

g=.;"0|. 置換シンボルのボックス化されたペアのリストを作成するためのユーティリティ動詞

   g d
┌─┬─┐
│0│9│
├─┼─┤
│1│8│
├─┼─┤
│2│7│
├─┼─┤
│3│6│
├─┼─┤
│4│5│
├─┼─┤
│5│4│
├─┼─┤
│6│3│
├─┼─┤
│7│2│
├─┼─┤
│8│1│
├─┼─┤
│9│0│
└─┴─┘

a=.'' 結果を保存するリスト

while.*#y do.a=.a,{.y rplc(g c),(g d),g v リストの長さが> 0の間、シンボルを取得し、それを置き換えて結果に追加します

y=.|.^:({:a e.v)}.y リストの先頭からシンボルを1つドロップし、シンボルが母音の場合、リストを逆にします

end.whileループを終了します

a 結果を返します



0

網膜、78バイト

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b
/[aeiou]/{*>0L`.*?[aeiou]
0`.*?[aeiou]

V`

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b

各文字を同等の文字と交換します。

/[aeiou]/{

母音が残っている間に繰り返します。

*>0L`.*?[aeiou]

テキストを母音まで出力します。

0`.*?[aeiou]

母音までのテキストを削除します。

V`

残りのテキストを反転します。母音が残っていない場合、これは暗黙的に出力されますが、テストケースの目的のために、ヘッダーは各行の最後にテキストを出力します。


0

スタックス、24 バイト

╥j•td╢Ä;Sµ*ûⁿvÉ╫î▓J o╩π╗

それを実行します

同じプログラムのascii表現を次に示します。

VcGVdGVvGwB]qVvs#!Hv*c}cr\$|t

最初に各文字クラスを変換してから、whileループを開始します。ループでは、次の文字を出力し、母音が検出されると文字列の残りを条件付きで反転します。

VcG                             Push lowercase consonants and jump to trailing }
   VdG                          Push digits and jump to trailing }
      VvG                       Push lowercase vowels and jump to trailing }
         wB]qVvs#!Hv*c          While; run this block until popped value is falsy
          B]                    Split first character off string 
            q                   Output with no newline; keep on the stack
             Vvs#               1 if letter is a vowel, 0 otherwise
                 !Hv            Not, Double, then Decrement
                                    -1 for vowels, 1 otherwise
                    *           Multiply string. -1 causes reversal       
                     c          Copy value to be popped as while condition
                      }         Jump target from above.  Return when done.
                       cr\$     Copy, reverse, zip, and flatten.
                           |t   Translate: use string as a character map
                                    for replacements
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.