Merge branch 'columns' into neil
authorNeil Smith <neil.github@njae.me.uk>
Wed, 20 Nov 2013 12:12:47 +0000 (12:12 +0000)
committerNeil Smith <neil.github@njae.me.uk>
Wed, 20 Nov 2013 12:12:47 +0000 (12:12 +0000)
2013/4a.ciphertext [new file with mode: 0644]
2013/4b.ciphertext [new file with mode: 0644]
2013/mona-lisa-words.txt [new file with mode: 0644]
2013/solutions.txt
cipher.py
segment.py

diff --git a/2013/4a.ciphertext b/2013/4a.ciphertext
new file mode 100644 (file)
index 0000000..b724af7
--- /dev/null
@@ -0,0 +1 @@
+EVWZE AGJUU WMWHM CWCIA GAHIW CUNDC CANIW DCVAH IDZAI VAEMW CIWCU MCTID DYWII DWIMZ ROALD GAIVA PMGMC TCDDC AYCDP HPVMI VMEEA CATID WITJG WCUIV ARAMG HWIPM HBWHH WCUUW KACVD PZDCU WIPMH MPMRW NMCJC TAGHI MCTIV ALGAC NVGAZ JNIMC NAIDZ AIUDD LWIMU MWCWL DZZDP ATJER DJGZA MTDCN VMBOD GTMCT TWHND KAGAT IVMII VAZDJ KGAHE MWCIW CUHPA GAIGM CHLAG GATID ZDJKW UCRIV AMOOM RATAZ DNTWA JIVAB JHAAT ABDCI MJOMC MCTLW CMZZR IDBDC IMZJC TAGIV AHJEA GKWHW DCDLI VABJH AJBHT WGANI DGXMN FJAHX MJXMG TOJIW VMKAM LAAZW CUPAM GABWH HWCUH DBAIV WCUWC MZZIV WHXJH INMCI EJIBR LWCUA GDCWI NVMHW CUJEI VAOMN YUGDJ CTHID GRDCD JGRDJ CUEMW CIAGW IHAAB HZWYA VAGLM BWZRV MKAVM TMZDC UWCIA GAHIW CMGIG AHIDG MIWDC MCTWU JAHHI VMIWH PVAGA HVAZA MGCAT VAGHY WZZHO JIVAG DOKWD JHJCT AGHIM CTWCU DLMLD GUAGH PDGYB MYABA PDCTA GWLHD BADCA WCIVA LMBWZ RBMRO AIVAB JNVZD KATUG MCTLM IVAGV MTMZA HHDOK WDJHH DJGNA DLWCN DBANM CRDJL WCTDJ IBDGA MODJI IVABP VMIEM GIDLW IMZRT WTIVA LMBWZ RNDBA LGDBD GWUWC MZZRW PWZZC AATIV MIQGM RDLIV AEMWC IWCUM HHDDC MHRDJ NMCUA IWITD CAWVM KAMVJ CNVIV ADZTZ MTRWH VWTWC UBDGA IVMCV AGLAA ZWCUH OAVWC TIVMI HBWZA MZZIV AOAHI VMGGR
diff --git a/2013/4b.ciphertext b/2013/4b.ciphertext
new file mode 100644 (file)
index 0000000..b64946e
--- /dev/null
@@ -0,0 +1 @@
+WPSHC TSGZR LSKON JZSHJ CWONJ NTLSB TJDLN TLYDC BTSCV WXKHJ NSVJW BTJDJ KGCJN TLSCM SHSOS WCHJJ NTPSZ ZWCJN THNSV DPHWS BCDJH KGTPN SJNTH SPAKJ WYTEJ BRNSC VHATN WCVBR ASLYJ DNWVT JNTGT VEWOB TCJWN SVATT CPDGY WCOSC VNTHS WVCDJ NWCON THTTB HJDNS MTHDI JTCTV AKJWY CDPWL SCCDJ JGKHJ SCRDC TNTGT HNTBK HJCDJ ATVWH LDMTG TVNTG TDGJN TRPWZ ZJSYT SPSRB RZSHJ NDETD IGTHL KWCON TGSCV GTJKG CWCON TGJDJ NTONT JJDBR EZSCH JDTHL SETSG TDIZT HHWBE DGJSC LTAKJ BRJGS MTZVD LKBTC JHSGT CDPLD BEZTJ TJNTE SETGH SCVWC YHPTG TNSGV JDSLF KWGTA KJWTQ LKHTV BKLND IWJAR TQEZS WCWCO JNSJW CTTVT VJDHY TJLNJ DHNSG ETCBR HYWZZ HPNWL NNSVV TJTGW DGSJT VWCJN TLSBE WSBHS MWCOH KLNID DVSHB WONJZ SHJBD HJZRN SGVAG TSVSC VNSGV LNTTH TSOSW CHJJN TVSRH PNTCW NDETJ DGKCI GDBJN WHEZS LTCDP WPWZZ CTTVJ DIWCV SPSRJ DHJTS ZBDCT RJDES RIDGB RXDKG CTRBR EZSLT NWONW CJNTS JJWLO WMTHB TSMWT PDIJN TLWJR PNWLN NSHSZ ZDPTV BTJDB SYTSB SEJDO KWVTB TDCJN TBDDC ZTHHC WONJP NTCWP WZZIW CSZZR GKCSC VWYTT EJNTB SEPWJ NNTGS CVPWJ NJNWH VWSGR KCVTG JNTAD SGVHW PWZZZ WMTSC VWPWZ ZATIG TTSCV HDPWZ ZHNT
diff --git a/2013/mona-lisa-words.txt b/2013/mona-lisa-words.txt
new file mode 100644 (file)
index 0000000..0ce029c
--- /dev/null
@@ -0,0 +1,23 @@
+samothrace
+paume
+musees
+musee
+valenay
+jeu
+montal
+montauban
+louvigny
+abbaye
+curated
+jaujard
+jahan
+loc
+albinguillot
+dieu
+reinstallation
+koblenz
+fonkenell
+vaux
+laure
+guillaume
+chambord
index 851fd4319727db43fefdd5dec13c7234221a5ac0..434832b25e767411175c4ec70091e1e71818b4d2 100644 (file)
@@ -3,4 +3,9 @@
 2a: affine_decipher(c2a, 3, 3, True)
 2b: caesar_decipher(c2b, 6)
 3a: affine_decipher(c3a, 7, 8, True)
+# with open('2013/mona-lisa-words.txt') as f: mona_lisa_words = [line.rstrip() for line in f]
+# keyword_break(c4a, wordlist=mona_lisa_words)
 3b: keyword_decipher(c3b, 'louvigny', 2)
+4a: keyword_decipher(c4a, 'montal', 2)
+4b: keyword_decipher(c4b, 'salvation', 2)
+
index bd07596815fd629ddf348b5bca12fbd75f080a2f..ba4a73f7f39ab8d712b9ba9e52d49e269e1999ed 100644 (file)
--- a/cipher.py
+++ b/cipher.py
@@ -51,6 +51,14 @@ for a in range(26):
         c = (a * b) % 26
         modular_division_table[b][c] = a
 
+def letters(text):
+    """Remove all non-alphabetic characters from a text
+    >>> letters('The Quick')
+    'TheQuick'
+    >>> letters('The Quick BROWN fox jumped! over... the (9lazy) DOG')
+    'TheQuickBROWNfoxjumpedoverthelazyDOG'
+    """
+    return ''.join([c for c in text if c in string.ascii_letters])
 
 def sanitise(text):
     """Remove all non-alphabetic characters and convert the text to lowercase
@@ -60,8 +68,9 @@ def sanitise(text):
     >>> sanitise('The Quick BROWN fox jumped! over... the (9lazy) DOG')
     'thequickbrownfoxjumpedoverthelazydog'
     """
-    sanitised = [c.lower() for c in text if c in string.ascii_letters]
-    return ''.join(sanitised)
+    # sanitised = [c.lower() for c in text if c in string.ascii_letters]
+    # return ''.join(sanitised)
+    return letters(text).lower()
 
 def ngrams(text, n):
     """Returns all n-grams of a text
@@ -160,11 +169,14 @@ def frequencies(text):
      ('h', 2), ('i', 1), ('j', 1), ('k', 1), ('l', 1), ('m', 1), ('n', 1), 
      ('o', 4), ('p', 1), ('q', 1), ('r', 2), ('t', 2), ('u', 2), ('v', 1), 
      ('w', 1), ('x', 1), ('y', 1), ('z', 1)]
+    >>> frequencies('abcdefabcdef')['x']
+    0
     """
-    counts = collections.defaultdict(int)
-    for c in text: 
-        counts[c] += 1
-    return counts
+    #counts = collections.defaultdict(int)
+    #for c in text: 
+    #    counts[c] += 1
+    #return counts
+    return collections.Counter(c for c in text)
 letter_frequencies = frequencies
 
 def deduplicate(text):
index 712895b6b0d7f1563ee4149fe7d94445a3931233..bd15e00e41913aa5115da546fb70215143341df2 100644 (file)
@@ -24,7 +24,7 @@ def splits(text, L=20):
 def Pwords(words): 
     """The Naive Bayes log probability of a sequence of words.
     """
-    return sum(Pw[w] for w in words)
+    return sum(Pw[w.lower()] for w in words)
 
 class Pdist(dict):
     """A probability distribution estimated from counts in datafile.