क्रिप्टिक किकर //


12

क्रिप्टिक किकर

पाठ को एन्क्रिप्ट करने का एक सामान्य लेकिन असुरक्षित तरीका वर्णमाला के अक्षरों को अनुमति देना है। दूसरे शब्दों में, वर्णमाला के प्रत्येक अक्षर को पाठ में किसी अन्य अक्षर द्वारा लगातार प्रतिस्थापित किया जाता है। यह सुनिश्चित करने के लिए कि एन्क्रिप्शन प्रतिवर्ती है, किसी भी दो अक्षरों को एक ही अक्षर द्वारा प्रतिस्थापित नहीं किया जाता है। आपका कार्य पाठ की कई एन्कोडेड लाइनों को डिक्रिप्ट करना है, यह मानते हुए कि प्रत्येक पंक्ति प्रतिस्थापन के एक अलग सेट का उपयोग करती है, और डिक्रिप्ट किए गए पाठ में सभी शब्द ज्ञात शब्दों के शब्दकोश से हैं।

इनपुट

इनपुट में निचले शब्दों के अक्षर होते हैं, वर्णमाला के क्रम में। ये शब्द उन शब्दों के शब्दकोश की रचना करते हैं, जो डिक्रिप्टेड पाठ में दिखाई दे सकते हैं। शब्दकोश के बाद इनपुट की कई लाइनें हैं। प्रत्येक पंक्ति को ऊपर वर्णित के अनुसार एन्क्रिप्ट किया गया है।

शब्दकोश में 1,000 से अधिक शब्द नहीं हैं। कोई भी शब्द 16 अक्षरों से अधिक नहीं है। एन्क्रिप्ट की गई लाइनों में केवल कम अक्षर के अक्षर और स्थान होते हैं और लंबाई में 80 अक्षर से अधिक नहीं होते हैं।

उत्पादन

प्रत्येक पंक्ति को डिक्रिप्ट करें और इसे मानक आउटपुट पर प्रिंट करें। यदि कई समाधान हैं, तो कोई भी करेगा। यदि कोई समाधान नहीं है, तो वर्णमाला के प्रत्येक अक्षर को तारांकन द्वारा प्रतिस्थापित करें।

नमूना इनपुट

and dick jane puff spot yertle

bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd

नमूना आउटपुट

dick and jane and puff and spot and yertle
**** *** **** *** **** *** **** *** ******

यहाँ समाधान है। कृपया ध्यान दें कि मैं सबसे छोटे बाइट्स / प्रतियोगी प्रोग्रामर की दौड़ में दौड़ने वाला घोड़ा नहीं हूं । मुझे सिर्फ पहेलियाँ पसंद हैं!

( स्रोत )


1
कृपया अपने> इनपुट <को आराम करें जो प्रत्येक भाषा के लिए लागू हो। उदाहरण के लिए बहुत सी भाषाएं नफरत करेंगी, और सराहना नहीं करें कि प्रारूप 6 से शुरू होता है। मैं सुझाव दूंगा कि प्रारूप पूरी तरह से अनिर्दिष्ट है, और केवल यह कहें कि इनपुट शब्दों की एक सूची है और एन्क्रिप्ट करने के लिए लाइनों की एक सूची है।
orlp

ठीक है, वहाँ तुम जाओ!
ध्रुव रमणी

1
क्या इसमें रनटाइम की बाधाएँ हैं? क्या मैं आसानी से हर संभव प्रतिस्थापन संयोजन के माध्यम से पुनरावृत्ति कर सकता हूं, जब तक कि एक काम नहीं होता (जिसे खत्म होने में वर्षों लगेंगे)?
नाथन मेरिल

@NathanMerrill ऐसा करो, और अगर यह साल लगने वाला है, तो इसे स्टार रूप में प्रिंट करें। विहान, यह कोई डुप्लिकेट नहीं है, कृपया प्रश्न को ठीक से पढ़ें।
ध्रुव रमणी

क्या हम केवल शब्दों का उत्पादन कर सकते हैं या क्या हमें उनसे जुड़ना होगा?
डाउनगाट

जवाबों:


3

पायथन 3, 423 बाइट्स

import sys,re
S=re.sub
D,*L=sys.stdin.read().split('\n')
def f(W,M=[],V="",r=0):
 if len({d for(s,d)in M})==len(M):
  if[]==W:return V.lower()
  for d in D.split():p='([a-z])(?%s.*\\1)';m=re.match(S(p%'=',')\\1=P?(',S(p%'!',').>\\1<P?(',W[0].translate(dict(M))[::-1]))[::-1]+'$',d.upper());r=r or m and f(W[1:],M+[(ord(s),m.group(s))for s in m.groupdict()],V+d+" ")
  return r
for l in L:print(f(l.split())or S('\w','*',l))

STDIN से इनपुट पढ़ता है और नमूना इनपुट / आउटपुट के समान प्रारूप का उपयोग करके STDOUT में आउटपुट लिखता है।

व्याख्या

सिफरटेक्स्ट की प्रत्येक पंक्ति के लिए, हम निम्नलिखित प्रक्रिया करते हैं:

हम पहले से ही स्थापित किए गए सभी पत्र परिवर्तनों का एक नक्शा, एम , रखते हैं (जो शुरू में खाली है)। हम इसे इस तरह से करते हैं कि स्रोत पत्र सभी लोअरकेस हैं और गंतव्य पत्र सभी बड़े हैं।

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

मान लीजिए कि हमारा शब्द, w , है glpplppljjlऔर उस M में नियम है j -> P। हम पहले बदलने w में मौजूदा नियमों का उपयोग कर एम , हो रही है glpplpplPPl। हम तब w को निम्न अजगर-स्वाद वाले रेगेक्स में बदलते हैं :

(?P<g>.)(?P<l>.)(?P<p>.)(?P=p)(?P=l)(?P=p)(?P=p)(?P=l)PP(?P=l)

परिवर्तन के नियम इस प्रकार हैं:

  • प्रत्येक लोअरकेस अक्षर की पहली घटना, के xसाथ बदल दी जाती है । यह एक नामित कैप्चर समूह को परिभाषित करता है, जिसे कहा जाता है , जो एक एकल कह्रेकर से मेल खाता है।(?P<x>.)x
  • प्रत्येक बाद की घटना प्रत्येक लोअरकेस अक्षर के xसाथ बदल दी जाती है । यह नाम समूह द्वारा अधिमानतः कब्जा किए गए चरित्र का एक बैकरेस्ट है ।(?P=x)x

हम इस परिवर्तन को w को उल्टा करके करते हैं , फिर निम्नलिखित दो रेगेक्स प्रतिस्थापनों को लागू करते हैं:

s/([a-z])(?!.*\1)/)>\1<P?(/
s/([a-z])(?=.*\1)/)\1=P?(/

और फिर परिणाम उलट। ध्यान दें कि M द्वारा पहले परिवर्तित किए गए वर्ण अपरकेस के रूप में दिखाई देते हैं, और इसलिए अपरिवर्तित रहते हैं।

हम प्रत्येक शब्दकोश शब्दों के खिलाफ परिणामी रेक्स से मेल खाते हैं, जहां शब्दकोश शब्द अपरकेस के रूप में दिखाई देते हैं। उदाहरण के लिए, उपरोक्त रेगेक्स शब्द से मेल खाएगा MISSISSIPPI। यदि हमें कोई मेल मिलता है, तो हम उसमें से नए परिवर्तन नियम निकालते हैं, और उन्हें M में जोड़ते हैं । नए परिवर्तन नियम बस कैप्चर समूहों में से प्रत्येक द्वारा पकड़े गए वर्ण हैं। उपरोक्त रेगेक्स में, समूह gमैच M, समूह lमैच I, और समूह pमैच S, हमें नियम देता है g -> M, l -> I, p -> S। हमें यह सुनिश्चित करना होगा कि परिणामी नियम सुसंगत हों, अर्थात एक ही गंतव्य पत्र के लिए कोई भी दो स्रोत पत्र मानचित्र न हों; अन्यथा, हम मैच को अस्वीकार करते हैं।

फिर हम संवर्धित परिवर्तन नियमों का उपयोग करते हुए, अगले शब्द पर जाते हैं। यदि हम इस प्रक्रिया का उपयोग करते हुए सभी सिफर शब्दों को मिला सकते हैं, तो हमने पाठ को डिक्रिप्ट किया है। यदि हम किसी शब्द के शब्दकोश के विरुद्ध किसी शब्द का मिलान नहीं कर सकते हैं, तो हम पीछे हटते हैं और पिछले शब्दों को विभिन्न शब्दकोश के शब्दों से मिलान करने का प्रयास करते हैं। यदि यह प्रक्रिया विफल हो जाती है, तो कोई समाधान नहीं है, और हम तारांकन की एक पंक्ति प्रिंट करते हैं।


2

सीजेएम, 62 56 बाइट्स

qN%Sf/(f{\:C,m*{C..+`Sa`m2/Q|z_''f-Qf|=},C:,'*f*a+0=S*N}

धीमी और स्मृति भूख लगी है, लेकिन जावा दुभाषिया के साथ परीक्षण के मामले के लिए काम करता है।

उदाहरण चलाते हैं

$ cat input; echo
and dick jane puff spot yertle

bjvg xsb hxsn xsb qymm xsb rqat xsb pnetfn
xxxx yyy zzzz www yyyy aaa bbbb ccc dddddd
$ time cjam kicker.cjam < input
dick and jane and puff and spot and yertle
**** *** **** *** **** *** **** *** ******

real    5m19.817s
user    6m41.740s
sys     0m1.611s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.