Pigpen Cipher暗号化


11

Pigpen Cipher暗号化

あなたの使命は簡単です。入力としてテキストを受け取り、そのテキストのASCII表現をPigpen Cipherに出力するプログラムを書くことです。

入力

ASCIIのみ(Unicodeなし)の文字。少なくとも16384文字と256行を処理できる必要があります。

出力

  • 改行ではないすべての文字を、スペースで、ABCDEFGHIJKLMNOPQRSTUVWXYZまたはabcdefghijklmnopqrstuvwxyzスペースで置き換えます。
  • 大文字と小文字を区別せずに、各文字を暗号化された形式に置き換え(次のセクションを参照)、3行それぞれに末尾のスペースを挿入します。エンコードされた各文字は、ASCIIアートの3 * 3ブロックです。スペースを3 * 3ブロックのスペースに置き換えます。
  • 新しいピッペンラインを開始する新しいラインがない限り、すべてのキャラクターは同じ3行にある必要があります(これらの3行を1つのピッペンラインと呼びます)。ピッペンラインの間の通常のラインは空白のままにします。

暗号

  |       | |       |
 .|       |.|       |.
--+ for J +-+ for K +-- for L

--+       +-+       +--
 .|       |.|       |.
--+ for M +-+ for N +-- for O

--+       +-+       +--
 .|       |.|       |.
  | for P | | for Q |   for R

(ABCDEFGHI are the same as JKLMNOPQR, but with the . replaced by a space)

\./
 V  for W (note the row of 3 spaces on the top)

 ^
/.\ for Z (note the 3 spaces on the bottom)


 \
 .>
 /  for X (note the leading spaces)

 /
<.
 \  for Y (note extra trailing spaces)

(STUV are like WXYZ, but with the . replaced by a space)

入力 "hEllo、wORLd"は以下を生成するはずです:

+-+ +-+ |   |   +--         +-- +-- |   --+
| | | | |.  |.  |.      \./ |.  |.  |.    |
| | +-+ +-- +-- +--      V  +-- |   +-- --+

上記のbase64エンコードと、後続の改行は以下のとおりです。md5sumは6f8ff1fed0cca4dd0492f9728ea02e7bです。

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

末尾に新しい行がない場合、md5sumは581005bef7ee76e24c019d076d5b375fbase64です。

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLS​​ArLS0gICAgICBW ICArLS0gfCAgICstLS​​AtLSs =

ルール

  • 標準の抜け穴は禁止されています。
  • これはコードゴルフです。最短のコードが勝ちます。
  • 一度に複数行の入力を受け入れることができない言語(JavaScriptとなどprompt())では、*(またはその他の文字)を行区切りとして使用します。

エランダ

  • 例にはいくつかのスペースがありませんでした(スペースは、前の文字の後続スペースがある場合は、それ自体と、それ自体の後続スペースで構成される必要があります)。これは修正されました。

1
私はこれを子供の頃に遊んだことを覚えていますが、その名前を知りませんでした。ありがとう!
Geobits

カスタムフォントを使用できますか?:-)
フロリアンF

@FlorianFいいえ...

JavaScriptでのコーディング。通常promptは入力に使用されますが、1行のみを受け入れます。特別な文字( '*'など)を使用して、入力の新しい行をマークできますか?
edc65 2014

@ edc65はい、可能です

回答:


4

JavaScript(ES6)312 327 340 372 446

インデントの空白と改行を数えない-より多くのゴ​​ルフをすることができます。'*'を使用して入力の新しい行をマークpromptすると、単一の行を受け入れます。

console.log(prompt().split('*').map(s=>
  [0,1,2].map(r=>
  [...s].map(c=>o+=n+
    '   \\1/ \\ /1\\ /  V  ^  1><1 --++-++-- 1||1||1 '.substr(
    (c=(32|c.charCodeAt())-97)<0|c>25?0:c<18
     ?27+3*'330441552030141252033144255'[f=8,c%9*3+r]
     :3*'482630015274'[f=21,c%4*3+r],3,n=' ')
  .replace(1,' .'[r&c>f])
  ,n='\n'),o=''
)&&o).join('\n'))

FireFox / FireBugコンソールでテストする

入力:ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeL10O WoRlD!

  | | | |   --+ +-+ +-- --+ +-+ +--
  | | | |     | | | |     | | | |  
--+ +-+ +-- --+ +-+ +--   | | | |  

  | | | |   --+ +-+ +-- --+ +-+ +--
 .| |.| |.   .| |.| |.   .| |.| |. 
--+ +-+ +-- --+ +-+ +--   | | | |  

     \   /   ^ 
\ /   > <   / \
 V   /   \     

     \   /   ^ 
\./  .> <.  /.\
 V   /   \     

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      

oとの間に5つのスペースがありw、「Hello world」では、OPには4つしかありません
Claudiu

@Claudiu各文字(空白、char 32も含む)3スペース、char間のセパレーター1スペース。1 + 3 + 1 == 5. OPで確認します
edc65

いや、それは間違いなく5の方が理にかなっています。私は彼が特別なケースとして4を特に望んでいると思いましたが、あなたが尋ねた良いことです!
Claudiu 2014

3

C#-921 720

明らかに優勝したエントリではありませんが、これは見過ごすには面白すぎたようです。

プログラムは入力を単一として受け取り、豚舎を印刷します。複数の行を入力するには、出力にあるようにアンダースコア(_)を使用します

コード

using System;class P{static void Main(){
int i,y,j,k,w,z;string[]g=Console.ReadLine().ToLower().Split('_');
var d="_________  |b .|b--+_| |b|.|b+-+_|  b|. b+--_--+b .|b--+_+-+b|.|b+-+_+--b|. b+--_--+b .|b  |_+-+b|.|b| |_+--b|. b|  _____   b\\./b v _ \\ b .>b / _ / b<. b \\ _ ^ b/.\\b   _  b  b  ".Replace('b','\n').Split('_');
for(i=0;i<d.Length;i++){if(d[i]==""){d[i]=i<17?d[i+9]:d[i+4];d[i]=d[i].Replace('.',' ');}}
for(y=0;y<g.Length;y++){string o="",s,e=g[y];var r=new string[z=e.Length][];
for(i=0;i<z;i++){if(e[i]-97<0|e[i]-97>25)e=e.Replace(e[i],'{');
o+=d[e[i]-97]+'_';r[i]=(o.Split('_')[i].Split('\n'));}
for(j=0;j<3;j++)for(k=0;k<(w=r.Length);k++){
s=r[k][j];Console.Write(k==w-1?s+'\n':s+' ');}}
Console.ReadLine();}}

概念

暗号は、かなり重複するいくつかの文字シーケンスを使用します。たとえば、「-」は16回表示され、「__」(2つのスペース)は20回表示されます。これらのシーケンスを1文字の記号に置き換え、実行時にそれらを切り替えて、ピッペン暗号を格納するために必要な文字数を半分に削減します。同様に、改行には通常2文字が必要ですが、記号(n)に置き換えられ、後で切り替えられます。

プログラムは、入力を配列に分割して複数の入力行を処理します。各要素は1行の入力です。プログラムは、単純に各行で個別に暗号を実行します。

これはどの言語でも初めてのゴルフなので、このコードを改善するためにできることはおそらくたくさんあります。

出力

hEllo,wORLd
+-+ +-+ |   |   +--        +-- +-- |   --+
| | | | |.  |.  |.     \./ |.  |.  |.    |
| | +-+ +-- +-- +--     v  +-- |   +-- --+

code_golf
|   +-- --+ +-+
|   |.    | | |
+-- +-- --+ +-+
--+ +-- |   +--
  | |.  |.  |
  | +-- +-- +--

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /

1
C#for(int i=0;i<p.Length; i++)

professorfishのおかげで、私が逃した別のものもありました
jrbuchner '13 / 09/13

1
ではm♥lti \n lin♣e \n input、私の電話は、マルチでuではなくハートを持ち、nとeの間にクラブが並んでいるとレンダリングします。何故ですか?
Beta Decay

2
@BetaDecay低ASCII文字の処理を示すことを目的としていると思う
edc65

ハートとクラブは、チャレンジのルールの遵守を示すためにそこに置かれました:新しい行、またはABCDEFGHIJKLMNOPQRSTUVWXYZまたはabcdefghijklmnopqrstuvwxyzにないすべての文字をスペースで
置き換え

2

Python 2、180 + 78 + 1 + 3 = 262文字

180バイトのプログラム(最後の2つの改行はタブです):

L=open('f','rb').read().decode('zip')
while 1:
 n=raw_input()
 for s in(0,3,6):
    for c in n:w=ord(c.lower())-97;print''.join(L[w+(s+i)*26]for i in(0,1,2))if-1<w<27 else'  ',
    print

'f'と呼ばれる78バイトのファイルが同じディレクトリである必要があります(ファイル名に+1バイト)。

$ hexdump f
0000000 9c78 a853 d1a9 d6d5 2206 3805 0103 c174
0000010 c100 8b88 07d1 9ae1 051a 4ab0 385d ae03
0000020 2803 8a82 3a80 406c ae18 0f42 6006 0c1c
0000030 0a2d 31fa 6076 ee8c a030 0e14 2987 8428
0000040 7501 3080 c39a 5a10 0014 21c7 7333
000004e

ファイルのbase64エンコーディングfは次のとおりです。

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

プログラムは例外で終了し2>_、エラーを抑制します(+3バイト)。

$ echo "hEllo,wORLd" | python pigpen.py 2>_| ./md5.py
7ed49b7013a30cc3e84aa807f6585325

説明

Lマッピングであるルックアップテーブルを作成{position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}し、フラット配列に保存しました。プログラムは、各位置について簡単な検索を行うことにより、文字を印刷します。


1バイトfと3バイトを追加する必要があります2>_

0

パール5 -lF297の288 261 231バイト

$,=$";$_=' .||.||. ';chomp@F;map{@r=/.../g;say map{/[a-z]/i?$r[-65+ord uc]:$"x3}@F}(y/./ /r.y/.| /-+-/r x2)x2 .'    \\  /  ^ 'x2,y/./ /r x3 .$_ x3 .'\\ /  ><  / \\\\./ .><. /.\\',(y/.| /-+-/r x2 .y/./ /r)x2 .' V  /  \\    'x2;say''

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

まだまだゴルフができるかもしれません。

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