Sanki bu meydan okuma ruhsal olarak artık Pythonesque olabilir ... Markov zincirleri veya şifreleme teknikleri hakkında önceden bilgi sahibi olmak gerekmez.
İngiliz güvenlik hizmeti M1S'den bazı önemli bilgileri edinmesi gereken bir casussunuz. M1S'nin ajanları, Wi-Fi sinyallerinin ele geçirilebileceğinin, Android / iOS güvenlik açıklarından vb. Yararlandığının farkındadır, bu nedenle hepsi T9 otomatik tamamlama kullanılarak yazılan metin bilgilerini iletmek için Nokia 3310'ları kullanır .
Daha önce istihbarat teşkilatına teslim edilmek için telefonları hacklediniz ve muhteşem plastik klavyelerinin altına tuş kaydediciler taktınız, bu yüzden şimdi yazdıkları harflere karşılık gelen sayı dizileri alıyorsunuz, böylece “ kartal yuvaları uyarıyor ”
84303245304270533808430637802537808430243687
Fakat bekle! Bazı T9 dizileri belirsizdir (“6263” “ad”, “yele” veya “obua” olabilir; ne kadar belirsiz olursa, o kadar şüpheli olur!), O zaman ne yaparsınız? M1S'in kullandığı tek giriş sınavının Marcel Proust'un başyapıtı “Geçmişi Anma” yı 15 saniyede özetlemek olduğunu biliyorsunuz, bu nedenle önceki şefin tümünde frekans dağılımına göre bir öncekinden sonra gelen kelimeyi seçmek istiyorsunuz. ust Proust!
Kodu kırabilir ve orijinal mesajın ne olduğunu elde edebilir misiniz?
T9 prensibi
T9 otomatik tamamlama mekanizması aşağıdaki gibi açıklanabilir. Alfabetik karakterleri yukarıdaki resimde gösterildiği gibi sayılarla eşler.
abc -> 2
def -> 3
ghi -> 4
jkl -> 5
mno -> 6
pqrs -> 7
tuv -> 8
wxyz -> 9
<space> -> 0
<other> -> <is deleted>
T9 şifre çözücü bir dizi rakam alır ve bu tuşlara basılabilecek kelimeyi tahmin etmeye çalışır. Standart bir frekans tablosu kullanabilir, ancak bir adım daha ileri gidiyoruz ve bir Markov zinciri kullanarak bir sonraki kelimeyi tahmin ediyoruz!
Öğrenme örneği
Korpus olan Proust'un “Geçmiş Zamanı Anımsama” bu ağır soyulmuş versiyon ( s/-/ /g
, s/['’]s //g
ve s/[^a-zA-Z ]//g
- begone kafa karıştırıcı iyelik 's
!) Aslen yayınlanan University of Adelaide web (bu çalışmanın metin Avustralya'da Public Domain içindedir).
Yazının tamamı tek bir uzun kelimelerin vektörü olarak, bir uzun cümle olarak, bir dize olarak analiz edilmelidir (Diliniz için daha uygun olan şekilde), satır aralıklarında elimden ve mekânlar kelimelerle bölünmüş . (Tek paragraflı bir dosya sağlamıyorum çünkü github araçları tarafından kaşlarını çatmış olabilir.)
Metnin tamamını bir dize / cümle olarak nasıl okurum? R'de bir örnek :
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
Görev
Sayı olarak bir basamak dizisi verildiğinde, uzun bir cümle olarak ele alınan bu eğitim metnine dayanarak bir sonraki X kelimesini tahmin etmek için bir olasılık zinciri kullanarak karşılık gelen T9 tuşları kullanılarak yazılabilecek olası bir metin dizesini döndürün .
Eğer X metnin ilk T9-kelime ve orada birden tahmin hakkın olan birini rasgele seçer aksi mümkün yalnızca birini seç.
Öncesinde w (i-1) deşifre edilmiş bir kelime ile gelen sonraki tüm T9 kelimeleri X (i ) için :
- Bir T9 kelimesi X , benzersiz bir şekilde normal bir x kelimesine dönüştürülebilirse , bunu yapın.
- X için birden fazla dönüştürme seçeneği varsa , örneğin x1, x2, ... , önceki tahmin edilen w kelimesine bakın .
- Eğer w eşleştiren bir şey tarafından takip asla X Proust orijinal çalışmalarında, olası herhangi almak , ... x1, x2 rastgele.
- Eğer X w hep tekabül x1 w orijinal ve hiçbir eşzamanlı vardır xi ‘s o dönüþtürülmelidir olabilir X , almak x1 .
- Eğer X w dönüştürülebilir x1 w , x2 w ... o korpus bulunabilir, daha sonra tüm olası saymak xi ‘o takip s w ve eşlemek X korpus ve almak xi olasılığı ile xi / (x1 + x2 + ...) .
Örnek 2a. Mesaj 76630489
, nerede 489
olabilirse guy
veya ivy
(en az bir kez corpus'ta meydana gelirse), (çok muhtemel bir ilk kelime) 7663
olarak deşifre edilebilir some
. Hiçbir some
zaman 489
cesetle eşleşen hiçbir şey gelmezse, 0,5 olasılıkla guy
veya ivy
rastgele seçin .
Örnek 2b. İleti ise 766302277437
, nerede 2277437
olabilir barrier
veya carrier
, 7663
olarak deşifre edilebilir some
. Proust her zaman kullanılırsa some carrier
ve asla kullanılmazsa some barrier
, seçin some carrier
.
Örnek 2c. Diziyi deşifre etmek istediğinizi varsayalım 536307663
. 5363
olarak tahmin edildi lend
. 7663
Bunlardan herhangi biri olabilir: pond
, roof
ve some
. lend
Örnek corpus'taki sözcüğün oluşumlarını sayıyorsunuz. Diyelim ki böyle bir şey aldınız (sadece örneklemek için):
T9 Word following lend Occurrences
7663 some 7
7663 pond 2
7663 roof 1
Yani 7663
öncesinde lend
, orada 7/(7+2+1)=70%
olasılığı 7663
açılımı some
% 20, pond
ve% 10 roof
. Algoritmanız lend some
% 70 vakada, lend pond
% 20 vakada vb. Üretmelidir.
Temsilcilerin yalnızca az harf ve boşluk kullandığını (noktalama işaretleri yok, iyelik 's
yok ve rakam yok) güvenle varsayabilirsiniz .
Ayrıca, M1S ajanlarının asla “Geçmişteki Şeyleri Anma” (29,237 kelimelik bir kelime haznesi!) Dışında herhangi bir kelime kullanmadığını varsayabilirsiniz .
T9 işlevliliği bu meydan okumada uygulandı, bu yüzden ona bir göz atabilirsiniz .
Herhangi bir yardıma ihtiyacınız olursa, olasılık zincirleri tarz içinde bakılmıştır bu , o ve aşağıdaki zorluklar, ancak daha böyle zincirlerin prensibini bilmek gerekmez: Her şey görevi belirtilmiştir.
Test senaryoları
--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
Kurallar:
- Standart boşluklar geçerlidir.
- Orijinal mesajı bilmiyorsunuz, elde ettiğiniz tek şey bir basamak dizisi ve sadece bellek / çalışma alanında / her neyse yüklemeniz gereken proust.txt dosyası . Kendi kendine yeten hiçbir şeye sahip olmaya gerek yoktur;
proust.txt
her zaman erişilebilir olduğunu varsayalım . - Eğer korpusa göre birden fazla şifre çözme seçeneği mümkünse, algoritmanızın ilgili olasılıklarla farklı çıktılar üretebilmesi gerekir (bakınız Örnek 2c).
Mümkün olduğunca gizli kalmanız gerekir, böylece en kısa kod kazanır!
PS Bu olasılıksal algoritmanın bariz yararı, belirsiz bir deşifre edilmiş dize için gerçek bir orijinal dize alma olasılığının bire eğilim göstermesidir - sadece bekleyin ...
PPS Ayrıca bkz . Kısmi Eşleme ile Tahmin .