Playfair एन्क्रिप्शन प्रोग्राम लिखें


20

एक प्रोग्राम लिखें जो इनपुट की दो लाइनें लेता है और प्लेफेयर एन्क्रिप्शन तकनीक के अनुसार दूसरे को एन्क्रिप्ट करने के लिए एक महत्वपूर्ण वाक्यांश के रूप में पहले का उपयोग करता है।

विकिपीडिया कुछ विस्तार में Playfair एन्क्रिप्शन का वर्णन करता है , लेकिन किसी भी अस्पष्टता से बचने के लिए, यहां एक संक्षिप्त सारांश है:

1. एक प्रमुख तालिका उत्पन्न करें:

Jकुंजी वाक्यांश में सभी आवृत्तियों को प्रतिस्थापित करें I, फिर सभी गैर-वर्णमाला वर्णों और दोहराया वर्णों को पट्टी करें। 5 × 5 एन्क्रिप्शन टेबल में डालें, शेष कोशिकाओं को वर्णमाला के बाकी हिस्सों के साथ भरें (छोड़कर 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कमांड लाइन आर्ग्युमेंट्स या ऐसे अन्य स्रोतों से प्राप्त की जा सकती है । हार्ड-कोडित इनपुट की अनुमति नहीं है।
  • आपके प्रोग्राम को पास वाक्यांश और संदेश के लिए ऊपरी और निचले दोनों प्रकार के पाठ को स्वीकार करना चाहिए।
  • एन्क्रिप्टेड आउटपुट ऊपरी या निचला मामला हो सकता है।
  • आपके कार्यक्रम को लंबाई में कम से कम 64 अक्षरों के प्रमुख वाक्यांशों को स्वीकार करना चाहिए, और कम से कम 16 केबी के संदेश ग्रंथों को लिखना चाहिए।
  • आपको गैर-एएससीआईआई इनपुट को संभालने की आवश्यकता नहीं है।
  • आप XXएन्क्रिप्शन के दौरान होने वाली अक्षर जोड़ी की संभावना को अनदेखा कर सकते हैं ।
  • कार्यक्रम के आउटपुट में व्हॉट्सएप को जोड़ने की कोई आवश्यकता नहीं है।
  • आपके उत्तर में एक संदेश, मुख्य वाक्यांश और आपके प्रोग्राम द्वारा निर्मित एन्क्रिप्टेड आउटपुट का उदाहरण शामिल होना चाहिए।
  • यह एक कोड गोल्फ चुनौती है, इसलिए सबसे छोटा कोड (बाइट्स में) वाला उत्तर जीत जाएगा।

नोट: कृपया याद रखें कि आपको केवल एक ही जोड़ी में दिखाई देने पर लगातार अक्षरों को तोड़ने की आवश्यकता है । इसलिए उदाहरण के लिए MASSACHUSETTSएन्क्रिप्ट किया जाना चाहिए MA SX SA CH US ET TS- डबल Sको विभाजित करना होगा, लेकिन डबल Tनहीं करता है।


8
"हमें पसंद नहीं है J" क्या आप एपीएल के बारे में समान भावनाओं को परेशान करते हैं ?
एल्गोरिदमार्क

Gobbledygook! (यद्यपि इसके नाम में J की कमी
श्रेयस्कर है

इनपुट आवश्यकता के संबंध में, फ़ंक्शन तर्क की अनुमति है? (सुनिश्चित नहीं है कि यह "हार्ड-कोडिंग" का गठन करता है) यदि नहीं, तो क्या हम मान सकते हैं कि कुंजी में कोई नईलाइन नहीं है (अधिमानतः, प्लेटेक्स्ट भी)? यदि नहीं, तो स्टैण्ड की तुलना में कमांड लाइन आर्ग्स अधिक व्यवहार्य हो सकती है।
अलाइड ईवेनी

जवाबों:


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
)

(@algorithmshark के व्यापक सुझावों के साथ)

उदाहरण का उपयोग करें:

   '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

* एक , सही के साथ हर जगह ?JI


2
हमें J पसंद नहीं है, लेकिन मैं सुंदर हूं!
वेरोस

वाह, यह असाधारण है।
स्क्विश ओस्सिफ्रेज

पहले संस्करण एक देखा जबकि सा मेरे लिए जादू टोना की तरह, यह एक नवीनतम शुद्ध वूडू है। बहुत प्रभावशाली कमी।
जोबिट्स

पॉप पॉप पॉप, कीस्ट्रोक्स ड्रॉप देखना! अगर किसी को इस बात की व्याख्या चाहिए कि यह जादू जादू कैसे काम करता है, तो यहां एक लिंक है ; गंभीर ऐंठन के बिना जवाब में फिट होना बहुत लंबा है।
एल्गोरिथमशार्क

मुझे अब J पसंद है :-)
स्क्वीश 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]]}*''

@Daniero को बचाने के लिए धन्यवाद ... गलती से, बहुत सारे बाइट्स। \ o /

यहाँ अन-कोडित कोड है:

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आपको सरणी में "कास्ट" करने की कोई आवश्यकता नहीं है , यह मानते हुए कि आप रूबी 2 का उपयोग कर रहे हैं। इसके अलावा आप इसके &बजाय एक सेट ऑपरेटर के रूप में उपयोग कर सकते हैं tr: t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}(7 बाइट्स सहेजे गए)। दो अगली पंक्तियों को कुछ के साथ जोड़ा जा सकता है जैसे k,m=[1,2].map{t[gets.chop]}(नोट chopबजाय chomp)।
डेनिएरो

उपयोग &करने से uniqबाद की आवश्यकता भी समाप्त हो जाती है । और charsसरणी चीज़ लाइन 6 पर भी लागू होती है
daniero

@daniero अधिकार, यह एक समय से पहले किया गया था, इसलिए शायद बहुत अधिक सुधार हैं जो मैं कर सकता था। सुझावों के लिए धन्यवाद; इस पर दोबारा गौर करने का समय!
दरवाज़े

हाँ, मुझे लगता है कि :) मैं चुनौती पर लड़खड़ाया और मैं तुरंत रूबी में उस पर एक छुरा लेना चाहता था, जब तक कि मैंने आपका जवाब नहीं देखा .. कोड की जटिलता ने मुझे इससे डरा दिया, लेकिन मुझे लेना पड़ा इसे देखिए :)
daniero

@daniero दुर्भाग्य से, trकरने के लिए &काम पंक्ति 1 पर नहीं है क्योंकि mनहीं किया जा सकता uniqवर्गीकृत। हालांकि, (1 बाइट बंद) k.uniqको छोटा किया जा सकता है (k&k)
दरवाज़े

4

C: 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
वैसे यह मेरा प्रयास बहुत बुरा लग रहा है !! आगे यह देखने के लिए कि आप इस :-) के साथ कितनी दूर जा सकते हैं
स्क्वीश ossifrage

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 में पूरी तरह से काम करता है :-)
स्क्वीश 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

रेगेक्स मुद्दे के बारे में अच्छी बात - मैं प्रश्न के लिए एक नोट
लिखूंगा

आपके दूसरे उदाहरण के साथ एक समस्या है - अक्षर 75 और 76 पर अक्षरों की जोड़ी के रूप में एन्कोड किया गया है UU। लगता है Eकि एक दोहराया गया था जिसे आपको विभाजित करना चाहिए था।
15 फरवरी को स्क्विश ossifrage

आपने सही कहा, मैंने खुद को पैर में गोली मार ली। समस्या केवल जोड़े को देखने के साथ है, लेकिन एक प्रविष्टि के बाद समाप्त हो रही है।
ज़ॉबियर

1

PHP 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

Ungolfed संस्करण:

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]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.