একটি ভিআইসি সাইফার এনকোডার লিখুন


18

ম্যানেজমেন্ট পরামর্শ সাইফার সবচেয়ে জটিল পেন্সিল এবং কাগজ সাইফারগুলির কখনও কল্পনা অন্যতম। "ভিক্টর" এর নামকরণ করা সোভিয়েত গুপ্তচর রেইনো হ্যাহেনেন 1950-এর দশকে ব্যবহার করেছিলেন, এর মূল নীতিটি হ'ল সুরক্ষা; একটি অনেক কিংকর্তব্যবিমূঢ়তা করুন।

আপনার কাজটি হ'ল এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা কোনও বার্তা নেবে এবং ভিসি সিফার ব্যবহার করে এটিকে এনকোড করবে। আমি এখানে একটি ভিআইসি সাইফার ডিকোডার চ্যালেঞ্জও পোস্ট করেছি । নিম্নলিখিত নির্দেশাবলীগুলির কোনও যদি অস্পষ্ট হয় তবে মন্তব্যে সেগুলি সম্পর্কে জিজ্ঞাসা করতে দ্বিধা করবেন না। নির্দেশাবলী এই সাইট থেকে অভিযোজিত হয়

ভিসি সাইফারকে এনকোডিং করা হচ্ছে

প্রস্তুতি

আপনার পাঁচটি ইনপুট লাগবে:

  • প্লেইন টেক্সট বার্তা
  • একটি সংক্ষিপ্ত কীওয়ার্ড বা বাক্যাংশ যা আপনার ভাষার সর্বাধিক সাধারণ অক্ষর রয়েছে
  • একটি মূল বাক্যাংশ, যেমন একটি গানের উদ্ধৃতি বা একটি লাইন (কমপক্ষে 20 টি অক্ষর)
  • একটি তারিখ (বা অন্য সংখ্যা যা ছয় অঙ্ক বা তার বেশি)
  • একটি ব্যক্তিগত এজেন্ট নম্বর

অনুশীলনে, এই শেষ চারটি প্রেরকের এবং প্রাপকের আগেই সম্মত হওয়া উচিত, প্রেরকের এজেন্ট নম্বর বা প্রাপকের এনকোডিংয়ে ব্যবহৃত হয় কিনা তা সহ।

আমার উদাহরণ বার্তাটি হবে: We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.

আমরা ইংরাজীতে এনকোডিং করব (যদিও আপনি যে ভাষা এবং বর্ণমালা পছন্দ করেন তা ব্যবহার করতে পারেন) এবং ইংরেজি বর্ণমালার সর্বাধিক সাধারণ অক্ষর A, E, I, N, O, R, S, T। আমি কীওয়ার্ডটি ব্যবহার করব SENATORI

আমার মূল বাক্যাংশটি রিচার্ড ফেনম্যানের একটি উক্তি: "প্রথম নীতিটি হ'ল আপনাকে নিজেকে বোকা বানাতে হবে না - এবং আপনি বোকা হওয়ার পক্ষে সবচেয়ে সহজ ব্যক্তি" "

তারিখ হিসাবে, আমি 31 জুলাই, 2016 (ফর্ম্যাটে 3172016) ব্যবহার করব , যা এই দিনটি ছিল যখন আমি এই বিবরণটি লিখেছিলাম।

আমি নিজের জন্য ব্যক্তিগত নম্বরটি বেছে নিয়েছি 9

পদক্ষেপের সংক্ষিপ্তসার

  1. নিম্নলিখিত পদক্ষেপে ব্যবহারের জন্য মধ্যবর্তী কীগুলি আবিষ্কার করুন।
  2. স্ট্র্যাডলিং চেকবোর্ডটি তৈরি করুন এবং প্রয়োগ করুন।
  3. প্রথম স্থানান্তর টেবিলটি তৈরি করুন এবং প্রয়োগ করুন।
  4. দ্বিতীয় (ব্যাহত) স্থানান্তর টেবিলটি তৈরি এবং প্রয়োগ করুন।
  5. বার্তা সূচক গোষ্ঠীটি প্রবেশ করে বার্তাটি চূড়ান্ত করুন।

Submechanisms

বিষয়টির মাংসে beforeোকার আগে আরও দুটি বিষয় ব্যাখ্যা করতে হবে: চেইন সংযোজন এবং অনুক্রমিককরণের প্রক্রিয়া।

চেইন সংযোজন, যা একটি পিছিয়ে ফিবোনাচি জেনারেটর হিসাবেও পরিচিত, একটি প্রাথমিক অঙ্কের ক্রম নিয়ে, প্রথম দুটি অঙ্ক বহন না করে যুক্ত করে (তাদের সাথে পরে যুক্ত করুন mod 10) এবং ফলাফলটি শেষে যুক্ত করে কাজ করে। উদাহরণ স্বরূপ:

79081
7 + 9 = 6

790816
9 + 0 = 9

7908169
0 + 8 = 8

79081698
8 + 1 = 9

790816989
1 + 6 = 7

7908169897
... and so on

সিক্যুয়েনালাইজিং হ'ল মূলত অক্ষর বা অঙ্কগুলির ক্রম গ্রহণ করে এবং বর্ণানুক্রমিক / সংখ্যাসূচক ক্রম দ্বারা সেগুলি লেবেল করা হয়। সদৃশগুলি বাম থেকে ডানে লেবেলযুক্ত। উদাহরণ স্বরূপ:

E X A M P L E
    0           # A
1   0       2   # Es
1   0     3 2   # L
1   0 4   3 2   # M
1   0 4 5 3 2   # P
1 6 0 4 5 3 2   # X

3  3  0  5  8  4  2  0  4  7  5  4  8  1
      0              1                     # 0s
      0              1                 2   # 1
      0           3  1                 2   # 2
4  5  0           3  1                 2   # 3s
4  5  0        6  3  1  7        8     2   # 4s
4  5  0  9     6  3  1  7    10  8     2   # 5s
4  5  0  9     6  3  1  7 11 10  8     2   # 7
4  5  0  9 12  6  3  1  7 11 10  8 13  2   # 8s

আমি এখানে শূন্য-সূচক ব্যবহার করি তবে আপনি পছন্দ করেন তবে সূচক।

1. মধ্যবর্তী কী

মূল বাক্যাংশের প্রথম 20 টি বর্ণকে 10 টির দুটি গ্রুপে বিভক্ত করুন এবং প্রতিটি স্বতন্ত্রভাবে ক্রমযুক্ত করুন, যা আমরা কল করব S1এবং করব S2

    THEFIRSTPR
S1: 8201357946

    INCIPLEIST
S2: 2603751489

এলোমেলো ৫-সংখ্যার বার্তা শনাক্তকারী চয়ন করুন, M(এটি যদি আপনি চান তবে ইনপুটগুলির মধ্যে একটি হতে পারে):

M = 47921

ধার নেওয়া (বিয়োগ mod 10) ছাড়াই বিয়োগ, মূল তারিখের প্রথম পাঁচটি অঙ্ক 3172016থেকে M:

M      47921
date - 31720
     = 16201

আপনার দশ অঙ্ক না হওয়া পর্যন্ত চেইন ফলাফল যুক্ত করুন:

1620178218

S1বহন করা বা mod 10প্রাপ্ত না করে এই অঙ্কগুলি যুক্ত করুন G:

     1620178218
S1 + 8201357946
G  = 9821425154

উপরে S2, 0123456789 অনুক্রমটি লিখুন। 0123456789 অনুক্রমের প্রতিটি অঙ্ক সন্ধান করুন Gএবং এটির নীচে অঙ্কের সাথে এটি প্রতিস্থাপন করুন S2। ফলাফল হয় T

   0123456789
S2 2603751489

G  9821425154
T  9806705657

T60 সংখ্যায় প্রসারিত করতে চেইন সংযোজন ব্যবহার করুন ।

9806705657

becomes

980670565778637511245490262369939288595822106344304316978734

এই সর্বশেষ 50 টি সংখ্যা, প্রতিটি দশ অঙ্কের পাঁচ সারিতে, Uব্লকটি তৈরি করে।

T  9806705657
U  7863751124
   5490262369
   9392885958
   2210634430
   4316978734

Uব্লকের শেষ দুটি অ-সমতুল্য অঙ্ক দুটি পৃথক স্থানের প্রস্থের জন্য পৃথকভাবে এজেন্টের ব্যক্তিগত সংখ্যাতে যুক্ত করা হয়, pএবংq

9 + 3 = 12 (পি, প্রথম স্থানান্তর প্রস্থ) 9 + 4 = 13 (কিউ, দ্বিতীয় স্থানান্তর প্রস্থ)

Sequentialize Tএবং এই ক্রম ব্যবহার বন্ধ কলাম কপি করতে U, উপর থেকে নীচে ব্লক, ডিজিটের একটি নতুন সারি মধ্যে V

T     9806705657
seqT  9804612537

U     7863751124
      5490262369
      9392885958
      2210634430
      4316978734

V     69911 56837 12548 26533 30206 13947 72869 49804 84323 75924

pপ্রথম স্থানান্তরের জন্য কীটি পেতে প্রথম সংখ্যাটি এবং দ্বিতীয়টির কীটির জন্য K1নিম্নলিখিত qসংখ্যাগুলি যথাযথ করুন K2

First 12  6  9  9  1  1  5  6  8  3  7  1  2
K1        6 10 11  0  1  5  7  9  4  8  2  3

Next 13   5  4  8  2  6  5  3  3  3  0  2  0  6
K2        8  7 12  2 10  9  4  5  6  0  3  1 11

অবশেষে, স্ট্র্যাডলিং চেকবোর্ডের জন্য কলাম শিরোনামগুলি Uপেতে ব্লকের চূড়ান্ত সারিটি অনুক্রমিক করুন C:

U5  4316978734
C   3105968724

2. স্ট্র্যাডলিং চেকবোর্ড

প্রথমে, আমি আমার উদাহরণ চেকবোর্ডটি দেব তারপর এটি তৈরির নীতিগুলি সেভাবে ব্যাখ্যা করব:

  3 1 0 5 9 6 8 7 2 4
  S E N A T O R I
2 B D G J L P U W Y .
4 C F H K M Q V X Z #

অক্ষরের প্রথম লাইনটি আমাদের সংক্ষিপ্ত কীওয়ার্ড SENATORI। আপনার কীওয়ার্ডটি নকল ছাড়াই কোনও স্ট্রিং হতে পারে তবে এটি যেহেতু এটি আপনার চেকবোর্ডের শীর্ষ সারিটি সংজ্ঞায়িত করে, তাই বিজ্ঞতার সাথে বেছে নিন। মূলশব্দটির উপরে Cএবং অন্য সারিগুলি আপনার বর্ণমালাগুলির বাকী অংশ যা আপনি চয়ন করুন। আমার ক্ষেত্রে, আমি বাকী ল্যাটিন বর্ণমালা, একটি বিরামচিহ্ন .এবং সংখ্যার সীমাবদ্ধকরণের জন্য একটি চিহ্ন দিয়ে চেকবোর্ডটি পূর্ণ করেছি #। মূলত, চেকারবোর্ডটি একটি অভিনব সাবস্টিটিউশন সাইফার। উদাহরণস্বরূপ, "E" এর পরিবর্তে 1"W" প্রতিস্থাপন করা হবে subst27

একবার আমরা এই চেকবোর্ডের সাথে আমাদের প্লেইন টেক্সট বার্তাটি এনকোড করেছি, তবে প্রথমে, আমাদের বার্তাটি এলোমেলো স্থানে বিভক্ত করে এবং সমস্ত বড় হাতের অক্ষর তৈরি করে আমাদের সূচনা কম স্পষ্ট করা দরকার। অন্যান্য আসল সূচনা বোঝাতে, আমরা দুটি পূর্ণ স্টপ ব্যবহার করি..

We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.

হয়ে

HING ELSE. MOVE TO SAFEHOUSE FOXTROT#3#.. WE ARE
DISCOVERED. TAKE WHAT YOU CAN. BURN EVERYT

আমরা চেকবোর্ড দিয়ে এনকোড করে আমাদের দিয়েছি:

407020 1293124 496481 96 354114062831 416479869443442424 271 581 
2173436481812124 95451 274059 22628 435024 232880 14818229

যদি বার্তার দৈর্ঘ্য 5 দ্বারা বিভাজ্য না হয়, আমরা বার্তাটি প্যাড করতে কিছু নাল অক্ষর যুক্ত করব। আমাদের বার্তাটি 109 ডিজিট দীর্ঘ, তাই আমি একটি নাল যুক্ত করব: "4"।

40702 01293 12449 64819 63541 14062 83141 64798 69443 44242 42715
81217 34364 81812 12495 45127 40592 26284 35024 23288 01481 82294

নোট: যেহেতু আমার উদাহরণ বার্তা সংখ্যার ধারণ করে না, আমি এখানে বলবো যে আপনার মনোনীত পারে, বলে, যেমন #3#, যা এনকোড করা আছে 44344এখানে।

3. প্রথম স্থানান্তর

K1কীটির নীচে একই দৈর্ঘ্যের সারিগুলিতে, পূর্ববর্তী পদক্ষেপ থেকে এনকোড করা বার্তা অনুসরণ করে (মধ্যবর্তী কী বিভাগ থেকে) লিখে (ট্রান্সমিশন কীগুলি বিভাগ থেকে) স্থানান্তর টেবিলটি তৈরি করুন :

K1   6 10 11  0  1  5  7  9  4  8  2  3

     4  0  7  0  2  0  1  2  9  3  1  2
     4  4  9  6  4  8  1  9  6  3  5  4
     1  1  4  0  6  2  8  3  1  4  1  6
     4  7  9  8  6  9  4  4  3  4  4  2
     4  2  4  2  7  1  5  8  1  2  1  7
     3  4  3  6  4  8  1  8  1  2  1  2
     4  9  5  4  5  1  2  7  4  0  5  9
     2  2  6  2  8  4  3  5  0  2  4  2
     3  2  8  8  0  1  4  8  1  8  2  2
     9  4

সংখ্যাযুক্ত কলামগুলি তাদের সংখ্যার ক্রম অনুসারে গ্রহণ করা:

060826428  246674580  151411542  246272922  961311401  082918141
4414434239 118451234  334422028  293488758  0417249224 794943568

৪. দ্বিতীয় স্থানান্তর

প্রথম স্থানান্তর তুলনামূলকভাবে সহজ ছিল। এটি অবশ্য একটি ব্যাহত স্থানান্তর। বিঘ্নিত প্যাটার্নটি টেবিলের প্রস্থ এবং কী দ্বারা নির্ধারিত হয়। আমাদের উদাহরণস্বরূপ, আমাদের ১১০ টি সংখ্যা এবং ১৩ টি কলাম রয়েছে, যার অর্থ আমাদের কাছে আটটি পূর্ণ সারি এবং left টি বাম ওভার থাকবে। আমরা প্রথম সারিতে ভরাট শুরু করি, তবে 0 কলামে থামি, এবং নীচের মতো চালিয়ে যাচ্ছি:

K2   8  7 12  2 10  9  4  5  6  0  3  1 11

     0  6  0  8  2  6  4  2  8              stop at 0
     2  4  6  6  7  4  5  8  0  1           continue in a triangle pattern
     5  1  4  1  1  5  4  2  2  4  6
     2  7  2  9  2  2  9  6  1  3  1  1
     4  0  1  0  8  2  9  1  8  1  4  1  4  until the end
     4  1  4  4  3  4  2  3  9  1  1        restart and stop at 1
     8  4  5  1  2  3  4  3  3  4  4  2
     2  0  2  8  2  9  3  4  8  8  7  5  8
     0  4  1                                restart and stop at 2

তারপরে আমরা বাকী অঙ্কগুলি সহ শেষ কয়েকটি স্থান পূরণ করব।

K2   8  7 12  2 10  9  4  5  6  0  3  1 11

     0  6  0  8  2  6  4  2  8  7  2  4  9
     2  4  6  6  7  4  5  8  0  1  2  2  4
     5  1  4  1  1  5  4  2  2  4  6  7  9
     2  7  2  9  2  2  9  6  1  3  1  1  4
     4  0  1  0  8  2  9  1  8  1  4  1  4
     4  1  4  4  3  4  2  3  9  1  1  9  4
     8  4  5  1  2  3  4  3  3  4  4  2  3
     2  0  2  8  2  9  3  4  8  8  7  5  8
     0  4  1  5  6  8

এখন, আমরা প্রথম স্থানান্তরের জন্য ঠিক একইভাবে কলামগুলি পড়েছিলাম।

71431148  42711925  861904185 22614147  45499243  28261334  80218938
641701404 025244820 645224398 271283226 94944438  064214521

এবং সবকিছুকে 5-সংখ্যার গোষ্ঠীতে বিভক্ত করুন:

71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189
38641 70140 40252 44820 64522 43982 71283 22694 94443 80642 14521

৫. বার্তা চূড়ান্ত করুন

চূড়ান্ত পদক্ষেপটি হ'ল আমাদের এলোমেলো বার্তা শনাক্তকারী, 47921বার্তায় intoোকানো। মূল তারিখের চূড়ান্ত 6অঙ্কটি গোষ্ঠীটির শেষ থেকে কত দূরত্বের ইঙ্গিত দেয়।

71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189 38641
70140 40252 44820 64522 43982 47921 71283 22694 94443 80642 14521

এই চ্যালেঞ্জ জন্য নোট

  • আপনাকে সর্বনিম্ন পাঁচটি ইনপুট দেওয়া হয়: বার্তা, বর্ণের কীওয়ার্ড, মূল বাক্যাংশ, তারিখ এবং একটি ব্যক্তিগত নম্বর। আপনি দুটি অতিরিক্ত ইনপুট অন্তর্ভুক্ত করতে পারেন: এলোমেলো বার্তা শনাক্তকারী এবং বার্তা প্যাড করার জন্য নালগুলি বা আপনার ফাংশনটি নিজে থেকে কিছু এলোমেলো সংখ্যা তৈরি করতে পারে।
  • অঙ্ক এবং অক্ষরের সঠিক সংখ্যার (5-সংখ্যার বার্তা শনাক্তকারী, মূল বাক্যাংশের জন্য কমপক্ষে 20 ডিজিট ইত্যাদি) সমেত আপনি সমস্ত ইনপুটগুলি বৈধ বলে ধরে নিতে পারেন। আপনি ধরে নিতে পারেন যে আপনার স্ট্রিংগুলিতে (বার্তা এবং কীওয়ার্ডগুলি) ইতিমধ্যে সমস্ত বিরামচিহ্ন এবং স্থানগুলি মুছে ফেলা হয়েছে যা আপনি আপনার সংস্করণে অনুমতি দিচ্ছেন তা বাদ দিয়ে এবং সেই সংখ্যা ইতিমধ্যে সংখ্যার চিহ্ন দ্বারা চিহ্নিত করা হয়েছে।
  • প্রথম কীওয়ার্ডটিতে এর সদৃশ অক্ষর থাকা উচিত নয় এবং আপনার কোডে আপনি ধরে নিতে পারেন যে এটির সদৃশ অক্ষর কখনও নেই।
  • আপনি যে ভাষাটি এনকোড করতে ব্যবহার করেন তা বিবেচ্য নয়, যতক্ষণ না ভাষাটি পূর্ববর্তী হয় ততক্ষণ বর্ণমালা পূর্ববর্তী হয় এবং আপনি নিজের উত্তরে কোন ভাষাটি ব্যবহার করেন তা নির্দিষ্ট করে।
  • আপনার স্ট্র্যাডলিং চেকবোর্ডের জন্য আপনি যে কোনও বর্ণমালা নিযুক্ত করেন, আপনি চেকারবোর্ডটি প্যাড করতে প্রতীক যুক্ত বা সরিয়ে ফেলতে পারেন। আপনি সেই চিহ্নগুলি কী ব্যবহার করেন তা নির্দিষ্ট করুন (উদাহরণস্বরূপ, বিরামচিহ্ন, একটি পৃথক "বার্তা শুরু" প্রতীক, সাধারণ শব্দের জন্য চিহ্ন)। আপনি সংখ্যার চিহ্নটি সম্পূর্ণরূপে অগ্রাহ্য করতে পারেন এবং সংখ্যার বানান করতে পারেন বা প্রতিটি অঙ্কটি চেকবোর্ডে অন্তর্ভুক্ত করে স্লটটি ব্যবহার করে যেখানে নম্বর সাইনটি অন্য কোনও কিছুর জন্য ছিল। আপনার উত্তরে আপনি কোন চেকবোর্ড ব্যবহার করেছেন তা নির্দিষ্ট করুন।
  • আউটপুটটি হয় স্থান-বিচ্ছিন্ন পাঁচ-অঙ্কের গোষ্ঠীর একটি স্ট্রিং, পাঁচ-সংখ্যার পূর্ণসংখ্যার একটি তালিকা বা অনুরূপ কিছু হওয়া উচিত।
  • আমি জিরো-ইনডেক্সিং ব্যবহার করেছি 0123456789এবং আমার উদাহরণে। আপনি নিজের উত্তরটিতে 1-ইনডেক্সিং এবং 1234567890, বা অন্য কোনও সিস্টেম ব্যবহার করতে পারেন , যতক্ষণ আপনি কী ব্যবহার করেছেন তা নির্দিষ্ট করে।

এখানে একটি হল Ideone উদাহরণ স্বরূপ বাস্তবায়ন

এটি একটি দীর্ঘ পোস্ট এবং আমি এটি বেশিরভাগ হাত দিয়ে লিখেছি, সুতরাং যদি এই পোস্টে কোনও বিভ্রান্তিকর অংশ থাকে বা আমার গণনা এবং স্থানান্তরের কোনও ত্রুটি রয়েছে তবে দয়া করে আমাকে জানান। শুভকামনা এবং ভাল গল্ফিং!


1
adding the first two digits without addingতুমি বোঝাতে চাও?
isaacg

হ্যাঁ, আমি করেছি সম্পাদনা করা হয়েছে।
শার্লক

আপনি কী বলতে চেয়েছেন without borrowingএবং কী বোঝাতে পারেন without carrying? আপনি কি অ্যাড এবং বিয়োগ মোড 10অর্থাত্ (6+7) mod 10 = 3এবং (6-8) mod 10 = 8?
আর কাপ,

@ আর কেপ হ্যাঁ, আমাকে এটি পরিষ্কার করতে দিন।
শার্লক

আমাদের কি সংখ্যা নির্ধারণ করতে হবে?
আর কাপ,

উত্তর:


10

পাইথন 3 , 1423 1348 1324 1316 1300 1286 1250 1249 1209 1206 1204 বাইট

এটি অবশ্যই আমার দীর্ঘতম গল্ফ এবং একমাত্র গল্ফ যেখানে আমি এক-চরিত্রের ভেরিয়েবলের নাম না নিয়ে গুরুতরভাবে উদ্বিগ্ন ছিলাম। গল্ফিং পরামর্শ স্বাগত জানাই। এটি অনলাইন চেষ্টা করুন!

আমি অতিরিক্ত অক্ষরের সাথে বড় হাতের ল্যাটিন বর্ণমালা .এবং #এনডেক্সিং ব্যবহার করে এবং 0123456789রূপান্তর gকরার সময় এনকোড করছি t। আমার চেকবোর্ডটি নীচের উদাহরণের মতো ফর্ম্যাটে রয়েছে:

  2 9 7 4 5 8 3 1 0 6    # C
  S E N A T O R I        # keyword
0 B D G J L P U W Y .    # remaining alphabet arranged in columns
6 C F H K M Q V X Z #    # . and # at the end

সম্পাদনা করুন: -63৪ বাইটগুলি এক-বর্ণের ভেরিয়েবলগুলির সাথে ঘন ঘন ব্যবহৃত ফাংশনগুলি ছোট করার জন্য টুক্কাক্সের পরামর্শকে ধন্যবাদ জানায়। -12 বাইট তৈরি থেকেa, g, tআরও কমপ্যাক্ট ।

সম্পাদনা: মধ্যবর্তী কীগুলির জন্য পরিবর্তনশীল নামগুলি কেবলমাত্র একবার ব্যবহার করা হয়, নামগুলি মুছে ফেলা থেকে -24 বাইট তৈরি করা a, g, s, S, k, K

সম্পাদনা করুন: -74 সংহতকরণ থেকে বাইট H(), T() and C()

সম্পাদনা: -1 পরিবর্তন তাদের পরামর্শের জন্য নিক ক তে বাইট ধন্যবাদ ord(s[i])+ord(s[i+1])করার sum(map(ord,s[i:i+2]))। 2 +=[a]কলগুলিতে পরিবর্তন থেকে 2 বাইট +=a,G()সর্বনিম্নের সূচকটি কীভাবে পাওয়া যায় তা পরিবর্তন করে -১13 বাইট s। -২ বাইট পরিবর্তন y=(y+1)%vথেকে y=-~y%v। নির্ধারিত থেকে -15 বাইটk.index() থেকে K। -4 বরাদ্দ থেকে বাইট 10থেকে W। -5 বরাদ্দ থেকে বাইট 1-I(d[-1])থেকে Xভিতরে V। পুনর্লিখনের C()মূল লুপ থেকে -3 বাইট পুনর্গঠন থেকে -2 বাইট T()

I=int;L=list;E=len;R=range;B=str;J=''.join;W=10
def H(s,e):
 for i in R(e-E(s)):s+=chr(48+sum(map(ord,s[i:i+2]))%32%W)
 return s
def Q(s):
 r=[0]*E(s);s=L(s)
 for z in R(E(s)):b=s.index(min(s));r[b]=z;s[b]="~"
 return r
def T(x,k,d=0):
 u=E(x);v=E(k);g=R(v);K=k.index;n=u//v+1;w=[];e=r=y=0;i=K(y);c=[]
 if d:
  while r<n:
   if r>n-1:i=min(i,(u%v or v))
   w+=L(x[e:e+i]),;e+=i;i+=1;r+=1
   if i>v:y=-~y%v;i=K(y)
  r=y=0;i=v-K(y)
  while r<n:
   w[r]+=L(x[e:e+i]);e+=i;i-=1;r+=1
   if i<1:y+=1;i+=v-K(y);r+=1
  w[-1]+=['']*(v-E(w[-1]))
  for j in g:c+=J(z[j]for z in w),
 else:c=[x[i::v]for i in g]
 s=[0]*v
 for f in g:s[k[f]]=c[f]
 return J(s)
def C(m,s,w,n):
 t={".":s[-2:],"#":s[-1]*2};j=z=0
 for x in R(26):
  v=chr(x+65)
  if v in w:t[v]=s[w.index(v)]
  else:t[v]=s[z-2]+s[j];j+=z;z=-~z%2
 r=J(i.isdigit()and i or t[i]for i in m)
 return r+n[:-E(r)%5]
def V(m,w,P,d,A,M,n):X=1-I(d[-1]);t=J(B(Q(P[W:20])[I(J(B((I(H(J(B((I(M[i])-I(d[i]))%W)for i in R(5)),W)[i])+I(Q(P[:W])[i]))%W)for i in R(W))[i])])for i in R(W));u=H(t,60)[W:];p=A+I(u[-2]);v=T(u,Q(t));z=T(T(C(m,J(B(i)for i in Q(u[40:])),w,n),Q(v[:p])),Q(v[p:p+A+I(u[-1])]),1);e=[z[5*i:5*-~i]for i in R(-(-E(z)//5))];return' '.join(e[:X]+[M]+e[X:])

Ungolfing:

def chain_add(seq, end):
    for i in range(end - len(seq)):
        seq += chr(48+sum(map(ord,seq[i:i+2]))%32%10)
    return seq

def sequent(seq):
    res = [0]*len(seq)
    seq = list(seq)
    for z in range(len(seq)):
        b = seq.index(min(seq))
        res[b] = z
        seq[b] = "~"
    return res

def transpose(text, keys, disrupt=False):
    if disrupt:
        num_rows = len(text) // len(keys) + 1
        len_last = len(text) % len(keys)
        if len_last == 0:
            len_last = len(keys)
        d_rows = []
        text_index = 0
        current_row = 0
        stop_key = 0
        stop_index = keys.index(stop_key)
        while current_row < num_rows:
            if current_row > num_rows-1:
                stop_index = min(stop_index, len_last)
            d_rows += [list(text[text_index:text_index+stop_index])]
            text_index += stop_index
            stop_index += 1
            if stop_index>len(keys):
                stop_key = (stop_key+1) % len(keys)
                stop_index = keys.index(stop_key)
            current_row += 1
        current_row = 0
        stop_key = 0
        stop_len = len(keys) - keys.index(stop_key)
        while current_row < num_rows:
            d_rows[current_row] += list(text[text_index:text_index+stop_len])
            text_index += stop_len
            stop_len -= 1
            if stop_len < 1:
                stop_key += 1
                stop_len = len(keys) - keys.index(stop_key)
                current_row += 1
            current_row += 1
        d_rows[-1] += ['']*(len(keys)-len(d_rows[-1]))
        columns = []
        for j in range(len(keys)):
            columns += [''.join(i[j]for i in d_rows)]
    else:
        columns = ['']*len(keys)
        for t in range(len(text)):
            columns[t%len(keys)] += text[t]
    res = [0]*len(keys)
    for index in range(len(keys)):
        res[keys[index]] = columns[index]
    return''.join(res)

def checkerboard(message, seq, word, null):
    trans = {".":seq[-2:], "#":seq[-1]*2};res='';j=z=0
    for x in range(26):
        v = chr(x + 65)
        if v in word:
            trans[v] = seq[word.index(v)]
        else:
            trans[v] = seq[z-2] + seq[j]
            j += z
            z = (z+1) % 2
    for i in message:
        if i.isdigit():
            res += i
        else:
            res += trans[i]
    return res + null[:-len(res)%5]

def vic_cipher(message, keyword, phrase, date, agent, m_id, null):
    s1 = sequent(phrase[:10])
    s2 = sequent(phrase[10:20])
    a = ''.join(str((int(m_id[i])-int(date[i]))%10) for i in range(5))
    g = ''.join(str((int(a[i])+int(s1[i]))%10) for i in range(10))
    t = ''.join(str(s2[int(g[i])]) for i in range(10))
    u = chain_add(t,60)[10:]
    p = agent+int(u[-2])
    q = agent+int(u[-1])
    seqT = sequent(t)
    v = transpose(u,seqT)
    k1 = sequent(v[:p])
    k2 = sequent(v[p:p+q])
    c = ''.join(str(i)for i in sequent(u[40:]))
    x = checkerboard(message,c,keyword,null)
    y = transpose(x,k1)
    z = transpose(y,k2,1)
    e = [z[5*i:5*(i+1)] for i in range(-(-len(z)//5))]
    X = 1-int(date[-1])
    return ' '.join(e[:X] + [m_id] + e[X:])

2
পাইথন 3 ইউনিকোড অক্ষরগুলিকে ভেরিয়েবল, এফওয়াইআই হিসাবে অনুমতি দেয়।
পল

পরিবর্তন ord(seq[i])+ord(seq[i+1])করার জন্য sum(map(ord,seq[i:i+2]))1 টি অক্ষর আমি বিশ্বাস করি পরিমাণ সঞ্চয় হয়।

3

সি, 2880 2769 2766 2762 2743 2741 2739 2699 2458 বাইট

#include<stdio.h>
#define m(x)malloc(x)
#define Y(x)strlen(x)
typedef int i;typedef char*c;c _(c A,i B,i D){if(D>=B){return A;}c C=m(Y(A)+2);sprintf(C,"%s%c",A,48+(A[D]+A[D+1]-96)%10);return _(C,B,D+1);}c l(c A){i J=Y(A);c P=m(J+2);for(i m=0;m<J;m++){P[m]=32;}for(i v=0;v<J;v++){char G;i R;for(i u=0;u<J;u++){R=u<1|A[u]<G?u:R;G=u<1|A[u]<G?A[u]:G;}P[R]=48+v;c V=m(J);for(i t=0;t<J;t++){V[t]=t!=R?A[t]:97;}A=V;}return P;}c S(c C,c N,c I,char U){srand(time(NULL));i M=Y(I);i O=Y(N);i R=rand()%M;c Q=m(M+1);for(i u=R;u<M;u++){Q[u-R]=I[u];}Q[M-R]=46;for(i H=0;H<R;H++){Q[H+M-R+1]=I[H];}c g=m(28);c V=m(28);strcat(V,C);sprintf(g,"%s%s",N,"BCDFGHJKLMPQUVWXYZ.#");i B=Y(N);for(i q=B;q<10;q++){for(i x=0;x<10;x++){char J[2]={C[q],C[x]};V[B]=48+atoi(J);B++;}}c w=m(M*2+4);for(i J=0;J<=M;J++){i K=0;for(i X=0;X<28;X++){if(Q[J]==g[X]){char F[3];sprintf(F,"%d",V[X]-48);strcat(w,F);K=1;}}if(K<1){w[Y(w)]=Q[J];}}i f=Y(w);if(f%5>0){c P=m(5-f%5);for(i E=0;E<5-f%5;E++){P[E]=U;}strcat(w,P);}return w;}c a(c I,c U){i M=Y(I),K=Y(U);c T=m(M);i F=0;for(i b=0;b<K;b++){for(i y=0;y<K;y++){if(U[y]==48+b){for(i u=y;u<M;u+=K){T[F]=I[u];F++;}}}}return T;}c da(c I,c K){i e=Y(I),k=Y(K);c T=m(e);for(i y=0;y<e;y++){T[y]=32;}i F,P;F=P=0;for(i u=0;u<k;u++){for(i v=0;v<k;v++){T[F]=I[P];P++;F++;if(K[v+1]-48==u){for(i C=1;C<k-v;C++){F+=k-v-C;for(i E=0;E<=v+C;E++){if(F<e&P<e){T[F]=I[P];}F++;P++;}}break;}}if(F>e){break;}}i U=0;for(i g=0;g<e;g++){U=T[g]-48<10&-1<T[g]-48?U+1:U;}for(i j=U;j<e;j++){for(i x=0;x<e;x++){if(T[x]==32){T[x]=I[j];break;}}}return a(T,K);}En(c n,c m,c k,i d,c v,c s,char u){c S1,S2;S1=m(10);S2=m(10);for(i i=0;i<20;i++){if(i<10){S1[i]=k[i];}else{S2[i-10]=k[i];}}S1=l(S1);S2=l(S2);c M=m(5);for(i i=4;i>-1;i--){M[i]=48+(s[i]-v[i])%10;}c G=_(M,5,0);for(i y=0;y<10;y++){G[y]=48+(S1[y]+G[y]-96)%10;}c N="0123456789";c T=m(10);for(i q=0;q<10;q++){for(i t=0;t<10;t++){if(N[t]==G[q]){T[q]=S2[t];}}}c Z=_(T,50,0);c U=m(50);for(i h=0;h<50;h++){U[h]=Z[h+10];}i p,q;for(i b=49;b>10;b++){if(U[b]!=U[b-1]){q=d+U[b]-48;p=d+U[b-1]-48;break;}}c V=m(50);i Ct=0;for(i j=0;j<10;j++){for(i o=0;o<10;o++){if(l(T)[o]==48+j){for(i x=o;x<o+41;x+=10){V[Ct]=U[x];Ct+=1;}}}}c K1=m(p);c K2=m(q);for(i D=0;D<p+q;D++){if(D<p){K1[D]=V[D];}else{K2[D-p]=V[D];}}K1=l(K1);K2=l(K2);c C=m(10);for(i b=40;b<50;b++){C[b-40]=U[b];}C=l(C);c t=da(a(S(C,m,n,u),K1),K2);i O=0;for(i B=0;B<Y(t)/5+1;B++){if(B==Y(t)/5-v[Y(v)-1]+49){printf("%s ",s);}else{for(i J=O;J<O+5;J++){printf("%c",t[J]);}printf(" ");O+=5;}}}

আমার গোশ এটি আমার দীর্ঘতম কর্মসূচি কি কখনো গলফ ছিল। এটিও প্রথম যেটিতে আমি বিশ্বব্যাপী সুযোগের জন্য একক-চরিত্রের পরিবর্তনশীল নামগুলি ছড়িয়ে দিয়েছি এবং তাই কয়েকটি 2 টি অক্ষর ব্যবহার করে এগিয়ে যেতে হয়েছিল (সত্য যে আমি ভেরিয়েবলগুলি পুনরায় বিবরণ করতে পারি না) এটি ব্যবহার করে না। গল্ফিং টিপস তাই খুব প্রশংসা করা হয়।

Ungolfed

গল্ফযুক্ত সংস্করণটির বিপরীতে কোনও সতর্কতা ছাড়াই সংকলন করুন। গল্ফযুক্ত সংস্করণে করা ছোটখাটো পরিবর্তনগুলি এই অলগীয় সংস্করণে প্রতিফলিত হবে না।

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

char*Chain_Add(char*String,int End,int Start){
  if(Start>=End){return String;}
  char*C=malloc(strlen(String)+2);
  sprintf(C,"%s%c",String,'0'+(((String[Start]-'0')+(String[Start+1]-'0'))%10));
  return Chain_Add(C,End,Start+1);
}

char*Sequent(char*String){
  int J=strlen(String);
  char*P=malloc(J+2);
  for(int m=0;m<J;m++){
    P[m]=' ';
  }
  for(int v=0;v<J;v++){
    char G;
    int R;
    for(int u=0;u<J;u++){
      R=(u<1||String[u]<G)?u:R;
      G=(u<1||String[u]<G)?String[u]:G;
    }
    P[R]='0'+v;
    char*V=malloc(J);
    for(int t=0;t<J;t++){
      if(t!=R){
    V[t]=String[t];
      }
      else{
    V[t]='a';
      }
    }
    String=V;
  }
  return P;
}

char*Straddling_Checkerboard(char*C,char*Key,char*Message,char null){
  srand(time(NULL));
  int Msg_Len=strlen(Message);
  int Key_Len=strlen(Key);
  int R=rand()%Msg_Len;
  char*Q=malloc(Msg_Len+1);
  for(int u=R;u<Msg_Len;u++){
    Q[u-R]=Message[u];
  }
  Q[Msg_Len-R]='.';
  for(int H=0;H<R;H++){
    Q[H+Msg_Len-R+1]=Message[H];
  }
  char*Alphabet=malloc(26);
  for(int W=0;W<26;W++){
    Alphabet[W]='A'+W;
  }
  int q=0;
  char*e=malloc(Key_Len);
  for(int z=0;z<Key_Len;z++){
    if(strchr(e,Key[z])!=NULL){
      q++;
    }
    else{
      e[z-q]=Key[z];
    }
  }
  int r=0;
  for(int h=0;h<26;h++){
    if(strchr(e,Alphabet[h-r])!=NULL){
      for(int X=h-r;X<26;X++){
    Alphabet[X]=Alphabet[X+1];
      }
      r++;
    }
  }
  char*Checkerboard=malloc(28);
  for(int i=0;i<26;i++){
    if(i<strlen(e)){
      Checkerboard[i]=e[i];
    }
    else{
      Checkerboard[i]=Alphabet[i-strlen(e)];
    }
  }
  Checkerboard[26]='.';
  Checkerboard[27]='#';
  char*Values=malloc(28);
  strcat(Values,C);
  int B=strlen(e);
  for(int q=B;q<10;q++){
    for(int x=0;x<10;x++){
      char J[2]={C[q],C[x]};
      Values[B]='0'+atoi(J);
      B++;
    }
  }
  char*Encoded=malloc(Msg_Len*2+4);
  for(int J=0;J<=Msg_Len;J++){
    int K=0;
    for(int X=0;X<28;X++){
      if(Q[J]==Checkerboard[X]){
    char F[3];
    sprintf(F,"%d",Values[X]-'0');
    strcat(Encoded,F);
    //printf("F = %s while Q[J] = %c and Checkerboard[X] = %c and Encoded = %s\n",F,Q[J],Checkerboard[X],Encoded);
    K=1;
      } 
    }
    if(K<1){
      Encoded[strlen(Encoded)]=Q[J];
    }
  }
  int Encded_Len=strlen(Encoded);
  if(Encded_Len%5>0){
    char*P=malloc(5-Encded_Len%5);
    for(int E=0;E<5-Encded_Len%5;E++){
      P[E]=null;
    }
  strcat(Encoded,P);
  }
  return Encoded;
}

char*Transpose(char*Message,char*K1){
  int Msg_Len=strlen(Message),K1_Len=strlen(K1);
  char*T=malloc(Msg_Len);
  int F=0;
  for(int i=0;i<K1_Len;i++){
    for(int y=0;y<K1_Len;y++){
      if(K1[y]=='0'+i){
    for(int u=y;u<Msg_Len;u+=K1_Len){
      T[F]=Message[u];
      F++;
    }
      }
    }
  }
  return T;
}

char*Disrupted_Transpose(char*Message,char*K2){
  int Msg_Len=strlen(Message),K2_Len=strlen(K2);
  char*T=malloc(Msg_Len);
  for(int y=0;y<Msg_Len;y++){
    T[y]=' ';
  }
  int F=0;
  int P=0;
  for(int u=0;u<K2_Len;u++){
    for(int v=0;v<K2_Len;v++){
      T[F]=Message[P];
      P++;F++;
      if(K2[v+1]-'0'==u){
        for(int C=1;C<K2_Len-v;C++){
      F+=K2_Len-v-C;
      for(int E=0;E<=v+C;E++){
        if(F<Msg_Len&P<Msg_Len){
          T[F]=Message[P];
        }
        F++;P++;
      }
    }
    break;
      }
    }
    if(F>Msg_Len){
      break;
    }
  }
  int U=0;
  for(int g=0;g<Msg_Len;g++){
    U=(T[g]-'0'<10&-1<T[g]-'0')?U+1:U;
  }
  for(int j=U;j<Msg_Len;j++){
    for(int x=0;x<Msg_Len;x++){
      if(T[x]==' '){
    T[x]=Message[j];
    break;
      }
    }
  }
  return Transpose(T,K2);
}

void VIC_Encoder(char*Message,char*Phrase,char*Key,int a_id,char*date,char*m_id,char null){
  char*S1=malloc(10);
  char*S2=malloc(10);
  for(int i=0;i<20;i++){
    if(i<10){
      S1[i]=Key[i];
    }
    else{
      S2[i-10]=Key[i];
    }
  }
  S1=Sequent(S1);
  S2=Sequent(S2);
  char*M=malloc(5);
  for(int i=4;i>-1;i--){
    M[i]='0'+(((m_id[i]-'0')-(date[i]-'0'))%10);
  }
  char*G=Chain_Add(M,5,0);
  for(int y=0;y<10;y++){
    G[y]='0'+(((S1[y]-'0')+(G[y]-'0'))%10);
  }
  char*N="0123456789";
  char*T=malloc(10);
  for(int q=0;q<10;q++){
    for(int t=0;t<10;t++){
      if(N[t]==G[q]){
    T[q]=S2[t];
      }
    }
  }
  char*Z=Chain_Add(T,50,0);
  char*U=malloc(50);
  for(int h=0;h<50;h++){
    U[h]=Z[h+10];
  }
  int p,q;
  for(int b=49;b>10;b++){
    if(U[b]!=U[b-1]){
      q=a_id+(U[b]-'0');
      p=a_id+(U[b-1]-'0');
      break;
    }
  }
  char*seqT=Sequent(T);
  char*V=malloc(50);
  int Count=0;
  for(int j=0;j<10;j++){
    for(int o=0;o<10;o++){
      if(seqT[o]=='0'+j){
    for(int x=o;x<o+41;x+=10){
      V[Count]=U[x];
      Count+=1;
    }
      }
    }
  }
  char*K1=malloc(p);
  char*K2=malloc(q);
  for(int D=0;D<p+q;D++){
    if(D<p){
      K1[D]=V[D];
    }
    else{
      K2[D-p]=V[D];
    }
  }
  K1=Sequent(K1);
  K2=Sequent(K2);
  char*C=malloc(10);
  for(int b=40;b<50;b++){
    C[b-40]=U[b];
  }
  C=Sequent(C);
  char*Transposed_2=Disrupted_Transpose(Transpose(Straddling_Checkerboard(C,Phrase,Message,null),K1),K2);
  int O=0;
  for(int B=0;B<strlen(Transposed_2)/5+1;B++){
    if(B==strlen(Transposed_2)/5-date[strlen(date)-1]+'1'){
      printf("%s ",m_id);
    }
    else{
      for(int J=O;J<O+5;J++){
    printf("%c",Transposed_2[J]);
      }
      printf(" ");
      O+=5;
    }
  }
}

মন্তব্য

  • বার্তাটি এনকোড করতে এটি নীচের মতো একটি চেকবোর্ড ব্যবহার করে:

      3 4 5 6 2 3 4 5 6 7
      S E N A T O R I     
    6 B C D F G H J K L M 
    7 P Q U V W X Y Z . #
    
  • এটি ধরে নেওয়া হয় যে সমস্ত প্রযোজ্য স্ট্রিংগুলি বড় হাতের মধ্যে দেওয়া হয়। বার্তা সব যতিচিহ্ন থাকা উচিত সময়সীমার ছাড়া মুছে ফেলেছি এবং দ্বারা demarcated সমস্ত নম্বর #, এস যখন কি ফ্রেজ থাকা উচিত সব বিরামচিহ্ন মুছে ফেলা ।

  • ফলাফলযুক্ত এনকোডযুক্ত বার্তাটি স্পেস-বিভক্ত পাঁচ-অঙ্কের গোষ্ঠীর স্ট্রিং হিসাবে STDOUT এ আউটপুট।

  • ইনপুট বার্তাটি ইংরেজিতে হওয়া উচিত।

  • আমি ব্যবহৃত কয়েকটি ফাংশনগুলি একত্রিত করতে পারতাম, তবে তারপরে আমাকে আরও দুটি-অক্ষরের ভেরিয়েবল নাম ব্যবহার করতে হবে, চূড়ান্ত প্রোগ্রামটি আরও কয়েকটি ফাংশনের সাথে দীর্ঘায়িত করে তুলবে।

  • এটি বর্তমানে ধরে নিচ্ছে না যে কীওয়ার্ড (সর্বনিম্ন ইংরেজী ভাষায়) সর্বদা একই বর্ণের সেট থাকে এবং তাই সদৃশগুলি মুছে ফেলা, চেকারবোর্ডে হেরফের করে ইত্যাদির মাধ্যমে এটি তৈরি করে, সম্ভবত এই ক্ষমতা ওপি দ্বারা প্রয়োজন হয় না, সুতরাং আমি বর্তমানে অতিরিক্ত, অযৌক্তিক বাইটগুলি গ্রহণ করছি। গল্ফ সংস্করণ জন্য আপডেট করা।


2

জাভাস্ক্রিপ্ট (ES6), 946 938 953 বাইট

V=(c,d,f,g,j,k,m)=>{S=a=>a.split``,J=a=>a.join``,A=(a,b)=>{for(i=0;a[L="length"]<b;a+=(a[i++]- -a[i])%h);return a},Q=b=>(a=S(b).sort(),S(b).map(b=>a[i=a[X="indexOf"](b)]=i)),u=A(t=J(S(A(J(S(k).map((a,b)=>Math.abs(a-g[b]))),h=10)).map((a,b)=>Q(f[C="slice"](h,20))[(Q(f[C](0,h))[b]- -a)%h])),60)[C](h),T=((a,b,c)=>{if(r=Array(l=b[L]).fill(""),c){for(e=a[L]/l,i=0,w=[],u=R=b[X](x=0);i<e;)w[i++]=a[P](0,R++),u?u=0:R>l||(R=b[X](u=++x));for(i=0;i<e;)w[i]=J(w[i].concat(a[P](0,l-w[i++][L])));a=J(w)}for(i in a)r[+b[i%l]]+=a[i];return r}),v=J(T(u,Q(t))),q=J(Q(u[C](-h))),t="ABCDEFGHIJKLMNOPQRSTUVWXYZ#".match(new RegExp("[^"+d+"]","g")),t[P="splice"](9,0,"."),M=[];for(i in t)M[t[i]]=q[8^i/h]+(M[d[i]]=q[i%h]);for(n=c[L],b=J((c[C](n-=new Date%n)+"."+c[C](0,n)).split(/ |/).map(a=>M[a]||a)),b+=m.repeat(5-b[L]%5),i=f=q=49;f==q;)f=+u[i-1]+j,q=+u[i++]+j;return t=J(T(S(J(T(b,Q(v[C](0,f))))),Q(v.substr(f,q)),1)).match(/.{5}/g),g=-g[C](-1),g++&&t[P](g||t[L],0,k),t}

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

ডেমো স্নিপেট

সম্পাদনা করুন: -8 বাইট

বুঝতে পারছি ফাংশনটির চারপাশে অতিরিক্ত বন্ধনী রয়েছে S,J,A,Q

সম্পাদনা করুন: +15 বাইট

কীভাবে এটির জন্য যুক্তি আপডেট করা হয়েছে message idচূড়ান্ত বার্তায় স্থাপন (এখন 1-সূচকযুক্ত এবং 0 এটি আউটপুটে অন্তর্ভুক্ত করে না)।

Ungolfed

chainAdd = (s,l)=>{for(i=0;s.length<l;s+=(s[i++]- -s[i])%10);return s;}

sequentialize = (s)=> {
    a=s.split('').sort();
    return s.split('').map(c=>(i=a.indexOf(c),a[i]='',i));  
}

transpose = (s,k,disruptive)=>{
    var result=Array(k.length).fill('')
    if(disruptive){
        rows=[]
        k_index=0;
        rowLength=k.indexOf(k_index);
        triangling=!rowLength;

        expectedRows = s.length/k.length
        for(row=0;row<expectedRows;row++){
            rows[row]=s.splice(0,rowLength++)
            if(triangling){     
                if(rowLength>k.length){
                    triangling=false;
                    rowLength=k.indexOf(++k_index)              
                }
            }
            else{               
                triangling=true;
            }
        }

        for(row=0;row<expectedRows;row++){
            rows[row]= rows[row].concat(s.splice(0,k.length-rows[row].length)).join('')
        }
        s=rows.join('')
    }
    for(i in s)
        result[+k[i%k.length]]+=s[i];   
    return result;
}

checkerboard =(message,seq, keyword, nulls)=>{  
    t='ABCDEFGHIJKLMNOPQRSTUVWXYZ#'.match(new RegExp('[^'+keyword+']','g'));
    t.splice(9,0,'.')

    map=[]
    for(i in t)
        map[t[i]]=(seq[8^(i/10)])+(map[keyword[i]]=seq[i%10])

    r = new Date%message.length;
    rotateMessage=message.substr(message.length-r)+'.'+message.substr(0,message.length-r)

    result =rotateMessage.split(/ |/).map(x=>map[x]||x).join('');
    result+=nulls.repeat(5-result.length%5)

    return result;
}

vic = (message, keyword, phrase, date, agent, m_id, nulls)=>{
    s1=sequentialize(phrase.substr(0,10))//.join('')
    s2=sequentialize(phrase.substr(10,10))//.join('')

    r = m_id.split('').map((x,i)=>Math.abs(x-date[i])).join('')
    g = chainAdd(r,10).split('').map((x,i)=>(s1[i]- -x)%10);

    t = g.map(i=>s2[+i]).join('');
    u=chainAdd(t,60).substr(10)

    var p,q;
    for(i=49;p==q;i++){
        p=agent + +u[i-1];
        q=agent + +u[i];
    }
    seqT = sequentialize(t);
    v=transpose(u,seqT).join('');

    k1 = sequentialize(v.substr(0,p));
    k2 = sequentialize(v.substr(p,q));
    c  = sequentialize(u.substr(-10)).join('')

    CB =checkerboard(message,c, keyword, nulls);
    t1=transpose(CB,k1).join('')
    t2=transpose(t1.split(''),k2,1).join('').match(/.{5}/g);
    (d=-date.substr(-1))&&t2.splice((d+1)||t2.length,0,m_id);
    return t2;
}

মন্তব্য

  • বার্তাটি এনকোড করতে এটি নীচের মতো একটি চেকবোর্ড ব্যবহার করে:

      3 1 0 5 9 6 8 7 2 4
      S E N A T O R I
    2 B C D F G H J K L .
    4 M P Q U V W X Y Z #
    
  • সমস্ত স্ট্রিং বড় হাতের মধ্যে দেওয়া হয়। বার্তাটি বর্ণানুক্রমিক লাতিন (প্লাস .এবং #) এবং সমস্ত বিরামচিহ্ন (পিরিয়ড ব্যতীত) মুছে ফেলা উচিত। সমস্ত নম্বর ইতিমধ্যে #গুলি দিয়ে চিহ্নিত করা উচিত । মূল বাক্যাংশে সমস্ত বিরামচিহ্ন / স্পেস মুছে ফেলা উচিত।

  • ফলাফলের বার্তাটি 5 অঙ্কের স্ট্রিংয়ের অ্যারে হিসাবে ফিরে আসে।

উন্নতি

  • আমি মনে করি কিছু বাইট সংরক্ষণ করার জন্য "সমস্ত ভাষা" ব্যবহার করার উপায় আছে। আমার আরও সময় থাকলে আমি এটিকে আবার অনুগ্রহ করে ধরে নিলাম ভাষাটি হাওয়াইয়ান জাতীয় কিছু ছিল যার মাত্র 12 টি অক্ষর রয়েছে।

  • যে কোনও গল্ফিং পরামর্শ সর্বদা স্বাগত।


আপনি কি দয়া করে একটি স্নিপেট যোগ করতে পারেন যাতে আমি যাচাই করতে পারি যে এটি কাজ করে? যদি এটি হয় তবে আমি আপনাকে অনুগ্রহ প্রদান করতে পারি।
আর কাপ,

@ আর কেপ শিওর, আমি একটি ডেমো স্নিপেট যুক্ত করেছি
এসএলএক 49

হুম ... ডেমোতে, message identifierমনে হচ্ছে এর 7বদলে শেষ থেকে দূরে রয়েছে 6। এছাড়াও, আপনার অদ্বিতীয় সংস্করণে একইটি শেষের পরিবর্তে শুরু থেকে দূরে রয়েছে Idবলে মনে হচ্ছে । 6
আর কাপ,

@ আর কেপ হ্যাঁ আমি প্রথম এটি পোস্ট করার সময় একটি ত্রুটি ছিল (অবশ্যই এটি অবহিতদের মধ্যে স্থির করা উচিত নয়)। গল্ফযুক্তদের জন্য, আমি ধরে নিয়েছি যে 0-সূচকযুক্ত কারণ অন্যথায় যদি এর 1অর্থ খুব শেষ হয় তবে আপনি কোথায় message identifierযেতে হবে 0? আমি এটি পরিবর্তন করতে পারি আমার কেবল জানা দরকার।
SLuck49

আমি যা বলতে চাই একটি আউটপুট থেকে বাদ দেওয়া হবে। 0message identifier
আর কাপ,

1

ক্লোজার, 1197 1212 বাইট

ওহ, আমি ক্লান্ত হয়ে পড়েছি।

আপডেট: বার্তাটির প্রয়োজনীয় এলোমেলো বিভাজক অবস্থান যুক্ত করেছে, অলগরিদম সহজেই যাচাই করা যায় যাতে উল্লিখিত উদাহরণ হিসাবে একই অবস্থান ব্যবহার করে।

(defn enc[I K E D Y M](let[P split-at A concat Z zipmap R partition W mapcat % count X repeat O vector / map x(fn[C](apply / O C))G range t 10 r(G t)m(fn[i](mod i t))F(fn[[n & N]](/ last(iterate(fn[[[b & N]a]][(A N[(m(+ a b))])b])[N n])))Q(fn[S](for[i(G(% S))a[(nth S i)]](apply +(%(filter #{a}(take i S)))(for[b S :when(pos?(compare a b))]1))))[S J](/ Q(P t(take 20 E)))T(/(Z r J)(/ m(/ + S(F(/ - M D)))))U(take 50(drop t(F T)))l(last U)p(+ Y(last(remove #{l}U)))V(W(Z(Q T)(x(R t U)))r)[k j](/ Q(P p(take(+ p Y l)V)))B(into(Z(/ char(G 48 58))(G))(/(fn[i c][c(+(*(quot i 10)20)(nth(Q(reverse(take t(reverse U))))(m i)))])(G)(A(str K",,")(remove(set K)(/ char(A(G 65 91)".#"))))))?(% k)T(vec(filter some?(W(Z k(x(R ?(A(flatten(R 5(A(W str(/ B(let[[b e](P(rand-int(count I))I)](apply str(A e".. "b)))))(X 4(B\,)))))(X(dec ?)nil)))))(G ?))))w (% j)NR(+(quot(% T)w)1)L(flatten(for[k r](for[i(G(.indexOf j k)(inc w))](G i))))C(for[[r c](/ O(rest(reductions + -1(/(fn[i](get{0 1}i 0))L)))L):when(< r NR)][r c])H(R 5(filter some?(W(Z j(x(R w (A(vals(into(sorted-map)(/ O(A C(for[i(G NR)j(G w)c[[i j]]:when(not((set C)c))]c))T)))(X(dec w)nil)))))(G w))))](/(fn[p](apply str p))(let[[b e](P(-(% H)(D 6)-1)H)](A b[M]e)))))

নমুনা ইনপুট এবং পরীক্ষার কেস:

(def mymsg (clojure.string/upper-case "We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot#3#"))
(def mykey "SENATORI")
(def mypharase (clojure.string/upper-case (apply str (remove #{\space} "The first principle is that you must not fool yourself — and you are the easiest person to fool."))))
(def mydate [3 1 7 2 0 1 6])
(def mynum 9)
(def M [4 7 9 2 1])

;("61231" "12824" "71192" "58609" "92185" "48612" "14927" "22944" "34046" "13348" "04159" "38645" "70546" "20254" "22026" "64584" "21904" "47921" "90253" "42694" "42221" "56644" "14541")
(enc mymsg mykey mypharase mydate mynum M)

Ungolfed:

(defn enc[mymsg mykey mypharase mydate mynum M]
  (let[t       10
       r       (range t)
       m       (fn[i](mod i t))
       lagfib  (fn[[n & N]](map last(iterate(fn[[[b & N]a]][(concat N[(m(+ a b))])b])[N n])))
       toseq   (fn[S](for[i(range(count S))a[(nth S i)]](apply +(count(filter #{a}(take i S)))(for[b S :when(pos?(compare a b))]1))))
       [S1 S2] (map toseq(split-at t(take 20 mypharase)))
       M2      (take t(lagfib(map - M mydate)))
       G       (map m(map + S1 M2))
       Gmap    (zipmap r S2)
       T       (map Gmap G)
       U       (take 50(drop t(lagfib T)))
       L2      (last U)
       L1      (last(remove #{L2}U))
       p       (+ mynum L1)
       q       (+ mynum L2)
       seqT    (toseq T)
       V       (mapcat(zipmap seqT(apply map vector(partition t U)))r)
       [K1 K2] (map toseq(split-at p(take(+ p q)V)))
       C       (toseq(reverse(take t(reverse U))))
       B       (into(zipmap(map char(range 48 58))(range))(map(fn[i c][c(+(*(quot i 10)20)(nth C(m i)))])(range)(concat(str mykey",,")(remove(set mykey)(map char(concat(range 65 91)".#"))))))
      ;B       (into(zipmap(map char(range 48 58))(range))(map(fn[i c][c(+(nth C(quot i 3))(*(mod i 3)20))])(range)(flatten(apply map vector(partition 10(apply concat mykey",,"(apply map vector (partition 2(remove(set mykey)(map char(concat(range 65 91)".#")))))))))))
       N1      (count K1)
       mymsg   (flatten(partition 5(concat(mapcat str(map B(let[[b e](split-at 49 mymsg)](apply str(concat e".. "b)))))(repeat 4(B\,)))))
       T1      (vec(filter some?(mapcat(zipmap K1(apply map vector(partition N1(concat mymsg(repeat(dec N1)nil)))))(range N1))))
       N2      (count K2)
       NR      (+(quot(count T1)N2)1)
       cols    (flatten(for[k r](for[i(range(.indexOf K2 k)(+(count K2)1))](range i))))
       rows    (rest(reductions + -1(map(fn[i](get{0 1}i 0))cols)))
       coords  (for[[r c](map vector rows cols):when(< r NR)][r c])
       coords  (concat coords(for[i(range NR)j(range N2)c[[i j]]:when(not((set coords)c))]c))
       T2      (partition 5(filter some?(mapcat(zipmap K2(apply map vector(partition N2(concat(vals(into(sorted-map)(map vector coords T1)))(repeat(dec N2)nil)))))(range N2))))]
    (map(fn[p](apply str p))(let[[b e](split-at(-(count T2)(mydate 6)-1)T2)](concat b[M]e)))))

এটির চেকবোর্ডে একটি বিকল্প বাস্তবায়ন রয়েছে Bযা কার্য সংজ্ঞা অনুসারে একই। তবে জমাটি অন্য একটি ব্যবহার করে যাতে অব্যবহৃত বর্ণমালা প্রথমে কলাম-বাই-কলাম পূরণ করার পরিবর্তে ২ য় সারিতে এবং তারপরে তৃতীয়টি পূরণ করে।


ক্লোজার সলিউশন লিখতে বিবেচনা করা হলেও আমি প্রশ্নটি পড়ার সময় আমার মাথাটি ফেটে গেল। লিখতে কত সময় লাগল?
কারসিজিনিট

পাশে 3 ঘন্টা ইউটিউব দেখার সময়। এটি বেশ সহজ শুরু হয়েছিল তবে যখন আমি দ্বিতীয় "ব্যাহত ট্রান্সপোজেশন" প্রয়োগ করতে হয়েছিল তখন আমি হাল ছেড়ে দিতে চলেছিলাম। এখন এটি coordsদু'বার উত্পন্ন হয়, প্রথমে ত্রিভুজাকার আকৃতি তৈরি করে এবং পরে যে কোনও স্থানাঙ্ক হারিয়েছিল তা পূরণ করে filling এছাড়াও "এন এর
বহুগুণে প্যাডিংয়ের

ওহে অভিশাপ, আমি হার্ড-কোডেড স্প্লিট পয়েন্টটি পরিবর্তন করতে ভুলে গিয়েছিলাম (split-at 49 mymsg), 49 এর মতো কিছু হওয়া উচিত (rand-int(count mymsg))তাই সঠিক উত্তরটি 1200 বাইটের বেশি হবে। zzz
NikoNyrh

অভিশাপ। সম্ভবত এখনও সি উত্তর চেয়ে কম।
কারসিজেনেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.