+ "execution_count": 55,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Setting sheet line 31 from http://www.codesandciphers.org.uk/enigma/enigma3.htm\n",
+ "# Enigma simulation settings are \n",
+ "# http://enigma.louisedade.co.uk/enigma.html?m3;b;b153;AFTX;AJFE;AU-BG-EY-FP-HL-IN-JZ-OS-QR-TX\n",
+ "enigma = Enigma(reflector_b_spec, \n",
+ " wheel_i_spec, wheel_i_pegs,\n",
+ " wheel_v_spec, wheel_v_pegs,\n",
+ " wheel_iii_spec, wheel_iii_pegs,\n",
+ " 6, 20, 24,\n",
+ " 'ua pf rq so ni ey bg hl tx zj')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "enigma.set_wheels('j', 'e', 'u')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (4, 11, 24))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'jev')\n",
+ "assert(enigma.peg_positions == ([7], [21], [0]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'mvqjlyowkdieasgzcunxrbhtfp')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (4, 12, 25))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'jfw')\n",
+ "assert(enigma.peg_positions == ([7], [20], [25]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'sjolzuyvrbwdpxcmtiaqfhknge')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (4, 12, 0))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'jfx')\n",
+ "assert(enigma.peg_positions == ([7], [20], [24]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'qrxedkoywufmlvgsabpzjnicht')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (4, 12, 1))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'jfy')\n",
+ "assert(enigma.peg_positions == ([7], [20], [23]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'hpsukliagqefwvtbjxcodnmrzy')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (4, 12, 2))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'jfz')\n",
+ "assert(enigma.peg_positions == ([7], [20], [22]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'zevnbpyqowrtxdifhkulscjmga')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "enigma.set_wheels('i', 'd', 'z')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 3))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'ida')\n",
+ "assert(enigma.peg_positions == ([8], [22], [21]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'ikhpqrvcambzjondefwyxgsutl')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 4))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idb')\n",
+ "assert(enigma.peg_positions == ([8], [22], [20]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'cdabskhgzwfmlqvunyexpojtri')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 5))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idc')\n",
+ "assert(enigma.peg_positions == ([8], [22], [19]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'pcbwiqhgemyvjsuaftnroldzkx')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 6))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idd')\n",
+ "assert(enigma.peg_positions == ([8], [22], [18]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'xcbfvdnouptmlghjzwykierasq')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 7))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'ide')\n",
+ "assert(enigma.peg_positions == ([8], [22], [17]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'xfvglbdynuseriwqpmkzjcoaht')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 8))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idf')\n",
+ "assert(enigma.peg_positions == ([8], [22], [16]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'tfpqlbouynsewjgcdxkahzmriv')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 9))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idg')\n",
+ "assert(enigma.peg_positions == ([8], [22], [15]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'cjaunvlwtbygzexrspqidfhokm')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 10))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idh')\n",
+ "assert(enigma.peg_positions == ([8], [22], [14]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'yltxkrqvowebzpingfucshjdam')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 11))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idi')\n",
+ "assert(enigma.peg_positions == ([8], [22], [13]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'myktluzrnxceaiqsohpdfwvjbg')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 12))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idj')\n",
+ "assert(enigma.peg_positions == ([8], [22], [12]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'pynjrmiugdqxfcvakewzhoslbt')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 13))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idk')\n",
+ "assert(enigma.peg_positions == ([8], [22], [11]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'mwvedyplnoxhaijgrqtszcbkfu')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 14))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idl')\n",
+ "assert(enigma.peg_positions == ([8], [22], [10]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'qcbrfeutvoxpnmjladzhgiykws')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 15))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idm')\n",
+ "assert(enigma.peg_positions == ([8], [22], [9]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'dnoahryetsmukbcvwfjilpqzgx')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 16))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idn')\n",
+ "assert(enigma.peg_positions == ([8], [22], [8]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'nidcfehgbqsovalyjzkxwmutpr')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 17))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'ido')\n",
+ "assert(enigma.peg_positions == ([8], [22], [7]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'joifxdulcarhzpbntkwqgysevm')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 18))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idp')\n",
+ "assert(enigma.peg_positions == ([8], [22], [6]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'ptnlsxvozmwdjchayuebrgkfqi')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 19))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idq')\n",
+ "assert(enigma.peg_positions == ([8], [22], [5]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'slwopzqnmxybihdeguavrtcjkf')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 20))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idr')\n",
+ "assert(enigma.peg_positions == ([8], [22], [4]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'hcbedwlamzogixkytsrqvufnpj')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 21))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'ids')\n",
+ "assert(enigma.peg_positions == ([8], [22], [3]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'odxbjwzrmelkisavuhnyqpfctg')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 22))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idt')\n",
+ "assert(enigma.peg_positions == ([8], [22], [2]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'udgbfeclrwnhxksvtioqapjmzy')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 23))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idu')\n",
+ "assert(enigma.peg_positions == ([8], [22], [1]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'nrdczqxmowvshaiufblypkjgte')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 10, 24))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'idv')\n",
+ "assert(enigma.peg_positions == ([8], [22], [0]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'hkifjdoacebqtzgulyvmpsxwrn')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 11, 25))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'iew')\n",
+ "assert(enigma.peg_positions == ([8], [21], [25]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'yptzuhofqvnmlkgbixwcejsrad')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 11, 0))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'iex')\n",
+ "assert(enigma.peg_positions == ([8], [21], [24]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'vkdcwhqfjibzsptngumoraeyxl')\n",
+ "\n",
+ "enigma.advance()\n",
+ "assert(enigma.wheel_positions == (3, 11, 1))\n",
+ "assert(cat(enigma.wheel_positions_l) == 'iey')\n",
+ "assert(enigma.peg_positions == ([8], [21], [23]))\n",
+ "assert(cat(enigma.lookup(l) for l in string.ascii_lowercase) == 'wenpbqrouxlkychdfgzvitajms')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,