Skip to content

Instantly share code, notes, and snippets.

@0xpizza
Created January 10, 2023 18:28
Show Gist options
  • Save 0xpizza/de11fad8de5a3bb3ea5bf5e82752c848 to your computer and use it in GitHub Desktop.
Save 0xpizza/de11fad8de5a3bb3ea5bf5e82752c848 to your computer and use it in GitHub Desktop.
import base64, gzip
wordlist = '''+,^C)8$TR6!rk-IgQJW\\&k1\\*@Qr3i;<_!;+I$11ooja+R\\pnUO\\:k*i:ND.YQ+T7H;%Bq](&<5UNBop9usZip,!/2:he3Q#'`4M:tb$C!mf:iTk0L9G$"AWDJ5VB:fVm<i5d9bW'$THOB*8Cf/\\mtOiro;L$Z1C\\CX@k]?lbq>:8%5:,No,I8-V[Y'G4>T<#2_>:?D(?u8JL>FO(;(]dX&0,N9=FpO.;,`fmX:/8unCo#N^_2C.2d_8L!,6@ObVtGQbbMpT`-EnD"0o!9Hf52/se-pQjQosr[oVZ`MK?/gpIABg'N_Gboe^-V47jUga*Q^.0CYD'1Fs>\\]\\CA>N+-(`2G,AWahf,0YLQhCOpA>W]=cot6eG2.Nkj%:F;ON;d-E#7f8sa9C)T^VQC(IME2M6+O5[0!N[-Z)IK=#YYXUs/Jnu[2=gZ:J#^D(rV4V-0,M7Zm]f./<5Fh-:M-"Z=Ph[N@VkJP<0$W*.o%^eJq&+Y)<8&&1Tml[S'GO\\2\\P7-00=3)E>":/;&Y]q;Zi[hiig5U+Q<VA@N+L\\XDO(ho@RPe3.ajV)/*I;EX+'Q(liQ-(\\QLh![NT,r?0%)A#VXP%WQ7o#F5_![k7Yp';]7kSi5%OlFjIEKa5))6^TI'8%M6sWLD97fC2.co`">Z+WnEP:pS`6mTNVs5djurE/-Wq@q[-"aH*I/7M4_Epfrf$2loZ5?XL"W$CX-V!TmiJf/6d_/%1nHF#%Q-27Bde>u4Yjp]>8RUPl2h4;L)!6p7!b)@n*oPfoE(%HBa3+\\Gg_%jm.kU2-8JM4rhf?QThnCU04&Ms$C(,#@GL/G5.l^FYq3oZihJX:+YDYC@>YG`09:lP3qa*R.$\\kP0;Xb2aB:W-!@%Ki!JfD$CRgEtgp;$,:1G`=Yl[^+)?,k@HT''N45ZoJ1:/!Sds)IM''X=JQE>]sC%#Nd4)d3P(;e8aFL40@U&8l?m*T[907gJI-Qt/%`oI7d`oU$jlJhcoR%20t"N]RGBT-)(NZ,7PR"shQpG#d^"$&)t%)W/G1%IL1PoHgjZ+lf_jZV6]j)bMr,I4kRd6)DgK".+^EuNL^3j&FnTB"r<q!:pqb%GB1]:nI"BHEb/GMI7c:;tikodokW!nsm)&989Bk&NuGJ]jT`I8[ko%[7*$TW0YriQBjW<Yo\\n`@WG=DjRfOHQr"^'_c3g:,,qljX`UcT#l<01X0)3cO`XIHCL3'(;h47BSL<U-LKQ<7Q4-r6eb0l!,377?&hTW"\\q]d=-h8NDS_K%E0a050?c\\%Qb4/g%!LYRMiQUYF$kZ@L!G$n#3_t-[f@Egj;`R"3!jli2QtFSlIIbp*j"_ip'gbrp@;DmOeBE23!8t1>\\?UO'p,;h09G=W%Z,I_#.h'ik&LmOSio(W59C)0B<!Qt+K#s+^]h<=[C.ElC?ru;jQCSs,XRGN$Nh#N<%Se+O\\[7bZ\\3uD+tW(eZiP;5:)@P'FC5;84QSPmPG&@%?4>8^3uIO02a#Y77U:C<^k+B#kqA>GJa.9Am*GHi'/]3<F=fG6+%_3"@uf:(d;@*)aOUJbo,Jo_".ceXOGFAD&c-R>(9t_bq"kW4!boac-*Pmcl5/jk9>@b(Oi[W]B6V(pb$1aTfrM#*iJe.^9R*n_n3dTgW&dDk\\7_JNC;ZOA%?%,B]VHJ;NeA2'V2tL6*hKWF_rs+LFNc*62pd(fF!-eNNpKYnSf\\mOcd1'Lo],2.&Y*q+UnE:^fSM_5.*bB-H0V\\Vk/jZ3:=B][]]\\q6"q"m2`ZYC'H>8!;+/:YXaN^S.3RVM;TK@1l^b-QLTF[O@;4Q_b/oYR?#;2q)iq=j-C(D-L<8Ga$0`4A];Ib_#=]n(T1KJ]@h/1FB3*dL=:2m"GR5nJ;%_0,2/-j!]6(el8m7f0^>-rA@Gq1k]C5^BV&nN]&?;?PZ-q!8tWU=.3%u7eHk@.G;7Z@_EK`"94+DI(mC,=SfN&D>gHgJ7-,uU4J7XpiR?Y4K3bU/b2(,O\\h5h/%*AlP%Gk9uQ.V\\RXm3s(+4W<RL2DZQ:Ife!U^qp:FY`uOZk@!K\\2J82;^a7XK:nrTV^bejKr%SLOKP.ME)jMsWZ-6'Aom>a.3e3ZEY8>l,5FH'qmHqt8koFtq/e<4;:!6O%V;75H4C83!(o-XA\\B6hn]DR#N$LTHTEqi"00=n\\XKOnM4"(<4PaS='GT)AXCYYVDQ_[\\&+c3M+?,<C7>[Yj2^kYD1>uGo*"E;iGd.iKDHU:;62`c"V*/WC6n,pf6P8ct3dKR)[XWCP2lQL75S?(fFPLW==]eKZtJ<el@K"#UG!';I`VfMr#,O;^UEt]G]P7'oDS+(]@P2Uu/'tkL]ELqR%+eE&glhlNQM-9YY`e-0BVAX'A!]mm93hRLNs,QYF4)ja9,;.cW:lV^&fC@R8[O-<D4L1:2^3&>-L@at<t8"mNJ6&tFp?d%TK26(T[M.li8+"YA>n6po'(3hT1[OI<I$$^N+7TO%*j4Iqe%:@5h'>Zkmt%63GA\\`B<%HQogYbs$[Y"fsg>k[4crEQM8PQYc&<ahL5Ia=TX-q%a[NJ6&_t%*b[=0b-Mt3?'+^K7Y<][3TrM9Ne9)+t\\ll1bumME\\hOS/gt<>`iJ#!7;F(i8JE"0%LP`L/Qf@\\&,AEQoq8pLp'/2OFNJjpZ<ME&Ab$*BVS=f8`E(Pf]M+ZtlR6,%qFe)#.c=<'I(Ta1dQ/OI8+Du\\d#ktKd4U,b)e7\\@<oeWnqWEIE[%JQK0#2^@TJ"=]"j+JdFp@"G=AX5DDD0@r$b0ijo"^l%+$'`E/Bh\\X27F^HQPdMS]Eie(%1A4#V.LT'j-S^N[>&sk"D]Q(HsSTSecM;MF`N$j4r14P@#ZK%kE)5plZBn3j[1UAlMP]O<a-0!Z_SiiY_K:]Zp**d+!$G=DTt)_<d[2KY3n^O8[@@>=gRe^'hr)T_mA@V=]t>H2T^hP-VbnW^+0uAb#,CK]N<[,i8I3GquMf1b(<qS1"Q;%eb\\Ot[%;G,Xi2?t'pW8\\HTDQZ:S%FbpG6uO,>/(Gn:7`,f.t(eIUDW?"D/c.@:_m1kTMJE'S3V`:A;*J3a4<=<XaKn"$lVu*hHtJD.P"$-ZGl`es.PoU;73iSnU@:D"6_D`WA8aXaJU]KJe"j<AU_]b'2ca<oa@@Rq9,>)s;d]f&s7M,rgn;`5a'L6_o!LLE2a4HY!X"Tc!c`;6+^0!YkKUeSULMn;VL*S#eJcB^jd;Eq1+Kc$S@f8V*amZJjCH*9j526iG]j:'%YF>mJMNY`!V@UV#L4'tU)u&9*u!B6-_3$sW:JZmAAa/Ms&+6f*rb6ST8[*LIeDdtVX\\bI&,D8G\\10EPoK"+_`m$pJrh&2LLN(C:;n2aZ(;T956!Nr<=Z_&K;k[:"l)ZXGLlUcrpe?Zj=2,:f0/=_LKI5[NY3"K\\V==\\fpAto[`CC9!R;9NU:e3O?[najei8i5he6@&efX)+EYFIHCd@T!Eg$ZYidIt-m-0EbK"*0<g5@@5&n_<=jQ7uel!L]3YZ)A,_p1llf^9DZH4_>aL57p3HUEr2d/\\O%-WU)cA0WpcIg@P:K,Q^C8b`AO`/FL+-t[-j>5^!(]I3F0>kra:U1H%P8B(RT4/]6_n?!`?Zc3"rBJ85oag65ccFEcPf=dA_5R-c<[Zfr+%rfi5a0P)j.jNa't/&5n#pSS`GlYS^3]Lq7H`e@qsSZ2$OUS3^J:8"Jb6p!B_T9e]JrQXJ5)tm`6>8UdMuVM[=*?HTUtC13=Uh.*Kt*UI[=O:&LmtNp=["4#tR2Cj=,Zshp+^K\\\\SSo_e/)WJ[oiE'@;j,q>k9j!u8nD\\)Zum-ub=BG,4;0kH62Z>`3/Z=@-3CJ^kpurB#>rSgp<#2V_/]pWS0Kj>p.TFlTKBH.UK2o<&q`Bd[UB`GOW'\\SD"ralRHehl>Roghf+@k]Jq=eSE+INg@/LjmAH1]"W=@W\\lH.]s*#-ku0DKD1?X1e.D1>E$VRG7LSRCr4&HjFI1"r,<m_%G1LQpUse=IUl?'geN'XV2B%^;iYM#F(=E,dYhD<9h*%X54S"'*(sSGEPoSR.*n-9"@ASK;).AotJ3KhP/^/j*`aeS\\+)#GAMkB;<&h&8eW]mEYUqMsQI4'D9rfi&!lephb-=<_9!o-p>=aG+SnTNu3p,@@?%XhSp8C<Kl,ol+Y4lpHCd]=T&A4#]^f]pRtH`9/6^q2(X>mig5J336g"[%m7n]Y;f!H!aI7=/QPZQ.X^g`q.^+"Ylk4.dCIm$m*ek4V'j4Rtp9+"0XHn*5&S)o>#C6FE&#3+Pm3P[2HZ0Y<j9aFNSE&Nj1&#<q0u^V.#>/Dp.^/bH[mmUrddlmT<*%h@%jIr_3mQ9j&Rp:U#"fob+l#E(b'YN>KC5Z'R=N=ONe8-sKZ1^_l#%<suqD\\&05nS'Q^K[MBooUP9a3jJ<Qm^u?&TG)rBAG?u;9Z_7MajVIk6?^5;aJBR14J2inbLrTU9<9frSqcG,bid;_\\Fo3N5E">3Jg-,\\6c#H`-csK3SCiR/"J"VNJ"is5S9QDficFls3^6r_-el@/(7!uiF/M-Kp6V]%O7MqP#BW_-fflHe\\l>!7Bo<^XOEdp>TDoEjo&?JcO(KYSqbRFFH9$E(*\\+YCnPXc=)N\\B3WZP6*At;t+ROW*%"Aj%``POBb8$LnYN&@DhJ,j:hJu--Im1&8=/%i`Tp#YmlKi)a2_)Q:;makWgq6L10i\\.L!>HbPp.dn_dQd\\]hF[]mGLocdb.ll?#YK:J'i`XYZ(l,7XJHQtWfaPr/&>8;`g7\\3gIA%F>%C+&9?00WOT'e`3XJYRsEh;G1W\\ZNT[HoI$7l=RZBJW`.>"&[s>W^Mr_:l!B"e7BmA&I'1ZK;6AQ[QU"m,q.Zs,n.K,>SZ:eA;LRJ&B5CO>s//j\\>8P:I+p(cLU_-J_V-"h,jKj$+b,>-7=X8A1*Q"f%)<pK6=YIUuHKrgtW'TK2_:K<A*bjStV$SW0ZK^6T;.6iehVWOh1XtM%V/I@(0o'[VT\\e3m\\K@mX2RDAWUMt)XssT0e;+QMI4,--!))_[9<C/gj2t,,#l3>'q8>SL3q`sELg5kb5iK"JNr>)/#)%i(KNmVeLIc*!lJ$mK!&5&JR@"aBRRC8Lg@F(X]HOW-`P#;I3!Y<XqPe^8+eXV0!<*1p4R%ZKIGcRTHXC%B@W^GDcf.5W0Vu3Hua<N7O(Xe,,!U'ZJb6eR^'K7[Fft2qLRVJ1+hSJa@o>JquL!*QiGqkgASlI'^`<mU"=rl:G;qo+`6chJj@VS#_"?<d+>_jB6%u25>?&""m_&N17f!/2:0^dg/Md[dDAnSeu@A5ehHl'W(k:(ejMmL#i0HjaWhX9L9Cjbg7eV=iJfA)(36AmUB*k3C@Sj_GQHC"$<l.oF#@4f/a[ice@71@B\\Bb7:uJ.bW>Bq6<O,Rb@A>cqFgr2/7"O]$kDQFD$-m6VgTWa@RbP8^8[g#k4i!P@L0iL&Z5Yuu!Zp11HH`[5/`hdLJKlg7f/FrU(d$""J2&7H10t/A?3\\@AF0CL/m)i&'EhVToB>rG0^tgU(E*As*os9AdYApu&&1%dF9TCcYeo>jij@dB-BrGLp`/5Q#_kEXJnX'_D1og7]6U,AM?l.D420l&PNn09mP.MNGpR81`"Kok>S@r,n&\\O8/e7)R"i=N_4$+kH^36eqJK%#*[F5bHV\\@N9Bp6LfP_R>q"!Ypf?&9=tHG3'&=E0bSmi%3H+Y%Ln-V,2:XMm#VQPu.@0!nnZHCU*fMoSs!_S0aeH)rgshAS<-f3;Z\\nS*N[Q'3DIN^QKn\\`HD$BC3G.T76]X5:i0^?a=2G32[-iN/em,WZSW+^U^J83T&@DBa;9t#+c/R;/-h:b[8]J5km?5YBmOfAD>#7Y4<U,cnc[aSc&Y(A?9/C1+_;HcqZ:$J#@E"1=tLHDcV1[5Apq.1D.Rau_UgPmRid+cA>("7\\!:mB!U-ps4+\\D\\i\\i,9YR6!uCb5g4!lZVN`J:cEi5uTe!?'Q,<oetPoYQIo\\-:Zc=+$?<a&9S@Y7;L;TpN0[lX`d<i77\\paVF<6Ik_Qh5BIR/B"dBeipT4i\\p0*TTjV/2mTo$ZfC!iD(XH)7me?k6Y`<aDeTZ!>&idW#(f[&?Q4:c<H%:WsMI%]C(H6QirpAl^7$<aB4m;g[_E<5>#Fsm`JK6;2_f!*PYR<\\R'ls't(L2J*EqfuGE!nke0-#TFBc_gAOj8!QfMAR9fBJd:J>_F<,Yht5oOZ$bo'Ig*mUWl!/@UfHG-[E/hc*ilZA^?K2SQ\\h][0+M3i`<g=lgpWQHdBigl(@*(ETZ96fZ%4^Gm=<C>Cs*!tT\\=_^`:.qOqB6)klhjPsMRepC2@c<ee7BjOO"Y!hna[=>/2Gh#QPWE]O/J+co0)REF1NQ2P%Bn!.UgIch<aL0reDQ.`7iE.o)NblYU7&!_F=bX;%<mo9tLTfm0?<gI4&,=GAR:blZK-qbh-ek>a1d=?F\\[q-eSTG]E2p+IiWO7!ujh%t&4BoSYM)sW10HtT@#,]1"Z,eUo&%O7+%M"I;,/D?]Z@.IrRp2jpRGG_,k*M#@Lg!^sqTX0]*nJ^af5VILliJWf7h:?53b[:ZdiA1k6=hJR^Y8RIpLA4HfeA)N`V.Cjma`cs`D@Z.bLma9jl-+!7HM<K43uH&tLTT1dCG>fAhH4,ir*A?Ej8.bYr#/TK0.`S#bN@e)i"Z;Em""DnN\\@Ekn)FqAJG83Nk.5EW#!>C7EgIS?!K5j)e*psiDDherP!C7TW`epPK7*RdLQI&8(m*).=nsmg&=nU5S[UQZ>u\\cef2g@(GFAuUN`t**;K^d;*UU)+*Hn"WF<&CC7rlZ?'$,ejFFiGolso;T=?6X]kJF2oISn_%C]]TX<26%dn&D[$:-3P(fgEmIL(q^h&euOIe_Yh"C2<nG\\cQE9FVLF]q=/I?h;/!D<N[rn!L\\b7QeIuXg&\\2@IIlM*UhLnH<f$B1FP^C!bp'*]EWjMe&<a?N2u>Hn:UE1f:=#+cT-)aj/#d0N(``c*2Y$.(9Lnf1B]iA`cX$B[kC+`8H,ka*A_%n1G]X<L?#7:[j>?4n5b/ReQTG'_7+t3Fcs9[;(1o4jia!&_Nj#6gkB,QUG0[*oI];F1;QB>MU%;r#kf-;lc@F2e#(\\Ul&l4lV%k9Xo.6ES*!iJD2qSHD56V,6:e+(G"gb>:#$3;eY*`R<S:j-.oFP\\<c]IG(jSmSuCs-OJh-K0MqkBUW(:8#lo@u3#9qW#rl:Da*K+1jpI^f,q-(ZNYk24C[jqQL^fDejXsp;%=02]u6!c1`AK3l3+\\OnL;E$T7E+O8TC_F>"E(EV]u_5T_!RLU3MW(0Fs(D+P5j?P)%Xn/1qh"$HZTmUYk*q10VKp3obE(N(`"dh%IQ;)0U]gI!K:nC,[mHkqJKG*\\%^\\boVd+<>NF.u=@hom="/'pcN_$g8N2`G,3.m;5hN.VZUaGpB0Br"0`WQu;p+0#oQn)u1Zl_j0>]K`=-g2=Snl54ab(igp$)nJt5`,7>ZEoK1f:%qo%XZTXBNb1U;'cCHN#/:H\\gD;R;HU@0k\\\\bX5MnLe,V!OknlWHf<"Ke<.5Dn]?f2b1]DLZ%<@qpn!CJeuhZe]f+(jI]geqMg$?nXeXnCZ!S[\\:Z`'rT6TGk!o3e4MJAW#tU$3r)4HZ%_j`>Df"'V%/uarC]`mL5`UF8l$\\?"Fu_'8!Qo]\\g_cK2k&Pom(NAQH6;DIr)sMc`hlkg[RfX5W!U\\m9LS$NBpr<<FZ`f+%beP/^Hbc81[jaQX#)fAe2cBE'IbYPYjP.J#bCtC6kg*q<20T,^i9!ancjf`5hb%bpLRTAWD?Ojm=a7+e+OWI(S,_LMhiL>7QZI](+CoQ]'1[<.r9tif_\\7\\6U\\$"\\q8$nC9,9=5*6E[kHN"._F4>jd56(Z'''
words = gzip.decompress(base64.a85decode(wordlist)).decode().splitlines()
# our working set of possible words
options = words.copy()
while True:
print(
'Best word to start is ATONE\n'
'Enter G=Grey; Y=Yellow, C=Green\n'
'Enter a blank line to restart, or type Q to leave.\n'
)
while True:
word = input('Word> ').lower().strip()
if not word: break
if word == 'exit': raise SystemExit
result = input('Result> ').strip().lower()
if not result: break
if word == 'exit': raise SystemExit
# filter out options based on parameters
for i, c, r in zip(range(5), word, result):
if r == 'g':
options = [o for o in options if c not in o]
elif r == 'y':
options = [o for o in options if c in o and o[i] != c]
elif r == 'c':
options = [o for o in options if c in o and o[i] == c]
else:
raise ValueError('Invalid letter: {letter}')
# copmute letter frequency
salad = ''.join(options)
ranks = [ (c, salad.count(c)) for c in 'abcdefghijklmnopqrstuvwxyz']
ranks.sort(key=lambda s: s[1])
frequency_chart = ''.join(a[0] for a in ranks)
# find a good word based on letter count
guess = ('', -1)
for opt in options:
score = 0
letters = list(set(opt))
for c in letters:
score += frequency_chart.index(c)
if score > guess[1]:
guess = (opt, score)
if len(options) < 5 and len(options) > 1:
print('Geuesses:', ', '.join(o.upper() for o in options))
else:
print('Next guess:', guess[0].upper())
print('\n\n\nRESTART\n')
options = words.copy()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment