প্লেফায়ার এনক্রিপশন প্রোগ্রামটি লিখুন


20

একটি প্রোগ্রাম লিখুন যা দুটি লাইনের ইনপুট নেয় এবং প্লেফায়ার এনক্রিপশন কৌশল অনুসারে দ্বিতীয়টিকে এনক্রিপ্ট করার জন্য একটি মূল বাক্যাংশ হিসাবে প্রথমটি ব্যবহার করে।

উইকিপিডিয়া প্লেফায়ার এনক্রিপশনটিকে কিছু বিশদে বর্ণনা করে তবে কোনও অস্পষ্টতা এড়াতে এখানে একটি সংক্ষিপ্তসার দেওয়া হল:

1. একটি মূল টেবিল তৈরি করুন:

Jমূল বাক্যাংশের সমস্ত উপস্থিতি এর সাথে প্রতিস্থাপন করুন I, তারপরে সমস্ত বর্ণমালার অক্ষর এবং পুনরাবৃত্ত অক্ষরগুলি সরিয়ে দিন। একটি 5 × 5 এনক্রিপশন টেবিল sertোকান, বাকী ঘরগুলি বাক্য বর্ণমালা দিয়ে পূরণ করুন (বাদে J; আমরা পছন্দ করি না J)।

উদাহরণ:

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

2. এনক্রিপ্ট করা বার্তা প্রস্তুত

প্রত্যেকটির Jসাথে একটি প্রতিস্থাপন করুন I, সমস্ত অ-বর্ণমালার অক্ষর Xকেটে জোড়ায় বিভক্ত করুন, একই অক্ষরটি দু'বার ভাঙার জন্য একটি ব্যবহার করে। আপনি যদি বিজোড় সংখ্যক অক্ষর Xদিয়ে শেষ করেন তবে শেষে যুক্ত করুন। (দ্রষ্টব্য: - সংখ্যাসূচক পূর্ণ বানান আউট আছে করা ONE, TWO, THREE, ইত্যাদি - কিন্তু আপনার এই ইতিমধ্যে আপনার জন্য কাজ করা হয়েছে অনুমান করতে পারেন।)

উদাহরণ:

In:
The cat crept into the crypt, crapped, and crept out again.

Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX

3. এনক্রিপশন

পরিবর্তে প্রতিটি জোড়া অক্ষর এনক্রিপ্ট করুন। যদি তারা কী সারণীর বিভিন্ন সারি এবং কলামগুলিতে থাকে তবে কলামের যেখানে অন্য অক্ষরটি পাওয়া যায় সেখানে একই সারির বর্ণটি দিয়ে প্রতিস্থাপন করুন (যেমন, VMEI, LZGQ)। যদি তারা একই সারিতে থাকে (বা কলাম), অবিলম্বে দুটি অক্ষর ডানদিকে (বা নীচে) বেছে নিন, প্রয়োজনে চারদিকে মোড়ানো (যেমন, OEVR, ZGKP)।

উদাহরণ:

In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX

Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY

এই প্রক্রিয়াটির দ্বারা উত্পাদিত স্ট্রিং হ'ল এনক্রিপ্ট হওয়া বার্তা, যা আপনার প্রোগ্রামটি আউটপুট করে।

নিয়মাবলী:

  • ইনপুট পাঠ্য এবং কী stdinকমান্ড লাইন আর্গুমেন্ট বা এই জাতীয় অন্যান্য উত্স থেকে প্রাপ্ত হতে পারে । হার্ড-কোডেড ইনপুট অনুমোদিত নয়।
  • আপনার প্রোগ্রামটি অবশ্যই পাস বাক্যাংশ এবং বার্তার জন্য উপরের এবং নিম্ন উভয় ক্ষেত্রে পাঠ্য গ্রহণ করতে হবে।
  • এনক্রিপ্ট করা আউটপুট আপার বা লোয়ার কেস হতে পারে।
  • আপনার প্রোগ্রামটির দৈর্ঘ্যে কমপক্ষে characters৪ টি অক্ষরের মূল বাক্যাংশ এবং কমপক্ষে ১ KB কেবি বার্তা পাঠ্য হওয়া উচিত।
  • আপনাকে নন-এসএসআইআই ইনপুট হ্যান্ডেল করার দরকার নেই।
  • আপনি XXএনক্রিপশন চলাকালীন চিঠি জোড়া হওয়ার সম্ভাবনাটিকে উপেক্ষা করতে পারেন ।
  • প্রোগ্রামের আউটপুটটিতে সাদা স্থান যুক্ত করার দরকার নেই।
  • আপনার উত্তরে আপনার বার্তাটির একটি উদাহরণ, কী বাক্যাংশ এবং আপনার প্রোগ্রাম দ্বারা উত্পাদিত এনক্রিপ্ট করা আউটপুট অন্তর্ভুক্ত করা উচিত।
  • এটি একটি কোড গল্ফ চ্যালেঞ্জ, সুতরাং সবচেয়ে সংক্ষিপ্ত কোডের উত্তর (বাইটে) জিতবে।

দ্রষ্টব্য: দয়া করে মনে রাখবেন যে কেবল একই জোড়ায় উপস্থিত হলে আপনার কেবল পরপর অক্ষরগুলি ভাঙ্গার প্রয়োজন । সুতরাং উদাহরণস্বরূপ MASSACHUSETTSএনক্রিপ্ট করা উচিত MA SX SA CH US ET TS- ডাবল Sবিভক্ত করতে হবে, কিন্তু ডাবল Tনা।


8
"আমরা পছন্দ করি না J" আপনি কি এপিএল সম্পর্কে একইরকম অনুভূতি পোষণ করেন?
অ্যালগরিদমশর্ক

Gobbledygook! (যদিও নামে জে অভাব তারা ঋণ, আমি অনুমান।)
খুঁতখুঁতে ossifrage

ইনপুট প্রয়োজনীয়তা সম্পর্কে, ফাংশন আর্গুমেন্ট অনুমোদিত? (এটি "হার্ড-কোডিং" গঠন করে কিনা তা নিশ্চিত নন) যদি তা না হয় তবে কী ধরে নিতে পারি যে কীটিতে কোনও নতুনলাইন নেই (পছন্দসই, প্লেটেক্সটটিও)? যদি তা না হয়, স্ট্যান্ডিনের তুলনায় কমান্ড লাইন আরোগুলি আরও কার্যকর হতে পারে।
অ্যালিয়েডভি

উত্তর:


13

জেআমি *, 536 431 417 380 263 218 203 197 186 167

p=:4 :0
a=.u:65+9-.~i.26
,_2(5|,:~@|.@(=/)+$$,A.~5*1-0{=/)&.(5 5#:(~.n x,a)&i.)\(,'X'#~2|#)(({.,'X',}.)~1+2*1{&I._2{.\2=/\]) ::]^:_(n=:a(e.~#])'JI'charsub toupper)y
)

(@ অ্যালগরিদমশার্কের পক্ষ থেকে বিস্তৃত পরামর্শ সহ)

উদাহরণস্বরূপ ব্যবহার:

   'Stack Overflow' p 'The cat crept into the crypt, crapped, and crept out again.'
SIRACARDFMVUICVSMORDZNAKECMZMFBCYNRDFMSVTVKBTMMY

ইনপুট সঠিকভাবে বিভক্ত:

   d=:(({.,'X',}.)~1+2*1{&I._2{.\2=/\]) ::]
   d^:_ 'MASSACHUSETTS'
MASXSACHUSETTS

* প্রত্যেক প্রতিস্থাপন Jএকটি সঙ্গে Iডান?


2
আমরা জে পছন্দ করি না, তবে আমি সুন্দর!
ভেরিওস

বাহ, এটি অসাধারণ।
কুঁচকানো অস্পষ্টতা

প্রথম সংস্করণ একটি লাগছিল যদিও বিট আমাকে যাদুবিদ্যার মত, এই সর্বশেষ এক বিশুদ্ধ জাদু হয়। খুব চিত্তাকর্ষক হ্রাস।
জিওবিটস

পপ পপ পপ, কীস্ট্রোকগুলি ড্রপ দেখছে! এই ভুডু যাদু কীভাবে কাজ করে তার ব্যাখ্যা যদি কেউ চান তবে এখানে একটি লিঙ্ক দেওয়া হয়েছে ; গুরুতর বাধা ছাড়াই উত্তরের সাথে ফিট করার পক্ষে এটি অনেক দীর্ঘ।
অ্যালগরিদমশর্ক

জে মত এখন :-) আমি
খুঁতখুঁতে ossifrage

7

রুবি, 461 411 366 359 352 346 330 টি অক্ষর

k,m=$<.map{|x|x.tr(?j,?i).upcase.tr('^A-Z','').chars}
t=[*((k&k)|[*?A..?Z]-[?J]).each_slice(5)]
m=(m*'').gsub(/(.)\1/,'\1X\1').chars
c=->n{[t.index{|r|k=r.index n},k]}
$><<(m.size%2<1?m:m+[?X]).each_slice(2).map{|p,q|a,b,d,e=*c[p],*c[q]
a==d ?[t[a][(b+1)%5],t[d][(e+1)%5]]:b==e ?[t[(a+1)%5][b],t[(d+1)%5][e]]:[t[a][e],t[d][b]]}*''

সংরক্ষণ করার জন্য @ ডানিরোকে ধন্যবাদ ... ভুল, প্রচুর বাইট \ ণ /

নিরবধি কোডটি এখানে:

key = gets.chomp
msg = gets.chomp
transform = ->str{
    str.gsub! 'j', 'i'
    str.upcase!
    str.gsub! /[^A-Z]/, ''
    str.split('')
}

# 1. Generate a key table
key = transform[key]
chars = key.uniq + ([*?A..?Z] - key - ['J'])
tbl = Array.new(5) {
    Array.new(5) {
        chars.shift
    }
}

# 2. Prepare the message
msg = transform[msg]
msg = msg.join('').gsub(/(.)\1/){ "#{$1}X#{$1}" }.split('')
msg = (msg.length % 2 == 0 ? msg : msg + ['X']).each_slice(2).to_a

# 3. Encryption
coords = ->chr{
    i = -1
    [tbl.index{|row| i = row.index chr}, i]
}
msg.map! do |c1, c2|
    c1, c2 = coords[c1], coords[c2]
    if c1[0] == c2[0]
        # same row
        [tbl[c1[0]][(c1[1] + 1) % 5], tbl[c2[0]][(c2[1] + 1) % 5]]
    elsif c1[1] == c2[1]
        # same column
        [tbl[(c1[0] + 1) % 5][c1[1]], tbl[(c2[0] + 1) % 5][c2[1]]]
    else
        # neither
        [tbl[c1[0]][c2[1]], tbl[c2[0]][c1[1]]]
    end
end

# Output!
puts msg.join

এখানে কিছু নমুনা আউটপুট:

llama@llama:...code/ruby/ppcg23276playfair$ printf 'Stack Overflow\nThe cat crept into the crypt, crapped, and crept out again.\n' | ./playfair.rb; printf 'This is a password!\nProgramming Puzzles and Code Golf is a Stack Exchange site.\n' | ./playfair.rb
SIRAVXRDFMVUUYVSBLRDZNYVECMZMFBCYNRDFMSVTVKBVBMY
WDDEDSXIXOQFBTUYVQFISQWGRPFBWMESATAHHGMBVEITQFFISHMI

দেখতে দেখতে দুর্দান্ত লাগছে, তবে উন্নতির জন্য জায়গা আছে: প্রথম লাইনে charsআপনি রুবি ২ ব্যবহার করছেন বলে ধরে নিয়ে অ্যারেতে "কাস্ট" করার দরকার নেই , এছাড়াও আপনি এর &পরিবর্তে সেট অপারেটর হিসাবে ব্যবহার করতে পারেন tr: t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}(by বাইট সংরক্ষিত)। পরের দুটি লাইন এর মতো k,m=[1,2].map{t[gets.chop]}(নোটের chopচেয়েও বেশি chomp) কিছু যুক্ত হতে পারে ।
দানিরো

ব্যবহার পরবর্তীকালের &প্রয়োজনীয়তাও দূর করে uniq। আর charsঅ্যারেতে জিনিস এছাড়াও লাইন 6. প্রযোজ্য
daniero

@ ডানিরো ঠিক আছে, এটি অনেক দীর্ঘ সময় আগে করা হয়েছিল, তাই সম্ভবত আমি আরও অনেক উন্নতি করতে পেরেছি। টিপস জন্য ধন্যবাদ; এই পুনর্বিবেচনার সময়!
ডুরকনবব

হ্যাঁ, আমি দেখতে পাচ্ছি :) আমি এই চ্যালেঞ্জকে হোঁচট খেয়েছি এবং আমি আপনার উত্তর না পাওয়া অবধি ততক্ষণে রুবিতে এটিকে লক্ষ্য করে দেখতে চাইছিলাম .. কোড ধরণের জটিলতার বিষয়টি আমাকে এড়িয়ে গিয়েছিল, কিন্তু আমাকে নিতে হয়েছিল এটি দেখুন :)
দানিরো

@daniero দুর্ভাগ্যবশত, trথেকে &কাজ লাইন 1 উপর না কারণ mযাবে না uniqified। তবে, k.uniqছোট করা যেতে পারে (k&k)(1 বাইট অফ)।
ডুরকনবব

4

সি: 495 401 355 341 টি অক্ষর

এটি এখনকার মতো মোটামুটি স্কেচ। আমার কমপক্ষে একশ চরিত্র মুণ্ডন করতে সক্ষম হওয়া উচিত।

লক্ষ্যটি সম্পন্ন হয়েছে: শতাধিক অক্ষর (এখনকার 154) কোডটি রহস্যজনকভাবে অদৃশ্য হয়ে গেছে।

p[25],l[96],a=1,b,c;o(x,y){putchar(p[x%5^y%5?x/5*5+(x/5^y/5?y:x+1)%5:(x+5)%25]);}main(){for(;a&&((a=(b=getchar())>31)||(b=65))||b++<90;c=0)for(b&=-33;b/65-b/91&&p[c]^b-(b==74);p[c++]||(p[--c]=b-(b==74),l[b]=c));for(;b=getchar(),b=b>31?b&-33:(c=88),b=b/65-b/91?a?a^b?(c*=c==88,b):(c=b,88):(a=b,0):0,a&b&&(o(a=l[a],b=l[b]),o(b,a),a=c),c^88;);}

কিছু মনোরম সাদা স্থান সহ:

p[25],l[96],a=1,b,c;
o(x,y){
    putchar(p[
        x%5^y%5
            ?x/5*5+(x/5^y/5?y:x+1)%5
            :(x+5)%25
    ]);
}
main(){
    for(;
        a&&(
            (a=(b=getchar())>31)||
            (b=65)
        )||b++<90;
        c=0
    )for(
        b&=-33;
        b/65-b/91&&
        p[c]^b-(b==74);
        p[c++]||(
            p[--c]=b-(b==74),
            l[b]=c
        )
    );
    for(;
        b=getchar(),
        b=b>31
            ?b&-33
            :(c=88),
        b=b/65-b/91
            ?a
                ?a^b
                    ?(c*=c==88,b)
                    :(c=b,88)
                :(a=b,0)
            :0,
        a&b&&(
            o(a=l[a],b=l[b]),
            o(b,a),
            a=c
        ),
        c^88;
    );
}

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


1
আচ্ছা এটি আমার প্রচেষ্টাকে খুব খারাপ দেখাচ্ছে! আপনি
এইটির

2

মতলব - 458 অক্ষর

function p=pf(k,p)
k=[upper(k),65:90];k(k==74)=73;k(k<65|k>90)='';[~,i]=unique(k,'first');k=reshape(k(sort(i)),5,5);e=[k,k(:,1);k(1,:)];p=upper(p);p(p==74)=73;p(p<65|p>90)='';n=length(p);for i=1:2:n
if i<n&&p(i)==p(i+1)p=[p(1:i),88,p(i+1:end)];end
n=length(p);end
if mod(n,2)p=[p,88];n=n+1;end
for i=1:2:n [x,y]=find(k==p(i));[w,z]=find(k==p(i+1));p(i:i+1)=[k(w,y),k(x,z)];if x==w p(i:i+1)=[e(w,y+1),e(x,z+1)];end
if y==z p(i:i+1)=[e(x+1,z),e(w+1,y)];end
end

কিছু উদাহরণ:

octave:180> pf('Stack Overflow', 'The cat crept into the crypt, crapped, and crept out again.')
ans = SIRACARDFMVUICVSMORDZNAKECMZMFBCYNRDFMSVTVKBTMMY

octave:181> pf('This is a password!','Programming Puzzles and Code Golf is a Stack Exchange site.')
ans = WDDEDSXIXOQFBTUYVQFISQWGRPFBWMESATAHHGMBVEITQFFISHMI

octave:182> pf('Matlab needs lambdas', 'Who thought elseif is good syntax?')
ans = XGQMFQPKQDSACDKGRIFPQNILDMTW

2

হাস্কেল - 711

ডেমো:

[timwolla@/data/workspace/haskell/PCG]ghc pcg-23276.hs
[1 of 1] Compiling Main             ( pcg-23276.hs, pcg-23276.o )
Linking pcg-23276 ...
[timwolla@/data/workspace/haskell/PCG]./pcg-23276 "Stack Overflow" "The cat crept into the crypt, crapped, and crept out again."
SIRACARDFMVUICVSMORDZNAKECMZMFBCYNRDFMSVTVKBTMMY

কোড:

import Data.List
import Data.Char
import Data.Maybe
import System.Environment
main=do a<-getArgs
    putStrLn$concat$map(x (a!!0))$map(\x->if (length x)==1 then x++"X"else x)$s 2$concat$map(\x->if (length x)==1then x else intersperse 'X' x)$group$p (a!!1)
p=map(\x->if x=='J' then 'I' else x).filter(isUpper).map toUpper
k x=y++(delete 'J'$['A'..'Z']\\y)where y=nub$p x
u l m=(div i 5,mod i 5)where i=fromJust$elemIndex l$k m
x y z
    |a/=c&&b/=d=(e!!(a*5+d)):(e!!(c*5+b)):[]
    |a==c=(e!!(a*5+(mod(b+1)5))):(e!!(c*5+(mod(d+1)5))):[]
    |True=(e!!((5*(mod(a+1)5))+b)):(e!!((5*(mod(c+1)5))+d)):[]
    where
        o=u(z!!0)y
        t=u(z!!1)y
        a=fst o
        b=snd o
        c=fst t
        d=snd t
        e=k y
s _ []=[]
s n l=(take n l):(s n(drop n l))

বড় সংস্করণ:

import Data.List
import Data.Char
import Data.Maybe

encryptAll key text = map (encrypt key) (transformValue text)

clean x = map (\x -> if x == 'J' then 'I' else x) $ filter (isUpper) $ map (toUpper) x
transformKey x = y ++ (delete 'J' $ ['A'..'Z'] \\ y)
    where y = nub (clean x)

transformValue x = map (\x -> if (length x) == 1 then x ++ "X" else x) $ split 2 $ concat $ map (\x -> if (length x) == 1 then x else intersperse 'X' x) $ group $ clean x

search letter key = (div index 5, mod index 5)
    where index = fromJust $ elemIndex letter $ transformKey key

encrypt key chars
    | rowA /= rowB && colA /= colB = (key' !! (rowA * 5 + colB)) : (key' !! (rowB * 5 + colA)) : []
    | rowA == rowB = (key' !! (rowA * 5 + ((colA + 1) `mod` 5))) : (key' !! (rowB * 5 + ((colB + 1) `mod` 5))) : []
    | otherwise = (key' !! ((5 * ((rowA + 1) `mod` 5)) + colA)) : (key' !! ((5 * ((rowB + 1) `mod` 5)) + colB)) : []
    where
        rowA = fst $ search (head chars) key
        colA = snd $ search (head chars) key
        rowB = fst $ search (last chars) key
        colB = snd $ search (last chars) key
        key' = transformKey key

-- http://stackoverflow.com/a/12876438/782822
split :: Int -> [a] -> [[a]]
split _ [] = []
split n l
  | n > 0 = (take n l) : (split n (drop n l))
  | otherwise = error "Negative n"

2

পাইথ - 111

প্রতিযোগিতার জন্য খুব দেরি হয়ে গেছে, আমি কেবল ভাগ করে নিতে চেয়েছিলাম। এখানে এনকোডার এবং ডিকোডার

L@G:rb0\j\iJ{y+wGKywWhZ=Zh*2xlR{RcK2 1IhZ=KXZK\x;M@J+G?!eH5?!hH?q4%G5_4 1eHVcK2A,xJhNxJeN=Z-V.DH5.DG5pgGZpgH_RZ

ব্যাখ্যা:

L    b                              L defines common method y(b); 2 calls helps us saving two bytes
    r 0                             lowercase r(b,0)
   :   \j\i                         : replaces all occurrences of "j" with "i"
 @G                                 strips all non-alphabetic characters; G = pyth built-in alphabet

    w                               first input argument
   + G                              appends the alphabet (G)
  y                                 calls y(b)
 {                                  { makes set (removes duplicated characters)
J                                   assigns result to 'J' (KEY VARIABLE)

Kyw                                 assigns output from y(second input argument) to 'K' (TEXT VARIABLE)

WhZ                         ;       While (Z+1 != 0) <-> While (Z != -1) <-> While mismatched items found
             cK2                    list of K pairs.                    e.g. 'ABCCDDE' -> [AB, CC, DD, E]
         lR{R                       l length of { unique characters.    e.g. [2, 1, 1, 1]
        x       1                   1-length first index.               e.g. 1
     h*2                            *2+1 (Index in K)                   e.g. 3 'ABC CDDE'
   =Z                               Assigns to 'Z'
                  IhZ               if (Z != -1) <-> if (mismatched found)
                     =KXZK\x        X Inserts at Z index in K an 'x' and reassigns to 'K'  e.g. 'ABCXC...'

M                                   M defines function g(G, H) where G index H vector (INDEX CONVERSION)
     ?!eH                           if (same col)
         5                              then +5
         ?!hH                           else { if (same row)
             ?q4%G5                             then if (last col)
                   _4                               then -4
                      1                             else +1
                       eH                       else col
   +G                               index += increment
 @J                                 J[index]

VcK2                                V loops over cK2 list of K pairs
     ,xJhNxJeN                      x returns pair members index in J
    A                               A assigns G = xJhN, H = xJeN
                  .DH5              .D returns [row, col] = [i/5,i%5] of 5xn matrix from index of H
                      .DG5          idem. of G
                -V                  Subtracts vectors (RELATIVE POSITION)
              =Z                    Assigns to 'Z'
                          pgGZ          p prints g(G, Z) return value
                              pgH_RZ    p prints g(H, _RZ) return value, and _R changes signs of Z vector

নমুনা কী / বার্তা / আউটপুট:

Stack Overflow
Gottfried Leibniz is famous for his slogan Calculemus, which means Let us calculate. He envisioned a formal language to reduce reasoning to calculation.
lfaukvvnrbbomwpmupkoexvqkovfimaqohflcmkcdsqwbxqtlintinbehcbovttksbtybsavmormwuthrhrbkevfxebqbspdxtbfsvfrwyarfrctrhmpwkrssbtybsvurh

1

সি, 516

উন্নত লেগিবিলিটি উপস্থাপনার জন্য লাইনফিডস যুক্ত হয়েছে । (সুস্পষ্টতা জানালার বাইরে চলে গেছে, আমি ভয় পাচ্ছি))

#define Z(u,v) putchar(o[u]),putchar(o[v])
#define X while((Y=getchar())>31){Y&=223;if(Y==74)Y--;if(Y<65||Y>90
P,L,A,Y,f,a,i,r,c=512,o[25],d[2],*e=o;Q(){for(i=0;o[i]!=d[0];i++);i-=(f=i%5);
for(r=0;o[r]!=d[1];r++);r-=(a=r%5);if(f==a)Z(f+(i+5)%25,a+(r+5)%25);
else if(i==r)Z((f+1)%5+i,(a+1)%5+r);else Z(a+i,f+r);}main(){X||c&(A=1<<Y-65))continue;
c|=A;*e++=Y;}A=1;Y=65;for(P=0;P<25;P++){if(!(c&A))*e++=Y;
if(++Y==74)Y++,A+=A;A+=A;}L=0;X)continue;if(L&&Y==*d)d[1]=88,Q(),*d=Y;
else d[L]=Y,L=1-L;if(!L)Q();}if(L)d[1]=88,Q();}

উদাহরণ:

$ ./pf
Playfair                                    
The quick brown fox jumps over the lazy dog
QMHNPEKSCBQVTPSVEPEFTQUGDOKGAYXFRTKV

1

পাইথন 3, 709 705 685 664

স্টিডিনের কাছ থেকে ইনপুট গ্রহণ করে।

from string import ascii_uppercase as a
from itertools import product as d
import re
n=range
k=input()
p=input()
t=lambda x: x.upper().replace('J','I')
s=[]
for _ in t(k+a):
 if _ not in s and _ in a:
  s.append(_)
m=[s[i:i+5] for i in n(0,len(s),5)]
e={r[i]+r[j]:r[(i+1)%5]+r[(j+1)%5] for r in m for i,j in d(n(5),repeat=2) if i!=j}
e.update({c[i]+c[j]:c[(i+1)%5]+c[(j+1)%5] for c in zip(*m) for i,j in d(n(5),repeat=2) if i!=j})
e.update({m[i1][j1]+m[i2][j2]:m[i1][j2]+m[i2][j1] for i1,j1,i2,j2 in d(n(5),repeat=4) if i1!=i2 and j1!=j2})
l=re.findall(r'(.)(?:(?!\1)(.))?',''.join([_ for _ in t(p) if _ in a]))
print(''.join(e[a+(b if b else 'X')] for a,b in l))

উদাহরণ:

mfukar@oxygen[/tmp]<>$ python playfair.py
Stack Overflow
The cat crept into the crypt, crapped, and crept out again.
SIRACARDFMVUICVSMORDZNAKECMZMFBCYNRDFMSVTVKBTMMY

পাইথন 2.5 :
samamish ossifrage

1

পাইথন: 591 বাইট

import sys
l=list
n=len
a=[sys.stdin.readline().upper().replace('J','I') for i in (1,2)]
b=l('ABCDEFGHIKLMNOPQRSTUVWXYZ')
def z(x):
    a=0
    if x in b:
        b.remove(x)
        a=1
    return a
c=l(filter(z,a[0]))+b
d=[x for x in a[1] if x in c]
e=1
while e<n(d):
    if d[e-1]==d[e]:
        d.insert(e,'X')
    e+=2
if n(d)%2>0:
    d+='X'
def y(i):
    z=c.index(d[i])
    return z/5,z%5
x=lambda i,j:c[(i%5)*5+(j%5)]
def w(i):
    e,f=y(i)
    g,h=y(i+1)
    if e==g:
        z=x(e,f+1)+x(g,h+1)
    elif f==h:
        z=x(e+1,f)+x(g+1,h)
    else:
        z=x(e,h)+x(g,f)
    print z,
e=0
while e<n(d):
    w(e)
    e+=2
print

এটি stdinক্রমে কী এবং বার্তাটি পেতে ব্যবহার করে। আমি আশা করি এটি এনক্রিপশন ম্যাট্রিক্স সঞ্চয় করতে ফ্ল্যাট তালিকা ব্যবহার করতে প্রতারণা করছে না, কারণ ম্যাট্রিক্সের সাথে কাজ করা বেশ সহজ। এখানে কয়েকটি উদাহরণ রান রয়েছে:

>python playfair.py
Stack Overflow
The cat crept into the crypt, crapped, and crept out again.
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY

>python playfair.py
Stack Overflow
The quick red fox jumps over the lazy brown dog.
SI OX TU KS FR GR EQ UT NH OL ER VC MO BS QZ DE VL YN FL

আমি বিশ্বাস করি আপনি খাটো করতে পারেন zথেকে lambda x:0if b not in x else b.remove(x)or 1। আপনি পরিত্রাণ পেতে পারেন বেশ কয়েকটি সাদা জায়গাও রয়েছে। এটি আপনাকে filterএটিকে বাইরের সংজ্ঞায়নের পরিবর্তে সরাসরি কলটিতে স্থানান্তর করতে দেয় ।
মরগান থ্রাপ

1

জাভা - 791

আমার প্রথম গল্ফ, সুতরাং যে কোনও সমালোচনা স্বাগত। জাভা ব্যবহার করছি কারণ আমার উচিত হয়নি। এত খারাপ লাগে না; বর্তমান নেতার দ্বিগুণের চেয়ে কম আকার। আমি এটি প্রত্যাশা করছিলাম যেহেতু এটি ভাল, জাভা :)

public class P{static String c(String s){return s.toUpperCase().replace('J','I').replaceAll("[^A-Z]","");}static int f(char[]a, char n){for(int i=0;i<a.length;i++)if(a[i]==n)return i;return -1;}public static void main(String[]a){int i=0,k,l;char j=0;String g=c(a[0]);char[]e,b,h=c(a[1]).toCharArray();b=new char[25];for(;j<g.length();j++)if(j==g.indexOf(g.charAt(j)))b[i++]=g.charAt(j);for(j=65;i<25;j++)if(f(b,j)<0&&j!=74)b[i++]=j;e=new char[h.length*2];for(i=0,j=0;j<h.length;){if(i%2>0&&h[j]==h[j-1])e[i++]=88;e[i++]=h[j++];}if(i%2>0)e[i++]=88;for(j=0;j<i;j+=2){k=f(b,e[j]);l=f(b,e[j+1]);if(k/5==l/5){e[j]=b[(k/5*5)+((k+1)%5)];e[j+1]=b[(l/5*5)+((l+1)%5)];}else if(k%5==l%5){e[j]=b[(k+5)%25];e[j+1]=b[(l+5)%25];}else{e[j]=b[(k/5*5)+(l%5)];e[j+1]=b[(l/5*5)+(k%5)];}}System.out.println(e);}}

স্বয়ংক্রিয় বিন্যাস সহ:

public class P {
    static String c(String s) {
        return s.toUpperCase().replace('J', 'I').replaceAll("[^A-Z]", "");
    }

    static int f(char[] a, char n) {
        for (int i = 0; i < a.length; i++)
            if (a[i] == n)
                return i;
        return -1;
    }

    public static void main(String[] a) {
        int i = 0, k, l;
        char j = 0;
        String g = c(a[0]);
        char[] e, b, h = c(a[1]).toCharArray();
        b = new char[25];
        for (; j < g.length(); j++)
            if (j == g.indexOf(g.charAt(j)))
                b[i++] = g.charAt(j);
        for (j = 65; i < 25; j++)
            if (f(b, j) < 0 && j != 74)
                b[i++] = j;
        e = new char[h.length * 2];
        for (i = 0, j = 0; j < h.length;) {
            if (i % 2 > 0 && h[j] == h[j - 1])
                e[i++] = 88;
            e[i++] = h[j++];
        }
        if (i % 2 > 0)
            e[i++] = 88;
        for (j = 0; j < i; j += 2) {
            k = f(b, e[j]);
            l = f(b, e[j + 1]);
            if (k / 5 == l / 5) {
                e[j] = b[(k / 5 * 5) + ((k + 1) % 5)];
                e[j + 1] = b[(l / 5 * 5) + ((l + 1) % 5)];
            } else if (k % 5 == l % 5) {
                e[j] = b[(k + 5) % 25];
                e[j + 1] = b[(l + 5) % 25];
            } else {
                e[j] = b[(k / 5 * 5) + (l % 5)];
                e[j + 1] = b[(l / 5 * 5) + (k % 5)];
            }
        }
        System.out.println(e);
    }
}

নমুনা আউটপুট:

>java P "Stack Overflow" "The cat crept into the crypt, crapped, and crept out again."
SIRACARDFMVUICVSMORDZNAKECMZMFBCYNRDFMSVTVKBTMMY

>java P "Write a PlayFair encryption program" "Write a program that takes two lines of input and uses the first as a key phrase to encrypt the second according to the Playfair encryption technique."
RITEWFCPGMWPGEBLYTWYQTXWINOLMWVNLECAXRNBURZWXWQILEWUWYWNQTFLDINWWEMICOTPYRIKWZRMGCBPGUOGPUWOKYGIQILYPFAPTIWMDPFLETGCEWODOWDZTZ

1

জেএস (নোড) - 528 466

k=n(2)+'ABCDEFGHIKLMNOPQRSTUVWXYZ',p=n(3),t=o=''
for(i=0;i<k.length;i++)if(!~t.indexOf(k[i]))t+=k[i]
for(i=0;i<p.length;){a=f(c=p[i++]),b=f(!(d=p[i])||c==d?'X':(i++,d))
if(a.x==b.x)a.y=(a.y+1)%5,b.y=(b.y+1)%5
else if(a.y==b.y)a.x=(a.x+1)%5,b.x=(b.x+1)%5
else a.x=b.x+(b.x=a.x,0)
o+=t[a.x+a.y*5]+t[b.x+b.y*5]}console.log(o)
function f(c){x=t.indexOf(c);return{x:x%5,y:x/5|0}}
function n(a){return process.argv[a].toUpperCase().replace(/[^A-Z]/g,'').replace(/J/g,'I')}

নমুনা আউটপুট:

$ node playfair "Stack Overflow" "The cat crept into the crypt, crapped, and crept out again."
SIRACARDFMVUICVSMORDZNAKECMZMFBCYNRDFMSVTVKBTMMY
$ node playfair "Lorem ipsum" "dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
CRORSDAHGAMQKPXDOFQMQAMSBSSPUPBPTDMOAHURNRCRLUAULRGNMLCPLSKDSBSBSQQAHMIGRERYMQCROREMAGDTSZIMUHAIAQRQALSGLAHSLZRQPIETAPDXRPNMSFRYMEBPZGHARKIEMIOGROIGREPUHSUPAQIMUHAPUOYRPGRLLRCRKPXDUYAINZ

রেজেক্স ইস্যু সম্পর্কে ভাল বক্তব্য - আমি প্রশ্নের একটি নোট বিজ্ঞাপন করব
que

আপনার দ্বিতীয় উদাহরণটিতে একটি সমস্যা রয়েছে - 75 এবং 76 অক্ষরের অক্ষরের জুটি এনকোড করা হয়েছে UU। দেখে মনে হচ্ছে একটি পুনরাবৃত্তি হয়েছিল Eযে আপনার বিচ্ছেদ হওয়া উচিত।
চটজলদি ossifrage

আপনি ঠিক বলেছেন, আমি নিজেকে পায়ে গুলি করলাম। সমস্যাটি কেবল জোড়া দেখার ক্ষেত্রে রয়েছে তবে একটি সন্নিবেশের পরে একে একে শেষ হয়।
জোবিয়ার

1

পিএইচপি 582

<? list($i,$k,$v)=array_map(function($v){return str_split(preg_replace('#[^A-Z]#','',strtr(strtoupper($v),'J','I')));},$argv);@$i=array_flip;$k=$i($k)+$i(range('A','Z'));unset($k['J']);$k=array_keys($k);$q=$i($k);for($i=1;$i<count($v);$i+=2){if ($v[$i-1]==$v[$i]){array_splice($v,$i,0,'X');}}if(count($v)%2)$v[]='X';for($i=1;$i<count($v);$i+=2){$c=(int)($q[$v[$i-1]]/5);$d=$q[$v[$i-1]]%5;$e=(int)($q[$v[$i]]/5);$f=$q[$v[$i]]%5;if($c==$e){$d=($d+1)%5;$f=($f+1)%5;}elseif($d==$f){$c=($c+1)%5;$e=($e+1)%5;}else{$t=$f;$f=$d;$d=$t;}$v[$i-1]=$k[$c*5+$d];$v[$i]=$k[$e*5+$f];}echo join($v);

অবহেলিত
ডিকোডার

আউটপুট

$ php playfair.php "Stack Overflow" "The cat crept into the crypt, crapper, and crept out again."
SIRACARDFMVUICVSMORDZNAKECMZMFECYNRDFMSVTVKBTMMY
$ php playfair.php "This was codegolf?" "The full J answers is shorter than my preparation code :("
HIOKVGFHCMWTKZWSIYWIEPWAMWTCPNXQZKMOMEHSCPODEA

1

পার্ল, 265

খুব সোজা।

chomp(($k,$_)=map{uc=~y/A-Z//cdr=~y/J/I/r}<>."@{[A..Z]}",~~<>);1while$k=~s/((.).*)\2/$1/;while(/(.)((?=\1|$)|(.))/g){($a,$b,$c,$d)=map{$e=index$k,$_;5*int$e/5,$e%5}$1,$3||X;print substr$k,$_%25,1 for$a-$c?$b-$d?($a+$d,$c+$b):($a+5+$b,$c+5+$d):(++$b%5+$a,++$d%5+$c)}

ইন্ডেন্টযুক্ত:

chomp(($k,$_)=map{uc=~y/A-Z//cdr=~y/J/I/r}<>."@{[A..Z]}",~~<>);
1while$k=~s/((.).*)\2/$1/;
while(/(.)((?=\1|$)|(.))/g){
    ($a,$b,$c,$d)=map{$e=index$k,$_;5*int$e/5,$e%5}$1,$3||X;
    print substr$k,$_%25,1 for
        $a-$c
            ?$b-$d
                ?($a+$d,$c+$b)
                :($a+5+$b,$c+5+$d)
            :(++$b%5+$a,++$d%5+$c)
}

0

কফিস্ক্রিপ্ট - 610

ডেমো:

[timwolla@/data/workspace/js/PCG]coffee pcg-23276.coffee "Stack Overflow" "The cat crept into the crypt, crapped, and crept out again."
SIRACARDFMVUICVSMORDZNAKECMZMFBCYNRDFMSVTVKBTMMY

কোড:

String::r=String::replace
_=(t,l)->
    for r in[0..4]
        for c in[0..4]
            return [r,c]if l is t[r][c]
K = {}
K[c]=c for c in (process.argv[2].toUpperCase().r(/J/g, 'I').r x=/([^A-Z])/g, '')
for i in[1..26]when i!=10
    c=String.fromCharCode 64+i
    K[c]=c
K=(c for c of K)
t=(K[s..s+4]for s in[0..24]by 5)
v=process.argv[3].toUpperCase().r(/J/g,'I').r(x,'').r(/(.)\1/g,'$1X$1').r /(..)/g, '$1 '
o=""
for p in v.trim().r(/\s([A-Z])$/, ' $1X').split /\s/
    [a,b]=p.split '';[d,f]=_ t,a;[e,g]=_ t,b
    o+=if d!=e&&f!=g
        t[d][g]+t[e][f]
    else if d==e
        t[d][++f%5]+t[e][++g%5]
    else
        t[++d%5][f]+t[++e%5][g]
console.log o

অবরুদ্ধ সংস্করণ:

search = (table, letter) ->
    for row in [0..4]
        for column in [0..4]
            return [ row, column ] if letter is table[row][column]

encrypt = (key, value) ->
    key = key.toUpperCase().replace(/J/g, 'I').replace /([^A-Z])/g, ''
    keyChars = {}
    keyChars[char] = char for char in key
    for i in [1..26] when i != 10
        char=String.fromCharCode 64 + i
        keyChars[char] = char
    keyChars = (char for char of keyChars)

    keyTable = (keyChars[start..start+4] for start in [0..24] by 5)

    value = value.toUpperCase().replace(/J/g, 'I').replace(/([^A-Z])/g, '').replace(/(.)\1/g, '$1X$1').replace /(..)/g, '$1 '
    pairs = value.trim().replace(/\s([A-Z])$/, ' $1X').split /\s/

    out = ""
    for pair in pairs
        [a,b] = pair.split ''
        [rowA, colA] = search keyTable, a
        [rowB, colB] = search keyTable, b
        if rowA!=rowB&&colA!=colB
            out += keyTable[rowA][colB]+keyTable[rowB][colA]
        else if rowA==rowB
            out += keyTable[rowA][++colA%5]+keyTable[rowB][++colB%5]
        else
            out += keyTable[++rowA%5][colA]+keyTable[++rowB%5][colB]
    out.replace /(..)/g, '$1 '

console.log encrypt process.argv[2], process.argv[3]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.