मार्सेल प्राउस्ट और मार्कोव ने सुरक्षा सेवा के T9 ग्रंथों को समझा


11

जैसे कि यह चुनौती आत्मा में कोई और पायथन हो सकती है ... मार्कोव श्रृंखला या एन्क्रिप्शन तकनीकों के पूर्व ज्ञान की आवश्यकता नहीं है।

आप एक जासूस हैं जिन्हें ब्रिटिश सुरक्षा सेवा M1S से कुछ महत्वपूर्ण जानकारी प्राप्त करने की आवश्यकता है। M1S के एजेंट अच्छी तरह से जानते हैं कि उनके वाई-फाई सिग्नलों को इंटरसेप्ट किया जा सकता है, उनका एंड्रॉइड / आईओएस सिक्योरिटी कमजोरियों आदि का फायदा उठाया जा सकता है, इसलिए वे सभी नोकिया 3310 का उपयोग टेक्स्ट जानकारी प्रसारित करने के लिए कर रहे हैं जो कि टी 9 ऑटो-कम्प्लीट का उपयोग करके टाइप किया गया है ।

आपने पहले खुफिया एजेंसी पर डिलीवर होने के लिए फोन हैक किए थे और अपने शानदार प्लास्टिक कीबोर्ड के नीचे कीलॉगर्स लगाए थे, इसलिए अब आपको टाइप किए गए अक्षरों के अनुरूप संख्याओं के अनुक्रम प्राप्त होते हैं, इसलिए " ईगल ने घोंसले को छोड़ दिया है, जो एजेंट बन गए हैं।"

84303245304270533808430637802537808430243687

लेकिन रुकें! कुछ T9 अनुक्रम अस्पष्ट हैं ("6263" "नाम", "अयाल" या "ओबो" हो सकता है;) जितना अधिक अस्पष्ट, उतना ही अधिक संदिग्ध!), तो आप क्या करते हैं? आप जानते हैं कि एकमात्र प्रवेश परीक्षा M1S का उपयोग 15 सेकंड में मार्सेल प्रूस्ट की कृति "रिमेंबरेंस ऑफ थिंग्स पास्ट" को संक्षेप में प्रस्तुत करता है, इसलिए आप उस शब्द को चुनना चाहते हैं जो पिछले शेफ-डी में इसकी आवृत्ति वितरण के अनुसार पिछले एक के बाद आता है। ' प्राउस्ट के Puvre!

क्या आप कोड को क्रैक कर सकते हैं और प्राप्त कर सकते हैं कि मूल संदेश क्या हो सकता है?

टी 9 का सिद्धांत

एजेंटों द्वारा उपयोग किए गए नोकिया 3310 कीबोर्ड

T9 ऑटो-पूरा करने के तंत्र को निम्नानुसार वर्णित किया जा सकता है। यह वर्णमाला के अक्षरों को मैप करता है जैसा कि ऊपर चित्र में दिखाया गया है।

abc     -> 2
def     -> 3
ghi     -> 4
jkl     -> 5
mno     -> 6
pqrs    -> 7
tuv     -> 8
wxyz    -> 9
<space> -> 0
<other> -> <is deleted>

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

नमूना सीखना

कोरपस इस जोर से छीन लिया गया संस्करण है जो प्राउस्ट के "रिमेंबरेंस ऑफ थिंग्स पास्ट"s/-/ /g , ( s/['’]s //gऔर s/[^a-zA-Z ]//g- भ्रामक भ्रामक है 's!) को मूल रूप से एडिलेड वेबसाइट पर प्रकाशित किया गया है (इस काम का पाठ ऑस्ट्रेलिया में पब्लिक डोमेन में है)।

पूरे पाठ का एक स्ट्रिंग के रूप में विश्लेषण किया जाना चाहिए, एक लंबे वाक्य के रूप में, शब्दों के एक लंबे वेक्टर के रूप में (जो भी आपकी भाषा के लिए अधिक सुविधाजनक है), लाइनब्रेक से छीन लिया गया , और रिक्त स्थान पर शब्दों में विभाजित हो गया । (मैं एकल-पैराग्राफ फ़ाइल की आपूर्ति नहीं करता हूं क्योंकि इस तरह से गितुब टूल द्वारा भरा जा सकता है।)

मैं पूरे पाठ को एक स्ट्रिंग / वाक्य के रूप में कैसे पढ़ सकता हूं? R में एक उदाहरण :

p_raw  <- read.table("proust.txt", sep="\t") # Because there are no tabs
p_vec  <- as.character(p_raw$V1)       # Conversion to character vector
p_str  <- paste(p_vec, collapse=" ")   # One long string with spaces
p_spl  <- strsplit(p_str, split=" ")[[1]] # Vector of 1360883 words
proust <- p_spl[p_spl!=""]           # Remove empty entries — 1360797

कार्य

एक संख्या के रूप में अंकों के अनुक्रम को देखते हुए, एक संभावित पाठ स्ट्रिंग लौटाएं जिसे एक लंबे वाक्य के रूप में माना जाने वाले इस प्रशिक्षण पाठ के आधार पर अगले शब्द X की भविष्यवाणी करने के लिए एक संभावित श्रृंखला का उपयोग करके संबंधित T9 कुंजी का उपयोग करके टाइप किया जा सकता है ।

यदि X पाठ का पहला T9-शब्द है और कई अनुमान हैं, तो यादृच्छिक पर एक को चुनें, अन्यथा केवल एक को ही चुनें।

बाद के सभी T9- शब्द X (i) के लिए पहले से ही व्याख्या किए गए शब्द (i-1) से पहले :

  1. यदि T9- शब्द X को एक अनोखे तरीके से सामान्य शब्द x में परिवर्तित किया जा सकता है , तो करें।
  2. यदि X के लिए कई रूपांतरण विकल्प उपलब्ध हैं , तो X1, x2, ... कहते हैं , पूर्ववर्ती अनुमानित शब्द w देखें
    • यदि w का कभी भी ऐसा कुछ भी नहीं है जो Proust के मूल काम में X के लिए मैप करता है, तो किसी भी संभावित X1, x2, ... को यादृच्छिक रूप से चुनें।
    • यदि w X हमेशा मूल में X1 से मेल खाता है और कोई समवर्ती xi नहीं है जिसे X में मैप किया जा सकता है , तो X1 को चुनें ।
    • यदि w X को w1 , w x2 , w में परिवर्तित किया जा सकता है , ... जो कि कॉर्पस में पाया जा सकता है, तो सभी संभावित xi की गणना करें, जो कॉर्प में w का अनुसरण करता है और कॉर्प का X में मैप करता है और प्रायिकता xi / X1 के साथ xi को चुनता है। + x2 + ...)

उदाहरण 2 ए। यदि संदेश है 76630489, जहां 489हो सकता है guyया ivy(वे कम से कम एक बार कॉर्पस में होते हैं), (एक बहुत ही संभावित पहला शब्द) के 7663रूप में व्याख्या की जा सकती है some। यदि कॉर्पस में someमैप करने वाली किसी भी चीज़ का पालन कभी नहीं किया जाता है 489, तो संभावना 0.5 के साथ यादृच्छिक पर चुनें guyया ivy

उदाहरण 2 बी। यदि संदेश है 766302277437, जहां या 2277437हो सकता है , के रूप में डिक्रिप्ट किया जा सकता है । यदि प्राउस्ट हमेशा उपयोग किया जाता है और कभी नहीं , तो उठाओ ।barriercarrier7663somesome carriersome barriersome carrier

उदाहरण 2 सी। मान लीजिए कि आप अनुक्रम को समझना चाहते हैं 5363076635363के रूप में भविष्यवाणी की गई थी lend7663इनमें से किसी भी हो सकता है: pond, roofऔर some। आप lendनमूना कॉर्पस में निम्नलिखित शब्दों की घटनाओं को गिनते हैं । मान लीजिए कि आपको कुछ ऐसा मिलता है (उदाहरण के लिए):

        T9  Word following lend  Occurrences
      7663  some                           7
      7663  pond                           2
      7663  roof                           1

इसलिए यदि 7663पहले से lend, 7/(7+2+1)=70%संभावना है कि 20% और 10% 7663के लिए खड़ा है । आपके एल्गोरिथ्म को 70% मामलों में, 20% मामलों में आदि का उत्पादन करना चाहिए ।somepondrooflend somelend pond

आप सुरक्षित रूप से मान सकते हैं कि एजेंट केवल az अक्षर और रिक्त स्थान का उपयोग करते हैं (कोई विराम चिह्न, कोई अधिकार 'sनहीं और कोई संख्या नहीं)।

आप यह भी मान सकते हैं कि M1S के एजेंट कभी भी " रिमेंबरेंस ऑफ थिंग्स पास्ट" के दायरे के बाहर किसी भी शब्द का उपयोग नहीं करते हैं (जो 29,237 शब्दों की एक गहन शब्दावली है!)।

इस चुनौती में टी 9 की अस्थिरता को लागू किया गया था , इसलिए आपको इस पर एक नज़र पड़ सकती है।

आप किसी भी मदद की ज़रूरत है, संभाव्य चेन महाप्रतापी में वश में कर रहे थे इस , कि और निम्नलिखित चुनौतियों, लेकिन आप भी इस तरह के चेन के सिद्धांत पता करने की जरूरत नहीं है: सब कुछ कार्य में कहा गया है।

परीक्षण के मामलों

--Inputs--
20784250276960369
20784250276960369
84303245304270533808430637802537808430243687
94280343084306289072908608430262780482737
94280343084306289072908608430262780482737

--Possible outputs--
c quick brown fox
a stick crown fox
the eagle gas left the nest blest vie agents
what did the navy pay to the coast guards
what did the navy raz un the coast guards

नियम:

  • मानक खामियां लागू होती हैं।
  • आपको मूल संदेश नहीं पता है, आपको जो कुछ भी मिलता है वह अंकों का एक क्रम है और फ़ाइल proust.txt है जिसे आपको बस मेमोरी / कार्यक्षेत्र / जो कुछ भी लोड करने की आवश्यकता है। कुछ भी आत्म-निहित होने की आवश्यकता नहीं है; मान proust.txtहमेशा सुलभ है।
  • आपके एल्गोरिदम को संबंधित संभावनाओं के साथ विभिन्न आउटपुट का उत्पादन करने में सक्षम होना चाहिए यदि कॉर्पस के अनुसार एक से अधिक डिक्रिप्शन विकल्प संभावित है (उदाहरण 2c देखें)।

आपको यथासंभव विवेकशील रहने की आवश्यकता है, इसलिए सबसे छोटा कोड जीतता है!

पुनश्च इस संभाव्य एल्गोरिथ्म का स्पष्ट लाभ यह तथ्य है कि संभाव्यता आपको एक अस्पष्ट डिक्रिपर्ड स्ट्रिंग के लिए एक वास्तविक मूल स्ट्रिंग मिलेगी - बस प्रतीक्षा करें ...

PPS आंशिक मिलान द्वारा भविष्यवाणी भी देखें ।


सैंडबॉक्स से पीटर टेलर की टिप्पणी को ध्यान में रखा गया। अफसोस की बात यह है कि कई अपडेट के बाद भी बहुत कम लोगों ने इस पर प्रतिक्रिया दी थी, इसलिए किसी भी सुझाव का स्वागत है! BTW, यह मेरी पहली चुनौती है!
आंद्रे

मुझे संदेह है कि इस समस्या को समझने के लिए आवश्यक उन्नत ज्ञान के कारण आपको कई प्रतिक्रियाएँ नहीं मिलीं। यदि आप एक बड़ी भीड़ से अपील करने के लिए इस चुनौती को चाहते हैं , तो मैं कुछ पहले के उदाहरणों की सिफारिश करूंगा, जो काम पर मार्कोव श्रृंखला दिखाते हैं :)
नाथन मेरिल

@NathanMerrill ठीक है, मैंने नमूना चुनौतियों के लिए 3 लिंक जोड़े। हालांकि, एक उपयोगकर्ता को मार्कोव श्रृंखलाओं को जानने की आवश्यकता नहीं है क्योंकि कार्य को निकाय में एल्गोरिदम के रूप में संभव के रूप में वर्णित किया गया है: यदि एक्स, इस सीखने के नमूने में जेड की गणना करके प्राप्त संभावनाओं के साथ वाई करता है। मैंने इसे जितना आत्मनिर्भर बनाने की कोशिश की ...
आंद्रेost कोस्टीर्का

ओह मैं समझता हूँ। यदि आप इसे स्पष्ट नहीं करते, तो मैं इसे बंद करने के लिए मतदान करता। यह सिर्फ ऐसा लगता है जैसे इसे उन्नत ज्ञान की आवश्यकता है :)
नाथन मेरिल

1
मुझे यह चुनौती पसंद है, लेकिन मेरे पास अभी तक बैठने और गोल्फ बनाने / हल करने का समय नहीं है। उम्मीद है कि जल्द ही होगा।
मेगो सेप

जवाबों:


1

समाधान, गैर-प्रतिस्पर्धी चित्रण जो किया जा सकता है

सबसे पहले, हम शब्दों के क्रम को मेमोरी में लोड करते हैं:

p_raw  <- read.table("proust.txt", sep="\t") # Because there are no tabs
p_vec  <- as.character(p_raw$V1)       # Conversion to character vector
p_str  <- paste(p_vec, collapse=" ")   # One long string with spaces
p_spl  <- strsplit(p_str, split=" ")[[1]] # Vector of 1360883 words
proust <- p_spl[p_spl!=""]           # Remove empty entries — 1360797

दूसरे, हमें एक फ़ंक्शन की आवश्यकता है जो किसी भी पाठ को T9-ifies:

t9 <- function (x) {
  x <- chartr(paste(c(letters, " "), collapse=""), "222333444555666777788899990", tolower(x))
  x <- gsub("[^0-9]", "", x, perl = TRUE) # Safety check
  x <- x[x!=""] # Also for safety because... you know...
  x
}

फिर, हम T9-ify प्राउस्ट:

p9 <- t9(proust)

अंतिम तैयारी: हम एक फ़ंक्शन का उपयोग करते हुए शून्य पर इनपुट स्ट्रिंग को विभाजित करते हैं prep)

prep <- function (x) {
  x <- chartr("0", " ", x)
  x <- strsplit(x, " ")[[1]]
  x <- x[x!=""] # Boil the empty strings for safety
  x
}

और अब मैं एक फ़ंक्शन का प्रस्ताव करता हूं जो संख्याओं के किसी भी इनपुट स्ट्रिंग को लेता है, prepयह है और शब्दों को एक-एक करके डिक्रिप्ट करता है:

decip <- function(x, verbose = FALSE) {
  x <- prep(x)
  l <- length(x)
  decrypted <- rep(NA, l)
  tb <- table(proust[which(p9 == x[1])])
  decrypted[1] <- sample(names(tb), 1, prob=tb/sum(tb))
  if (verbose) print(decrypted[1])
  for (i in 2:l) {
    mtchl <- p9 == x[i]
    mtch <- which(mtchl)  # Positions that matched
    pmtch <- proust[mtch] # Words that matched
    tb <- table(pmtch)    # Count occurrences that matched
    if (length(tb)==1) {  # It is either 1 or >1
      decrypted[i] <- names(tb)[1]
      if (verbose) print(paste0("i = ", i, ", case 1: unique decryption"))
      } else {  # If there are more than one ways to decipher...
      preced <- proust[mtch-1] 
      s <- sum(preced==decrypted[i-1])
      if (s==0) {
        decrypted[i] <- sample(names(tb), 1)
        if (verbose) print(paste0("i = ", i, ", case 2a: multiple decryption, collocation never used, picking at random"))
        } else {
        tb2 <- table(pmtch[preced==decrypted[i-1]])
        if (length(tb2)==1) {
          decrypted[i] <-  names(tb2)[1]
          if (verbose) print(paste0("i = ", i, ", case 2b: multiple decryption, only one collocation found, using it"))
        } else {
          decrypted[i] <- sample(names(tb2), 1, prob = tb2/sum(tb2))
          if (verbose) print(paste0("i = ", i, ", case 2c: multiple decryption, ", length(tb2), " choices"))
          }
      }
    }
    if(verbose) print(decrypted[i])
  }
  decrypted
}

और अब यह वास्तव में क्या कर रहा है:

decip("20784250276960369", verbose=TRUE)
----
[1] "a"
[1] "i = 2, case 2c: multiple decryption, 2 choices"
[1] "quick"
[1] "i = 3, case 2a: multiple decryption, collocation never used, picking at random"
[1] "brown"
[1] "i = 4, case 1: unique decryption"
[1] "fox"
[1] "a"     "quick" "brown" "fox" 

दूसरा उदाहरण:

decip("84303245304270533808430637802537808430243687", verbose=TRUE)
----
[1] "what"
[1] "i = 2, case 2b: multiple decryption, only one collocation found, using it"
[1] "did"
[1] "i = 3, case 2b: multiple decryption, only one collocation found, using it"
[1] "the"
[1] "i = 4, case 1: unique decryption"
[1] "navy"
[1] "i = 5, case 2a: multiple decryption, collocation never used, picking at random"
[1] "raz"
[1] "i = 6, case 2a: multiple decryption, collocation never used, picking at random"
[1] "um"
[1] "i = 7, case 2a: multiple decryption, collocation never used, picking at random"
[1] "the"
[1] "i = 8, case 2b: multiple decryption, only one collocation found, using it"
[1] "coast"
[1] "i = 9, case 1: unique decryption"
[1] "guards"
[1] "what"   "did"    "the"    "navy"   "raz"    "um"     "the"    "coast"  "guards"

कृपया टिप्पणी न करें कि यह गोल्फ हो सकता है। लगता है कि मेरी भयानक वाचालता के कारण कुछ लोग इस चुनौती में रुचि रखते हैं, इसलिए मैंने यह उत्तर यह दिखाने के लिए पोस्ट किया कि एक संभावित कार्यक्रम कैसा दिख सकता है। आपको इस उत्तर को अपवोट / डाउनवोट करने की आवश्यकता नहीं है।


1

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

from random import*
from collections import*
def d(s,f):
 D=defaultdict(Counter);p=q=''
 for w in open(f).read().split():D[w.translate({97+c:(c-(c>17)-(c>24))//3+50for c in range(26)})].update([w]);D[p].update([w]);p=w
 for c in s.split('0'):q=choice([*(len(D[c])>1and D[c]&D[q]or D[c]).elements()]);print(q,end=' ')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.