বাইনারি এনক্রিপশন


11

এটি xkcd # 153 এর উপর ভিত্তি করে ।

একটি প্রোগ্রাম বা নামকৃত ফাংশন তৈরি করুন যা 2 টি প্যারামিটার নেয়, যার প্রতিটি স্ট্রিং বা বাইট বা অক্ষরের তালিকা বা অ্যারে। দ্বিতীয় প্যারামিটারে কেবল অক্ষর lrfu(বা সমতুল্য ASCII বাইটস) থাকবে। এটি প্রথম প্যারামিটারের দ্বারা প্রতিনিধিত্ব করা কিছুটা ক্রম অনুসারে নির্দেশের একটি সিরিজ হিসাবে ব্যাখ্যা করা উচিত।

সম্পাদিত প্রক্রিয়াজাতকরণ অবশ্যই নিম্নলিখিত সমতুল্য হতে হবে:

  1. প্রথম প্যারামিটারকে প্রতিটি চরিত্রের বিটগুলি সমন্বিত করে গঠিত একক বিটস্ট্রিংয়ে রূপান্তর করুন ((-বিট ASCII এর মধ্যে একটি হিসাবে ব্যাখ্যা করা, একটি 8-বিট প্রসারিত ASCII, বা একটি মানক ইউনিকোড এনকোডিং)। উদাহরণস্বরূপ যদি প্রথম প্যারামিটারটি হয় "AB"তবে এটি 10000011000010(7-বিট) এর মধ্যে একটি 0100000101000010(8-বিট বা ইউটিএফ -8) 00000000010000010000000001000010, বা 01000001000000000100001000000000(দুটি সমাপ্তির মধ্যে ইউটিএফ -16) ইত্যাদি হবে etc.
  2. দ্বিতীয় প্যারামিটারের প্রতিটি চরিত্রের জন্য, যথাযথভাবে নির্দেশাবলী কার্যকর করুন:
    • lবিটস্ট্রিং বাম দিকে ঘোরান। যেমন 10000011000010হয়ে যায় 00000110000101
    • rবিটস্ট্রিং ডানদিকে ঘোরান। যেমন 10000011000010হয়ে যায় 01000001100001
    • fবিটস্ট্রিংয়ে প্রতিটি বিট উল্টে (বা বিপরীতগুলি) যেমন 10000011000010হয়ে যায় 01111100111101
    • uবিটস্ট্রিং বিপরীত। যেমন 10000011000010হয়ে যায় 01000011000001
  3. বিটস্ট্রিংকে ASCII স্ট্রিংয়ে রূপান্তর করুন যা প্রতি বিটে একটি অক্ষর ব্যবহার করে। যেমন 10000011000010হয়ে যায় "10000011000010"। এটি কারণ 7/8 বিটের সমস্ত সেটগুলিতে একটি চরিত্র নির্ধারিত হয় না।

উদাহরণ (পাইথনে):

>>> f("b", "rfu")
01110011

এটি "b"তার 8-বিট ASCII বাইনারি উপস্থাপনায় রূপান্তরিত করে 01100010, ডানদিকে ঘুরিয়ে দেয় ( 00110001) প্রতিটি বিট ( 11001110) বিভক্ত করে তোলে এবং এটি বিপরীত হয় ( 01110011)।

নমনীয়তা

অন্যান্য অক্ষরের অক্ষরের পরিবর্তে ব্যবহার করা যেতে পারে l, r, f, এবং u, কিন্তু তারা স্পষ্টভাবে নথিভুক্ত করা আবশ্যক।

স্কোরবোর্ড

নিম্নলিখিত কোড স্নিপেট তৈরি করার জন্য @ অপ্টিমাইজারকে ধন্যবাদ । ব্যবহার করতে, "কোড স্নিপেট দেখান" ক্লিক করুন, নীচে স্ক্রোল করুন এবং "কোড স্নিপেট চালান" ক্লিক করুন।


3
দ্বিতীয় প্যারামিটারটি কী হতে পারে? এটা কি হতে পারে "rrfrburb"? এছাড়াও, যখন কোনও বিট পরিবর্তন করে বা বিটগুলি বিপরীত হয়, প্রতিটি স্বতন্ত্র চিঠির জন্য কি এটি পুরোপুরি স্ট্রিং করে? আরও পরীক্ষার কেসগুলি এটি পরিষ্কার করে দেবে।
xnor

1
আপনি কি শিফট বা ঘোরা মানে? সি-তে একটি বামফিশ্ফ্টের ফলে বাম দিকের বিটটি হারিয়ে যাবে এবং ডানদিকের বিটটি শূন্য হয়ে যাবে। স্বাক্ষরবিহীন সংখ্যায় রাইটসশিটের জন্য বিপরীতটি ঘটে। স্বাক্ষরিত সংখ্যার জন্য আমি নিশ্চিত নই যে নেতিবাচক সংখ্যার জন্য কী স্থানান্তরিত হয় তার জন্য সার্বজনীন সংজ্ঞায়িত আচরণ আছে কিনা (এটি 0 বা 1?) যে কোনও উপায়ে, শিফটটি চালানো হলে তথ্য সর্বদা নষ্ট হয়ে যায়, যা ঘটেনি একটি ঘোরা জন্য।
স্তরের নদী সেন্ট


2
@ ফ্লোয়ার, আমি মনে করি না যে 'xkcd' অনুসন্ধানের
পিটার টেলর

1
@ কেএসএফটি আমার মনে হয় আমি এটিকে কিছু বলতে হবে না। এটিতে যোগদান করে একটি স্ট্রিং করুন।

উত্তর:


1

সিজেম, 34 32 বাইট

1l+256b2b1>l{~"11W:mm%!<>">4%~}/

এটি নির্দেশাবলীর জন্য নিম্নলিখিত বর্ণগুলি ব্যবহার করে:

0: left rotation
1: right rotation
2: reverse
3: flip

ইনপুটটি প্রথম লাইনের শব্দের সাথে দ্বিতীয় লাইনে নির্দেশের স্ট্রিং দিয়ে এসটিডিএন থেকে নেওয়া হচ্ছে।

এটি এখানে পরীক্ষা করুন।

ব্যাখ্যা

বিট স্ট্রিং পাওয়া সত্যই অক্ষর কোডগুলি একটি বেস -২66 সংখ্যার অঙ্ক হিসাবে ব্যাখ্যা করা (এবং এর বেস -২ উপস্থাপনা পাওয়া)। জটিল জিনিসটি হ'ল পরের বেস রূপান্তরটি 0 টি দিয়ে বাম দিকে ফলাফল প্যাড করবে না। অতএব, আমি প্রাথমিক ইনপুটটিতে একটি শীর্ষস্থানীয় 1 যুক্ত করি এবং তারপরে বাইনারি উপস্থাপনায় আবার সেই 1টিকে বিভক্ত করে রাখি। উদাহরণস্বরূপ, যদি ইনপুট হয় ab, আমি এটিকে অ্যারে রূপান্তর করি [1 'a 'b], এটি বেস-256 (অক্ষরগুলি স্বয়ংক্রিয়ভাবে চরিত্রের কোডগুলিতে রূপান্তরিত হয়) হিসাবে ব্যাখ্যা করি, যা হয় 90466এবং বেস -২, যা হয় [1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0]। এখন যদি আমি কেবল 1সেই অগ্রণীটিকে সরিয়ে ফেলি তবে আমি যে বিটস্ট্রিমটি খুঁজছি তা পেয়েছি।

কোডের এই অংশটি এটাই করে:

1l+256b2b1>

এখন আমি নির্দেশাবলীর তালিকাটি পড়েছি এবং নির্দেশের স্ট্রিংয়ের প্রতিটি অক্ষরের জন্য একটি ব্লক কার্যকর করি:

l{...}/

প্রথম জিনিস চরিত্র এবং প্রকৃত পূর্ণসংখ্যার নির্ণয় করা হয় 0, 1, 2বা 3। এখন আসল গোলফি যাদু ... নির্দেশের উপর নির্ভর করে আমি কোডের একটি সংক্ষিপ্ত অংশ চালাতে চাই যা অপারেশনটি কার্যকর করে:

Integer:  Code  Operation
0         1m<   "Left rotation";
1         1m>   "Right rotation";
2         W%    "Reverse";
3         :!    "Flip each bit";

আমি এগুলিকে ব্লকের একটি অ্যারে সংরক্ষণ করতে এবং চালানোর জন্য সঠিক ব্লকটি বেছে নিতে পারতাম, তবে সেগুলিতে একটি স্ট্রিংয়ে এনকোডিং করা আসলে সংক্ষিপ্ত:

"11W:mm%!<>">4%~

প্রথমত, আমি স্ট্রিংয়ের শুরুটি টুকরো টুকরো করার জন্য নির্দেশের সাথে পূর্ণসংখ্যার সহযোগী ব্যবহার করি। সুতরাং বাম ঘূর্ণনের জন্য, স্ট্রিংটি অপরিবর্তিত রয়েছে, ডান রোটেশনের জন্য প্রথম অক্ষরটি বাতিল করা হবে ইত্যাদি on তারপর আমি প্রথম থেকে শুরু, স্ট্রিং থেকে প্রতি মাসের চতুর্থ অক্ষর নির্বাচন করুন, 4%। লক্ষ্য করুন যে কীভাবে চারটি কোড স্নিপেটগুলি স্ট্রিং জুড়ে বিতরণ করা হয়েছে। শেষ পর্যন্ত আমি স্ট্রিংটি কোড হিসাবে মূল্যায়ন করি ~

বিট স্ট্রিং প্রোগ্রাম শেষে স্বয়ংক্রিয়ভাবে মুদ্রিত হয়।


1m<তার চেয়ে কেন (+? আপনি একটি সংখ্যার চেয়ে অ্যারে নিয়ে কাজ করছেন, তাই না?
পিটার টেলর

@ পিটার ওহ ঠিক আছে, ধন্যবাদ। আমি পরে এটি ঠিক করব।
মার্টিন এেন্ডার 5:25

2

সিজেম, 34 বাইট

সিজেমে আরেকটি পন্থা।

1l+256b2b1>l_S/,1&@f=_,,@f{W%~}\f=

ইনপুট পাঠ্যটি প্রথম লাইনে রয়েছে এবং নির্দেশগুলি দ্বিতীয় লাইনে রয়েছে।

নির্দেশাবলী:

)        Rotate left.
(        Rotate right.
 (space) Flip.
~        Reverse.

1
এটা বেশ চালাক। একটি লজ্জা যা f~বাস্তবায়িত হয় না, তাই না? ;)
মার্টিন এন্ডার

2

পাইথ 33

jku@[+eGPG+tGhG_Gms!dG)sHwsmjCk2z

ব্যবহারসমূহ:

0    : rotate right
1    : rotate left
2    : reverse order
3    : flip values

পাইথ গিথুব

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

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

AbC
0321

ব্যাখ্যা:

                                    : z=input() (implicit)
jk                                  : join("", ...)
  u@[                 )sHw          : reduce(select from [...] the value at int(H), input(), ...)
     +eGPG                          : [ G[-1] + G[:1],
          +tGhG                     : G[1:] + G[1],
               _G                   : G[::-1],
                 ms!dG              : map(lambda d: int(not(d)), G) ]
                          smjCk2z   : first arg = sum(map(lambda k:convert_to_base(ord(k),2),z)

এমন কিছু যা আমি পুরোপুরি চেপে ধরতে পারি না: পাইথের reduceস্বয়ংক্রিয়ভাবে Gপূর্ববর্তী মান এবং Hপরবর্তী মানের জন্য ব্যবহার হয়।


আপনার স্পর্শ হারাবেন? সিজেমের চেয়ে মাত্র 1 বাইট কম?
অপ্টিমাইজার 23

@ অপ্টিমাইজার প্রকৃতপক্ষে, একই নির্দেশাবলী ব্যবহার করে আমি এটি পরাজিত করতে পারি। তবে আমি এটি বৈধ বলে মনে করিনি কারণ চ্যালেঞ্জটি বলে যে "অন্যান্য অক্ষর পরিবর্তে ব্যবহার করা যেতে পারে lrfuতবে সেগুলি অবশ্যই স্পষ্টভাবে নথিভুক্ত করা উচিত।" (জোর দেওয়া খনি)
মার্টিন এন্ডার

1

স্কালা - 192

def f(i:String,l:String)=(i.flatMap(_.toBinaryString).map(_.toInt-48)/:l){
case(b,'l')⇒b.tail:+b.head
case(b,'r')⇒b.last+:b.init
case(b,'f')⇒b.map(1-_)
case(b,'u')⇒b.reverse}.mkString

1

মতলব (১66 বাইট)

এটি যথাক্রমে abcdপরিবর্তে অক্ষর ব্যবহার lrfuকরে।

function D=f(B,C)
D=dec2bin(B,8)';
D=D(:);
g=@circshift;
for c=C
switch c-97
case 0
D=g(D,-1);
case 1
D=g(D,1);
case 2
D=char(97-D);
case 3
D=flipud(D);
end
end
D=D';

স্থান বাঁচাতে এখানে কয়েকটি কৌশল ব্যবহার করা হয়েছে:

  • ব্যবহার abcdচিঠি আমাকে বিয়োগ করতে দেয় 97একবার, এবং তারপর চিঠি পরিণত 0, 1, 2, 3। এটি switch- caseধারাগুলিতে স্থান সাশ্রয় করে।
  • circshiftএক-অক্ষর বেনামে ফাংশন হিসাবে সংজ্ঞায়িত করাও স্থান বাঁচায়, কারণ এটি দুটিবার ব্যবহার করা হয়েছে used
  • যেহেতু এবং অক্ষর (এএসসিআইআই কোডস এবং ) Dনিয়ে গঠিত তাই বিবৃতিটি মান এবং মানগুলির মধ্যে বিপরীততার সাথে মিলে যায় । দ্রষ্টব্য যে উপরে বর্ণিত এর সাথে এর কোনও যোগসূত্র নেই।'0''1'4849D=char(97-D)'0''1'97
  • কমপ্লেক্স-কনজুগেট ট্রান্সপোজ পরিবর্তনের 'পরিবর্তে ব্যবহৃত হয় .'

0

পাইথন 2 - 179

b="".join([bin(ord(i))[2:]for i in input()])
for i in input():b=b[-1]+b[:-1]if i=="r"else b[1:]+b[0]if i=="l"else[str("10".find(j))for j in b]if i=="f"else b[::-1]
print"".join(b)

0

সি #, 418 বাইট

using System;using System.Collections.Generic;using System.Linq;class P{string F(string a,string o){var f=new Dictionary<char,Func<string,IEnumerable<char>>>{{'l',s=>s.Substring(1)+s[0]},{'r',s=>s[s.Length-1]+s.Substring(0,s.Length-1)},{'u',s=>s.Reverse()},{'f',s=>s.Select(c=>(char)(97-c))}};return o.Aggregate(string.Join("",a.Select(c=>Convert.ToString(c,2).PadLeft(8,'0'))),(r,c)=>new string(f[c](r).ToArray()));}}

বিন্যাসকৃত:

using System;
using System.Collections.Generic;
using System.Linq;

class P
{
    string F(string a, string o)
    {
        // define string operations
        var f = new Dictionary<char, Func<string, IEnumerable<char>>>
        {
            {'l', s => s.Substring(1) + s[0]},
            {'r', s => s[s.Length - 1] + s.Substring(0, s.Length - 1)},
            {'u', s => s.Reverse()},
            {'f', s => s.Select(c => (char) (97 - c))}
        };
        // for each operation invoke f[?]; start from converted a
        return o.Aggregate(
            // convert each char to binary string, pad left to 8 bytes and join them
            string.Join("", a.Select(c => Convert.ToString(c, 2).PadLeft(8, '0'))),
            // invoke f[c] on result of prev operation
            (r, c) => new string(f[c](r).ToArray())
        );
    }
}

0

জে, 164

([: >@:}. (([: }. >&{.) ; >@:{.@:>@:{. 128!:2 >@:}.)^:({.@:$@:>@:{.))@:(>@:((<;._1 ' 1&|."1 _1&|."1 -. |."1') {~ 'lrfu' i. 0&({::)@:]) ; ;@:([: (8$2)&#: a. i. 1&({::)))

বিন্যাসকৃত:

nextop=:([: }. >&{.)
exec=: (>@:{.@:>@:{.) apply"1 >@:}.
times=: ({.@:$@:>@:{.)
gapply=: [: >@:}. (nextop ; exec)^:(times) f.

tobin=: ;@:([: (8#2)&#:(a.i.1&{::))
g=:'1&|.';'_1&|.';'-.';'|.'
tog =:  g {~ ('lrfu' i. 0&{::@:])
golf=: gapply @: (>@:tog;tobin)  f.

উদাহরণ

golf ('rfu';'b')
0 1 1 1 0 0 1 1


golf ('lruuff';'b')
0 1 1 0 0 0 1 0

(8#2)#: 98
0 1 1 0 0 0 1 0

golf ('lruuff';'AB')
0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0

tobin '';'AB'
0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0

0

জাভাস্ক্রিপ্ট (E6), 163 167

সম্পূর্ণভাবে ইনপুট নমনীয়তা, 2 অ্যারে পরামিতি সহ একটি নামকৃত ফাংশন ব্যবহার করে।

  • প্রথম প্যারামিটার, 7 বিট অক্ষর কোডের সাথে সম্পর্কিত বাইটের অ্যারে
  • দ্বিতীয় প্যারামিটার, আসকি অক্ষর 'এফ', 'এল', 'আর', 'ইউ' -> 70, 76, 82, 85 এর সাথে সম্পর্কিত বাইটের অ্যারে

ফাংশনটি '1' এবং '0' দ্বারা গঠিত একটি অক্ষরের স্ট্রিং প্রদান করে

F=(a,s,r='')=>
  a.map(c=>r+=(128|c).toString(2).slice(-7))-
  s.map(c=>a=c<71?a.map(c=>1-c):c<77?a.concat(a.shift):c<83?[a.pop(),...a]:a.reverse(),a=[...r])
  ||a.join('')

উদাহরণ হিসাবে f("b", "rfu") অনুবাদ F([98],[82,70,85]), ফলাফল হয়0111001

নোট অক্ষরের ব্যবহার জাভাস্ক্রিপ্টে এত দীর্ঘ! বাইট গণনা 186

F=(a,s,r='')=>
  [for(c of a)r+=(128|c.charCodeAt()).toString(2).slice(-7)]-
  [for(c of(a=[...r],s))a=c<'G'?a.map(c=>1-c):c<'M'?a.concat(a.shift):c<'S'?[a.pop(),...a]:a.reverse()]
  ||a.join('')

উদাহরণ F("b", "RFU") , ফলাফল 0111001আবার


0

রুবি, 151

f=->i,s{s.chars.inject(i.unpack("B*")[0]){|a,c|
a.reverse! if c==?u
a.tr!"01","10" if c==?f
a<<a.slice!(1..-1) if c==?l
a<<a.slice!(0..-2) if c==?r
a}}

মোটামুটি সহজবোধ্য. লুপগুলি চরিত্রগুলিকে ট্রুপ করে sএবং সেগুলির জন্য একটি ক্রিয়া করে।


0

পাইথন 2, 142

j="".join
f=lambda S,I:reduce(lambda s,i:[s[1:]+s[0],s[-1]+s[:-1],s[::-1],j([`1^int(c)`for c in s])][int(i)],I,j([bin(ord(c))[2:]for c in S]))

যোগাযোগের ক্ষেত্রে আমার পাইথ উত্তরটির অনুরূপ: আমি হ্রাস ব্যবহারের মাধ্যমে পুনরায় পুনরুক্তি করা নির্দেশিকার স্ট্রিংয়ের মানের ভিত্তিতে আমি এতে সমস্ত স্ট্রিং এবং সূচকের তালিকা তৈরি করি।

ব্যবহারসমূহ:

0  ->  Rotate left
1  ->  Rotate right
2  ->  Reverse order
3  ->  Invert bits
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.