アルファベット暗号をエンコードする


24

小文字のみを含む文字列の場合、その文字列をアルファベット暗号でエンコードします。

アルファベット暗号でエンコードするには(例を使用しますhello):

  1. 最初に、文字列の各文字をアルファベットの位置(a= 1b= 2など)に応じて数字に変換します。例:8 5 12 12 15
  2. 各数字を0sで2文字に埋め込みます。例:08 05 12 12 15
  3. 参加してください。例:0805121215

テストケース

helloworld -> 08051212152315181204
codegolf -> 0315040507151206
alphabetcipher -> 0112160801020520030916080518
johncena -> 1015081403051401

これはであるため、バイト数が最も少ないコードが優先されることに注意してください。


回答:


23

05AB1E11 6バイト

コード:

Ç4+€¦J

説明:

最初に、文字列をASCII値に変換します。codegolfになるだろう:

[99, 111, 100, 101, 103, 111, 108, 102]

アルファベットのインデックスを取得するには、以下を減算します96

[3, 15, 4, 5, 7, 15, 12, 6]

ゼロを埋め込むには100、各要素に追加し、各intの最初の文字を削除します。上記の例で+100は、次のようになります。

[103, 115, 104, 105, 107, 115, 112, 106]

そして、それぞれの最初の文字を削除すると、次のようになります。

[03, 15, 04, 05, 07, 15, 12, 06] 

上記の両方のステップ(-96および+100)部分をちょうどにマージできます+4。コードの場合:

Ç       # Convert to an array of ASCII code points
 4+     # Add four to each element in the array
   €¦   # Remove the first character of each element
     J  # Join to a single string

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


¦再び何をしますか?
魔法のタコUr

@carusocomputing文字列、リストなどの最初の要素を削除します
Adnan

向こうの天才...
マジックタコ壺


8

Pyth、11 10バイト

FNwpt`+4CN

それを試してみてください!Pythに初めて行きました。

FNwpt`+4CN
FNw         # For N in w (w is input, N will be single char)
   p        # Print without newline
        CN  # Int with code point `N`
      +4CN  # Add 4 to int with code point N
     `+4CN  # representation of above (basically to string)
    t`+4CN  # Tail (All but first character)

同等のPython:

for N in input():
    print(repr(ord(N) + 4)[1:], end='')

最初のPythプログラムでお疲れ様でした!
ハイパーニュートリノ

7

C、55 43バイト

f(char*c){for(;*c;)printf("%02d",*c++-96);}

イデオン


1
printf("%02d",*c++-96);}私が間違えていなければ、短くて有効です。
ダダ


6

ゼリー9 7 バイト

O+4ṾḊ$€

TryItOnline

どうやって?

O+4ṾḊ$€ - Main link: s                                e.g. hello
O       - cast to ordinals                            e.g. [ 104,  101,  108,  108,  111]
 +4     - add 4                                       e.g. [  108,  109,  112,  112,  115]
     $€ - last two links as a monad for €ach
   Ṿ    -    uneval, effectively converts to strings  e.g. ["108","109","112","112","115"]
    Ḋ   -    dequeue, remove the leading '1'          e.g. [ "08", "09", "12", "12", "15"]
        - implicit print                              e.g. "0809121215"

私が思い付いたO+4DḊ€FṾ€同じ回数、おそらくgolfableのために
ETHproductions

@ETHproductions O+4Ṿ€Ḋ€は2バイトを節約します。
デニス

@Dennis私は...同じ(ISH)を行った
ジョナサン・アラン

4

Haskell、44 30 28バイト

(>>=tail.show.(+4).fromEnum)

Adnanの回答の+4アプローチを使用すると、14バイト節約できます。

Ideoneでお試しください。使用法:

> (>>=tail.show.(+4).fromEnum)"codegolf"
"0315040507151206"

xnorのおかげで2バイトがオフになりました。古いバージョン:

f a=['0'|a<'k']++(show$fromEnum a-96)
(f=<<)

括弧の2番目のセットは必要ありません。
-xnor

3

Perl、29バイト

28バイトのコード+ -nフラグ。

printf"%02s",-96+ord for/./g

で実行:

perl -ne 'printf"%02s",-96+ord for/./g' <<< "helloworld"

3

JavaScript(ES6)、52 49バイト

f=s=>s&&(s.charCodeAt()+4+f(s.slice(1))).slice(1)

再帰は、以下よりも3バイト短いことが判明しました.replace

s=>s.replace(/./g,s=>(s.charCodeAt()+4+"").slice(1))

parseInt(s,36)次のように変更4する必要があるため、各アプローチでわずかに長くなります91

s=>s.replace(/./g,s=>(parseInt(s,36)+91+"").slice(1))
f=s=>s&&(parseInt(s[0],36)+91+f(s.slice(1))).slice(1)




3

六角形、33バイト

10}{'a({=!{{\.@29$\,<.-":!\>Oct\%

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

Mm .. Hexagonで何も操作しなかったので、今日の日付を入れました。

日付がno-opsに置き換えられた拡張フォーム

   1 0 } {
  ' a ( { =
 ! { { \ . @
. . $ \ , < .
 - " : ! \ >
  . . . \ %
   . . . .
  1. a 10を初期化し、メモリーポインターをどこかに移動します...
  2. $ミラーをスキップし,、バイトを読み取ります。<枝:
  3. 文字列の終わり(-1正でない)の場合@、プログラムに進み、プログラムを終了します。
  4. それ以外の場合は、減算95(デクリメントa)してから、印刷result / 10(整数除算)してresult % 10、再びループします。

2

Vim、60キーストローク

:s/./\=char2nr(submatch(0))-96."\r"/g
:%s/\<\d\n/0&
V{gJ

ほとんど完全に正規表現ベースのソリューション。いつものように、evalレジスタを使用すると、わいせつに長くなります。



2

PowerShell v2 +、44バイト

-join([char[]]$args[0]|%{"{0:D2}"-f($_%32)})

入力を受け取り$args[0]、それをchar-array としてキャストし、ループに送ります。反復ごとに、現在の文字を$_法として取得し、32暗黙的にASCII値としてキャストします。便利な;-)、これa = 1, b = 2-fそう整列"{0:D2}"します、など。2桁の最小値を指定するstring で動作するormat演算子に入力されます(つまり、必要に応じて先行ゼロを付加します)。これらの数字列は括弧にカプセル化され、-join1つの文字列にまとめられてパイプラインに残されます。暗黙的な出力Write-Outputは、プログラムの終了時に発生します。

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'hello'
0805121215

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'helloworld'
08051212152315181204

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'codegolf'
0315040507151206

PS C:\Tools\Scripts\golfing> .\encode-alphabet-cipher.ps1 'johncena'
1015081403051401

2

Perl、24バイト

+1を含む -p

STDINに入力を与えます。

encode.pl <<< hello

encode.pl

#!/usr/bin/perl -p
s/./substr 4+ord$&,1/eg

よくできました。おそらく4+ord$&代わりにあなたが意味したと思う5+ord$&;
ダダ

@Dada右は、私のスニペットのバージョンが再びテストしたバージョンの代わりにバッファ貼り付け
トンHospel

それが起こる!:)関係のない質問をしてもいいですか?この質問に対する8バイトのperlソリューション(入力を逆にする)(無秩序で)は何ですか?
ダダ

@Dada純粋なperlでは不可能だと思うので、その側の自動化されたシステムの悪用が予想されます。たとえば、STDINから入力ができた場合、できることexec rev
Ton Hospel

理にかなっています、ありがとう!print5バイト、<>さらに2 バイトであるため、これを理解するのに苦労していました。
ダダ

2

DASH、27バイト

@><""(->@rstr["."""]+4#0)#0

使用例:

(@><""(->@rstr["."""]+4#0)#0)"helloworld"

説明

@ (                         #. take input through a lambda
  join "" (                 #. join with newlines the following:
    (map                    #. result of mapping
      @ (                   #. this lambda
        rstr ["." ; ""] (     #. replace first char w/ empty string:
          + 4 #0               #. mapped item's codepoint + 4
        )
      )
    ) #0                    #. over the argument
  )
)

2

バッチ、256 239 237バイト

@echo off
set/ps=
set r=
set a=abcdefghijklmnopqrstuvwxyz
:g
set c=%a%
for /l %%i in (101,1,126)do call:l %%i
set s=%s:~1%
if not "%s%"=="" goto g
echo %r%
exit/b
:l
set i=%1
if %c:~,1%==%s:~,1% set r=%r%%i:~1%
set c=%c:~1%

STDINで入力を受け取ります。


2

IBM PC DOS 8088アセンブリ、 33 28 27バイト

組み立てられたバイナリ:

00000000: be82 00ac 2c60 7812 d40a 0530 3092 86f2  ....,`x....00...
00000010: b402 cd21 86f2 cd21 ebe9 c3              ...!...!...

組み立てられていない:

BE 0082     MOV  SI, 82H        ; point SI to command line string 
        CH_LOOP: 
AC          LODSB               ; load next char into AL
2C 60       SUB  AL, 'a'-1      ; convert ASCII to a=1,b=2...z=26 
78 12       JS   DONE           ; if char is terminator or not valid, exit
D4 0A       AAM                 ; convert binary to BCD 
05 3030     ADD  AX, '00'       ; convert BCD to ASCII 
92          XCHG DX, AX         ; save AX to DX for display 
86 F2       XCHG DH, DL         ; reverse bytes 
B4 02       MOV  AH, 2          ; DOS display char function 
CD 21       INT  21H            ; write first digit 
86 F2       XCHG DH, DL         ; reverse bytes back 
CD 21       INT  21H            ; write second digit 
EB E9       JMP  CH_LOOP        ; restart loop 
        DONE: 
C3          RET                 ; return to DOS

スタンドアロンPC DOS実行可能ファイル。コマンドラインからの入力文字列、コンソールへの出力。

I / O:

ここに画像の説明を入力してください



1

ルビー、53 46バイト

->s{s.chars.map{|c|(c.ord-96).to_s.rjust(2,?0)}.join}

->s{s.chars.map{|c|(c.ord+4).to_s[1..2]}.join}


1

R、71 51バイト

Billywobのおかげで20バイト節約されました。stdinから入力を受け取り、stdoutに出力します。

cat(sprintf("%02d",utf8ToInt(scan(,""))-96),sep="")

例:

helloworld-> 08051212152315181204

codegolf-> 0315040507151206

アルファベット暗号-> 0112160801020520030916080518

johncena-> 1015081403051401


utf8toInt(scan(,"))-96一致するもの全体の代わりに使用できます。ただし、パディングを処理するより良い方法があるとは思わないでください。
ビリーウォブ

@Billywobありがとう!パディングについては、formatC以前使用してみましたが、現在のアプローチよりも1バイト多く必要であることがわかりました。
-rturnbull

1

実際には、10バイト

Adnanの05AB1E回答で、きちんとしたアルゴリズムを使用しています。ゴルフの提案を歓迎します。オンラインでお試しください!

O4+`$pX`MΣ

アンゴルフ

         Implicit input s.
O        ord() every char in s.
4+       Add 4 to every ord in s.
`...`M   Map the following function over s. Variable m.
  $        Push str(m).
  pX       Discard the first char of str(m).
           Invariably this is a `1` and we get our ciphered m.
Σ        sum() everything to get one string.
         Implicit return.






弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.