From ee8194796a73cdf220172b88acf1a81afa3a379e Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Mon, 26 Jun 2017 20:30:41 +0100 Subject: [PATCH] Added more tour shape images --- .../mistake-tour-000-s0018-m002-walk.png | Bin 0 -> 6796 bytes .../mistake-tour-001-s0008-m000-walk.png | Bin 0 -> 4715 bytes .../mistake-tour-002-s0024-m001-walk.png | Bin 0 -> 7239 bytes .../mistake-tour-003-s0020-m001-walk.png | Bin 0 -> 5793 bytes .../mistake-tour-004-s0020-m000-walk.png | Bin 0 -> 5630 bytes .../mistake-tour-005-s0010-m001-walk.png | Bin 0 -> 4848 bytes .../mistake-tour-006-s0012-m001-walk.png | Bin 0 -> 5162 bytes .../mistake-tour-007-s0008-m000-walk.png | Bin 0 -> 4388 bytes .../mistake-tour-008-s0012-m000-walk.png | Bin 0 -> 2536 bytes .../mistake-tour-009-s0024-m000-walk.png | Bin 0 -> 7915 bytes .../mistake-tour-010-s0008-m002-walk.png | Bin 0 -> 4610 bytes .../mistake-tour-011-s0022-m002-walk.png | Bin 0 -> 6897 bytes .../mistake-tour-012-s0022-m001-walk.png | Bin 0 -> 7653 bytes .../mistake-tour-013-s0008-m000-walk.png | Bin 0 -> 4741 bytes .../mistake-tour-014-s0014-m001-walk.png | Bin 0 -> 6098 bytes .../mistake-tour-015-s0010-m002-walk.png | Bin 0 -> 4652 bytes .../mistake-tour-016-s0012-m001-walk.png | Bin 0 -> 5122 bytes .../mistake-tour-017-s0022-m002-walk.png | Bin 0 -> 7379 bytes .../mistake-tour-018-s0014-m001-walk.png | Bin 0 -> 2578 bytes .../mistake-tour-019-s0010-m000-walk.png | Bin 0 -> 4721 bytes 06-tour-shapes/mistakes.txt | 20 + 06-tour-shapes/open-loop.png | Bin 0 -> 1242 bytes .../sample-tour-000-s0016-m000-walk.png | Bin 0 -> 5302 bytes .../sample-tour-001-s0010-m000-walk.png | Bin 0 -> 4872 bytes .../sample-tour-002-s0012-m000-walk.png | Bin 0 -> 5765 bytes .../sample-tour-003-s0012-m000-walk.png | Bin 0 -> 4917 bytes .../sample-tour-004-s0010-m000-walk.png | Bin 0 -> 2149 bytes .../sample-tour-005-s0012-m000-walk.png | Bin 0 -> 5119 bytes .../sample-tour-006-s0014-m000-walk.png | Bin 0 -> 5137 bytes .../sample-tour-007-s0010-m000-walk.png | Bin 0 -> 4840 bytes .../sample-tour-008-s0020-m000-walk.png | Bin 0 -> 5675 bytes .../sample-tour-009-s0012-m000-walk.png | Bin 0 -> 5040 bytes 06-tour-shapes/samples.txt | 10 + 06-tour-shapes/split-leg-1.png | Bin 0 -> 1654 bytes 06-tour-shapes/split-leg-2.png | Bin 0 -> 1502 bytes 06-tour-shapes/split-leg-combined.png | Bin 0 -> 2669 bytes 06-tour-shapes/tour-shape-plots.py | 5 +- 06-tour-shapes/tour-shapes-sample-tours.ipynb | 1143 +++++++++++++++++ 06-tour-shapes/tour-shapes-solution.ipynb | 321 +++-- 39 files changed, 1373 insertions(+), 126 deletions(-) create mode 100644 06-tour-shapes/mistake-tour-000-s0018-m002-walk.png create mode 100644 06-tour-shapes/mistake-tour-001-s0008-m000-walk.png create mode 100644 06-tour-shapes/mistake-tour-002-s0024-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-003-s0020-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-004-s0020-m000-walk.png create mode 100644 06-tour-shapes/mistake-tour-005-s0010-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-006-s0012-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-007-s0008-m000-walk.png create mode 100644 06-tour-shapes/mistake-tour-008-s0012-m000-walk.png create mode 100644 06-tour-shapes/mistake-tour-009-s0024-m000-walk.png create mode 100644 06-tour-shapes/mistake-tour-010-s0008-m002-walk.png create mode 100644 06-tour-shapes/mistake-tour-011-s0022-m002-walk.png create mode 100644 06-tour-shapes/mistake-tour-012-s0022-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-013-s0008-m000-walk.png create mode 100644 06-tour-shapes/mistake-tour-014-s0014-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-015-s0010-m002-walk.png create mode 100644 06-tour-shapes/mistake-tour-016-s0012-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-017-s0022-m002-walk.png create mode 100644 06-tour-shapes/mistake-tour-018-s0014-m001-walk.png create mode 100644 06-tour-shapes/mistake-tour-019-s0010-m000-walk.png create mode 100644 06-tour-shapes/mistakes.txt create mode 100644 06-tour-shapes/open-loop.png create mode 100644 06-tour-shapes/sample-tour-000-s0016-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-001-s0010-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-002-s0012-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-003-s0012-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-004-s0010-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-005-s0012-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-006-s0014-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-007-s0010-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-008-s0020-m000-walk.png create mode 100644 06-tour-shapes/sample-tour-009-s0012-m000-walk.png create mode 100644 06-tour-shapes/samples.txt create mode 100644 06-tour-shapes/split-leg-1.png create mode 100644 06-tour-shapes/split-leg-2.png create mode 100644 06-tour-shapes/split-leg-combined.png create mode 100644 06-tour-shapes/tour-shapes-sample-tours.ipynb diff --git a/06-tour-shapes/mistake-tour-000-s0018-m002-walk.png b/06-tour-shapes/mistake-tour-000-s0018-m002-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..8028858a842fafef0d87f065bd2c1e1615750fb3 GIT binary patch literal 6796 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 X`9|;ey-e^Y4TL?6J5>2s|BQbDLHf+Q literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-001-s0008-m000-walk.png b/06-tour-shapes/mistake-tour-001-s0008-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..88b936498f0c64b9b508440ca8de34a510586c1e GIT binary patch literal 4715 zcmeI0YgAKL7RPr&fB+&0Q><8%6d$yemMJ1t#3U$>+7YQj5U>~);Dd)Dg#Zyrh|KDM zi$a{`2bJ(@wLAg@0U1ycqQC$PdC4OKmtx@1 z&fV+(+y8xXYH}cYWxo`r1f{i)Vre4 zLd%iXH&WaSyK3ySG6zybhKA0X2rLViNhTL_|2}iwse(P%oVIX4X1(iQi&_o_0Jr4{ z8LiGfg2Mw??xq6pKEz-FTJV+tBrhKN?Mo~UAY&T|fchh#N5VEkH#6{mmVuS2A$h{* zw>w2Wz$4mGfqO=-eoW@B1WwM?cXxM3RRyv*R^TQNkr;zAwdQ+mRmiL^`BU zT%pmfxCpWx4R|vqmb`)%zi|vutTEW$_~!<^aHoIFE^0-582g^ym{Mv%Bo8p^tO>g` zE1LMOi#2G)L$+94VVlvP-Dx!Q^y8S9f2DIZzc3h#C}-OQj;Z*xGUNepu|#r8Nl|3f zp_JwRh1OP2#p1Q5;AM3iF?E1>s9ef8tJ1hF)tNJ2IgsFJVjy)vtE;Ird{kdwBI9Z+ zG7s>(lb?#_*eQ#7tvN-da(VQAJk<=vQf~BJ_D@~aTneGn*Lv-qugOx#m5Rh`i!+ME zXhY298-{3a?;S}NQo4tWz(=Q+&=2OF>bEE4rOVr{e}F68wJO;m_I`vxFX2zFYZ7J%50qw;15$MmBLC&_;g{Ut>cn08-o%Yj=g`5 zyb1~x-e$AB{T?!)63Go zam9VZsT7Ic&Cky#Sp2*WfaZ)zFM%J5nQw`3DlLl4=QJVBJKe>7f#oeAw(>vB@;WH! z(o^84Lb@N03Aoqy33~@TY}*|ON2?K-ZUoA*>rG*$yiKjH1(P|v4OOdW;#d0q3^l?r z6oYwlw>ZF3?wya+#j!yzy&7X!#RaB=K5U+e#w@*h$!2&eQoVaQ5k9g;W8Vsi-1YF` zQlU^F*ok?GK~q{Bp32u4Gm~&6v0RBX=oW_R0;8^MoyP`wJY@f6L&8#}55Rf8Ar1(4 zdS+^+jM>!&DWie}pI2>=&|{H?V}~FN>SxB6zYj&^rT-@W|3F4e$q%M%EhmBFCG-_v zntk0JzYgKp1+?{VX=Q`&hL=i&BQY+u!4=r;n2+qy9{EAkYMac~ueQZ;x#wxL?c28} z#YX2874=81xbVV1rb6;b9;>sBSjZtfLyf_v`~UAV@XrJez*?|_P3>?@<2CK{^t5zV zP*nPsmE&dx!3TcxlftM+-wh294_iE)9UP?P<>xoPcOMA-V~OxH`e&Gt$!!k2{5vQ2 z4LWz#%t{b}`)-Lnp_hz`ruDtPl8ZG#=IOqvQG~7OdY+tZ4Uu~-uyJOE-pC2F+9ti} z#%I(Cy86aO8`8%}8J7!?9KBbg*Gbu;Cq*@28m4PUh5TU;qU8X;f;40S**~DLbb^R9 z#AgIjVMMRfpR^m~g`sh&IyuDN-kwHFh>zb*bww~zDflAZxw^4<(pl-ARdC*=&F`zg8w}C%u`dp73(f+jf^zmb1 ze}BK^Xol?;BN}b`PkX7?+|mqtt#5VQ&nddPphIm_M}$>99!Bg@(F}989gJ})8&|&d z?P?x>fOyLCx;J(KHr%Uyz1doMBc}=*MMQ~2g5A@Cl%deKJ?*K86n-LFIJi<0Qh-su zMxZ3WF8!coxi7yp>~z!Wa`ZtTznbB4?wW4Vn<7HuUO>%L^6M&ni0Jq$)F3U-zx6|u zE-%g9^F-!@06cDS7J1r}FB~1^D=RC4I`j1A3^j=%Z7-n=4ke1+@tc22s<}; tzJ9cr991H-**tn~W?(Y||2+dLN|y8OI=g0;68%R5Cp=Gih>nG({Tt#?&t?Ds literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-002-s0024-m001-walk.png b/06-tour-shapes/mistake-tour-002-s0024-m001-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5ba68a96623189acfb0cf498d4d1d7cb7c9f59 GIT binary patch literal 7239 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 literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-003-s0020-m001-walk.png b/06-tour-shapes/mistake-tour-003-s0020-m001-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..81b418fb93e6ccaac6abb02deff061ad6d6e35f7 GIT binary patch literal 5793 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 literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-007-s0008-m000-walk.png b/06-tour-shapes/mistake-tour-007-s0008-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..89085a5dabca5e06cc39afed303c6bc00a60a8a5 GIT binary patch literal 4388 zcmeHLi%(N$6#x1F@c|T>fFiV8CTQl$ODK=hRtG2<7Uw1qth_4mv5uCC6iT55#+ZOq z%{G__-Nq&{2(>caEstqi9giB76b1zv0#yqXC@(36-Ab~*VauA_d%xu5-rsl5$#;Ig zbMCcMMi6c82> z5oWr@zo1+JK=p)&9Q`8W&Wx%rguy~*J0)NygL<_y~-U3v9@%c+YCZjl&moFaC*Ziy{{5J9f=UszZ;VbFD=<#IW-#H)(PB@hhL4c8)NXFPS8Ui5_e6mm8g7i_Q-nM|fP zIWn?_usiz67LYw=&Mr04+hZ!&W6FBY9R^3k9NqLuqtFGo?xcic*oY~q=~dWh@29Uk zZ&p`V&#%r;q_Ww8{r&xrN4b%Nw~xga9*Z@Tb8`$lXO;1W+7*Vvc;2k5tMigM6-)oH z_%osfQ|YL$Dw~;^nb#|be3eRdj}J!&3lMO7!<$;6tnO^HEGbpgS*j2a(b}cIl$JTh zg&xSOY7c#tTsa}<%acS--1T|6e_&wSvpb2iG*ZF`LL5fBv_@AH38QLRqh3n^unL9A zSD|o{8L+&(ys;U84GIdH7;3oCgqd^ogJK<2sa)c@#--KQH3Dq5{JTD?DO9CWtycR7 z1ial8ayN~vv#1u}j4FQ;kHcsr+R}SLzbg5eisH<8TTL@sIF#3AXth9~f5xf2CfB^7 z6zjC=_2miQv#1QB>9ck}jOOFAp47CoBXJV8Z--&FT_llY56G# zCwW~VSbGfM;B9PdWG`wW$JW%hils?-_Toi+=E8@By);W0+#b@Z3QhJfUr9SUJ|jlJ z0pln=Yh?nj%j+5*f*@!l;MWtn!td4lx3*X2a}{bP zKF`7|pZ~AcVQT8-Hl8-6G4^_yM|{W9O1wB@p086$vRE`aJ$_OIfSaf>PN@7G4XSID*U~%(O2g5=)fLI$?*r{MXHW$!*k*lO@HM_{@X#< zB8@a&1eJ@Zxfxf==X)$_Sn27qh6@VW?Ck6w!7iR{wTzm?}uRo_+d~jPaGaEBS1OA8TGB0zB9=n3W%y5$e0`N zZpk(*uR`3?H+|bjm-!Z_Z-V9a*kMqC{{Bvp0)k6TO%2zu0kI9=HF#fS75>Lp=P9yc zM-Q1KYenWn9cjDz<+M)M?kSP=X2osvi7l)sr6Bj&a1*8pT`?(iJV;&Ndt-Qb7#krx z1W_K>hYo|6O}L<}B(Kk*bUCz+hK7bz4hP?1Tpl*XY$|z%b2ik-g7QU8st!V;OJ zX*Qv0)?J?KN8ay@+uG?X(m0bw!Ys3QK8!g`Bi0{cML=YynLMetH08(b0R=192)G0? znS7V9BUhT_l`_(jIO-#cIV|g|z{xK+-d;P1bSRek2L(A(2YFqg5PKlgSu8njjN`N9 zWhKc8LA2yFH8;y4{&*?pT~9>78R5FDu=Pd=j9^@RA?oZTx)M0AK5Ms5HW4Rd$)qhj zt*qdwxO_!ij$3EJk>iMe6a`%hV5@ved2g|aKOYsklfXuPWu=Rwo6kFqVfc!_wqbwjxxpW>cec-R*FlPDSb?*PI> L$szT}67v2AhhHml literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-008-s0012-m000-walk.png b/06-tour-shapes/mistake-tour-008-s0012-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..903bf15e1419d0e0375f2d688e49309fd11bd348 GIT binary patch literal 2536 zcmbVO3sh3s8m1bJN-EMJE^3)lxr(eDuQ_G8DlAz=*B%h~K+&);!<-Z!`6x>xUrl;N zGt<(B3=0iM$tNi(HDpL?q##6QWeh$t^Fhen+Ff_uxpP-{=B{)0Isf_o|Lk?vzrXL> z=c4Dn-LUzn`49*MhV#H4fIwzprU%p%AklFd5#VMTuxB?GVw^s%*Wbzl$h?ytT1Y|uB_yPmV0R*`m?IN`OGsRN*3SMh$OTD^dPe=`#OI-0R~sKUR}>n@As zk%=u2e#Q{=e){Ch$9!itE{ybBX_da~GKY?Stcdh>$k|WGR$ONE4!dNcFY5LB+}5Ci z8$&W!DVJMFk$5@e3>);3S+0pi_C*TawuTRR9Qv=!E#8ROBcc@6BR+=5;{^y5amRXJ z6<%!(x~Cpo?xr3btHO+D!?cy_UQ&D4NE{gqM!*JS?(55f(zzg$1k={1AFrpRcCJ2g zxC-Oal-w+z4#smV5q<*SF8+h$hy#l3bqhjB>GygVZXZoQ@G*h4Jt(9z#*$c1EbUw* ztEsC?V+j+)y8h%olZD^xDbE|bp6lkaWOky74GEHH0!5thp9MwyF18`f;NbFK3cs5C z_Zh!h_|@cZXL(RPj)33ux?6;iEHy^O#TmxK@;DojW_!&_@Ss754e`dEk(4rdSXdY} zxX^I@XD>J$tQYk`yB)Pmp6Y~8h!H#Ci{;uYNKe0VJ|@*wYKK!b`;>Rg+A@kb<^_*gd(Hp*B|GXZiP(pyz1ceMm6Re@Yf#|ge0B2Z5NxQMO{)!l zo=mWCe-czd!XWmuX-cIsYLq?FU9Rfpha7J0E?Jd@3$N|T-FNGf8%edfMU)UDia8Y zEs2?ETSC@E?6T+rOKkhO(a#=Da&HV`BP#vX)D&fg!G;Hn$;&?mJsNRkgoXw>q1^L0 zgHs0vf2dC5a+Mk3mY2kr(Kw(1aftKCk)Nr( za#2QIXbN$ytu2@9n8vZ5ce2uJn1kuLM;R^JZXx z7c5W^u=hJp?#a9f!p_)jWhLTvanmV&fx=sAjMAl!Oeoue&7O+5F^V8TK=tFQB8IA z#=qOOj#4>)3#I2x4aGg<)=}T@IpKWu-Du1pp78O~dY800={3wzW&3fUCQF19vo@xI)>VF{J4B#ZRDZS(BYD9P zOlLZ@6A6i@qND!;hfDfCT!0X#f zaPVQTJga%fpKC{L@$H4G_4szsaMKpD`JFr(84+EuJG0K(xk9^s*y|)f(HaCJ7&jEApeEYrC!lsDCk)?N%8RV+9n$7YFp}6!s z?4X7F=V9@3u(QL8O>vnILxl!Jf?+g=+Tmmb1cXyox?WkQmAV<7pihalJsA_R4AHAP zUq3%_Utix5 r={@%CAPRAm2HI98H|LsPGa4cBV%XIyPbqltPX@uc@5AzT_$U4YgfxTa literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-009-s0024-m000-walk.png b/06-tour-shapes/mistake-tour-009-s0024-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..5a822d0505687645b903079c58409d4be709827d GIT binary patch literal 7915 zcmeI1c{tST`^P_nq?2t@$TA$-Z8^z4MyIi~;E0et%aJ`%Xu`B-zos{Uevle6BH{=XpNQbKmdx>%J%A4`TzqU&MYv z5QOiLA@LZ3a7rTxhZPSuymRl|rPJ`TEkMsIfavP)e8&BBfV-~`qJQkz(WClD_2CEo z1K02lyvUoW%^?Wx(jnpj^Pt3ues8Y_>$+*I@tHh+j>&FEPD#(FvE;kG6f(DYNA0Q4 z?R=DoXB00NtOIiGmtM!a)yjeeyt0COJq<+<#Hg$8xMwIM`KeZbI94Ye&S)Sb?raWs z)s7^8g4E-){j?EG!MLJUg~NvzWz7juPxD5?vX;tCp6rU0fhBKJiNnLodvz`z1i7wH zhHLkqmp}L6e=i7Lew>||shJ8}TYA>+;Y$6@>xDywj;dGJA8gTTeP3VSOerfXW8OGi7`n1}%F{Ed zprAl~;q$FVTv`D9!>`pyP0!QQ)An@bx|~xjDY*uF?A+Yk5(5W<{i-(XtjTk4Wz>o| z$dk5_IiJ5~V#osJNl8gX3&Zz^;%$5)%FD|un+(Fj!s>6urKP6I3M<-*j(28LJ@Un{ zE$_u24GatvO%(JxjeU5M6SBmHG`x5JzWAcs<5#ct2`gA{&aljm9Ufj=*6{h9Ec8&B zM{p2NTKJOiV{C`jZwUvhoM~nz_$`u>lG}|eV>|6h3Zb(Z4rSg!Z65jIOQFo3e7V)t zxe9uW+JLCmIVL4#7q?V~`5xBWea$L;b1w8)Nxx3JK)wxB{6S`mfmBS>eYFG?I}Kya zvB&Dm)76bQPQzon*~^~Dw4#LnTV>X_Mx_LN-OFR?=2h9pg92kUhVRUGR;+GOP*8BC za%>Znrjabt&AAEL78y%kx=)YZ-Q<=O{3qM$iHCql{HUZvD_;J@Z$ZwNtTTn1nwtE&T@z|^ zT^kQ4DLR;L&iS+HUJ<*;b8f>8*dO|p4MK;L_R%KpUM3otLLwFc;g`;1;M#jlm*3Gkq8gc0XLOYI9w5Ce; z!R<~RFHZ1DI%C&j=kD%v(}yT~VPB@X!|0wl+ipU8?#AUn6c>A^JiRhWNR<11$(%8;}d8LP+IBn$M`<;wTb!)BTp@p^f z_e%=xG``Sl!(SrI#UHwU?T9==dztG}e=|g}T8yZ&fSQ@H);SHG z^E0Dexvobf&UKw!IEaz5Qk8xm!p#4?w@Rao)$=bP$l%io-U5P z1P0RSI_#Wh=6g&tEru9TO0nxU3fDkJHsCTvY@AzC^!z?u712L( zh>56uRicJA|otaa|@oN13kzTHZWPD>6g z{_NhMcG@j3m8zpz;N2@+5;&zudi-I(ni}c`dHMOZ2LADX@x}%i%!`k_SO0OaMQu^^_X_8m{v-Ua2b>4v zR{j>5vF~xLoDm~2?oeZWDo*m_%4DD{tf*246VcvSP6v)w!j~lI%}Pr8pj{!!ko8$F(tj9?sUDZCI^uy4i0czf<4L z%nY<^Vq&5|`n@!aR&sj&(>3}H1Kifk%*?7G1$3{8JXCzh@{p9&CLCdvMHQda=UYqI z@7Ym61H;({<-wbbg%`L3vW zQI8r5Ru#8a+v`o>?z%*)Gyx1wA8=nX%VPAD;5o2g5QlY3_@Y9eaSiRyRw*w#7pZC^i+Y`R&m`yfKA{CZWyo|1jxi(CshcXsKw!>EH0YakJ2Wt`fdANOn6 zopxKpDSc1eVIna|lOrY-I1Cwd>;Ud-)>&fe&`XMoWn>sEx|HuIf)S(g@gNeqdZsmP z>1NKYPmN5oJFjW0{)dhMN$H3Sp3=_3U<}`b@nx5>t-GCh#o?A)COX}MCYo|_hiwD< z&o0%VdWtGrzy&1c5E+K;@9$T3dzW}e-OouPY?`wF+Cg80j%L=6nq;zHdv6{5dHdyJAc=-r6n@ynr6*b6)diU4ps^_@zrCt7vQ+>4ct%Qgwvx`wBLTgz zur(bKNdw~12b%d;>Kpt=A6-f(rZFyH2I#7C>7v3w<%}l@ z_K_4yzGr9M+q?T3C3y^CFW9e8Nn+IqnbbsXk#m}x?7#f$G0^_>w4^=3#b;0_s=B(- zd1Z0-@~?6ql=Aixvw(W6iUZucW#fFB1s6IB%eQ=7co*1!i?}IoQy_nC zY5+e!OB1enl74#n$B~_xZMXbE<^qJ})8Gklcz#|RJRXl$CcsTSBRNY`6@)+E-Z8B* z*A*5QM5Nn+Nf}LQANxjvAo4u3Ue^JQo#Eg@3}<13O1)h`VVenS7nof+saMj;@{^!3 zkBdi=NKO#wpi*Cy!Zc)Lpm3-Fu>#(gguvV5sUm$5!63(C#MKl*XVpG;C6v!Rx%m{6 ztFdk)f*8u`A_!RpCi!{!&wXgMWh01`3%Gjh?0BaEu?BT33MGh{Lq~G}invtZA5f$S zAr9K~vE7h?Bp$NB^DS}~HPq0V)W8cDAR+xaPPlD1=8}@N`Jt*o4JW zbrzoqc2{TFl`vq2O)?1Sw1_-;#ib|Do%KeRT7xx^zz)%=N~A=U2M->YrkjWN)jqS% z)Ca&ZGuGG+zKmAt>L<(Jy?YlDdpx84l)HOGlw$ENpNf@pg>IoyC5{J%z$cgLlh>9< z)Q6(?HQ+7_khLa@WQX70HG`7B3bb7c$b{7(mt6x%-hf+gI2gl&Vc%*sA>e@q#3$qW zl9xa4^c&AC)Q6%IO0xa?^~&t2^|yA?8MRSE%va4mMV3nj(V~#zA=Bd*$1lHwnXC$Z z?6iSJU1L;Vph|;^H-%zVej(U4Y-M)4373l?tgB_9aLAjBvr>6_>hYmljNaky0hp z2%rSLwZkZ~J;Txfiomyt8m~?cfz^F}bK~;Vy4LpgEkLkt)qPtg)-s@_(2?yx2>Kq5 zVo$u1gZ(#iU2af{fdmkT9q+Wizf}k66xY;b&%h(ry?dagM-R&xVav*-*k|`%(!Kl= zgBc7-H{av;;n2?{H&wvvK!NYaBrU<~4ZE!n z-RDZ7tf&_794r<#9*b4>W7JS6>XSu7=t7?~aZ3cDvXl>jV)fGT0C9OF_GB}D&h{ty z{C}+XZ}Rbg(p;IuW{yrxQ9;8MlY)ou!XA$#`UB1k-}j9jiq*<`i#>AuU-es)s{n$m ze{~IaewRhIeOWVWJuXNZ3Pb#C+Z{Dud$twwBnN{bb3Q|jniXMEgF;7h#xmS+3WQ># zGMLTHr*g@BP<(fikv}3cZ3^S@zemQ$$6Mu{YSA%ydH>!$Mx=uHNKK^$% zO!*wMt7wJY+lbp)TUfC&Axa2c9?V$5VrBKCDNuC8t8dZOfM)V;?y8|HLdK${tDjzv zB*_Iommv8b@FI})cjzMO4+j*rAzM?eGvl>SWL;D+yfU%=eV6SOej3LAOPpohw=a!< zHGsr2c`b2InH$GDo~@|Kf1^xi16RRX9q)#nB<~gGnST&gZ212Ls+^} zj}=49O;pXtwsduIyrrcD3%)2v+9rL`>?NW;2!)bH&|-`3?Yz9an!eZmsk7w21( zSGVa5oayy0tQGey#TpqI{lzSpo9I+UCtm%jXKC4aU2trCTrPM|LtAgJc&9^H2v{-D zf~KaX6R?RZbsaRvkjEfxTQ|uhFT8bQKt3vxOJ@!oFfS8 zEvK2$mhC1RBzFCX36*$1Im)*Krl zwDXr6lp>T9SCnnWnrZ%YjhJnEM|5m?~4rSH}wkWUvP+d$^g8lh)rZRaOEQ0fCMFjyz zV&;UC&XOFz?|b+cL_o)WzEU7m(3u{q;P&z+T9Ere3C^q00o;$uPoq+Wwqgl0cYf4> zVErLLS9J^rf~MYh|L%8nAD)Z4U^wQ9u`( u2S{+Kz|V9-H{yTqd!(N#_pf6a4#Rk_;~zO^YYqs3AcypfiCMopUit?pG_uP8 literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-010-s0008-m002-walk.png b/06-tour-shapes/mistake-tour-010-s0008-m002-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..5926b007d192b8bf58f22ecffd659d42e9bf9353 GIT binary patch literal 4610 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 ZB9D0ApF0_^;=zA5ASP;6WK~2`;qS_SarrAChx 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 ocKcIk}mTO)zW{;lEQEN)8@q5DC<3b^8Ugo;9TW zImNj-N`Y?w>wXNdf6%sf3q|Pu8P*2ADUShy}>OfE<8!B;ol&gB?L9FUa zJAEl9l9Z8A9d0oaW4YpZ-%?6C-*=}L$yHv6AoQvyJA(G7@$}cDo%7wMzu!6$uOPlB_E)Jy|52Sd$rR7OLHmgB4TOuXN zsUes!MO`kX{KwEw1E#)>He~YKKidY zAe!c=!oouCRAZH&fKzNy)%{`gGF&!;!a~PZ6{3dHE`@G>OxgT40bJ)(ez=(s9r}Gs zy+R99b#o&QoUZd)g@>FI^es+h(#;pG&XxJSIoT1Fv>jbn*{kCxC2PP?)=RbDwyB{1 zUkW;~p()REwJ^Ptrki7SSyyJBy5I}eO}duW);#u8+Z)|H^mi6rN_S6U+pJYN>!)($*R8Oe|chO&qYc;03d+pcg-LD9H`M;BYv3hlX!{$+;Qp zMLcsxsIUk4MewOxNoL4MAi9VEWpVQ8%1O7bt6xcPh~+?A7tf zNlfjo@SS8Ce|<>l&FpJ0wpyshrRjW=KJtOG^sy0I1>FKk17 zNP*^;V;j|@qXYM_t!+b%ggrey4qPR@5TC~r8PZMTFaj^ap#F9<^u4^0$3=1MtL)Vl zSFz#vk#L}1dkZ2G$k*oA<+b58U$kY`YYyg*!U+BV*nr_&kMnZnHlgQ$WC|yipNDEv zHDFEk>vc%|BN!1U#GsN&Kq`xj)8*MzYWv)6)Q0%Kt}loz=P3^Piw}b_1rda|eh{mS zGvA~p@SF~D&vQwHunbUIKmm&PwHqzNVWDlNX8|vTUd%qD#jFty4i2^#8q^-dHS>5a zOfS0Au{*`?7g}l|FO1g8P9_Hzs~M1wB+cJ5@m{j0K_lBW#12Ed?83hzR^@_XwLClA zw7dpuvo%w^Y#w*LQ#MBt`k|7(?F>7KAbaOykv8 zP^XRue(zp6k9?}cVY)qih{Tl^)U-5h53QwrDhuD~h#^D*%1k_>oJsD;UrbJ+hX71l zEEXyt4t3>K-}CYDzs$*oP7j)C+Kg=8^xBq<9!0+0XR}k;Y~427*3Fjvf9knnz-sf| Y$f?9Xx89it&p%L1bX?TELxhX}0ZDBsEdT%j literal 0 HcmV?d00001 diff --git a/06-tour-shapes/mistake-tour-016-s0012-m001-walk.png b/06-tour-shapes/mistake-tour-016-s0012-m001-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..b326f71e2ae447af854e65f7cb3e4a026482d0e2 GIT binary patch literal 5122 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 qPb|K>bP2Sp0{dmxj=lS|xv6<2KrRD=b5Uwy zNotBhd1gt5g1e`0K#E=}I|BoYou`XqNX4zUxBNS%q{9q}=`E}4F- z^!eKj`^E3cUjMe~&6)fkbqNJ&_f8w1-*f+a<+E7FC>iYr$K{T%^rts8`#FcNVa{We zp2MZPjp@hH%oknx4U!Lff)x+Hn}2nekb1QmrT0*k;Dfwcie5ZWZSffdZkHvN!dQ?D~`eNohsJO3DFISBS^ zKJZ?idQ$Yj3hixTr#D)x^a?&u?&tkJiuDb1nX2r6jRKAe!X^5|`dEa*!%{^s@TZU}t-|Eq@m_~QrK2U<_PU*;42 z(J?{2Ky-)n8;J3Y*-7ue2O`3Jq* zz^K+xC6mJ-UH!*dhy5J0JhQfN9cOmK{6_vq&jZZ#8SNQwH#W9BuIIOy`@p7t2J?aK z2X?g{(hGm9v-+#@fxkOA?s`i6P+P!xhjpDgPYu(IuA>i<4jt$Z5!<+#lX<_u^ZLy~ zKjv&$9e+&jLHCmI4b_G7AFzE0IrQ=RV`Cns)suTFr6l^E_eMxuQ@PV9a^{}SJ|3It zAMWgw?-xwak(%*YRfaV#`5Ry5`qfAE7JojyQ+9Pio2>hCwh#F=+jt)9YprKbdLB}J zBK`H#pZVd({_}6pdH93-LH2|5Z_K$)t*x*P>#~(yn0}*c`y-_i$qMb8VP#5TZ`}S| ztFyfMvsk4mgXwtVSI+H^E^j<-ZF4{W^_sTE$(+r4y^Qv1JiERyeQ-Xs!23PJeRZB) eTk;n!_|I&hle1IwhW`do5##CV=d#Wzp$PzD=P*M6 literal 0 HcmV?d00001 diff --git a/06-tour-shapes/sample-tour-000-s0016-m000-walk.png b/06-tour-shapes/sample-tour-000-s0016-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..493db5a1a7029931c17d4cc2a969d44b6f3c2ffa GIT binary patch literal 5302 zcmeHLYfzI{8a}xoSph@cE;wpQtlKi(D$o`Ixg~gkbu6Gj)Ji0gYEv#D5J4b>B*<3k zDAFCOD7Ua>$6_J`775poc#X<(D}*4C7@I79rUgfOkoIc7?^|R8EgaM{O{V$e-+-DCq(v@8>@7_#5Wa zqb?zln>X!?zwEj8=Gv-F*9zXLxaaots^VNS;$r-$LDT(YExxrAWj?T<<8ePGot6F~ zwrJS%#|NqPN_`dr0JQHBEZj@#8Uzx6+Za~>@Zmgo;S(epfN$Ty13)|nU|k{_1Ayyh zA^^N~E2S$4{BI+`J5NqX7?GFYgmhIyMDE2(TyQibbRaW5eIG8AU3dRj%+RypZ(c}$ zS<>XL#e;#SJBj-vA|ky0%Kgq*sN2m0MC`Q#AG`llqFK_IM-PjX`i3Gvy%fr|lBL## z6y=w}dn1R2&$@e0iKNyk*7vk$dh>fYoO01*==5-GgAHb4uhZih>aGlgr4W5j>l+y> zR0sqD@)S|p=HSHRC;C+==I67vMaD`kFXQW#DWV`zRaI4Bj(VV`;;kh0Pgl{hLYD!JvbBDqCSTKZd)cDY#P-e)v-h2}5BX=mH?P1VIkZ>lSL zziJ_SF}f4H%C=SX23FQR{*zoAK*&i5M!{amD)EPeYG;c>+$ZJa9kQU)9G~51sbu20p%Z^99T6nI5^mgl2PEci;9ZUiZ_Mxh=kv`g6hAU z#5l^sQ{VlbSi`sX-yRZTNn^)Zbe;$JRaFk2$Qnk%$q)c;HFb8zQ@Yvh=7pbs{y{KR zQL=Y@e7v~dfylMva(Amw=KW>vKy=y-IFVMy&VP--dU^r_0@_U0&TK;( zC!ftGt5mA{O}rrZXnim`oh~aQBg0@(86^3O;wwW*%q^Pp_46#ra~1}iPD)7;3It1} zojX+GZI?e!ZaNhFYO!{(Zqk@rEZ5E)lhLaY2(apCu!mBuPT1CK>8ZGql+0j6vx!)Y zE4B8>zsWJbSt_N7DAI0|Rj(AKaJkaLGrUeTrg3o1nl)3mimQ-*<76$w-7*<65*3#2k5V1!0aBNH<_yc#i z;4jcfUJrjqF4uRxf*mTF&DmJ(+}8UU9?0*wiIXyjn2KyAT!F650 z23Kk+o8gqWh_D<*A%XMVo$;{It&?+rZ~KQ+oBN=IRUEM(@{>%K%GQ8W}X^@sly z*(E8jAaW8%t>Hg9<$&_5=$%?v=x7j$Qv52iLe>DD3�EkxxM+{JZ5CYy(X!xt*+L zOUPdIFu?13$ddtc7#aBC2M+o{c4xQR90-6T&4_{mv-+j><9JtU>?kxSSShQluIBiM z3IuLvcSDWdH5|LaLI-_n0eRB+gq>EXw-`awWQNLKRcU2XD~eF$mgy$23GR<$~$-NNK6c= z>E*PlJnBcAQHe+N^Bww4JU;EU8|`;I-9T5BfBs?1p)DRumcg&%U=q5k&B*ywiucOu(P z-b5S8A57cpN+2C8T`-Mj#>Dmh40Rkyp-@}^1s?CL=9e z^&Q>a4G&XC<^upEs85{7O|)N?3mmJk%`mK(VCEX4r%=dbxWB%>KL2GGKybh1~SeR#! z=9!*PD&=x{i$qej(Wz~xje+SLP68Y&CbiU}R<$xx0;@iR9Dj45;8fSw*9!!55$~<* z5YtmWy*!-Qlrv+BsNLVIGp;X@Ke^9S!7vS+Z{`FyNFQ_7uSA63Q zNX8NzVPssJVyb#C@bx-SCDrSc3;iFV1_S|qk-DUTgREECak^%&PtSKCpl2g`i&YlYO5<;2X)j3XUiM1*K#8>yOZ&guh0zFuU`fbgIQ zPWdsj1^>EVf`mmnc<>++&AR;=-X~qUY|WFf<^}psKwt)&y(P4U2D8#5c&gG*O$pXu zu_?amLtf2(9~2bSk|2_F8=0KGesjoU+qsKBS@F@#F*GKXH=9G|hvvgHWF>eX%eiFC z+h|)1yKepC8`Q$!%uTllx+M>}IRwV2(>HfMwWHYF+&nfuUJuQ#L7sckjv@p`cH#s3 o8;@2hV&#>{3IhK(2wYl5ZJB9Enxt)Z0PwSCchs(i9n@3*1V;Hv2mk;8 literal 0 HcmV?d00001 diff --git a/06-tour-shapes/sample-tour-001-s0010-m000-walk.png b/06-tour-shapes/sample-tour-001-s0010-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..dc127b3d8b6e8ee5bddb47fb603ddf76e342a8a7 GIT binary patch literal 4872 zcmeH~{Zms{8plsUQc_V9=?IK3Nwi?yl@)2L2m*mELTLpQ4PHoj5p7X0CL&6}NK#nE zRcYFxEegxaiUYo2NI?P!dBL~HC<`l?2*D(Z%1eL*FhDLz*aJG9{R?(>rp*1}&OOgF z=XuWe-t)QN^Y@+MAxjpmSOfrA68dFOBmj0)0I&$*12|H6BAX3wPHEebw4iT~?N2?# zPCLXp0)m5sBj>Iik<6yp0stIuh6V-h;rwIdd0;prY2}$01)Yu=7;@eC&%!n5sUImj zybs~>e#y98wsqesrQG%KT1MG!*We_~uM8vY>OjQqFA2}ue=@0Z%LrfV0b}00dkB7yuG+1OP}M2LQl#Sx8+_ zU_pWZl>$0UctnKWq*px^GgTq`KI~=58si7f01SsOkw`L4L-f4h@)ZIF`9S6a>txZ) z=_3RZAAd2t@;IBV3#_P|&wuDh1rDhh8H0fpigyEWYdgFNtkBLsA^sSw$d!BmZJVFr zb@#>g{s|!wW6|akDMR(zEIsPt9@zQ0=`NAhRm!ts|fxZ}tP81aH>VVzyCUw=!dXQXB4jybv`Yw}yK*ie0Sa$!ZB zlp8%^?p2?YFKn`f+vnpbym#O8;zok9v=Gf z@tUPXqC~@Ki{-Jsw{5%O#nN=Kw+^F-``MY1`l3;1p+?;k)@Z%9*W(p|gka)@l)Y6{ z{r*iZ9QL3mT+gU;4cFOy08xuKugFXGDb`Gn!KRavl5COR?BZF*LRM2Ks%n{S=!eXQ z)=Bl0#_-@lFx|WnG490Te72AUdYw)e?;*P_JXF}D)z)W&v>kkTB7ro}QLhwih$8Vv zKO`ZGwP&1t($uOf?%+^LAOOl@JkBRoW$HV(99PD0f(Z_Uv{!u!LHZAZ>(>XZZxliz0HUuTS5jCkgHk{{IXO%-oSYhsWipw6nLs*L!oR<+u&=Mr$J@Kn)aP|- zc(Ai_Gg(lO;XaU;XXg4FP?CI>dHC=i`Y*IX@cf`!99+IDtg>^P6@9l8Hm_P*!2NW< zKHd%s*lp~sRnMP4PcCH9)@=^k-PF|d(oUL#$3b!t+s+6&9fE9QfDQuzc9BT&?=r|{68CvF;~b(MPxQCzEtclVsi~ArE?iS?LTtB2BQ$eInfJAGoP_MUe}8+}x_tR; z7!YN`%6GWSGI`T$qma2(Kpa$wUa%3CrukZJZLJ|D2=Rl<|E{*1HtSc^Rz(HAU%|AG zvq$8#Q+QQ!nFwm&UbJ`6igxM6rS4;H@SAr_lb#Z>$F_*{nw>FMbiLbvwn#Pd;Q zE*|G}7bYCux(aIVMAF2GkjfD*ZCV`xGoFu@NANbrR3^Xu`O?x-Zz(Kbitr!zetS+<5i&?XAhl$s^Y3+N5^dgf!itd8$+@KNa95 zYv3V8=%+Jqf(6TxeCH|*k`o=hy6xo_*?~RQSIXn-q2#M%+kN75JNax_&a9P$S zm#*&a=q0&#-AWguEh;_$-+Z=eX$rIpg>Te?P`Cp}M}^aTLjndvsNu^q8}xIiFeG6x zVERsM6iIL2D*zZ|7etd@Rjr3j>dQsA(R7o9Gj_SeHzQTADD};V^oVOFln~HBKB&4V zW~TU(RR=%6zPCE=lu7-4O;)b~o$i_E;73%j;U$_g*wWHcEVCo(TdcxL^?a35fEjoe zMyx0(D2Sz;#~+pHM=F-zLoq~nMDuysatr!89=CChQ2TI%0DIqylLf|sQvHUrCOh)K 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 CBry&E literal 0 HcmV?d00001 diff --git a/06-tour-shapes/sample-tour-003-s0012-m000-walk.png b/06-tour-shapes/sample-tour-003-s0012-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..303112faa9aeef8feb7e360f58cf07e31b8f41b0 GIT binary patch literal 4917 zcmeHLZB!Fi8oo10Bmy@Uw*a^{@O+`0F? zGtYgW_j&G|`gB{+JGRcY0DyObw`|%00EP+x%ET{$Ek&PaAAx^PshgRpoAw`#Nr^j> z8kck!1O^6%{C2#Yq)Y;^q9=G$z|QnyZC}7AF>xz%2D%mhF2?QKd1lRz@4s8za9%*w z+J3nfKO8OI>+g8Z0e`jw{n+^-ef8Hhod+!rWicgDj$0y5oybojcJzfsYsKLr1_A)q zlShH`_mEL604JBj2lGD-V0$zc4*>B4e*gqd2nxU*JP`nDpaAy$`(oEc1pdDe5U`bL zd*E-Hce;GoY#25p=9LI)R5w(Jq*CcKwOZ2J+FJDR0FM$Us%z`~$ zrbdp8j8sRh)r^f*2!*7)&GJ>MWn<0kG0O99Jn{KMR;KR#R?|$o36qcm5Y}*uh&_Lo zBmF#F)Fm9>2q@iia~UP2rAn=~+(uIRYHX~*Law)D@eFUuT?&HLZNO`b036c3dbN|m zPO47r3);cTP`FUnJk@5kEfo!hGz7c?!PT z)YMc%W1|Sp;zOrPDl~c;sq#Hm!147{RHgfj+I^<%qmpfh>Z52zUVT(#0LQ;61+_dq zN{D7m>)8E;hVeoJpKW2$$94s9m|XmynHuxPUo@=0!O(MDmW_?gjhG2{D;9idM@Pq~ zrdtw5d#&~iwL($o&d&7tW945_EK}o#pp{Gaba$D}<~)m#tEx%k@wDrsTar39(PG)tj!eL#mp4L&?uK0ofzS)Ru#u!u$JngicLv-Kg+fcOfL+(-{}G z1la!*CP9Aco(O}%AkSKMWwcG7%;UNF3%(d}V|s*;h|kZZtvNZ30kaHveyT8>sImEK zA98%}O#uk=tIcN8fgrR}0Oa}%TvZl`BN3fk?C?4Z3Jy%a-i&7gW1a{fpSyNb3Ov z0kp4SIcguC92jpOeqxJaq7g(1pCZ`&-cBc)9UkcR8k@3urP;D0%!QFZZPm1GScA7e zfy07XA}ey9tN$~P7>xm9>Bjm*m5-0lCuBR|bh4x?zIxO^l(ij6OJn5b<|gT%wzs$YczdU- zG05)3*w|}Ap`TDznQlkYas0>;sv3zoN>#ItoDYjD$blx35O{fes7pb7Q6bwIstx4S z<;SbjKLniBFbUGHXd0lT^4}b#GU&>Djph)7Hu)yCWLxQyFWwy>rU045N}ZsoM~*A5m1iA3>fNSJ*pwS&8y( z$Tdae+Cl=Ky%rMMiD-wf{1*mi54v6cP<4hz=0zr_bz$U=-?;;1xwwMoiTiq|jmCx+ou!+zVnr_^;1#$==I#tY38tuE~ZkzZx1E5(*pY>e6Rf zQ0Y=r-=(jt{0A%sTLpkOp~tkoaAPjo__qOp2UZWrb(KC9lk)BsjPosK(|~-zMNBe* z%>R{j6Q<4uv>cI0 z=hCMM;gIUp&CTrC*jVzNAA0%Cz4V0j2H?TC&&9j%y zb0cNeOE@KLfo4+(`*IFiRT0(^lW9iHqhNY=z#G$ARqgG3B;h5awgiGVZ`)MyF(>;!N3&#| literal 0 HcmV?d00001 diff --git a/06-tour-shapes/sample-tour-004-s0010-m000-walk.png b/06-tour-shapes/sample-tour-004-s0010-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d4ce83577a7c906d9f501d59fd991f98c3cf01 GIT binary patch literal 2149 zcmds(i&Ikh0>_WzBtFt^tcpu2t=T^2dNppArXsqjh>5n1+b$BQm|eAiy_yK3Vvk)j z)>ySI%M{bnCWnjK3i;r;X+Fx_VhluylzgofK0+}>@E+Z1W@rC|oio4l{m%C{zcc4M zzu)J~DLNd3v$sXs0svr-j|@8k02WNho2{*&yZ2-7`1(Ywllr z!MVMDMiARu9``Qj>A9|o!4v3f(XYA-x5-j{T`w3i`gMa}e1EjzXIvOXG_2$Ccxz_! z%bVpsuz<0L!;dqF-dE8sTWdy6MTmxZz67_6hKxj=lOF!KIU0C!)v`*|$T^z`UOokO z&Doqa91$Dn?S}l!%re}0oDB+JI@uCGNW9Df<>_+byRgBZOzYT7 z#yspK6?9~Qq64G92-jC}OY(H5Zq0Y~>n_HX^LOOwvf0zG-oAapQ|BJ|$>2^?DNq=? zw#uKfQ0~)HJ}*0@Y7a*GJL)F8^a#JfhM&pq z=cwHt9^zwG<6JMoQ0o4QreogOtES}~%(SkR^A<4Pm8FK&4;6W`F>-wAhKs08N``&j ztuWsg`XTLi1ct~Y`UJ_cH6#0YU$JK3st>wi(DetyJH(C3%5dRPRgUy%L(j;_2>0N8 zKWlc&*qddDtlp`qDITM}E7uT6GU{k#C3|@b)@3Wxd?{#pV4ZuC3kvN5Md0{7ugpEu z166cwg*Ypz&+cXJ7Yhn7jf7zOuzXm$+tnnan1=D_;F}KTnO64&bIq=AmPdKgTX*Gm z4OenOUJo@{Sw>5kZIGwOHOM1}p4(h`Rv#;PrO`YH4GATa$+RC=6^+{pyT26;H&H~% z{;mNJ;BT1iUx|jZS4*ajHaM}XIF6G|-+DcfJmm9HSbAkja~cU%98r=&JWh13mGvtq zR8u~7T4z9QDWInMBBwdkr3BS#dP~mgj66N%Bm(+o)cjx?rkP5FWMEH%t*d?pB8m*S zTNW6OxW+QFbG5afa7~esQG4EFS%D|7*P-3{wQ73b;$l%U5ll(N<8oN%5^ zDD`Yp(;=kmnTbg-TNgc77dmGh*eEF7#3)nbRt@k}CR3i7VQ!8iwHLc7hl)*ly`CS; zXSW{fWd$)a0M6?>(9_jwH3LyMloqzOhMt%i)r!k3mBZK)ab*xV7zr2n7@ zpO%%!)RRPvHfBZ!TuOPW2@U;vgD1+JI1dl%K#Hx$UtwbVBJB%dTc+GOkM<#pe?J{i z;wj<>;7cJ_I2T@zCAhZQFG3bp&uD|z! zw1eE=dMO=3wb%i6ze)9MpdESzO^Bb~6aTOSA}HO<*)FN@;E0kzr`N;_18&0G+uGn+ z{u)5PY}y0;8aEN?64LPys4;{A7BlhDy#%*h;=TqSqPcfh$0stQ#6ZXF^6VLu1>HO*p literal 0 HcmV?d00001 diff --git a/06-tour-shapes/sample-tour-005-s0012-m000-walk.png b/06-tour-shapes/sample-tour-005-s0012-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..08545e7b0bd9c8d68dc665024365c71fc725a535 GIT binary patch literal 5119 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∈)=A3fgdFQ?J-tXOe zf8Y1JpZC4*+K~Wn>y>sZ0RYxMfABg6fCUi%go3exS4z@y65(M@${|XM*XPL*7o!qW zq7vf4F~7ry{mk1j%Wb?W0Bj3zt7Z+j?RY*E(B z^Y#5Tuy2GGM}UV64>Se<+$J&r%(W;4fOZTH0ODaLytfNM18{XU5diXE0SbWd<f;jW>|}a40iAK3>er zC9$c3+7R|B9*?)zu3${#47zRtRAgIs_t9V~m887;Q}o(Zd1KODFwLh=&1sYb+)urD z@tA*41H+MW`p#<9nUT8#abwbT_qr>$6h2*CytKQxFGmI%^#Tk=4EV0Bllb>B{5boItC&%BA^zF*T=5aexT0I~`WVq^I*}t!h%Ip4K`blYK}4?pRp9*y+9mRJpCn-J7sWjRdH#aw(G(phFaG2DzE=8|;7ftbm6MT3$ zEG{s90-Ko4EKdBI%jTDn$wpFrh@vJLfgxc3e9HwFGdZc=AoTrS!2X` z))>bP_N>VnIyT&d5+DkrN(E4)uWh(>aZZ zu(#N6z{3jr%cRUrgW3)S95iflA zf0=8c={}mG;&ui?UO}u*==I#g_l`!r*qGgG#X%a-%E zrhxeymjRtkZFE-FVw(th0l}=yWKhSzLcJkE0A(8r+2KkevGeouR}cj1x*{hkEY{(T zEK9&S@+-sSuF?PgQj^BJY^-vd`25=8#E0@iRASkGGwk`7a7r~dH%lfMi|jCVZ?#Mo ztU-YqcY9o9cLa~fB>+`DDtm^5%3gEeycr50JosZyyVv$M0gEH<0nJ2)6J<>mea zV%O}-N-CmE+Z>rQX}4!Sbwgts-kQn98s!ND)P%v7zZVn~K;ov{P_EUgT(o~q!{8{0 zO`K;e>7*#by;h-!z!zWNJruu(`lBt8gI?lQ%^hXR_{N^FF=^Zw))hhDY%el5DH+|^ z1HBHsmcNx8>O<#S*3G}M!WToA6W^S`7t)REag>dam2APnnXJY6bg6e3iq;x3Ki%Op zCOrzDYz<*o^hBMQS&uWGhOG3u@;I#ZvY}QL0TNl60xH3S9%)+3nT{oc%8JLizWm7w7x-@o_#6uGs{J%H=U;$YIS>E< literal 0 HcmV?d00001 diff --git a/06-tour-shapes/sample-tour-008-s0020-m000-walk.png b/06-tour-shapes/sample-tour-008-s0020-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..52770fc768b3da1cfdf8aaddc842e9142af86ab2 GIT binary patch literal 5675 zcmeI0c~nzZ9>;GImRJgj(-s)fz{uEIOQE$0BMl^|U|m?G4MY$UceW6eeM$4pJ0HEvuK$6iW@J>NuRxJFoi}xbO?>HKF_+&(E zd;~oP1bBOU@7=rn8L)RRy!76FqGb~R?=+yxr}Ga~n4X4tZ@OumAnMH5b0~;TdoCIuvh7&9|B}-=qy^)i;#Zt&>PL>_>_l zD1OF6=ZDu;xD-A)W()xKse>MdBOJrR5Q$#{1OSJO(D1%J5dfAo0tvuW3EJ-kgs=~__d9Lfc6D5*P=Pt}j7gJ@I#Cm;dPj7F5^r9gK z!x*|bUEKJ~mkxSs>;~fHlFG_T4kxmp*-UwH4k=!afZ{5b%M&s(LgyJw(aub3MV2u$ zZ+?D$Y$~c@QVvP3!I$9gU#T>5}GVZ+-Zl zwtr?kEv%cr#rn<2&G~bqx-f1KJSL0}Za`y4M!2w?;B0ce6Oxm)KVP4}9udi83M?!v zEaNvnSZ(+8TY%_GyZg8KJIBrLabhuOKomZF_%KJckF+I!@7Uy|bMkufo6J?~fE_h0 zt=7@e5$8c55V#ydFGs6lq81Y!8?w$G$TAkZI%mDR$G&cEKMMZ@hfxuMH4Gi}Rn3NLH#uNv@y2dl8PL79> zLmtHMBkSi!Hm6L>>%zFVZr$QY71@3!!p-|bLdrOs1Yg~b{0W8RK3B{{{b_BW7(YK9 zQE>gs#w%I?k~7WGt+Hz$o*6d!oCd0YiRi}{{Lsm7`?9GhWSlqkBdZfcAr=q$I97(r{AD3 zbVo%kGBTP}4!=hP{bs^L)uBJ*rCkwxmq+-3;4 z6hTK<*ZvHxvf)7AYD4$hj9LR^>gSN%TyJ|7Ldsk2pn5hvQ1l^M=^jl4EXB!_C)J12 zzaYVq>E`ZkUW6ul(=9Uqpl*$Z;5RijH4e`xl#|-=V^vjE1H;I3IeU1Q?axyYWslkj zRGec2bQ3G?;=j(o(37he@OVhA{_FJgbP--qSvjRt!5Kx1j{YOt81UXULf?G`-|(g4 zVnWJ-Do!C4a7E$Y;VpqMfc#pacD=63_}QtYs@$%aX?zd$Ab1JD-GD2@L6R8)N~4Td zFf>}_CwAVl)}qN22+g92R0}5>q=Q9L2ibhXr^$c*`3FdwoUo|#(}xQ&ttLi8%AYLn zPow(SO6y#2C;(&PQopwP2vgn**xOec^QyNd8TE`$gHzVc!{gRyd@w|fM5=_W2o@J+ z*Rxm6Q4NjRRS;+4rdnz8S{$we7L79))^I0_XbM%QHc7$ZjOq2kEbze~1NF=~cjSV2 zxUD$q`0?YS7S=`ta$SneZYn85r@qFRpOVzn)xBdE7fhkdV8}Pu!nq0Jy1Kel zm2$(lGcUXI=rJ)J(JmV8kP6ZmS#UjuPKRc}sc#YIaMm0$jY9gzY-1YJ58dNbAP~S! zJ~NvT8|x314P&#q$Q8$qa=YY_?s3VN=1G3v1qzutTKM@d6|(s%Thpk_j&3k90$S6_ z+4(iO-u(kM(ip--R~Bz~H1V=MgrolyIPsK8I4P+`+Sc z1s{vVtE&sOva-Sy!y~BOR`K?gz4-;Sc?f{-Hx6k!yzAay(4#ufkFf{znRFMi^kveMHdAiiWEyDl{{5#M2x4ovxtF zM6XOP;XqbwdisId+FF-g%qtNEsW5xy+1o1$PQ89q0s`r9KN$~8kzT2bcPoc}7aC_X zd^@{LBG)xtLoF=;2-;6vuWa8L6%|DqeD|INhHY}n6RIM?T`Hd%8ykCMHfc{0Fv_6~ z(ko@Bs#_bDR}JuOT((E3Q=uKPz+h}01vL_9pK*nvI|~Q}7eMA&qX+UO$BP7uF}=oS zXWX`KP5Ib^v!KmsC@n2*cnbk`#cVUZYACk-{rxfxJUAReUFhKSbmH6rK>Tt^a^VsN z@Pb!7@2|6i@mqRc{>6@t4i4uLdp#hV|6A&X20?uW1$E%Y#6Vk*bSw_A40})~@0wYzY(lMM;QuEBI>IJr|9k7G)UV(^D%j=ayW`e2 HYSuphw)iTM literal 0 HcmV?d00001 diff --git a/06-tour-shapes/sample-tour-009-s0012-m000-walk.png b/06-tour-shapes/sample-tour-009-s0012-m000-walk.png new file mode 100644 index 0000000000000000000000000000000000000000..cec0569935301d7a78e1687b864d56dbb1cf9708 GIT binary patch literal 5040 zcmeI0dr;F?7RT@JmtZ2Ogt`K&Es4?ryQPR7l$M9V6;W0m^$|c`0YMZbgaUzpgap<> zcTs7_I;=dTmR)suBvDHciX@uVNHIoNLU02FWg$q^5FjKZgzN>J=}dR_e`l7N-^}lk zbI-lMlk@qWbANyODtyms+x4~pfYl*;gAM?IApw9!<5$2ZRe7aZ@Z_AkJ32S$Xijo= zT2^ivJre|n1}`0<2SR^0+|vZW+JhlMI}b5y-V9Lx;98)1@PfCkxd+Ye`DR^;gYDxh zux3==YBg#L+y*alSqNiDBYe!6mZavPZ#S@0uy^Q$Ux;h2ZpIcvFUnNtsh-ueu&s(xB$h;5H zv;$0-U$t{nZykv1bKJUyvLeP%qIX(#~OZVG%aR4uSSiVIe zq;kok)Hlrv4MTMr2oxhDM{8?qsmzJ_{_{qn9q@n-s9fcmXrTB zsTuK6m6eqYHk)cN7#IZwhvOA`mPg{Qj#8998r($XvW0Qhn&%mjjq-7wwo(4GEsA-0 zajlUTz;KPERIn#I(SU0z^!+XW6BNsQ8jE5R*S2#Tbbr|4x{3W}ZxXde-Y64{E3^8iWsIFQrHw3H-G;vJVI@_mTF z)DRn)c8VkHtuS26-HHx{ZMi-`8EDZl^2`Sa%or|&2f3I>yD z?8KpY{~8=jpitTLv#WnVB{>ib04Y!P(6YKT&=ylAyr>{z_;TLgqm;k`zV7FiS5_TWpV50N8#XMg1E! z?IxoxnL=S%OcV~-zc3n-`EWIOg0o_C z_IEi+w_t^jJ-WSGp59V8XHIXqSt{a02XdSa2Xa0Z;@6eQP!wdGt5a0qA_>lG;Mz9X z;lG*eH|a#Si|7Esy&R1M^C^DSA8oMAZ*8!9nKTPC(WXRIXM+V}15&B9QMaGc66dKI z9d*mvG<4^k_wQzl=69W{si`?ckymb^x(IuhNqV2#t@oXz3Tcdoqnr`1k^s);1%}j+ zA<5_?^^|E!MsB1jVOeAp7LK>yi|`;V0_YS00j!V~p807c`>>Of(>9k1&D>o7CR8*8 zv)|p)Q5sF&t{ES12oDc0HpV>jW@Ke0I+R$Gk&-0HY=o&8GMmz`QpE-VXMZ?l6D(1~ zk_!DBWou`}%?nTt$n(Z}PfyQu-`W}0hi7haL|)MIv2(%o?YD1_nVtQhC0(zevh}Q0 zXEg2H8H3>jo2~i)k8yeO3@-{gHuEJehr2r~BEP%e4%hQ=~Ycb#+eqy3t5P&m;`4LXh_DU7?XdlfknI4&O& zi3+{G1AEEa=FUi#8poe1Z&$IJR`GQ3$*4;v?;dVms7m!pr zt0k6oLET#3YrF>$cyzkc9*C^fGBwn1_N+-Rmk+CH%3huB>&a-q-+EG`FB~vz1lJ*Y zjNIJmtJ*uAom{b4YzQDsXDs%f{S6{M6Kj{aFVyWqx^hOYJ)so1T?iQp0{jBlpzS*w zTo1vNd&`90K4Ax+z4{T>(}@(o{}QHi-==tloatXY$s$p#O~lsLR`gWukb}oUjTAW+ zq(S^LdXL<=&efQ9Jb0XKNy=XdlQE~TFb0Ri35zU4L*Iu-M4bHM=>${(Utiw_9Wzd? zR%f0P$FcipaQ1HhmPN*2IJ7QFz%M`9E#f~YvsmtIc;V7E&p(NUb1or&+u^O^pn~Y^ zMz(=3276v2xwwh0>eREotL^a)V;Lu|L^e`Xd!C2Dw%KA~QD#4h_VQi;W!w65<1b(S zpiK^>L)JA@YS}`k?q!Due(EKmxjc6a4!V1HC#2suAV5E+^vkj&wX(*{0Pt7$8)v%p zrw29$g1)rOBJ+qz{1)!ZU)Km|L~HJFwb~@koN^(6ynn)|bfvs}(CW@5zxG_*q#L(( lEJL*%f#nGN&j`%nl8JW?>=9$O!jE1cWOsNF_xFjV{{gpdtv>(& literal 0 HcmV?d00001 diff --git a/06-tour-shapes/samples.txt b/06-tour-shapes/samples.txt new file mode 100644 index 0000000..4cb0b69 --- /dev/null +++ b/06-tour-shapes/samples.txt @@ -0,0 +1,10 @@ +FLRFRFFFRFFFRFFR +FFFRFRFRLR +FFFFRFRFRLFR +FFFLFFLFFLFF +FFRRFLRRFR +RLRFFRFRFFFR +LFRFLLFFFLFFLF +RLFFLFLFLR +RFFFLLRFFFLLRRLLFFFF +FLFFLFFLFLRL \ No newline at end of file diff --git a/06-tour-shapes/split-leg-1.png b/06-tour-shapes/split-leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..78c143c76bf1d5b3c23348dbd852ac027b2f19e6 GIT binary patch literal 1654 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 cP6U41zhuRd7ZX!AoBzopr02nT>H~;_u literal 0 HcmV?d00001 diff --git a/06-tour-shapes/split-leg-combined.png b/06-tour-shapes/split-leg-combined.png new file mode 100644 index 0000000000000000000000000000000000000000..86a02a68245830009347c83f304f624f06130b6e GIT binary patch literal 2669 zcmZWrc{Cg777r?hp=miR##|NavIfDv$R{y41S-CO=Q6|E6SJM2lE(7wM9 z2upMOprNHvbeX(^Jad)%@=;IsWpqzX9sy55QjQB=!p9!C_rxI~Ce6Lv-Q!uNB6;nj zT8ito>%zTeDN%LRW2a)2R6Uhlbq_&Qt)3!ZXgVhyxAM+W2DZ&7ZTRza@LmGmo6fCy zhG(kj`PdsoEOPUm^ZIb;EC-7J-31sOeMF9FC&)ClC-5}Ko}HL-$pZ1`#tsNibjm0& zN8_2RSEHvQH2reC7(5!c}3)(&8+V zZmU!4X5_CIlAk#c(F8e_;xZ6vuE=_E9o0N&xZW7E$uFaGSrDe&7xe=^cn653cqQvx zLL!{9lYK7a<)1BY1A~|PrEGpJQjk@rnCz(dns;n?LvPK10k)UBr0se`8=~hZBCNFH z1Je;zh_P3}g7xuU;#DVv$5j`jLzRd3gz5!?__snWc>)aeuH0rF{&yg1ZzM)uKt|_>jFk*3y)-H7sx>Ycke$UM+E5dS21~KE>s6;q!B(|U zKv?|N8YL1iPV^cpVSh<1cvYYDi8a4*gnj*tQ$yiww!k}hV^b!0F!0jbKiy!;xmSeP z)0nz~->6^&(eit73TBB|-7;QcgFlfpBHr)FmhavxH~I|iCrd^k>oC3U8Fm~c>HsL! z0oJKlp^5S=^&!q2jUKnGq00x6RxEGe>v}=@#PzU(x2EyEptT$IU_DjT!*2zLe-G2k zA(aU)CaTm)Yp$5V)ao+Mi?Q-(&8hXy=~E2-DlpDSc-SO|y~}jUDjSoIP*EBb{rZ$B z^dgx&nl%G6$Q zccfUaA*8G+A*~0mq%DucZsf*pe9=!YeC}8qd&d)(rZo8IeT3G0z!{=t(eXCFdG|y?IhSC*UJ#v6=Ss|-)Y z0qPSuM^`fk4y>G}LEUl;bZtkNG>BCy9@oOkqoZKme9f1zb17QNh2nCe?K#n*D%2>W zcw;zH>k60%6+%+*UO}9K2lqDPV@x+%jM7K-bAgd z3`aaJ+gJ`|oNA~rp|B#BFx+OE4h5KiOnO!#WDYV-=@rJCT{H#s5bXdP&Kk@N^hHD?N(KS&uAkH8evqsCVo=g2T?;|ciBX`aj z9ZvRmJ{{p1vh-_2RxlEMdju3WBQe$)@EPu8!tJ@Y|yx}AeU<7j~jI(c4+e$Mn%(0bM$03mKXv#cn2C-~gwl9;1AEfNW zgx!wkeYSHN8(-Nq1vXj)OYF%D2F6w5*J|vJ#?2TnzPeZP0-b2VYgOYq%6itVm5vRn z(XD&%b+>C zoES8k0O*)j?EriaZ4u&m_MiB2aCCKe=+?|AgMMCtK2F}L!ld&})Cq1cOvY|Xi48+a zJbodz3PV*O9uO6++l@&azDyij){Kl&==iPvk#o_e#y2$@iseEonN zDbXpok+i=G9P7inOOOA{%PLC48%k9gXczA<$^AWAAOJY6?7^R-Fw;Zy+4c7^EOg c(HHgvl0H7k%|4Y_{%z|+SlL)sSh&Xg8^X2-SO5S3 literal 0 HcmV?d00001 diff --git a/06-tour-shapes/tour-shape-plots.py b/06-tour-shapes/tour-shape-plots.py index af9e356..4bb47e0 100644 --- a/06-tour-shapes/tour-shape-plots.py +++ b/06-tour-shapes/tour-shape-plots.py @@ -507,10 +507,11 @@ def heart_tour_func(): return heart_tour # meta.add_text('Description', tour) # im.save(filename, 'PNG', pnginfo=meta) -with open('tours-random-walk.txt') as f: +# with open('tours-random-walk.txt') as f: +with open('samples.txt') as f: for i, tour_s in enumerate(f.readlines()): tour = tour_s.strip() - filename = 'tour-{:03}-s{:04}-m{:03}-walk.png'.format(i, len(tour), len(mistake_positions(trace_tour(tour)))) + filename = 'sample-tour-{:03}-s{:04}-m{:03}-walk.png'.format(i, len(tour), len(mistake_positions(trace_tour(tour)))) plot_trace(trace_tour(tour), filename=filename) im = Image.open(filename) meta = PngImagePlugin.PngInfo() diff --git a/06-tour-shapes/tour-shapes-sample-tours.ipynb b/06-tour-shapes/tour-shapes-sample-tours.ipynb new file mode 100644 index 0000000..3fa22ff --- /dev/null +++ b/06-tour-shapes/tour-shapes-sample-tours.ipynb @@ -0,0 +1,1143 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Given a sequence of {F|L|R}, each of which is \"move forward one step\", \"turn left, then move forward one step\", \"turn right, then move forward one step\":\n", + "1. which tours are closed?\n", + "2. what is the area enclosed by the tour?" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import collections\n", + "import enum\n", + "import random\n", + "import os\n", + "\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Direction(enum.Enum):\n", + " UP = 1\n", + " RIGHT = 2\n", + " DOWN = 3\n", + " LEFT = 4\n", + " \n", + "turn_lefts = {Direction.UP: Direction.LEFT, Direction.LEFT: Direction.DOWN,\n", + " Direction.DOWN: Direction.RIGHT, Direction.RIGHT: Direction.UP}\n", + "\n", + "turn_rights = {Direction.UP: Direction.RIGHT, Direction.RIGHT: Direction.DOWN,\n", + " Direction.DOWN: Direction.LEFT, Direction.LEFT: Direction.UP}\n", + "\n", + "def turn_left(d):\n", + " return turn_lefts[d]\n", + "\n", + "def turn_right(d):\n", + " return turn_rights[d]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Step = collections.namedtuple('Step', ['x', 'y', 'dir'])\n", + "Mistake = collections.namedtuple('Mistake', ['i', 'step'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def advance(step, d):\n", + " if d == Direction.UP:\n", + " return Step(step.x, step.y+1, d)\n", + " elif d == Direction.DOWN:\n", + " return Step(step.x, step.y-1, d)\n", + " elif d == Direction.LEFT:\n", + " return Step(step.x-1, step.y, d)\n", + " elif d == Direction.RIGHT:\n", + " return Step(step.x+1, step.y, d)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def step(s, current):\n", + " if s == 'F':\n", + " return advance(current, current.dir)\n", + " elif s == 'L':\n", + " return advance(current, turn_left(current.dir))\n", + " elif s == 'R':\n", + " return advance(current, turn_right(current.dir))\n", + " else:\n", + " raise ValueError" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def trace_tour(tour, startx=0, starty=0, startdir=Direction.RIGHT):\n", + " current = Step(startx, starty, startdir)\n", + " trace = [current]\n", + " for s in tour:\n", + " current = step(s, current)\n", + " trace += [current]\n", + " return trace " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def positions(trace):\n", + " return [(s.x, s.y) for s in trace]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def valid(trace):\n", + " return (trace[-1].x == 0 \n", + " and trace[-1].y == 0 \n", + " and len(set(positions(trace))) + 1 == len(trace))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def valid_prefix(tour):\n", + " current = Step(0, 0, Direction.RIGHT)\n", + " prefix = []\n", + " posns = []\n", + " for s in tour:\n", + " current = step(s, current)\n", + " prefix += [s]\n", + " if (current.x, current.y) in posns:\n", + " return ''\n", + " elif current.x == 0 and current.y == 0: \n", + " return ''.join(prefix)\n", + " posns += [(current.x, current.y)]\n", + " if current.x == 0 and current.y == 0:\n", + " return ''.join(prefix)\n", + " else:\n", + " return ''" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def mistake_positions(trace, debug=False):\n", + " mistakes = []\n", + " current = trace[0]\n", + " posns = [(0, 0)]\n", + " for i, current in enumerate(trace[1:]):\n", + " if (current.x, current.y) in posns:\n", + " if debug: print(i, current)\n", + " mistakes += [Mistake(i+1, current)]\n", + " posns += [(current.x, current.y)]\n", + " if (current.x, current.y) == (0, 0):\n", + " return mistakes[:-1]\n", + " else:\n", + " return mistakes + [Mistake(len(trace)+1, current)]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def returns_to_origin(mistake_positions):\n", + " return [i for i, m in mistake_positions\n", + " if (m.x, m.y) == (0, 0)]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "sample_tours = ['FFLRLLFLRL', 'FLLFFLFFFLFFLFLLRRFR', 'FFRLLFRLLFFFRFLLRLLRRLLRLL']" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def random_walk(steps=1000):\n", + " return ''.join(random.choice('FFLR') for _ in range(steps))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def bounds(trace):\n", + " return (max(s.x for s in trace),\n", + " max(s.y for s in trace),\n", + " min(s.x for s in trace),\n", + " min(s.y for s in trace))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "plot_wh = {Direction.UP: (0, 1), Direction.LEFT: (-1, 0),\n", + " Direction.DOWN: (0, -1), Direction.RIGHT: (1, 0)}" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def chunks(items, n=2):\n", + " return [items[i:i+n] for i in range(len(items) - n + 1)]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def plot_trace(trace, colour='k', xybounds=None, fig=None, subplot_details=None, filename=None, show_axis=False):\n", + " if show_axis:\n", + " plt.axis('on')\n", + " else:\n", + " plt.axis('off')\n", + " plt.axes().set_aspect('equal')\n", + " for s, t in chunks(trace, 2):\n", + " w, h = plot_wh[t.dir]\n", + " plt.arrow(s.x, s.y, w, h, head_width=0.1, head_length=0.1, fc=colour, ec=colour, length_includes_head=True)\n", + " xh, yh, xl, yl = bounds(trace)\n", + " if xybounds is not None: \n", + " bxh, byh, bxl, byl = xybounds\n", + " plt.xlim([min(xl, bxl)-1, max(xh, bxh)+1])\n", + " plt.ylim([min(yl, byl)-1, max(yh, byh)+1])\n", + " else:\n", + " plt.xlim([xl-1, xh+1])\n", + " plt.ylim([yl-1, yh+1])\n", + " if filename:\n", + " plt.savefig(filename)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def trim_loop(tour, random_mistake=False):\n", + " trace = trace_tour(tour)\n", + " mistakes = mistake_positions(trace)\n", + " if random_mistake:\n", + " end_mistake_index = random.randrange(len(mistakes))\n", + " else:\n", + " end_mistake_index = 0\n", + "# print('end_mistake_index {} pointing to trace position {}; {} mistakes and {} in trace; {}'.format(end_mistake_index, mistakes[end_mistake_index].i, len(mistakes), len(trace), mistakes))\n", + " # while this mistake extends to the next step in the trace...\n", + " while (mistakes[end_mistake_index].i + 1 < len(trace) and \n", + " end_mistake_index + 1 < len(mistakes) and\n", + " mistakes[end_mistake_index].i + 1 == \n", + " mistakes[end_mistake_index + 1].i):\n", + "# print('end_mistake_index {} pointing to trace position {}; {} mistakes and {} in trace'.format(end_mistake_index, mistakes[end_mistake_index].i, len(mistakes), len(trace), mistakes))\n", + " # push this mistake finish point later\n", + " end_mistake_index += 1\n", + " mistake = mistakes[end_mistake_index]\n", + " \n", + " # find the first location that mentions where this mistake ends (which the point where the loop starts)\n", + " mistake_loop_start = max(i for i, loc in enumerate(trace[:mistake.i])\n", + " if (loc.x, loc.y) == (mistake.step.x, mistake.step.y))\n", + "# print('Dealing with mistake from', mistake_loop_start, 'to', mistake.i, ', trace has len', len(trace))\n", + " \n", + " # direction before entering the loop\n", + " direction_before = trace[mistake_loop_start].dir\n", + " \n", + " # find the new instruction to turn from heading before the loop to heading after the loop\n", + " new_instruction = 'F'\n", + " if (mistake.i + 1) < len(trace):\n", + " if turn_left(direction_before) == trace[mistake.i + 1].dir:\n", + " new_instruction = 'L'\n", + " if turn_right(direction_before) == trace[mistake.i + 1].dir:\n", + " new_instruction = 'R'\n", + "# if (mistake.i + 1) < len(trace):\n", + "# print('turning from', direction_before, 'to', trace[mistake.i + 1].dir, 'with', new_instruction )\n", + "# else:\n", + "# print('turning from', direction_before, 'to BEYOND END', 'with', new_instruction )\n", + " return tour[:mistake_loop_start] + new_instruction + tour[mistake.i+1:]\n", + "# return mistake, mistake_loop_start, trace[mistake_loop_start-2:mistake_loop_start+8]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def trim_all_loops(tour, mistake_reduction_attempt_limit=10):\n", + " trace = trace_tour(tour)\n", + " mistake_limit = 1\n", + " if trace[-1].x == 0 and trace[-1].y == 0:\n", + " mistake_limit = 0\n", + " mistakes = mistake_positions(trace)\n", + " \n", + " old_mistake_count = len(mistakes)\n", + " mistake_reduction_tries = 0\n", + " \n", + " while len(mistakes) > mistake_limit and mistake_reduction_tries < mistake_reduction_attempt_limit:\n", + " tour = trim_loop(tour)\n", + " trace = trace_tour(tour)\n", + " mistakes = mistake_positions(trace)\n", + " if len(mistakes) < old_mistake_count:\n", + " old_mistake_count = len(mistakes)\n", + " mistake_reduction_tries = 0\n", + " else:\n", + " mistake_reduction_tries += 1\n", + " if mistake_reduction_tries >= mistake_reduction_attempt_limit:\n", + " return ''\n", + " else:\n", + " return tour" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def reverse_tour(tour):\n", + " def swap(tour_step):\n", + " if tour_step == 'R':\n", + " return 'L'\n", + " elif tour_step == 'L':\n", + " return 'R'\n", + " else:\n", + " return tour_step\n", + " \n", + " return ''.join(swap(s) for s in reversed(tour))" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def wander_near(locus, current, limit=10):\n", + " valid_proposal = False\n", + " while not valid_proposal:\n", + " s = random.choice('FFFRL')\n", + " if s == 'F':\n", + " proposed = advance(current, current.dir)\n", + " elif s == 'L':\n", + " proposed = advance(current, turn_left(current.dir))\n", + " elif s == 'R':\n", + " proposed = advance(current, turn_right(current.dir))\n", + " if abs(proposed.x - locus.x) < limit and abs(proposed.y - locus.y) < limit:\n", + " valid_proposal = True\n", + "# print('At {} going to {} by step {} to {}'.format(current, locus, s, proposed))\n", + " return s, proposed" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def seek(goal, current):\n", + " dx = current.x - goal.x\n", + " dy = current.y - goal.y\n", + "\n", + " if dx < 0 and abs(dx) > abs(dy): # to the left\n", + " side = 'left'\n", + " if current.dir == Direction.RIGHT:\n", + " s = 'F'\n", + " elif current.dir == Direction.UP:\n", + " s = 'R'\n", + " else:\n", + " s = 'L'\n", + " elif dx > 0 and abs(dx) > abs(dy): # to the right\n", + " side = 'right'\n", + " if current.dir == Direction.LEFT:\n", + " s = 'F'\n", + " elif current.dir == Direction.UP:\n", + " s = 'L'\n", + " else:\n", + " s = 'R'\n", + " elif dy > 0 and abs(dx) <= abs(dy): # above\n", + " side = 'above'\n", + " if current.dir == Direction.DOWN:\n", + " s = 'F'\n", + " elif current.dir == Direction.RIGHT:\n", + " s = 'R'\n", + " else:\n", + " s = 'L'\n", + " else: # below\n", + " side = 'below'\n", + " if current.dir == Direction.UP:\n", + " s = 'F'\n", + " elif current.dir == Direction.LEFT:\n", + " s = 'R'\n", + " else:\n", + " s = 'L'\n", + " if s == 'F':\n", + " proposed = advance(current, current.dir)\n", + " elif s == 'L':\n", + " proposed = advance(current, turn_left(current.dir))\n", + " elif s == 'R':\n", + " proposed = advance(current, turn_right(current.dir))\n", + " \n", + "# print('At {} going to {}, currently {}, by step {} to {}'.format(current, goal, side, s, proposed))\n", + "\n", + " return s, proposed" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def guided_walk(loci, locus_limit=5, wander_limit=10, seek_step_limit=20, return_anyway=False):\n", + " trail = ''\n", + " current = Step(0, 0, Direction.RIGHT) \n", + " l = 0\n", + " finished = False\n", + " while not finished:\n", + " if abs(current.x - loci[l].x) < locus_limit and abs(current.y - loci[l].y) < locus_limit:\n", + " l += 1\n", + " if l == len(loci) - 1:\n", + " finished = True\n", + " s, proposed = wander_near(loci[l], current, limit=wander_limit)\n", + " trail += s\n", + " current = proposed\n", + "# print('!! Finished loci')\n", + " seek_steps = 0\n", + " while not (current.x == loci[l].x and current.y == loci[l].y) and seek_steps < seek_step_limit:\n", + "# error = max(abs(current.x - loci[l].x), abs(current.y - loci[l].y))\n", + "# s, proposed = wander_near(loci[l], current, limit=error+1)\n", + " s, proposed = seek(loci[l], current)\n", + " trail += s\n", + " current = proposed\n", + " seek_steps += 1\n", + " if seek_steps >= seek_step_limit and not return_anyway:\n", + " return ''\n", + " else:\n", + " return trail" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nhMqGoYtNhANGByBP3bLhxWPIPI4M8pSuE9AJQL7SdQJzGCAcgDybqBOQGIQ8dUcHJAahC3UCMLi6\nQ4TKhqGLTYQDyoYhz6rE4KpxxWMt6gT+uNvt7kXEXyLio4i4GRHPIuL9iPgiIn4ZEXfb8l9FxO2I\n+Doi7kXENxHxoP3sb2353Yj4Z/v5fyPivYi4FRF/j4iHbb1PI+JncdlLXrT1P23r34+Ix22/1yPi\neWvL56199yPiUUR83Lb9tO3zq4j4eXvvX9u23o+IJ60tT9u+b7W2PmzrfR4RH0TED21/tyPik7b+\nvdbuX8TlyTyLiDuLtj5obfkoLs/bs8Xv/2Fb/9Hecbvfvn/QtvV4r633I+L79v61x+1aRLxo2/+s\nHav94/Zt2+eX7fdbnuM77Xje3zvHjw8ctxdx+Tez39ZP2vmIuLzt9vK43W/n6MNXnOP57/Hjtt3/\n7J3j5XG7036HBxHxXdvO3Jb57/GzdtxetvN4q7Vvbuuhc/yPxXGb23qz7eNu/P9n41Hb1qHPxsNY\nY5qm9K+4/EP5U1z+QU3tQE97X98tXv/rwPKLxesnB5ZPr1h+fmD5l4vX3x9Y/s3i9b8PLH++eP3V\nEW059PXF4vUPB5Yvt//tgeVPrzhuZyvbcuhredyeH1j+9RXn+NkRx+2qtiyXv7yirc8OLL/qHL94\nxbbWnOMnr9juofP29MDyYz4bfzj287kz1R/GZnQABqcTgMHpBGBwOgEYnE4ABqcTgMHpBGBwOgEY\nnE4ABqcTgMHpBGBwOgEYnE4ABqcTgMHpBGBwOgEYnE4ABqcTgMHpBGBwOgEYnE4ABqcTgMH9D868\nJ7EMO+IfAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def square_tour(a=80):\n", + " \"a is width of square\"\n", + " return ('F' * a + 'L') * 4\n", + "\n", + "plot_trace(trace_tour(square_tour()))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def cross_tour(a=50, b=40):\n", + " \"a is width of cross arm, b is length of cross arm\"\n", + " return ('F' * a + 'L' + 'F' * b + 'R' + 'F' * b + 'L') * 4\n", + "\n", + "plot_trace(trace_tour(cross_tour()))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\ndwO41XcnEvOQAd2izoOgzsuuu3sOPO27E4k5xfLxGrmnwHbfnUjM49gCjhi07DaBT/vuRGKuYfn4\nQUtp+wzVVZz5WBUtH5/SjuepRJ3rpLsDwrRoTVg+fuBcJ90dYfKxKlo+PqURg7UH6lwn3T3A0m5V\nt4C7bQukFBhS6ksqXCfdXcPp9lUbhDxDo5ROJfx0rDPH0J3l4+teYfn4QTPH0N0bLB9fZfn4gTMw\ndPch5hiqLB8/cAbL7lLax1NxA8vHa+S2McdQdUgo79YopWjqsLnOEUN3K6T1AZiCQyL3lUgpMDhi\nqPNrtu7uA5/03YnE3GdAU6ItH19nsOzuHa7HqkGVj/c7+zpPr7rbxlvUVe0xoKsrPZ/WRbiG5eOr\njgnXkDRKKTCozu3T3V0sH181qPLxKZ3WpMLy8d0dE7nEeIQyIsdbSgejB0FdSoF7qCwfX7dD5NhP\naccz0aaLsEEYOmsiJ5LTSykwqM5g2d0NTD5WPSJy/UhKpxKbWZatEL62LCPaKuE76Kz498uEU47y\ngMmmll3h/UhYtlW+9tLU801tvy2ey6b+nQtoe2Xq+ayhbfAr3Hk4Ap5lWfaQ5vXdtm1XeX+fnN4H\nc8K2L5+fbqtt2/6xbTP1+mzq75z395v8jLan98mcyKl7SoHhD313IEHec7G73wJ/CvzUd0cS829t\nT2Z57vQBSe8zxyCpxsAgqcbAIKnGwCCpxsAgqcbAIKnGwCCpxsAgqcbAIKnGwCCpxsAgqcbAIKnG\nwCCpxsAgqcbAIKnGwCCpxsAgqcbAIKnGwCCpxsAgqcbAIKnm/wGyPjyrfbBoQAAAAABJRU5ErkJg\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def quincunx_tour(a=60, b=30, c=50):\n", + " \"a is length of indent, b is indent/outdent distance, c is outdent outer length\"\n", + " return ('F' * a + 'R' + 'F' * b + 'L' + 'F' * c + 'L' + 'F' * c + 'L' + 'F' * b + 'R') * 4\n", + "plot_trace(trace_tour(quincunx_tour()))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n1sd/Aw+RJa+eq45oAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "heart_points = [Step(60, 50, Direction.UP), Step(50, 90, Direction.UP),\n", + " Step(20, 70, Direction.UP), \n", + " Step(-40, 90, Direction.UP), Step(-60, 80, Direction.UP), \n", + " Step(0, 0, Direction.RIGHT)]\n", + "\n", + "heart_tour = ''\n", + "current = Step(0, 0, Direction.RIGHT)\n", + "\n", + "for hp in heart_points:\n", + " while not (current.x == hp.x and current.y == hp.y):\n", + " s, proposed = seek(hp, current)\n", + " heart_tour += s\n", + " current = proposed\n", + "\n", + "plot_trace(trace_tour(heart_tour))\n", + "\n", + "def heart_tour_func(): return heart_tour" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def trim_some_mistakes(tour, mistake_limit):\n", + " trimmed_tour = rw\n", + " mistake_count = len(mistake_positions(trace_tour(trimmed_tour)))\n", + " while len(mistake_positions(trace_tour(trimmed_tour))) > mistake_limit:\n", + " trimmed_tour = trim_loop(trimmed_tour, random_mistake=True)\n", + " return trimmed_tour" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nJogA7b/FLob4OhrHyQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(sample_tours[0]))\n", + "len(sample_tours[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(sample_tours[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASMAAAEACAYAAAD4GBC1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAACyxJREFUeJzt3W2spHdZx/Hvr552d8v2KV2FtkELGGwgkKLUB4Lb8sKm\nGB8SFXVfaGJB1FKrCUrarRVNoUDTghqr2GAjwRgxohKDDzFRUw3gAxXUhCUNqAlSoK1uS93ubrvn\n8sV9L6jJdncbz/2/zsz3k0w607S5rplz5nv+M2/uVBWSNNoZoxeQJDBGkpowRpJaMEaSWjBGklow\nRpJaMEaSWjBGklowRpJaMEaSWjBGklowRpJaMEaSWjBGklowRpJaMEaSWjBGklowRpJaMEaSWjBG\nklowRpJaMEaSWjBGklowRpJaMEaSWjBGklowRpJaMEaSWjBGklowRpJaMEaSWjBGklowRpJaMEaS\nWjBGklowRpJaMEaSWjBGklowRpJaMEaSWjBGC0qyO8nrklw0ehepm43RC6yDJLuBG4AbgV3AlyW5\ne8EVjlXVEwvOk05bqmr0DisvyYPAnvlhARmwxtdW1T8MmCudEj+mLWMP8H7gILAJXFdVWeIG7J9n\n3jbw+UsnZYyWcy9wMfBa4H1LDJw/Ht7E9HO+MsmLl5grPR3GaEFV9XhV3VNVn19o5JXAM+b7O4B9\nC82VTpsxWm1/DFw+378WePPAXaSnZIxWWFVtVtU/zQ8PVNVjQxeSnoIxktSCMZLUgjGS1IIxktSC\nMZLUgjGS1IIxktSCMZLUgjGS1IIxktSCMZLUgjGS1IIxktSCMZLUgjGS1IIxktSCMZLUgjGS1IIx\nktSCMZLUgjGS1IIxktSCMdpCSc5I8h3zw71Jnjt0IamxjdELrLgXAe+f738bcAT4vnHrSH2t1cko\nyZ4ktyW5YqGR/wgcv4jiEeAdC82Vtp21OBkleSbwU8B1wE7g8iR3LDT+PcBbgfuq6sMLzZS2nbWI\nEXAfcPH/ePzK+bak/QvPAyDJhcAhYM+I+dKpWpePaRcD9wIfAwp4W1Vl4dtfDXrub2A6Df7MoPnS\nKVmXGAE8CLwEuAq4fewqy5hPRdcz/ZxfnOTlg1eSTmidYkRN7q2q/xi9y0K+Dtg13z8b+JaBu0hP\naV2+M1pXfwZcABwErgb+Yuw60omt1clo3cwnwUfmh49W1ZNDF5KegjGS1IIxktSCMZLUgjGS1IIx\nktSCMZLUgjGS1IIxktSCMZLUgjGS1IIxktSCMZLUgjGS1IIxktSCMZLUgjGS1IIxktSCMZLUgjGS\n1IIxktSCMZLUgjGS1MJKxyiTV88Pr0myd+hCkk5opWMEXAjcDWwyXVn1bWPXkXQiKx2jqnoI+C2m\nGD0OvHGp2UneneR1SXYsNfNkklyV5A+SPGfA7CT5ziS/n+TCAfM3kvxAkt8Z8TNJsjPJDUnuWXr2\ndpGqGr3DlprfePcDDwJ3LTj6VuAQcBi4raruXHD2/5KkgAPAs4GdwJ8CH1pwhcPAa4GLgN3AbwCf\nXHD+E8ANwLnz/NuBLyw4/0zgx4EdwNnALQvOBri7qj6/8MzTtvIxAkjyLuDVJ/0Pt8ZR4Czg+6vq\nvSMWSPIR4HLGnYT/EzgH2Bg0/2GmEJ05aP5jTL8DZw2a/1ngkqraHDT/lKz0x7Tjquo1VZUlb8AR\npjfhG+Y1Lhn3CvBS4Grgo/PjVy78WuwBvhf41Dz/hQvPfxbwI0xvygLOX3j+VwA3AgeBQwvPPQSc\nB3zXMr9qT19qDU5GIyR5LvCZqjo8f0x6fVW9ffBOAS4DDtSAH3ySM4DnV9WBpWfP8zeA51TV/YPm\n7wKeVVX/stC8twPXMX08/FfgedX4dDTq2LzyqupTJ/+vljUH6OMD528yfXc1av6TTN8fjpr/OLBI\niGYvYAoRTB+Tz2U6nbW0Fh/TpHVUVdcAH5jv76mqtiECYySpCWMkqQVjJKkFYySpBWMkqQVjJKkF\nYySpBWMkqQVjJKkFYySpBWMkqQVjJKkFYySpBWMkqQVjJKkFYySpBWMkqQVjJKkFYySpBWMkqQVj\nJKkFYySpBWMkqQVjtIWSnD1f1RPg+iRXD11IaswYba1nAz85378U2DduFam3tYpRkquSfDjJq5aY\nV1WfYLqi5yZwBPj5JeZqvSXZl+SDSfaO3uV0ZLr8+mpL8grgDuBrgGfM//pPFhq/G3g58J6q+sGF\nZqqJJGcBtzP97i3lmvmf/wU8AZxfVVlw/tOyLjEq4BjwJLBjwAoHga+vqvsHzNZASd4E3Dxo/BEg\nwJuq6tZBO5yydfqY9kfArwBHgZurKgveLjBE6yfJucBPMP3O3bbU7xvT1wFHgV8GLtkOIYL1Ohm9\nr6q+J8l5wKO1Dk9cQyW5helUtAM4DFxUVQcXmHsGcE5VPbLVs/4/rdPJCICqesQQaSG7+NLXAp/h\nS99Xbqmq2txuIQLYGL2AtKqqan+SR4G3VNXzRu/T3dqdjCT1ZIwktWCMJLVgjCS1YIwktWCMJLVg\njCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCM\nJLVgjCS1YIwktbDSMUqyI8l754ffneSnhy4k6YRWOkbATuDb5/sFfPNSg5NkqVkdjX7+o+fr9K10\njOZL/N7BdJ3zw8BNC47/eJLfS3LZgjNbSHIp8ECSO5PsGTD/CuCzSW5Ocs7S8/X0ZNUvO5/kfOAB\nIMDRBUefAxybZ34Q+NaqWnL+FyV5I/D6BUceD8BhYBP4a+CbBsw/xPQz+IWq+tkF539Rkv3Am6vK\nk9pJrHyMAJJcC/z6gNHF9IbcBVxfVXctvUCSlwD3LT13dpQpRh8DvmHA/MNMf4R2jIpBkl8Cfgz4\nyqp6YMQO28VKf0w7rqruqaoseQM+DfwlsHdeY8egp387UxQfYn5TLvDcvxr4AvCbwPOr6hsXfu1f\nBjwG3AW8atDrTpIvB17D9PrfMmqP7WJj9AIr7NKqOgYw6rvU+VT0CqbTwbnAtcA7t3puVX0yyQXH\nn//SqupDSc6vqmNJ9p78/9gyNwFnMr3PfjjJrZ6OTmwtTkYjjHoj/h+HgL+d7/870+loEaOf/+j5\ns39j+kMA0/eGQ74z3C48Ga2wqvoE8LIkBeyrqr8ZvdM6qapfTLILeEtVXTl6n+48GUlqwRhJasEY\nSWrBGElqwRhJasEYSWrBGElqwRhJasEYSWrBGElqwRhJasEYSWrBGElqwRhJasEYSWrBGElqwRhJ\nasEYSWrBGElqwRhJasEYSWrBGElqwRhJasEYbaEkFyf56PzwziQ3Dl1ozST5IeB35/v/nOSFg1fS\nUzBGW+sY8IL5/lFg51KDkyw2q7ENpst6A1zG9PNYhK//6TNGW6iqPsd0bfsn5ts7lpib5Dzg4SR/\nnuSlS8xs6t3AI0ABf1hVB5YYmmQfcDDJncDZS8xcBamq0TustCTPBD7NmEuJF3CE6UR2RVX9/YAd\nhkryo8CvDhi9yXQa3gA2qioDdthWRrxB1kpVfW7+S/lzC47dDXwVU4g2gV8DPrLg/E7eBbwIWPJa\n98e/m3oSeBjYv+DsbcuT0QpKshv4O+ADwFur6qHBK62VJFcDdzH9Afrtqlrsu6rtzBhJasEvsCW1\nYIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVg\njCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCM\nJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktWCMJLVgjCS1YIwk\ntWCMJLVgjCS1YIwktWCMJLVgjCS1YIwktfDfe+gKnnXxV4YAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(sample_tours[2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['FLRFRFFFRFFFRFFR',\n", + " 'FFFRFRFRLR',\n", + " 'FFFFRFRFRLFR',\n", + " 'FFFLFFLFFLFF',\n", + " 'FFRRFLRRFR',\n", + " 'RLRFFRFRFFFR',\n", + " 'LFRFLLFFFLFFLF',\n", + " 'RLFFLFLFLR',\n", + " 'RFFFLLRFFFLLRRLLFFFF',\n", + " 'FLFFLFFLFLRL']" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = []\n", + "while len(samples) < 10:\n", + " t = valid_prefix(random_walk())\n", + " if len(t) > 8 and len(t) < 25:\n", + " samples += [t]\n", + "samples" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(samples[2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mistakes = [t.strip() for t in open('tours-random-walk.txt').readlines()\n", + " if len(t) > 8\n", + " if len(t) < 26]\n", + "len(mistakes)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQMAAAEACAYAAAC3RRNlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABydJREFUeJzt3U+o9XldwPH3x+axNEpwEBSdCO0PghCG6MI/S5HAoF0h\n1CJIIm2VtHCgbBPSQkGFESxQN6H1UC4E2wRFCv2hmCisQCnJzGxIcWaceXS+Le43Eheiz7nnnLnn\neb3gcM/Z3M/nHu593/P7bb6z1grgGedeAHh6EAOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNg\nEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOg\nEgNgEwOgEgNgEwOgEgNgEwOgEoMbY2aeOzM/eu49uFyz1jr3DjfezDyj44f1o9VPV7ert6+1/vnI\n87jHiME1mJn3Vr9yonFPVat62Vrr0yeayT3AZcL1+NXq1pEff9RVCG5X31O5ZOBa3XfuBS7BWuup\nrv5Qj2ZmfrG6f631LzPj4xzXTgxuiLXWI9Uj596Dy+UyAajEANjEAKjEANjEAKjEANjEAKjEANjE\nAKjEANjEAKjEANjEAKjEANjEAKjEANjEAKjEANjEAKjEANjEAKjE4EaZmefMzL/ulx+bmdefdSEu\nihhco5l53sy8fmbmSCMe7eoAlaonq38/0hzuQc5NuAYz8/zq16s3V8+qXjszjx9p3EPVO6pPrLX+\n4UgzuAc5a/EazMxXq+8/8difWGs9fOKZXDAxuAb7uLOPVq+sXlT9wFrrWJ8M4CjcM7g+/1i9uPoh\nIeAmcs/gGu0DWD9/7j3gbvhkAFRiAGxiAFRiAGxiAFRiAGxiAFRiAGxiAFRiAGxiAFRiAGxiAFRi\nAGxiAFRiAGxiAFRiAGxiAFRiAGxiAFRicJCZuTUzX9wvf2Nm3nLWheAAFx2DmXlgZt48M7eO8f3X\nWneqT1ereqz6y2PMgVO4yHMTZubF1YPVz1XfVz0wM5870ri/qF5T/fVaSwy4sS7yeLWZ+VJ1f1f/\nsY91IvK3evVa65MnmgXX7lJjsKo/q56oXle9ZK3l+HL4Ni7yMmH7ylrrjTPz7LXWY+deBp7uLvoG\nYpUQwHfm4mMAfGfEAKjEANjEAKjEANjEAKjEANjEAKjEANjEAKjEANjEAKjEANjEAKjEANjEAKjE\nANjEAKjEANjEAKguMAYz84P76XNm5nvPugzcIBcXg+rh/fW11TvPuQjcJJcYg49XT1aPVh871pCZ\necXMvP2bPonAjXZxJyrNzAuqf6v+p7p9xFG/UN3q6sDV91dvW5f2ZnJPubgYVM3M71S/dqJxX+vq\ncNdfXms9dKKZcO0u8TKhtdbb1lpzzEf11uo/q7fssc8/308Mh7vIGJzCWuu91QvWWr977l3gOojB\nAdwj4JKIAVCJAbCJAVCJAbCJAVCJAbCJAVCJAbCJAVCJAbCJAVCJAbCJAVCJAbCJAVCJAbCJAVCJ\nAbCJAVCJAbCJwYFm5iX76Y/MzLPPugwcQAwOMDO3+v+zHd/U1VkKcCOJwQHWWneqP66+3tXJSh85\n70Zw98TgcA929T7eXmt99tzLwN0SgwOttT7T1fv4T+feBQ4hBtfHe8mN5hcYqMQA2MQAqMQA2MQA\nqMQA2MQAqMQA2MQAqMQA2MQAqMQA2MQAqMQA2MQAqMQA2MQAqMQA2MQAqMQA2MQAqMQA2MTgQDPz\nqv30VTPz3LMuAwcQgwPssxb/dL98Q/VLZ1wHDiIGB9hnLX6wulM9vp/DjSQGh/utaqoPr7X+49zL\nwN0SgwPtANxXCQE3mhgAlRgAmxgAlRgAmxgAlRgAmxgAlRgAmxgAlRgAmxgAlRgAmxgAlRgAmxgA\nlRgAmxgAlRgAmxgAlRgAmxgAlRgAmxgAlRgcbGbeuJ/+1My88KzLwAHE4AD7rMXf3y9fUb3pjOvA\nQcTgAPusxfdUT1aPVR841qyZeXBmPjUzrznWjG+Z976Z+ZOZefmJ5t2emT+YmR870bw/n5nfm5kH\nTjDrmTPz8My8a2aed+x5d2vWWufe4Ubbx7B/obp1opGPV5+rTvJHUz1RfaZ66QlmPVV9vfps9eMn\nmHenWtXnqx8+wbwn9tefX2t95ATzviv3nXuBm26t9cjM/Ez1jq4OYD2Wn6y+0dUv799VXz3irP+b\nd2c//rarCB173pPV16q/qR49wbw7Xb2Pf1U9csRZz6xetuf9d1cxf9rxyeCGmJmfrV5Z/fZa679O\nMO+t1f3Vu9ZaXz7BvN+svlw9tNY6dniamXdXf199aF/uHXPWfdVD1SeqP1xrPXXMeXdLDIDKDURg\nEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOg\nEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNgEwOgEgNg\nEwOgEgNgEwOgEgNgEwOgEgNgEwOgqv8F9Hl5y6i1C9AAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(mistakes[0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(212,\n", + " 94,\n", + " 'FFRFLLFFFRLRRFFFLFLRRFLLFFFFFRFLFFFFFRLLFRFRLLFFFFFFLRFFRLLFRFFFLFFLFFRFRRLLFFRLFFFFFLLFFRFRFL')" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "lc = trace_tour(square_tour(a=10))\n", + "rw = guided_walk(lc, wander_limit=4, locus_limit=2)\n", + "rw_trimmed = trim_all_loops(rw)\n", + "plot_trace(trace_tour(rw_trimmed))\n", + "len(rw), len(rw_trimmed), rw_trimmed" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['LFLLFFFFLLLFFRFRFF',\n", + " 'LFFLLFFL',\n", + " 'FRFFRRFFFFFFLLRLRLRLLFFF',\n", + " 'RFFRRRFLFFFFLFLFRLLF',\n", + " 'LFFRFRFFFFFRFFRLRFRF',\n", + " 'LFFRFRFRFL',\n", + " 'FLFFLLFFRLLL',\n", + " 'FLLFFLLF',\n", + " 'FFLLRLRLLFLR',\n", + " 'FRRLLFLFFFFLFFFLLFFRRFLL',\n", + " 'FRFRRFFF',\n", + " 'FFFRFRRFFFFFFLFLFFFLRR',\n", + " 'FFRRRFFLRLFRLFLFLFRFLF',\n", + " 'RFFRRFFR',\n", + " 'LFFFFRRRFLFFFL',\n", + " 'FFLLLRRLLL',\n", + " 'FFRFFRFRFRLL',\n", + " 'RFLFFFFRRFFFFFRFFLLLLR',\n", + " 'RRLLRRFFRFRFLR',\n", + " 'FFRFRFFRFR']" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mistakes = []\n", + "while len(mistakes) < 20:\n", + " lc = trace_tour(square_tour(a=8))\n", + " rw = guided_walk(lc, wander_limit=4, locus_limit=2)\n", + " rw_trimmed = trim_some_mistakes(rw, 2)\n", + " if len(rw_trimmed) > 6 and len(rw_trimmed) < 25:\n", + " mistakes += [rw_trimmed]\n", + "mistakes" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "317" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "open('mistakes.txt', 'w').write('\\n'.join(mistakes))" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "137" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "open('samples.txt', 'w').write('\\n'.join(samples))" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('FFRRFLRRFR', 10)" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples[4], len(samples[4])" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('RRLLRRFFRFRFLR', 14)" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mistakes[18], len(mistakes[18])" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'RRFFLLFFFFLF'" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t = trim_all_loops(random_walk(20))\n", + "plot_trace(trace_tour(t))\n", + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "t2 = 'FFRFLLFFFRLRRFFFLFLRRFLLFFFFFRFLFFFFFRLLFRFRLLFFFFFFLRFFRLLFRFFFLFFLFFRFRRLLFFRLFFFFFLLFFRFRFL'\n", + "t2a = t2[:51]\n", + "t2b = t2[51:]" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'FFRFLLFFFRLRRFFFLFLRRFLLFFFFFRFLFFFFFRLLFRFRLLFFFFF'" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMwAAAEACAYAAAD/f5mJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAACT5JREFUeJzt3V2IbWUdx/Hf78yhFzM7YmXJeYlOGJSZlQYK3VQq2REk\nDYkKjKK60i6NoKsovAsKIrookLroIiizkowKQUmttAwJLT1qqcfeTnl8qTPz72KeXYOUe/3GvebZ\na+b7gcNewlqz/lP7Oy/Mw7NcVQIwzK7eAwBTQjBAgGCAAMEAAYIBAgQDBAgGCBAMECAYIEAwQIBg\ngADBAAGCAQIEAwQIBggQDBAgGCBAMECAYIAAwQABggECBLNEbK+Mef5W3MP2Ltse8x49EcySsP01\nScdt18B/Pw/PP2r7vvCan4bn3y9pVdLawPPXbN8U3uNm26f2+v+JYDA150r6Qq+bm438loftlapa\nHev8rbiH7V2SqoI31tB72H65pEcl/b6qDg79+Iu0u8dN8b+lb/70/K24R1WtZRMNv0dVHWm/Hl2b\n3mNR+JEMCBAMECAYIEAwQIBggADBAAGCAQIEAwT4wyW6sv1qSScPPP0TY84yBMGgG9sXSLohvGxN\n0ndHGGcQfiRDT59qrxdUlef9k3SRpFdV1e29BmbxJbqx/T5J35C0K1ms2RPfYdDT49L60ubegwxF\nMECAYIAAwQABggECBAMECAYIEAwQIBggQDDoaUWS0p0yeyIY9PSe9vq2rlMECAY9PdRef9N1igDB\noKdbJKmq/tx7kKEIBggQDBAgGCBAMECAYIAAwQABggECBAME2JcM3dkuSV+XdGzA6f+Q9AFJRyX9\nZMD5a5I+V1UPbHrADdhmCd3Y3iPp15L2jnyrv0s6paqOP9cPRDDoqj1Edl9VHQ6u2S/pDwMfJDt7\ng790EUtwCAbbmu3rJB1qO2c+Z/zSDwQIBggQDBAgGCBAMECAYIAAwQABggECBINty/YBSS9b5Mdk\n8SUmo234d6uks8NLf7eoGQgGU/IGrcfyiKRDA84/T9Jpkq5Z1ACsJcNktIWaq5K+WVWX95iB32Ew\nGVW11g7v7jUDwQABggECBAMECAYIEAwQIBggQDBAgGCAAMEAAYLBZNh+ZTt8Xa8ZCAZTMtu47y29\nBiAYTEZVHWmH1/aagWCAAMEAAYIBAgQDBAgGCBAMECAYIEAwQIBggADBYDJs75b0mKQnu83AvmSY\nCttnaP2py09W1Qk9ZuA7DCajqu5qh1/uNQPBYIqO9roxwQABggECBAMECAYIEAwQIBggQDBAgGCA\nAMFgiv7V68YEg8mw/dp2eEmvGQgGU/JAe32i1wAEg8moqtmy/h/3moFggADBAAGCAQIEAwQIBggQ\nDBAgGCBAMECAYDBF7nVjgsFk2D5R68+57LInmcRGfpgQ26+RdI+kp6rqhT1m4DsMJqOq7m2H1/Sa\ngWCAAMEAAYIBAgQDBAgGCBAMECAYIEAwQIBggADBYDJsW+tbLB3rNgNryTAVts+UdKekB6tqf48Z\n+A6DKZk9FPaWXgMQDCajqtba4d29ZiAYIEAwQIBggADBAAGCAQIEAwQIBggQDLqxvTLm+WMgGCyM\n7XfYPmK7hvyTdNz2zcn57VZP9/ocd/e6MbYX27sl3Shp7MWJt0r6/Mj3+L8IBotmSbtqwKpe2ytV\ntTr4A4fnj4EfybAQVTX7cemRIbG0a6I3f+9YJIIBIgQDBAgGCBAMECAYIEAwQIBggADBAAH+0j+C\ntkzkjQNPPyjpfEmfqarD402FRWBfshHY/pGkt6fXVVW3pwMvgu3bJT1cVRf3nmUsBLNgtp8v6an2\nn3PXVNl+iaSrJV095WDSz3uq+B1mwapqtvR8dcibpqqOSrp53KnGl37eU0Uw43ms9wCdbOvPm2CA\nAMEAAYIBAgQDBAgGCBAMECAYIEAwC2b7lE1cdlW79twFj4MFI5g5bO+2fVuw2dyf2qV3PdvHfYZv\ntdf7Fzr81jss6Z7eQ4yJ1crzXSbpbEm3SfrlgPM/Kul6SR8K7vGgJFXVw/F0S6KtJTsg6YBtb9fl\nMQQz38/a66er6gcDzv/YmMMssX/ODrZrLBI/ks1VVfe1wzu7DrLkNkTySNdBRkYwQIBggADBAAGC\nAQIEAwQIBggQDBAgmOVwrrTpdWjYQgSzHPa219d3nWIxuj2wdSsQzBy2z2iHZ414m9niy5tGvMeo\nbFvra+Ie7T3LmAhmvtPb6zkj3mNVmvwarOdJ2ifprS2ebYlg5qiq2Vf/r3QdZMlt2Mhv8ENhp4hg\ngADBAAGCAQIEAwQIBggQDBAgGCBAMMvhROk/fy3HEpt0MLbfZXtfcP4B2xcu4Rvz4+31nV2naNpe\nbJe1xwlig6XaZukZz0kcatX2SnjN9ZIODZzpxHZ4kqSx9g37kqQ3acRH99m+QtJXw8uO2T61qo4N\nPP8OSX8M7zEpSxVMVT1t+6CkkwdecpWkb2v4jpHnSbpS0ruDsS5vr1dI+mRwXeKYpBcHb8zNmMVy\nvqS/zjn3JEkflvT+djx3rvbF7ixJZ23njfx23FOUbV8n6dDQJxbb3qP1N9ibq2rIzpebmeliSd8Z\n8ynKtg9L2p/co219e9rQHTnb+ZN/fPqzmfTvMFuhqv7WDqe+Qd2vtug+U//f6VkRDBAgGCBAMECA\nYIAAwQABggECBAMEdmIwhyTJ9ot6D7LBpZJk+/R5J7bz0qVAMdvntcOLxr7XlCzV0pgtcoeCPcY2\nLNQc84vLbP3Vb4euC7X9C0lnaH17ozHMvqAkS0Ge0H8first7cTvMPdKUrBua7aC+MJxxpEkfVbS\n90f8+DMfDM69sb3eMORk27slnSBp7xKuBl+Ynfgd5gXh+bOwRnsTVNXjCn70sb1SVavJPdJrqqra\n+34tuY+kPeH5k7ITv8NEqmq25P57XQfZII1ls9eEH/94O2QjPwDrCAYIEAwQIBggQDBAgGCAAMEA\ngZ0YzJm9B5iCtvmHJL2i6yBLZif+pX+/JNk+X9Jf5px7kqSPjD7Rcrq0vV5p+4sDzn/vmMMsi524\nzdIV2sSGdpKSDe0mr21g+JCkdPfLq6vqmhFGWgo7LphEW1B4iaQfVtXR3vMsM9vnSDo+1t5ty4Jg\ngMBO/KUf2DSCAQIEAwQIBggQDBAgGCBAMECAYIAAwQABggECBAMECAYIEAwQIBggQDBAgGCAAMEA\nAYIBAgQDBAgGCBAMECAYIEAwQIBggADBAAGCAQIEAwQIBggQDBAgGCBAMEDg3wk1m/lkRzKtAAAA\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(t2a))\n", + "t2a" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'FLRFFRLLFRFFFLFFLFFRFRRLLFFRLFFFFFLLFFRFRFL'" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(t2b))\n", + "t2b" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(94,\n", + " 'FFRFLLFFFRLRRFFFLFLRRFLLFFFFFRFLFFFFFRLLFRFRLLFFFFFFLRFFRLLFRFFFLFFLFFRFRRLLFFRLFFFFFLLFFRFRFL')" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_trace(trace_tour(t2a + t2b))\n", + "len(t2a + t2b), t2a + t2b" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2+" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/06-tour-shapes/tour-shapes-solution.ipynb b/06-tour-shapes/tour-shapes-solution.ipynb index 9a0a4e1..11bba60 100644 --- a/06-tour-shapes/tour-shapes-solution.ipynb +++ b/06-tour-shapes/tour-shapes-solution.ipynb @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "collapsed": true }, @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -55,7 +55,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { "collapsed": true }, @@ -67,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": { "collapsed": true }, @@ -86,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": { "collapsed": true }, @@ -105,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": { "collapsed": true }, @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": { "collapsed": true }, @@ -134,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": { "collapsed": true }, @@ -148,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": { "collapsed": true }, @@ -174,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": { "collapsed": true }, @@ -197,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": { "collapsed": true }, @@ -210,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": { "collapsed": true }, @@ -221,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": { "collapsed": true }, @@ -236,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": { "collapsed": true }, @@ -248,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "collapsed": true }, @@ -260,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": true }, @@ -293,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -302,7 +302,7 @@ "226" ] }, - "execution_count": 23, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -315,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -324,7 +324,7 @@ "61762" ] }, - "execution_count": 24, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -335,123 +335,121 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 31, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 loop, best of 3: 209 ms per loop\n" - ] + "data": { + "text/plain": [ + "100" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "%%timeit\n", - "sum(len(t) for t in tours if valid(trace_tour(t)))" + "sum(1 for t in tours if valid(trace_tour(t)))" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 20, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "123845" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# Part 2" + "sum(len(t) for t in tours)" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 loop, best of 3: 1min 29s per loop\n" + "1 loop, best of 3: 211 ms per loop\n" ] } ], "source": [ "%%timeit\n", - "[(i, j) \n", - " for i, pi in enumerate(tours) \n", - " for j, pj in enumerate(tours)\n", - " if i != j\n", - " if not valid(trace_tour(pi))\n", - " if not valid(trace_tour(pj))\n", - " if valid(trace_tour(pi + pj))]" + "sum(len(t) for t in tours if valid(trace_tour(t)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Part 2" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 23, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(16, 125),\n", - " (70, 48),\n", - " (91, 128),\n", - " (110, 134),\n", - " (116, 194),\n", - " (123, 51),\n", - " (136, 9),\n", - " (142, 193),\n", - " (152, 63),\n", - " (168, 150),\n", - " (201, 83),\n", - " (208, 204),\n", - " (212, 113)]" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "[(i, j) \n", - " for i, pi in enumerate(tours) \n", - " for j, pj in enumerate(tours)\n", - " if i != j\n", - " if not valid(trace_tour(pi))\n", - " if not valid(trace_tour(pj))\n", - " if valid(trace_tour(pi + pj))]" + "# %%timeit\n", + "# [(i, j) \n", + "# for i, pi in enumerate(tours) \n", + "# for j, pj in enumerate(tours)\n", + "# if i != j\n", + "# if not valid(trace_tour(pi))\n", + "# if not valid(trace_tour(pj))\n", + "# if valid(trace_tour(pi + pj))]" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "80622" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "(sum(len(t) for t in tours if valid(trace_tour(t)))\n", - " +\n", - " sum(len(pi + pj) \n", - " for i, pi in enumerate(tours) \n", - " for j, pj in enumerate(tours)\n", - " if i != j\n", - " if not valid(trace_tour(pi))\n", - " if not valid(trace_tour(pj))\n", - " if valid(trace_tour(pi + pj)))\n", - ")" + "# [(i, j) \n", + "# for i, pi in enumerate(tours) \n", + "# for j, pj in enumerate(tours)\n", + "# if i != j\n", + "# if not valid(trace_tour(pi))\n", + "# if not valid(trace_tour(pj))\n", + "# if valid(trace_tour(pi + pj))]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# (sum(len(t) for t in tours if valid(trace_tour(t)))\n", + "# +\n", + "# sum(len(pi + pj) \n", + "# for i, pi in enumerate(tours) \n", + "# for j, pj in enumerate(tours)\n", + "# if i != j\n", + "# if not valid(trace_tour(pi))\n", + "# if not valid(trace_tour(pj))\n", + "# if valid(trace_tour(pi + pj)))\n", + "# )" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -490,14 +488,13 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[(0, 124),\n", - " (1, 1),\n", + "[(1, 1),\n", " (2, 1),\n", " (3, 4),\n", " (4, 5),\n", @@ -511,7 +508,7 @@ " (19, 1)]" ] }, - "execution_count": 30, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -524,32 +521,24 @@ "cell_type": "code", "execution_count": 27, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 loop, best of 3: 1min 28s per loop\n" - ] - } - ], + "outputs": [], "source": [ - "%%timeit\n", - "(sum(len(t) for t in tours if valid(trace_tour(t)))\n", - " +\n", - " sum(len(pi + pj) \n", - " for i, pi in enumerate(tours) \n", - " for j, pj in enumerate(tours)\n", - " if i != j\n", - " if not valid(trace_tour(pi))\n", - " if not valid(trace_tour(pj))\n", - " if valid(trace_tour(pi + pj)))\n", - ")" + "# %%timeit\n", + "# (sum(len(t) for t in tours if valid(trace_tour(t)))\n", + "# +\n", + "# sum(len(pi + pj) \n", + "# for i, pi in enumerate(tours) \n", + "# for j, pj in enumerate(tours)\n", + "# if i != j\n", + "# if not valid(trace_tour(pi))\n", + "# if not valid(trace_tour(pj))\n", + "# if valid(trace_tour(pi + pj)))\n", + "# )" ] }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 28, "metadata": { "collapsed": true }, @@ -574,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -583,7 +572,7 @@ "80622" ] }, - "execution_count": 51, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -597,14 +586,14 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 loop, best of 3: 1.16 s per loop\n" + "1 loop, best of 3: 1.27 s per loop\n" ] } ], @@ -640,6 +629,90 @@ ")" ] }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "13" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(goods)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(16, 125),\n", + " (70, 48),\n", + " (91, 128),\n", + " (110, 134),\n", + " (116, 194),\n", + " (123, 51),\n", + " (136, 9),\n", + " (142, 193),\n", + " (152, 63),\n", + " (168, 150),\n", + " (201, 83),\n", + " (208, 204),\n", + " (212, 113)]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(good_is)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(136, 9),\n", + " (70, 48),\n", + " (123, 51),\n", + " (152, 63),\n", + " (201, 83),\n", + " (212, 113),\n", + " (16, 125),\n", + " (91, 128),\n", + " (110, 134),\n", + " (168, 150),\n", + " (142, 193),\n", + " (116, 194),\n", + " (208, 204)]" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(good_is, key=lambda p: p[1])" + ] + }, { "cell_type": "code", "execution_count": null, -- 2.34.1