रेल बाड़ सिफर


10

दो प्रोग्राम लिखें:
- जो एक स्ट्रिंग और एक कुंजी को पढ़ता है और उस कुंजी का उपयोग करके स्ट्रिंग को रेल-बाड़ सिफर में एन्कोड करता है। - इसी तरह, रिवर्स फ़ंक्शन के लिए एक प्रोग्राम लिखें: एक कुंजी का उपयोग करके रेल बाड़ को डिक्रिप्ट करना।

उन लोगों के लिए जो रेल बाड़ सिफर नहीं जानते हैं, यह मूल रूप से एक तरह से सादा पाठ लिखने की एक विधि है जो एक सर्पिल तरीके से रैखिक पैटर्न बनाता है। उदाहरण - जब "FOOBARBAZQUX" रेल-फेंस 3 की कुंजी का उपयोग कर।

F . . . A . . . Z . . . .
  O . B . R . A . Q . X
    O . . . B . . . U

उपरोक्त सर्पिल रेखा-दर-पंक्ति पढ़कर, सिफर पाठ "FAZOBRAQXOBU" हो जाता है।

- कम से और अधिक पढ़ें रेल बाड़ सिफर - विकिपीडिया

किसी भी भाषा में कोड का स्वागत है।

बाइट्स जीत में सबसे छोटा जवाब।


2
जीतने की कसौटी क्या है?
पॉल आर

जवाबों:


9

पायथन 133 बाइट्स

def cipher(t,r):
 m=r*2-2;o='';j=o.join
 for i in range(r):s=t[i::m];o+=i%~-r and j(map(j,zip(s,list(t[m-i::m])+[''])))or s
 return o

नमूना उपयोग:

>>> print cipher('FOOBARBAZQUX', 3)
FAZOBRAQXOBU

>>> print cipher('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 4)
AGMSYBFHLNRTXZCEIKOQUWDJPV

>>> print cipher('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 5)
AIQYBHJPRXZCGKOSWDFLNTVEMU

>>> print cipher('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 6)
AKUBJLTVCIMSWDHNRXEGOQYFPZ

नोट: यहां तक ​​कि रेल की गिनती के परिणाम आपके द्वारा प्रदान किए गए कोड से भिन्न हैं, लेकिन वे सही प्रतीत होते हैं। उदाहरण के लिए, 6 रेल:

A         K         U
 B       J L       T V
  C     I   M     S   W
   D   H     N   R     X
    E G       O Q       Y
     F         P         Z

आपके कोड के उत्पादन के अनुरूप है AKUBJLTVCIMSWDHNRXEGOQYFPZ, और नहीं AKUTBLVJICMSWXRDNHQYEOGZFP

मूल विचार यह है कि प्रत्येक रेल को सीधे स्ट्रिंग स्लाइस लेने से पाया जा सकता है [i::m], जहां iरेल नंबर ( 0-indexed) है, और mहै (num_rails - 1)*2। आंतरिक रेलों को अतिरिक्त रूप [m-i::m]से परस्पर जुड़ने की आवश्यकता होती है , जो कि दो सेटों के पात्रों को जोड़कर और जोड़कर हासिल की जाती है। क्योंकि इनमें से दूसरा संभावित रूप से एक वर्ण छोटा हो सकता है, यह एक चरित्र के साथ गद्देदार होता है जिसे कहीं भी प्रकट नहीं होना माना जाता है ( _), और फिर उस चरित्र को छीन लिया जाता है यदि आवश्यक हो तो इसे सूची में बदल दिया जाता है, और खाली स्ट्रिंग के साथ गद्देदार किया जाता है।


थोड़ा और मानवीय पठनीय रूप:

def cipher(text, rails):
  m = (rails - 1) * 2
  out = ''
  for i in range(rails):
    if i % (rails - 1) == 0:
      # outer rail
      out += text[i::m]
    else:
      # inner rail
      char_pairs = zip(text[i::m], list(text[m-i::m]) + [''])
      out += ''.join(map(''.join, char_pairs))
  return out

एक deciphering फ़ंक्शन की भी आवश्यकता है।
शुक्लसन्निध्य

@ शुक्लासन्निध्या फिर आपने एक अधूरा जवाब क्यों स्वीकार किया?
जो किंग

3
@JoKing स्पष्टता के लिए, "दो कार्यक्रमों" की आवश्यकता को एक साल बाद जोड़ा गया जब मैंने अपना समाधान पोस्ट किया।
प्रिमो

2

एपीएल ५२ ४१

i←⍞⋄n←⍎⍞⋄(,((⍴i)⍴(⌽⍳n),1↓¯1↓⍳n)⊖(n,⍴i)⍴(n×⍴i)↑i)~' '

यदि इनपुट टेक्स्ट स्ट्रिंग i और कुंजी नंबर n हैं, तो समाधान को 9 वर्णों से छोटा किया जा सकता है। प्राइमो द्वारा दिए गए उदाहरणों के विरुद्ध हल चलाना समान जवाब देता है:

FOOBARBAZQUX
3
FAZOBRAQXOBU

ABCDEFGHIJKLMNOPQRSTUVWXYZ
4
AGMSYBFHLNRTXZCEIKOQUWDJPV

ABCDEFGHIJKLMNOPQRSTUVWXYZ
5
AIQYBHJPRXZCGKOSWDFLNTVEMU

ABCDEFGHIJKLMNOPQRSTUVWXYZ
6
AKUBJLTVCIMSWDHNRXEGOQYFPZ

आगे प्रतिबिंब पर एक छोटा सूचकांक आधारित समाधान प्रतीत होता है:

i[⍋+\1,(y-1)⍴((n←⍎⍞)-1)/1 ¯1×1 ¯1+y←⍴i←⍞]

एक deciphering फ़ंक्शन की भी आवश्यकता है।
शुक्लसन्निध्य

1

पायथन 2 , 124 + 179 = 303 बाइट्स

एनकोड:

lambda t,k:''.join(t[i+j]for r in R(k)for i in R(k-1,len(t)+k,2*k-2)for j in[r-k+1,k+~r][:1+(k-1>r>0)]if i+j<len(t))
R=range

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

डिकोड:

lambda t,k:''.join(t[dict((b,a)for a,b in enumerate(i+j for r in R(k)for i in R(k-1,len(t)+k,2*k-2)for j in[r-k+1,k+~r][:1+(k-1>r>0)]if i+j<len(t)))[m]]for m in R(len(t)))
R=range

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


आपको एक निर्णायक समारोह की भी आवश्यकता है
जो किंग

@ राजा: मैंने एक निर्णायक रूप से जोड़ा है।
चास ब्राउन

0

MATL, 70 बाइट्स (कुल)

f'(.{'iV'})(.{1,'2GqqV'})'5$h'$1'0'$2'0K$hYX2Get2LZ)P2LZ(!tg)i?&S]1Gw)

MATL ऑनलाइन पर इसे
आज़माएं कई परीक्षण मामलों की कोशिश करें

तीसरे इनपुट के रूप में एक झंडे को लेता है, Fस्ट्रिंग Tको मढ़ने के लिए , इसे समझने के लिए ( उस विचार के लिए केविन क्रूज़सेन का धन्यवाद )।

यह एक जूलिया उत्तर के रूप में शुरू हुआ जब तक कि मुझे एहसास नहीं हुआ कि सख्त टाइपिंग बहुत अधिक हो गई है, विशेष रूप से व्याख्या के लिए। यहाँ पर जूलिया कोड मेरे पास था (टीआईओ के लिए v0.6 के लिए वापस लाया गया):

जूलिया 0.6 , 191 बाइट्स

!M=(M[2:2:end,:]=flipdim(M[2:2:end,:],2);M)
s|n=replace(String((!permutedims(reshape([rpad(replace(s,Regex("(.{$n})(.{1,$(n-2)})"),s"\1ø\2ø"),length(s)*n,'ø')...],n,:),(2,1)))[:]),"ø","")

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

स्पष्टीकरण:

रेल बाड़ संचालन

F . . . A . . . Z . . . .
  O . B . R . A . Q . X
    O . . . B . . . U

r = इनपुट के 3 वर्णों को पढ़ने के रूप में देखा जा सकता है, फिर r-2 वर्णों को पढ़ना और उपसर्ग करना और प्रत्यय देना कि डमी मानों (नल) के साथ, फिर r वर्णों को फिर से पढ़ना, आदि, हर बार एक नया स्तंभ बनाते हुए:

F.A.Z.
OBRAQX
O.B.U.

फिर हर दूसरे कॉलम को उलटते हैं (क्योंकि ज़िगज़ैग का ज़ैग हिस्सा नीचे की बजाय ऊपर जाता है, जिससे r> 3) का फर्क पड़ता है, फिर पंक्तियों के साथ इस मैट्रिक्स को पढ़ते हैं, और डमी पात्रों को हटाते हैं।

इस तरह के किसी भी स्पष्ट पैटर्न की घोषणा नहीं हुई थी, लेकिन जब मैं इस पोस्ट के बारे में आया, तो इस बारे में खोज करते हुए , जिसने मुझे बताया कि (ए) यह एक प्रसिद्ध और (संभवतः?) रेल सिफर के लिए प्रकाशित एल्गोरिथ्म था, और ( ख) स्पष्टीकरण एक ही विधि का एक सरल पुन: उपयोग किया गया था, यह स्ट्रिंग के सूचकांकों दे रही है और हो रही है के सूचकांकों कूटलेखन के बाद उन सूचकांक, और उन स्थानों पर सिफर पढ़ने।

चूंकि सूचकांकों पर काम करने से चीजों को करने की आवश्यकता होती है, यह कोड स्ट्रिंग के सूचकांकों को छाँटकर भी करता है, और फिर इस मामले में उन पुन: व्यवस्थित सूचकांकों को अनुक्रमित करता है।

              % implicit first input, say 'FOOBARBAZQUX'
f             % indices of input string (i.e. range 1 to length(input)
'(.{'iV'})(.{1,'2GqqV'})'5$h
              % Take implicit second input, say r = 3
              % Create regular expression '(.{$r})(.{1,$(r-2)})'
              % matches r characters, then 1 to r-2 characters
              %  (to allow for < r-2 characters at end of string)
'$1'0'$2'0K$h % Create replacement expression, '$1\0$2\0'
YX            % Do the regex replacement
2Ge           % reshape the result to have r rows (padding 0s if necessary)
t2LZ)         % extract out the even columns of that
P             % flip them upside down
2LZ(          % assign them back into the matrix
!             % transpose
tg)           % index into the non-zero places (i.e. remove dummy 0s)
i?            % read third input, check if it's true or false
&S]           % if it's true, decipherment needed, so get the indices of the 
              %  rearranged indices
1Gw)          % index the input string at those positions

0
int r=depth,len=plainText.length();
int c=len/depth;
char mat[][]=new char[r][c];
int k=0;
String cipherText="";
for(int i=0;i< c;i++)
{
 for(int j=0;j< r;j++)
 {
  if(k!=len)
   mat[j][i]=plainText.charAt(k++);
  else
   mat[j][i]='X';
 }
}
for(int i=0;i< r;i++)
{
 for(int j=0;j< c;j++)
 {
  cipherText+=mat[i][j];
 }
}
return cipherText;
}

मैं इस कोड में व्याख्या करना चाहता हूं।


चूंकि यह कोड-गोल्फ है , इसलिए आपको अपने कोड को छोटा करने का प्रयास करना चाहिए। इसके अलावा, आपको इस सबमिशन में लैंग्वेज और बाइट काउंट को जोड़ना चाहिए
Jo King

जो किंग ने जो कहा उसके अलावा, आप TIO जैसी ऑनलाइन सेवा का उपयोग करने पर विचार कर सकते हैं ताकि अन्य लोग आसानी से आपके कोड का परीक्षण कर सकें।
Οurous

0

जावा 10, 459 451 445 439 327 बाइट्स

(s,k,M)->{int l=s.length,i=-1,f=0,r=0,c=0;var a=new char[k][l];for(;++i<l;a[r][c++]=M?s[i]:1,r+=f>0?1:-1)f=r<1?M?f^1:1:r>k-2?M?f^1:0:f;for(c=i=0;i<k*l;i++)if(a[i/l][i%l]>0)if(M)System.out.print(a[i/l][i%l]);else a[i/l][i%l]=s[c++];if(!M)for(r=c=i=0;i++<l;f=r<1?1:r>k-2?0:f,r+=f>0?1:-1)if(a[r][c]>1)System.out.print(a[r][c++]);}

-12 बाइट्स @ceilingcat की बदौलत
-112 बाइट्स इनपुट के रूप में एक अतिरिक्त मोड-फ्लैग के साथ दो फ़ंक्शन को मिलाते हैं।

फ़ंक्शन एक तीसरा इनपुट लेता है M। यदि यह है trueतो यह समृद्ध होगा, और यदि यह है तो यह falseगूढ़ होगा।

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

स्पष्टीकरण:

(s,k,M)->{              // Method with character-array, integer, and boolean parameters
                        // and no return-type
  int l=s.length,       //  Length of the input char-array
      i=-1,             //  Index-integer, starting at -1
      f=0,              //  Flag-integer, starting at 0
      r=0,c=0;          //  Row and column integers, starting both at 0
  var a=new char[k][l]; //  Create a character-matrix of size `k` by `l`
  for(;++i<l            //  Loop `i` in the range (-1, `l`):
      ;                 //    After every iteration:
       a[r][c++]=       //     Set the matrix-cell at `r,c` to:
         M?s[i++]       //      If we're enciphering: set it to the current character
         :1,            //      If we're deciphering: set it to 1 instead
       r+=f>0?          //     If the flag is 1:
           1            //      Go one row down
          :             //     Else (flag is 0):
           -1)          //      Go one row up
    f=r<1?              //   If we're at the first row:
       M?f^1            //    If we're enciphering: toggle the flag (0→1; 1→0)
       :1               //    If we're deciphering: set the flag to 1
      :r>k-2?           //   Else-if we're at the last row:
       M?f^1            //    If we're enciphering: toggle the flag (0→1; 1→0)
       :0               //    If we're deciphering: set the flag to 0
      :                 //   Else (neither first nor last row):
       f;               //    Leave the flag unchanged regardless of the mode
  for(c=i=0;            //  Reset `c` to 0
            i<k*l;i++)  //  Loop `i` in the range [0, `k*l`):
    if(a[i/l][i%l]>0)   //   If the current matrix-cell is filled with a character:
      if(M)             //    If we're enciphering:
        System.out.print(a[i/l][i%l]);}
                        //     Print this character
      else              //    Else (we're deciphering):
        a[r][i]=s[c++]; //     Fill this cell with the current character
  if(!M)                //  If we're deciphering:
    for(r=c=i=0;        //   Reset `r` and `c` both to 0
        i++<l           //   Loop `i` in the range [0, `l`)
        ;               //     After every iteration:
         f=r<1?         //      If we are at the first row:
            1           //       Set the flag to 1
           :r>k-2?      //      Else-if we are at the last row:
            0           //       Set the flag to 0
           :            //      Else:
            f,          //       Leave the flag the same
         r+=f>0?        //      If the flag is now 1:
             1          //       Go one row up
            :           //      Else (flag is 0):
             -1)        //       Go one row down
      if(a[r][c]>1)     //    If the current matrix-cell is filled with a character:
        System.out.print(a[r][c++]);}
                        //     Print this character
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.