돼지 펜 암호화


11

돼지 펜 암호화

당신의 임무는 간단합니다 : 텍스트를 입력으로 받아 프로그램의 ASCII 표현을 Pigpen Cipher로 출력하는 프로그램을 작성하는 것입니다 .

입력

ASCII 전용 (유니 코드 없음) 문자 최소한 16384 자 및 256 줄을 처리 할 수 ​​있어야합니다.

산출

  • 줄 바꿈이 아니 ABCDEFGHIJKLMNOPQRSTUVWXYZ거나 abcdefghijklmnopqrstuvwxyz공백 이 아닌 모든 문자를 바꾸십시오.
  • 대소 문자를 구분하지 않고 각 문자를 암호화 된 양식으로 바꾸고 (다음 섹션 참조) 각 세 줄 뒤에 후행 공백을 삽입하십시오. 인코딩 된 각 문자는 ASCII 아트의 3 * 3 블록입니다. 공백을 3 * 3 블록의 공백으로 교체하십시오.
  • 새로운 피그 펜 라인을 시작하는 새로운 라인이 없다면, 모든 문자는 같은 세 라인에 있어야합니다 (이 세 라인을 하나의 피펜 라인이라고 부릅니다). 피펜 선 사이에 일반 선을 비워 둡니다.

암호

  |       | |       |
 .|       |.|       |.
--+ 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은 다음 581005bef7ee76e24c019d076d5b375f이며 base64는 다음과 같습니다.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =

규칙

  • 표준 허점 은 금지되어 있습니다.
  • 이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다.
  • 시간 (예를 들어 자바 스크립트에서 입력의 여러 라인을 받아 들일 수없는 언어에서 prompt()) 사용 *라인 구분 기호로 (또는 다른 문자).

에 란다

  • 예에서 몇 개의 공백이 누락되었습니다 (공백은 이전 문자의 후행 공백과 해당하는 후행 공백으로 구성되어야 함). 이것은 이제 수정되었습니다.

1
나는 이것을 어린 시절로 노는 것을 기억하지만 그 이름을 알지 못했습니다. 감사!
Geobits

사용자 정의 글꼴을 사용할 수 있습니까? :-)
Florian F

@FlorianF No ...

자바 스크립트로 코딩. 일반적으로 prompt입력에 사용되지만 한 줄만 허용합니다. 입력에 새 줄을 표시하기 위해 '*'와 같은 특수 문자를 사용할 수 있습니까?
edc65

@ edc65 네, 가능합니다

답변:


4

자바 스크립트 (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 * HeLlO WoRlD!

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

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

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

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

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

당신은 사이 5 개 공간이 ow"안녕하세요 세계"에서을, 영업 이익은 4가
Claudiu

@Claudiu 각 문자 (공백, 문자 32) 3 공백, 문자 1 공백 사이의 구분 기호. 1 + 3 + 1 == 5. OP로 확인합니다
edc65

그러나 그것은 5와 함께 더 의미가 있습니다. 나는 그가 특별히 4를 특별한 경우로 원한다고 생각했지만, 당신이 요구 한 좋은 점!
Claudiu

3

C 번호 - 921 (720)

분명히이기는 항목은 아니지만, 이건 너무 재미있어 보입니다. :)

프로그램은 입력을 단일로 취한 다음 pigpen을 인쇄합니다. 여러 줄을 입력하려면 output에 표시된대로 밑줄 (_)을 사용하십시오 .

암호

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 번 나타납니다. 이 시퀀스를 단일 문자 기호로 바꾸고 런타임에 전환하여 돼지 암호를 절반으로 저장하는 데 필요한 문자 수를 줄입니다. 마찬가지로 개행에는 일반적으로 두 문자가 필요하지만 기호 (n)로 바뀌고 나중에 전환됩니다.

프로그램은 각 요소가 단일 입력 행인 배열로 입력을 분할하여 여러 입력 행을 처리합니다. 그런 다음 프로그램은 각 행에서 암호를 개별적으로 실행합니다.

이것은 어떤 언어로든 내 첫 번째 골프 이므로이 코드를 개선하기 위해 할 수있는 일이 많이있을 것입니다.

산출

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

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

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

1
C #을 모르지만 for(int i=0;i<p.Length; i++)(가운데 근처에) 불필요한 공간이있는 것

고마워 교수님, 내가 놓친 또 하나가 있습니다
jrbuchner

1
에서 m♥lti \n lin♣e \n input, 내 전화는 마음을 가진 대신 U의 멀티, 그리고 n 개의 라인에서 전자 사이의 클럽으로 그 렌더링합니다. 왜 그런 겁니까?
Beta Decay

2
@BetaDecay ASCII 문자가 적은 문자를 처리하기위한 것입니다.
edc65

마음과 클럽은 도전 과제 규칙의 준수를 입증하기 위해 그곳에 배치되었습니다. 줄 바꿈이 아니거나 ABCDEFGHIJKLMNOPQRSTUVWXYZ 또는 abcdefghijklmnopqrstuvwxyz가 아닌 모든 문자를 공백으로
바꿉니다

2

파이썬 2, 180 + 78 + 1 + 3 = 262 자

180 바이트 프로그램 (마지막 두 줄 바꿈은 탭) :

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 -lF , 297288261231 바이트

$,=$";$_=' .||.||. ';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.