पिगपेन सिफर एन्क्रिप्शन


11

पिगपेन सिफर एन्क्रिप्शन

आपका मिशन सरल है: एक प्रोग्राम लिखने के लिए जो इनपुट के रूप में टेक्स्ट प्राप्त करता है और पिगपेन सिपर में एएससीआईआई प्रतिनिधित्व का आउटपुट देता है ।

इनपुट

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  +-- |   +-- --+

अनुगामी नई लाइन के साथ ऊपर का बेस 64 एन्कोडिंग नीचे है। Md5sum है 6f8ff1fed0cca4dd0492f9728ea02e7b

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

अनुगामी नई रेखा के बिना, md5sum है 581005bef7ee76e24c019d076d5b375fऔर बेस 64 है:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gggICBW ICArLS0gfCAgICstLstLSAtLSs =

नियम

  • मानक खामियों को मना किया जाता है।
  • यह कोड गोल्फ है। सबसे छोटा कोड जीतता है।
  • ऐसी भाषाएं जो एक समय में इनपुट की कई पंक्तियों को स्वीकार नहीं कर सकती हैं (उदाहरण के लिए जावास्क्रिप्ट के साथ prompt()), *लाइन विभाजक के रूप में उपयोग (या कुछ अन्य चरित्र)।

Erranda

  • उदाहरण कुछ स्थानों को याद कर रहा था (ए अंतरिक्ष में पिछले चरित्र के अनुगामी रिक्त स्थान शामिल होने चाहिए, यदि कोई हो, स्वयं, और अपने अनुगामी रिक्त स्थान हैं)। अब यह सुधर गया है।

1
मुझे एक बच्चे के रूप में इसके साथ खेलना याद है, लेकिन इसका नाम कभी नहीं पता था। धन्यवाद!
जियोबिट्स

क्या मैं एक कस्टम फ़ॉन्ट का उपयोग कर सकता हूं? :-)
फ़्लोरियन एफ


जावास्क्रिप्ट में कोडिंग। आमतौर पर promptइसका उपयोग इनपुट के लिए किया जाता है, लेकिन यह केवल एक ही लाइन को स्वीकार करता है। क्या मैं इनपुट में एक नई लाइन को चिह्नित करने के लिए एक विशेष चार (जैसे '*') का उपयोग कर सकता हूं?
edc65

@ edc65 हाँ, आप कर सकते हैं

जवाबों:


4

जावास्क्रिप्ट (ईएस 6) 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 WoRDD!

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

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

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

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

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

आपके पास oऔर w"हैलो वर्ल्ड" के बीच 5 स्थान हैं , ओपी में केवल 4
क्लाउडीउ

@ चालुडीयू प्रत्येक वर्ण (यहां तक ​​कि रिक्त, चार 32) 3 रिक्त स्थान, चार्ट 1 के बीच विभाजक। 1 + 3 + 1 == 5. मैं ओपी के साथ जाँच करूँगा
edc65

हाँ, यह निश्चित रूप से 5 के साथ अधिक समझ में आता है। मुझे लगा कि वह विशेष रूप से एक विशेष मामले के रूप में 4 चाहते थे, लेकिन अच्छी बात यह है कि आपने पूछा!
क्लाउडीयू

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 बार और '__' (दो रिक्त स्थान) 20 बार दिखाता है। मैं इन दृश्यों को एकल-चरित्र प्रतीकों के साथ बदल देता हूं और रनटाइम पर उन्हें स्विच करता हूं, आधे में पिगपन सिफर को स्टोर करने के लिए आवश्यक वर्णों की संख्या में कटौती करता हूं। इसी तरह, एक नई पंक्ति में आमतौर पर दो अक्षरों की आवश्यकता होती है, लेकिन एक प्रतीक (एन) द्वारा बदल दिया जाता है और बाद में स्विच किया जाता है।

कार्यक्रम इनपुट को एक सरणी में विभाजित करके इनपुट की कई पंक्तियों को संभालता है जहां प्रत्येक तत्व इनपुट की एक पंक्ति है। कार्यक्रम तो बस प्रत्येक पंक्ति पर अलग से सिफर चलाता है।

यह किसी भी भाषा में मेरा पहला गोल्फ है, इसलिए इस कोड को बेहतर बनाने के लिए बहुत कुछ किया जा सकता है।

उत्पादन

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, बदले अपना फ़ोन यू की बहु में एक दिल है, और n और लाइन में ई के बीच एक क्लब के रूप में रेंडर कर। ऐसा क्यों है?
बीटा डिके

2
@ BetaDecay मुझे लगता है कि यह इरादा है, कम ASCII वर्णों की हैंडलिंग दिखाने के लिए
edc65

चुनौतियों के नियम के अनुपालन को प्रदर्शित करने के लिए दिल और क्लब को वहां रखा गया था: सभी वर्णों को बदलें जो नई लाइनें नहीं हैं या ABCDEFGHIJKLMNOPQRSTUVWXYZ या रिक्त स्थान के साथ abcdefghijklmnoprstvwxyz
jrbuchner

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

78-बाइट फ़ाइल के लिए 'f' नामक एक ही डायरेक्टरी (फ़ाइल नाम के लिए +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

फ़ाइल fका बेस 64 एन्कोडिंग है:

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}}, एक फ्लैट ऐरे में संग्रहीत है। कार्यक्रम प्रत्येक स्थिति के लिए एक साधारण लुक-अप करके पत्रों को प्रिंट करता है।


आप के लिए एक बाइट fऔर तीन बाइट्स को जोड़ना चाहिए2>_

0

पर्ल 5 -lF , 297 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''

इसे ऑनलाइन आज़माएं!

वहाँ शायद अभी भी एक सा है कि आगे गोल्फ हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.