কম্পিউটার সাইফার


14

পরিচিতি:

আমার কাছে একটি ছাগলছানা হিসাবে একবার সঙ্কলিত একটি নথিতে আমার কাছে প্রচুর বিভিন্ন সাইফার সঞ্চিত আছে, আমি যেগুলি আমার মনে হয়েছিল সেগুলির মধ্যে কয়েকটি বেছে নিয়েছিলাম চ্যালেঞ্জগুলির জন্য সবচেয়ে উপযুক্ত (খুব তুচ্ছ নয়, খুব বেশি কঠিন নয়) এবং সেগুলি চ্যালেঞ্জগুলিতে রূপান্তরিত করে। তাদের বেশিরভাগ এখনও স্যান্ডবক্সে রয়েছে এবং আমি এখনও নিশ্চিত নই যে আমি তাদের সমস্ত পোস্ট করব, বা কেবল কয়েক জন। তবে এখানে প্রথম জিনিসগুলি শুরু করা উচিত।


একটি কম্পিউটার সাইফার প্রদত্ত পাঠ্যটিকে 'এলোমেলো' একটি প্রদত্ত চরিত্রের গ্রুপগুলিতে এনক্রিচার করবে length। যদি এই জাতীয় গোষ্ঠীতে কোনও অঙ্ক থাকে তবে এটি সেই অঙ্কটি এনক্রিফড অক্ষরের জন্য তার নিজস্ব গোষ্ঠীতে সূচক করতে ব্যবহার করবে। গ্রুপে কোনও অঙ্ক উপস্থিত না থাকলে এর অর্থ প্রথম অক্ষর ব্যবহৃত হয় used

উদাহরণস্বরূপ, ধরা যাক আমরা this is a computer cipherএকটি নির্দিষ্ট দৈর্ঘ্যের সাথে পাঠ্যটি এনক্রিফার করতে চাই 5। এটি একটি সম্ভাব্য আউটপুট (দ্রষ্টব্য: সংখ্যাগুলি নীচের উদাহরণে 1-সূচিযুক্ত):

t     h     i     s     i     s     a     c     o     m     p     u     t     e     r     c     i     p     h     e     r       (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv   (without spaces of course, but added as clarification)

গ্রুপটি কীভাবে বোঝাবেন তা বোঝাতে উদাহরণ হিসাবে কয়েকটি গ্রুপ নেওয়া যাক:

  • qu5dtএই দল অঙ্ক রয়েছে 5, তাই (1-সূচীবদ্ধ) এই দলের 5 ম চরিত্র পাঠোদ্ধার পাঠ্যের জন্য ব্যবহৃত চরিত্র: t
  • hpritএই গ্রুপ তাই এই গোষ্ঠী প্রথম অক্ষরটি পাঠোদ্ধার পাঠ্যের জন্য পরোক্ষভাবে ব্যবহার করা হয়, কোন ডিজিট রয়েছে: h
  • osyw2এই গ্রুপ একটি অঙ্ক রয়েছে 2, তাই (1-সূচীবদ্ধ) এই দলের 2nd চরিত্র পাঠোদ্ধার পাঠ্যের জন্য ব্যবহৃত চরিত্র: s

চ্যালেঞ্জ:

একটি পূর্ণসংখ্যা lengthএবং স্ট্রিং দেওয়া হয়েছে, উপরে বর্ণিত হিসাবে word_to_encipherএকটি এলোমেলো এনকিফার্ড স্ট্রিং আউটপুট ।

আপনি শুধুমাত্র দেওয়া কেবলমাত্র চিহ্ন আছে lengthএবং word_to_encipherতাই হিসাবে ভাল একটি deciphering প্রোগ্রাম / ফাংশন তৈরি করার কোন প্রয়োজন। ভবিষ্যতে সিদ্ধান্ত গ্রহণের জন্য আমি পার্ট 2 চ্যালেঞ্জ করতে পারি।

চ্যালেঞ্জ নিয়ম:

  • আপনি ধারনা করতে পারেন lengthপরিসীমা হবে [3,9]
  • আপনি ধরে নিতে পারেন word_to_encipherকেবলমাত্র অক্ষর থাকবে।
  • আপনি পুরো ছোট ছোট হাতের বা সম্পূর্ণ বড় হাতের অক্ষর ব্যবহার করতে পারেন (দয়া করে আপনার উত্তরটিতে কোনটি ব্যবহার করেছেন) তা উল্লেখ করুন।
  • আপনার আউটপুটগুলি, প্রতিটি গ্রুপ এবং একটি গ্রুপে অঙ্কগুলির অবস্থানগুলি (উপস্থিত থাকলে) অভিন্নভাবে এলোমেলো হওয়া উচিত । সুতরাং বর্ণমালার সমস্ত এলোমেলো অক্ষরগুলির একই ঘটনার সম্ভাবনা রয়েছে; প্রতিটি গ্রুপে এনকিফার্ড চিঠির অবস্থানের একই সম্ভাবনা রয়েছে; এবং অঙ্কটির অবস্থানের একই ঘটনার সম্ভাবনা থাকে (কেবলমাত্র যখন এটি প্রথম অক্ষর এবং কোনও অঙ্ক উপস্থিত না থাকে; এবং সম্ভবত এটি এনকিফার্ড অক্ষরের মতো একই অবস্থানে থাকতে পারে না)।
  • আপনাকে 1-ইনডেক্সের পরিবর্তে 0-সূচকযুক্ত অঙ্কগুলি ব্যবহার করার অনুমতি দেওয়া হয়। আপনি নিজের উত্তরে দু'জনের মধ্যে কোনটি ব্যবহার করেছেন দয়া করে তা জানান।
  • অঙ্ক 1(অথবা 0যখন 0-সূচীবদ্ধ) আউটপুটে উপস্থিত হতে হবে। সুতরাং b1ndh'বি' অক্ষরটি এনক্রিফার করার জন্য কোনও বৈধ গ্রুপ নয়। যাইহোক, b4tbw, বৈধ যেখানে 4enciphers b4th দিকে (1-সূচীবদ্ধ) অবস্থান, এবং অন্যান্য অক্ষরের b, t, wর্যান্ডম হয় (যা কাকতালীয়ভাবে একটি রয়েছেb )। অন্য সম্ভাব্য বৈধ গ্রুপ length5 সঙ্কেতাক্ষরে লিখা চরিত্র 'খ' আছেন: abcd2, ab2de, babbk, hue5b, ইত্যাদি

সাধারণ নিয়ম:

  • এটি , তাই বাইট জেতে সংক্ষিপ্ত উত্তর।
    কোড-গল্ফ ভাষাগুলি আপনাকে নন-কোডগলফিং ভাষার সাথে উত্তর পোস্ট করতে নিরুৎসাহিত করবেন না। 'যে কোনও' প্রোগ্রামিং ভাষার জন্য যতটা সম্ভব সংক্ষিপ্ত উত্তর নিয়ে আসার চেষ্টা করুন।
  • আপনার উত্তরটির জন্য ডিফল্ট আই / ও বিধিগুলি সহ মানক বিধিগুলি প্রযোজ্য , সুতরাং আপনাকে সঠিক পরামিতি এবং ফিরতি-টাইপ, সম্পূর্ণ প্রোগ্রাম সহ STDIN / STDOUT, ফাংশন / পদ্ধতি ব্যবহারের অনুমতি দেওয়া হবে। আপনার কল
  • ডিফল্ট লুফোলগুলি নিষিদ্ধ।
  • যদি সম্ভব হয় তবে দয়া করে আপনার কোডের (যেমন টিআইও ) একটি পরীক্ষার সাথে একটি লিঙ্ক যুক্ত করুন ।
  • এছাড়াও, আপনার উত্তরের জন্য একটি ব্যাখ্যা যুক্ত করা অত্যন্ত প্রস্তাবিত।

পরীক্ষার কেস:

Input:
 Length:           5
 Word to encipher: thisisacomputercipher
Possible output:
 qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv

Input:
 Length:           8
 Word to encipher: test
Possible output:
 ewetng4o6smptebyo6ontsrbtxten3qk

Input:
 Length:           3
 Word to encipher: three
Possible output:
 tomv3h2rvege3le

2
"ইউনিফর্ম" কীভাবে বোঝায়
l4m2

@ l4m2 যে কোনও ফলাফলের জন্য সমান সুযোগ রয়েছে। সুতরাং বর্ণমালার সমস্ত এলোমেলো অক্ষরগুলির একই ঘটনার সম্ভাবনা রয়েছে; প্রতিটি গ্রুপে এনকিফার্ড চিঠির অবস্থানের একই সম্ভাবনা রয়েছে; এবং অঙ্কটির অবস্থানের একই ঘটনার সম্ভাবনা থাকে (কেবলমাত্র যখন এটি প্রথম অক্ষর এবং কোনও অঙ্ক উপস্থিত না থাকে, এবং এনকিফার্ড অক্ষর হিসাবে একই অবস্থানেও থাকে না) except
কেভিন ক্রুইজসেন

সুতরাং abcd2, ab2de, babbkসব একই? এছাড়াও b1akkবৈধ?
l4m2

@ l4m2 হ্যাঁ, তিনটিই সম্ভবত 'বি' চরিত্রটি enciphering এর আউটপুট। হিসাবে b1akkআমি কোন বলতে চাই। স্পষ্ট করার জন্য চ্যালেঞ্জ বিবরণে এটি সম্পাদনা করবে। প্রথম অক্ষরটি যদি এনক্লিফার্ড অক্ষর হয় তবে কোনও অঙ্ক উপস্থিত থাকতে হবে না।
কেভিন ক্রুইজসেন

1
উদাহরণস্বরূপ, যখন দৈর্ঘ্য = 3, চর = "ক"; ফর্ম "a??"676 সম্ভব ফলাফল আছে, কিন্তু "1a?", "?a1", "2?a", "?2a"রয়েছে only104 ফলাফল নেই। সুতরাং, যদি আমি এই 780 টি ফলাফল থেকে একটি ফলাফল বেছে নেওয়ার চেষ্টা করছি, তবে "এনকিফার্ড চিঠির অবস্থান" এর বিতরণ 13: 1: 1, 1: 1: 1 নয়। এবং আমি এটি "অভিন্ন র্যান্ডম" কাজ হিসাবে বিবেচনা করব।
tsh

উত্তর:


3

পাইথ, 22 বাইট

smsXWJOQXmOGQJdO-UQJJz

এটি অনলাইনে চেষ্টা করুন।

লোয়ারকেস এবং জিরো-ইনডেক্সিং ব্যবহার করে।

ব্যাখ্যা

খুব সোজা আলগোরিদিম।

                           Implicit: read word in z
                           Implicit: read number in Q
 m                   z     For each char d in z:
      OQ                     Choose a number 0..Q-1
     J                       and call it J.
         m  Q                Make an array of Q
          OG                 random letters.
        X     d              Place d in this string
             J               at position J.
    W                        If J is not 0,
   X                J        place J in this string
               O             at a random position from
                 UQ          0..Q-1
                -  J         except for J.
  s                          Concatenate the letters.
s                          Concatenate the results.

5

পার্ল 6 , 125 বাইট

->\n{*.&{S:g{.}=(65..90)>>.chr.roll(n).join.subst(/./,$/,:th($!=roll 1..n:)).subst(/./,$!,:th($!-1??(^n+1$!).roll!!n+1))}}

এটি অনলাইন চেষ্টা করুন!

বড়হাতে ইনপুট এবং আউটপুট নেয়। পছন্দ মতো ইনপুট নেয় f(n)(string)। 1 ইনডেক্সিং ব্যবহার করে।

ব্যাখ্যা:

->\n{*.&{ ...  }}   # Anonymous code block that takes a number n and returns a function
     S:g{.}=        # That turns each character of the given string into
                          .roll(n)      # Randomly pick n times with replacement
            (65..90)>>.chr              # From the uppercase alphabet
                                  .join # And join
            .subst(                         ) # Then replace
                   /./,  ,:th($!=roll 1..n:)  # A random index (saving the number in $!)
                       $/               # With the original character
            .subst(                )    # Replace again
                   /./,$!,:th( ... )    # The xth character with $!, where x is:
                           $!-1??          # If $! is not 1
                                 (^n+1$!).roll       # A random index that isn't $!
                                               !!n+1  # Else an index out of range

4

পাইথন 2 , 187 177 176 156 154 148 বাইট

lambda l,s:''.join([chr(choice(R(65,91))),c,`n`][(j==n)-(j==i)*(n>0)]for c in s for n,i in[sample(R(l),2)]for j in R(l))
from random import*
R=range

এটি অনলাইন চেষ্টা করুন!

বড় হাতের অক্ষর এবং 0-ইনডেক্সড নম্বর ব্যবহার করে।

-৩ বাইট, কেভিন ক্রুইজসেনকে ধন্যবাদ


@ কেভিন ক্রুজসেন ধন্যবাদ :)
টিফিল্ড

কী sample(R(l),2)[::1|-(random()<.5)]মানে?
l4m2

@ l4m2 এটি থেকে 2 টি সংখ্যা নেয় range(l)এবং এগুলি বদলে যায়। তবে স্পষ্টতই নমুনা আদেশের গ্যারান্টি দেয় না, সুতরাং এটির প্রয়োজন নেই :)
টিফিল্ড

আপনি চারপাশে প্রথম বন্ধন মুছে ফেলতে পারবেন না (j==i)*(n>0)? গুণফলটির বিয়োগফলের চেয়ে অপারেটর অগ্রাধিকার আছে তাই না?
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুজসেন হ্যাঁ, আমি যখন কিছু সমস্যা ছিল তখন আমি সেগুলি সরিয়ে দিতে ভুলে গেছি
TFeld


3

আর , 134 132 123 বাইট

function(S,n,s=sample)for(k in utf8ToInt(S)){o=k+!1:n
P=s(n,1)
o[-P]=s(c(P[i<-P>1],s(17:42,n-1-i,T)))+48
cat(intToUtf8(o))}

এটি অনলাইন চেষ্টা করুন!

বড় হাতের অক্ষর নেয়।

পুরানো কোডের ব্যাখ্যা (বেশিরভাগ ক্ষেত্রে একই পদ্ধতি):

function(S,n){s=sample				# alias
K=el(strsplit(S,""))				# split to characters
o=1:n						# output array
for(k in K){					# for each character in the string
P=s(n,1)					# pick a Position for that character
o[-P]=						# assign to everywhere besides P:
      s(					# a permutation of:
	c(P[i<-P>1],				# P if it's greater than 1
		s(letters,n-1-i,T)))		# and a random sample, with replacement, of lowercase letters
o[P]=k						# set k to position P
cat(o,sep="")}}					# and print

2

জাভা (জেডিকে) , 193 বাইট

s->n->s.flatMap(c->{int a[]=new int[n],i=n,x=0;for(;i-->0;)a[i]+=Math.random()*26+97;a[i+=Math.random()*n+1]=c;x+=Math.random()*~-n;if(i>0)a[x<i?x:x+1]=48+i;return java.util.Arrays.stream(a);})

এটি অনলাইন চেষ্টা করুন!

  • সূচক 0-ভিত্তিক।
  • এই এন্ট্রিটি ইনপুট হিসাবে একটি IntStream(অর্জিত String::chars) ব্যবহার করে এবং একটি নম্বর দেয় returnsIntStream
  • থেকে কাস্ট doubleকরার intকারণে অপ্রয়োজনীয় হয় +=হ্যাক।

2

জাপট , 29 বাইট

;£=VöJ;CöV hUÎX hUÅÎUÎ?UÎs:Cö

এটি অনলাইন চেষ্টা করুন!

শূন্য-ইন্ডেক্স।

ব্যাখ্যা:

;                                :Set C = [a...z]
 £                               :For each character of the input:
  =VöJ;                          : Get two different random indexes from [0,length)
       CöV                       : Get 5 random letters
           hUÎX                  : Replace one at random with the character from the input
                hUÅÎ             : Replace a different random character with:
                    UÎ?          :  If the input character was not placed at 0:
                       UÎs       :   The index of the input character
                          :      :  Otherwise:
                           Cö    :   A random letter
                                 :Implicitly join back to a string

2

সি, 115 বাইট

g(_,n)char*_;{int i=rand(),j=i%~-n,k=0;for(i%=n;k<n;k++)putchar(k-i?!i|i<k^k-j?rand()%26+97:48+i:*_);*++_&&g(_,n);}

এটি অনলাইন চেষ্টা করুন!

0-ইনডেক্সড, লোয়ারকেস

কিছুটা অবারিত এবং প্রসারিত:

g(char*_,int n) {
    int i = rand(), j = i%(n-1), k = 0;
    for(i = i%n; k<n; k++)
        putchar(k!=i ? i!=0 || k==j + (k>i)
                          ? rand()%26 + 'A'
                          : i + '0')
                    : *_);
    if (*++_!=0) g(_,n);
}

কোডটি বেশ সোজা হওয়া উচিত। দুটি কলম i, jএকটি rand()কলে উত্পন্ন উত্স হিসাবে ভাল হিসাবে ভাল gcd ( n, ~-n) = 1 এবং RAND_MAXবড়।


1
পিপিসিজিতে আপনাকে স্বাগতম! :)
শেগি

1

পরিষ্কার , 256 বাইট

import StdEnv
s::!Int->Int
s _=code {
ccall time "I:I"
ccall srand "I:I"
}
r::!Int->Int
r _=code {
ccall rand "I:I"
}
$n|s 0<1#k=map\e.r e rem n
=flatten o map\c.hd[map(\i|i==x=c=toChar if(i==y&&x>0)(x+48)(r i rem 26+97))[0..n-1]\\x<-k[0..]&y<-k[0..]|x<>y]

এটি অনলাইন চেষ্টা করুন!

পছন্দ:

  • একটি এলোমেলো x(বিভাগে চরিত্রের অবস্থান)
  • এলোমেলো yযা সমান নয় x(বিভাগে অঙ্কের অবস্থান)
  • প্রতিটি পদের জন্য একটি র্যান্ডম ছোট হাতের অক্ষর না সমান xএবং সমান নয় yযদি না xশূন্য

1

জাভাস্ক্রিপ্ট, 134 বাইট

l=>w=>w.replace(/./g,c=>eval("for(s=c;!s[l-1]||s[t?t-1||9:0]!=c;t=s.replace(/\\D/g,''))s=(p=Math.random()*36**l,p-p%1).toString(36)"))

এটি অনলাইন চেষ্টা করুন!

এই উত্তরটি সমস্ত সম্ভাব্য এনকোডযুক্ত স্ট্রিংটি অভিন্নভাবে এনকোডযুক্ত স্ট্রিংটি বেছে নিয়েছে। সুতরাং এনকোডেড চিঠিটিকে প্রথমটি হিসাবে তৈরি করা আরও বেশি সম্ভব।


1

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 171 বাইট

s=>n=>{var r=new Random();return s.SelectMany(c=>{int i=r.Next(n),j=r.Next(n-1);j+=j<i?0:1;return new int[n].Select((_,k)=>(char)(i==k?c:j==k&i>0?i+49:r.Next(26)+97));});}

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা ...

// s is the input string
// n is the input length
s=>n=>{
  // we need to create an instance
  // of Random and use throughout
  var r=new Random();
  // iterate over s, each iteration
  // returns an array... flatten it
  return s.SelectMany(c=>{
    // i is the position of the letter
    // j is the position of the number
    int i=r.Next(n), j=r.Next(n-1);
    // ensure i and j are different
    j+=j<i?0:1;
    // create an iterable of size n
    return new int[n]
      // iterate over it with index k
      .Select((_,k)=>(char)(
        // return the letter
        i==k?c:
        // return the number
        j==k&i>0?i+49:
        // return a random letter
        r.Next(26)+97)
      );
  });
}

1

কাঠকয়লা , 35 30 বাইট

NθFS«≔‽θη≔∧η‽Φθ⁻κηζFθ≡κζIηηι‽β

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। 0-ইন্ডেক্স। ব্যাখ্যা:

Nθ

দৈর্ঘ্য ইনপুট করুন।

FS«

শব্দটি ইনপুট করুন এবং অক্ষরগুলির উপর লুপ করুন।

≔‽θη

অনর্থক অক্ষরের জন্য একটি এলোমেলো অবস্থান চয়ন করুন।

≔∧η‽Φθ⁻κηζ

অঙ্কটির জন্য আলাদা একটি এলোমেলো অবস্থান বেছে নিন, যদি না চিঠিটি 0 পজিশনে থাকে তবে এই ক্ষেত্রে অঙ্কটি 0 পজিশনেও রাখে।

Fθ≡κ

প্রতিটি আউটপুট চরিত্রের জন্য একবার লুপ করুন এবং অবস্থানটি স্যুইচ করুন।

ζIη

যদি এটি ডিজিটের অবস্থান হয় তবে ডিক্রিফার্ড অক্ষরের অবস্থান নির্ধারণ করুন

ηι

তবে এটি যদি সিদ্ধান্তহীন অক্ষরের অবস্থান হয় তবে চিঠিটি আউটপুট করুন। এটি অঙ্কের অবস্থানের তুলনায় অগ্রাধিকার গ্রহণ করে কারণ একাধিক স্যুইচ কেসের একই মান থাকলে চারকোল শেষ প্রবেশ করে।

‽β

অন্যথায় একটি এলোমেলো চিঠি আউটপুট।


0

05 এ বি 1 ই , 26 বাইট

ε²Ý¨Ω©A.r²£Šǝ®Āi®²Ý¨®KΩǝ]J

0-ইন্ডেক্স।

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

ε            # Map over the characters of the first (implicit) input-string:
 ²Ý¨         #  Create a list in the range [0, second input)
    Ω        #  Get a random item from this list
     ©       #  Store it in the register (without popping)
 A           #  Push the lowercase alphabet
  .r         #  Shuffle it
    ²£       #  Leave only the first second input amount of characters
      Š      #  Triple swap, so the stack order becomes:
             #  random index; random string; map-character
       ǝ     #  Insert the map-character at this random index into the random string
 ®Āi         #  If the random index was NOT 0:
    ®        #   Push the random index
    ²Ý¨      #   Push the list in the range [0, second input) again
       ®K    #   Remove the random index from this list
         Ω   #   Get a random item from this list
          ǝ  #   Insert the first random index at the second random index into the string
]            # Close both the if-else and map
 J           # Join all strings together (and output implicitly)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.