シフトシーザーズシフト

説明

シーザーシフトは非常に単純なモノアルファベットの暗号で、各文字はアルファベットの後の文字に置き換えられます。例:

Hello world! -> IFMMP XPSME!


IBSLR、EGUFV!は実際のチャレンジの出力ですが、これは1ずつシフトした例です)。

ご覧のとおり、スペースと句読点は一切ありません。ただし、メッセージを推測するのを防ぐために、すべての文字が大文字になります。手紙を戻すことによって、メッセージは解読され、便利であったが、メッセージが何を意味するのかを知らないと思われる他の人が解読することも本当に簡単であった。

ですから、私たちはシーザーの暗号の高度な使い方を使ってシーザーを少し助けます:自己シフトシーザーシフト

チャレンジ

あなたの仕事はプログラムや関数を書くことです。暗号化する文字列があれば、入力に対応する暗号化された文字列を出力します。高度なシーザーシフトは次のように機能します:

1. Compute letter differences of all adjacent letters: 
    1.1. Letter difference is computed like this:

         Position of 2nd letter in the alphabet
        -Position of 1st letter in the alphabet
        =======================================
                              Letter difference

    1.2. Example input: Hello
         H - e|e -  l|l  -  l|l  -  o
         7 - 5|5 - 12|12 - 12|12 - 15 Letter differences: 3; -7; 0; -3
            =3|   =-7|     =0|    =-3

2. Assign the letters continously a letter difference from the list,
   starting at the second letter and inverting the differences:
    2.1. 2nd letter: first difference, 3rd letter: second difference, etc.

    2.2. The first letter is assigned a 1.

    2.3. Example input: Hello with differences 3; -7; 0; -3

         Letter || Value
         =======||======
            H   ||   1
            E   ||  -3
            L   ||   7
            L   ||   0
            O   ||   3

3. Shift the letters by the value x they have been assigned:
    3.1. In case of a positive x, the letter is shifted x letters to the right.
    3.2. In case of a negative x, the letter is shifted |x| letters to the left.
    3.3. In case of x = 0, the letter is not shifted.

    3.4. If the shift would surpass the limits of the alphabet, it gets wrapped around
         Example: Y + Shift of 2 --> A

    3.5. Example input: See the table under 2.3.

                ||       || Shifted
         Letter || Value || Letter
         =======||=======||=========
            H   ||   1   ||    I
            E   ||  -3   ||    B     Program output:
            L   ||   7   ||    S     IBSLR
            L   ||   0   ||    L
            O   ||   3   ||    R

スペースやその他の特殊記号(句読点など)は、このプロセスではスキップされます。プログラムには、印刷可能なASCII文字のみを含む文字列が与えられます。関数/プログラムの出力は大文字でなければなりません。

This is ,
so standard loopholes apply, and may the shortest answer in bytes
win!

ベストアンサー

05AB1E, 28 27 24 bytes

láÇ¥R`XIlvyaiAyk+Aèëy}u?

試してみるオンライン!

説明

l                          # convert input to lower case
 á                         # keep only letters
  ǥ                       # compute deltas of character codes
    R`                     # reverse and push separated to stack
      X                    # push 1
       Ilv                 # for each char y in lower case input
          yai              # if y is a letter
             Ayk           # get the index of y in the alphabet
                +          # add the next delta
                 Aè        # index into the alphabet with this
            ëy             # else push y
              }            # end if
            u?             # print as upper case

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です