রেল বেড়া সাইফার


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]দুটি অক্ষরের জিপ করে এবং যোগ দিয়ে অর্জন করা দরকার । এর মধ্যে দ্বিতীয়টি সম্ভাব্যভাবে একটি অক্ষর ছোট হতে পারে, এটি কোনও চরিত্রের সাথে প্যাড করা হয় যেখানে কোথাও উপস্থিত হবে না বলে ধরে নেওয়া হয় ( _) এবং তারপরে প্রয়োজনে প্রয়োজনে চরিত্রটি কেটে ফেলা হয় এবং খালি স্ট্রিং দিয়ে প্যাড করা হয় with


কিছুটা বেশি মানব পাঠযোগ্য ফর্ম:

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

একটি ডিসিফেরিং ফাংশনও প্রয়োজন।
শুক্লস্নিধ্য্যা

@ শুক্লস্নিধ্য্যা তাহলে আপনি কেন অসম্পূর্ণ উত্তর মেনে নিলেন?
জো কিং

3
@ জোকিং স্পষ্টতার জন্য, আমি আমার সমাধান পোস্ট করার এক বছর পরে "দুটি প্রোগ্রাম" প্রয়োজনীয়তা যুক্ত করা হয়েছিল ।
প্রিমো

2

এপিএল 52 41

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

যদি ইনপুট পাঠ্য স্ট্রিং i এবং কী নম্বর এনটি পূর্বনির্ধারিত হয় তবে সমাধানটি 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←⍞]

একটি ডিসিফেরিং ফাংশনও প্রয়োজন।
শুক্লস্নিধ্য্যা

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

এমএটিএল, by০ বাইট (মোট)

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

এমএটিএল অনলাইন এ চেষ্টা করুন
দেখুন একাধিক পরীক্ষার কেস

Fস্ট্রিংটি encipher করতে তৃতীয় ইনপুট হিসাবে একটি পতাকা নেয় ,T এনকিফার করতে এটি বোঝার ( এই ধারণার জন্য কেভিন ক্রুইজসেনকে ধন্যবাদ )।

জুলিয়া উত্তর হিসাবে এটি শুরু হয়েছিল যতক্ষণ না বুঝতে পেলাম কঠোর টাইপিং খুব বেশি হয়ে গেছে, বিশেষত সিদ্ধান্তের জন্য her এনসিফারমেন্টের জন্য আমার কাছে জুলিয়া কোডটি রয়েছে (টিআইওর জন্য 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 টি অক্ষর পড়া, তারপরে আর -2 টি অক্ষর পড়ার এবং ডামি মান (নালাগুলি) সহ উপস্থাপিত এবং প্রত্যয় যুক্ত হিসাবে দেখা যায়, তারপরে আবার আর অক্ষরগুলি পড়তে ইত্যাদি every প্রতিবার একটি নতুন কলাম তৈরি করা হিসাবে দেখা যায়:

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;
}

আমি এই কোডটিতে ব্যাখ্যা করতে চাই।


যেহেতু এটি কোড-গল্ফ , তাই আপনার কোডটি ছোট করার চেষ্টা করা উচিত। এছাড়াও, আপনার এই জমাতে ভাষা এবং বাইট গণনা যুক্ত করা উচিত
জো কিং

জো কিং যা বলেছিলেন তা ছাড়াও, আপনি টিআইওর মতো একটি অনলাইন পরিষেবা ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন যাতে অন্য লোকেরা সহজেই আপনার কোডটি পরীক্ষা করে দেখতে পারে।
0urous

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 বাইটস @ সিলিংক্যাটকে ধন্যবাদ ।
-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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.