--!name Word Hive
--!icon puzzle
--!category Puzzles
local aI="!$%&()+,-0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnpqrstu"local function aj(d)return aI:sub(d+1,d+1)end local aJ,aP,aH,aL,aM=26,52,60,68,72 local am="ucemortoahmnryiablrtyeainqtuginoprvpaceloufacelnrwadelnoacilntutacilmnecfprtuvabelnrubeilrtbaekrwydabginrwcdenormacinorbelortudacginrolprtuyyaeilrttilmoruafilnptnacilptoagilrtnafiotudagilnrtabloryfaehmrtfaeortwcaginotwaeginrlefhopudagimnrmaceilrgbinpruabekoryocfinrtcafinottailnrubaelntubelnrturfinotunailmpteacflpupaeilnxuaeoqrtwdegnorhaelmptacfiltynaeltuvgbinoprbaelnrwraflmoyuaegortmginortmacehiluabelrtladimoprabinowhaceilriadlpryvadeglriablortmaelorzyaeglrukabdemrpacinotiaclmnrwadeforcaehimnrabhmotvelortydainortmadlorufceiklrnacdioryadeirtracfintradinoyncdiotuelnotvymadinotbaeklntlfioprtfegnortgdfinrtyaeglrtncijotuoahlmnrgdinoprpaloruyvadelnrfaceirtpaceilnhacemntyaeglnrpainortcaioprtueinprtfeiloprrachiothaceiltaflmoruvadelrtailortuhaceimtcaegintoeimprvebfinorginopruucenprteablmovfaeimnrebprtuyechintyeablovyiabcentnaehlptacfortypacehlyoeikmnroaemnrybaelopttacloruwdefnorlanoprucadinotgcdinotianoptuladhotueblnotvpeilotyrbelmpubadloryucenrtymaortwyabdilrzoabdiltuabelnrfabeilrmabelrutailmopgimnorumaceoprlcefhiyfacelrucehiortcaeimntbaeilmthaceipteahlnvytadmnormahnortvaelnruoacntuytacinruiacnprtdginorwcailnovcafilrtmacdinooaeilntfaegirtrachipthceiprtyaeglorbadilorpailnoteabnqtubaeilnridgnouwwacdelralnrtuywadefrtcaimortuaeglrtueinorticflnotlabioprwabdeornailotyoimnrtymailnoyebcilmryaloprtradotuwgfimnoriaclprtlafhituyaelorvraghoptcabinotkabelmrdaginrtyaeoprtyabdertubeinrtcanortyvadegnrlaknoptbaeilntrablmnoalnorwylacfioydbginoriaeflrwpailotucainotunafilotgbinorwnimoprtpabceloefnqrtukabcertmabeloruaelnrttablnoymaceklrfacertupegloruaehnopttcnoruylbdfotuacilptygdinorugcinopryaelnrticfgnortadinoufabelpraclrtuyvaelmorialmorttcdnorunaefltunacimopiadnoptnciotuynacmorygdimnrupabceiltaciloyfaegilrtceipruuegmortuefinrtefirtuxpeilotxtabclorbaelnotecfirtyladinotlafimpyyabelrviacentyvaelnrtiacdlnrgcinorwyaeglrvgiknorwvdeklorfaeimrwoeilntuwadehrtralmnoplaboprypceilmonaeitxydaginruacdmnotfaeilrubaeglmnyabelrtmalnoryraekmovmainotyhacelotdgilnorhaceintlaimrtyuefnortbaeinorrailmptiaclnotlaimnotocilmptginorwyrachitupacilotrailptybeilnorndgikmoicmnotufceilryacdimrtrfinoptgbinortvcenortkabcepruenortyacilmtytacnopucaeinptdagilnovaelorttacilryadiortumabinotfabeortlahinotvaeloprlaehpuvrimoptudaginrwpbelmorncfiotumaeiloriamnotucainotveainotxhacenptuaegnrtndgiopulacehmyyabeilrfaenortoadnrtunaehlotebclmruoailptviablnrtrachityvaenortaimortuoachmnrmaceorvolmprtytacilnyocfimnrebcilruhceikntbainortceghintvadelorailmpryabclnoyfbeilrylabinoteciqrtuobeinrwwadenrthaeltwytfnoprubaenotyoehilntbaeloprtacdloruenortvnaelptydacilorbaehiltgcinorupilnotupelmoryaflnort"local aQ="0abbey3ot2iding3lity2le2normal2oard3lition3ve2road1ccent4pt6ance3laim3ord6ion4unt7ancy9t3uracy2etate2he2id4ic2ne2orn2ronym2ting4on4vation3or3ual6ly1damant3ptation2dict4ng4tion8al2miring4t2option3ration2ult5hood2vert1erial1far2fair3ect3iliation4rm3luent2loat2ter5math5noon5ward1iding2rborne3craft3port3y1larm2bino3um2chemy2ibi3enation2legory4rgy4y3igator3ocation4w5ed4y3ure3y2oe3ft3ha3ne3ud2pha3ine2tar3ernately3o2um1maze2bition2monia2plify1nalytic8al3tomy2chor3ient2droid2ew2gry2imal5tion2nex5ation3oy3ual6ly2omaly3n4ymity2te4nna3hem3i4biotic4cipate9ion4que2xiety2ymore3way1part2ex2iece2peal3liance5cable7nt4y3oint3roval6e2ron2tly1qua1rbitrarily8y7tion3or2ch4aic4er3tic2ea2gue2ia3d2mada3or5y4ur3y2oma5tic3und2ray3ow2tery3ifact5icial1thlete6ic2om4ic3p2rium2tach6ment5k6er4in6able3ention3ic3ract2ypical1uburn2ction2dio4t5ion5or2nt4ie2ra3ora2to4mation4pilot1vatar2enge6r4ue3rage7d4t5ed1ward5ed5ing4e3y0babe3y2ck4pack3on2dly2gel3gage2il3t2ke4d4r5y2lcony3d3e3l4ad4erina5t4oon5t4room3m2mboo2nana3d3e3g3k3ner3quet2rb4arian4er3d3e4foot4ly3k4er3ley3n3on3rel5n4ier4ow2th4e4room3on3tery4le2yonet2zaar1eagle3k3m3n3r4er3t4en3u3ver2ef3n3p3t4le2fore2gan2lief3l4y3t2nevolent3t2rry2ta3ray6al6ed3ter2ware1ible2dding2ennial2le3lboard4ion2nd4ing3go2polar2rd2te3ing3ten1lame3nk5et3tant7ly2eak3ep3w2izzard2ob3od5y4m2ue3ff3nt3r1oar4d3t2dy2il4er2ld4ly3t2nd4ing3e3fire3net3y2oing3m4er3n3t2re3ing3n4e3row6ed7r6ing2tany3tle4om2ut2wed3ing1racket3id4n3ke3n4d5ing3t3ve5ly5ry3wl3y2eak5away5er3w4ed5r6y2ibe3dal4ging3ef5ly3g3lliant3ne4g5ing2oad5ly3od5ing4m3th3w4n5ie6ng2unette4t3tal4e1ubble2gging2ilt2lb3l4et2mper2reau3n4er4ing4t3r2tler3te5r2yer1yte0cabin5et2che2fe4teria2ge2ke2lamity3culator3f3l3m4ly2me4l4o4ra3p4er2nal4ry3did3e3ine3ning4on3on5ical3teen4on5r3yon2pable4citor7y3e3ita6l5ol3tain4ion2ramel4t3d4iac5gan5nal3efree5ul4taker3p3rot4y3t4on5on2talytic3ch2ution1ell2ment2nt4ury2ramic3tificate6y1hain4r3let3nce4t3p4el3r4iot5ty4t3t2eap5ly4t3ck3ek4r4tah3mical2ic4k5en3efly3li4l5i5y3me3n3p2ocolate3ice4r3re2urch1inema6tic3namon2pher2rcle4uit2tation3e3ing3y2vic4l5ian1lad3im5ant3m3n3p3rity3w3y2iche3ff3matic4ber3nic6al3p2ot4h3ut2ue1oach3l4ition3t4ing2balt2coa4nut4on2ding2gnition2hort2il3n2la3d3laborator3on5ial3t2ma3e3ic3ma5nd7ant7o4erce4it4on5tion4union5te7r3panion5re4el4ile4licit2ncord3dition9ing4uct7or5it3firm4lict4orm4ront3ical3junction3tact7ing5in7ing4inuation7ity7um4our4ract8or6ry3vent5rt7er4ict7ion2ol3p2pe3ing2rd4ial4on3e3n4y3ona6ry3rect4idor3vette2tton2unt5ry5y3p4e4le3rt5room3ture2ve4r5t1raft5y3m3wl5ed3yon2eam3ek4p3pt3w2ime4inal3tic6al8ly5que2ochet3ft3p4ping3w4d5ed4n5ed5ing2ucible3el3mble1ube3icle2cumber2ff2lt4ural8ly2nning2rator3e3ing3rency6t4y3t4ain2te3ter1ycle4ic6al0daddy2ily3ry2maging2ncing3gling2ring3k3ling3n3t2ta3ing2wn1eity2lve2rby2volved1iagonal4ram3l4ing4og3mond3ry2etary2gging3it2ll2ng3ing2ploma3ping2rt4y2tto1octor6al2dging2ll4ar2main3inant6tion5ion5o2nation3or3ut2om3r2rm4ant2ubtful2ve2wn4ed5r4ing4load8ed1rag4ging3in5ing3ke3ma5tic3w4er4ing4n2eary3w2ifting3ll5ing3p4ping2ooling3pping3ve3wn5ed5ing2um4ming2yer1ual2ct2ll1warf2ell1yed3r0each2gerly2rlier4y2ten1bony1cho1ddy1erie1ffect3ort1ither1lephant3vate7d6or4en1mail2bark6ed3lem2inence2peror3loy6ee7r1nable3ct5ing5ment2dowed2ergy2graved2hance7ment2ter3ice5ing4ty3repreneur4y2voy3y1pic1quate5or3ine1rror1tching2ernally2hanol3er3ic5al3nic6ity2iquette1uro1vade2en4ly4t5ual3r4green4y2oke5d3lve6d1xert2it2pel3lain4oit3o2tant3ent1yeball3d0fable2ce4t3ial4lity3t4ion4or6y2il4ure3nt3r3thful2ll4acy4en2me3ilial5y4ne2natic3fare2rce3e3m4er3ther2tal3e3her3ter4y2ucet3lt3na1ear4ful3t4her4ure2eble3l3t2ll4a2minine2nce2ral3n3ry2wer1iber2ckle3tion2erce6ly4y2fe2le3l4er4y3m2nal3ding3e4r2re4ball4fly4man4wall3ing3m4ware2tting2xture1lag3ir3nnel3p3re3t2ea3e4ce2ick5er3nt3p3rt2oat3od4r3p3ra5l3tation2uent3ff2yer1oam2cal2il2ld3io3ly2nt2ol3t4er4note4print4wear2rcing3e4front4word3ge5t4ing4ot6ten3m4al6ly4ing4ula3t4e4une3ward7ed2ul3ntain3r4teen1racture3gile3il3me3ntic3y2ee4lance5y3quent3t2iction3gate2og3nt5al3wn5ed2uit5ion1uel2lfil6l3l2nction3nel4ier2rniture2ture0gable2llery5y2mble2rland2tor2uge2ve1enerally4tic2ology1ift2gantic2raffe2ving1lad3nd2iding2ory2ue1oal3t2ing2ld2ng2od3n2rilla2urmet3t2wn1rading3ffiti4t3nd5ma4ny3ph3ve5l6y4y3y2eatly3w3y2id3ef3ffin3m3n4d5ing4ning3p4ping3t2oom5ing3und6ing4p5ing3w4ing4n2ub3nt1uarantee4d5ian6ng2iding2lly2nner4ing2ru2tter0habit5able6t2il3r4cut4y2lal3e3f3l4way3o3t2mlet2ppen4y2rbor3dware3e3m4ony3p3t2tch3e2ul2ve4n1eal4er4th6y3p3r3t4h5en3ven6ly4y2ctic2el2ir2llo3m4et3p4ful2mp2nce2re4after3oic1ierarchical2ke2ll4y2nt2ppie2re2tch3ter1old3e2ne3or5ary2oray2peful2rmonal3n3ror2tel3line1ull2rt1ype0icing2on4ic1dol1gnition3oring1llicit1mitation2mortal2pala4rt6ial3lant4y3ort3rint4omptu5per5ve1naction2ch3ite5ing3lination3ognito2dication4go3oor3uction2fant3er5ior5no3lation4ict3orm6ing3ringing2halation2itial7ly6te7ion2junction2land2nate3er3ing2put2tact3ent6ion9al4rrupt3uition2ward1ron4ic5ng4y2radiation1tch4ing0join4t1unction0kale2ppa2raoke4te3ma2yak1eel3p4er1idding2nd3g4dom2tchen1nowing0label3or5atory2ce3y2id3r2ke2mb3e3p2nd4ing3e2ptop2rgely3k3vae2tch3ely4nt2ureate5l2va3ender2wn2yer1each3f3gue3k3n3p3ve2ech2gally2thal2vel5ed4r5age8d3y1iability4le3r2bel4ral3rarian6y2ce2eu2fe3t2lac3y2mb3e3it5ation3p2on2terally6ry2zard1oad4ing3f3n3the2bby3e2cal5ity5ly4tion3h2dging2ft2go2llipop2ne4ly2ok3m3p4hole3t2rd3ry2tion3to2ud2vable3e4d4ly4r2yal5ty1uggage2ll2mber2nar2re0macaroni3e3hine4o3kerel3ro2dam2id3l3n4ly4tain5enance2ke4over4r2le3ice3l3t2mmal6ian4oth2nageable3darin3ia4c4la3ly3or3tra3y2rathon3ble3e3ina4tal3k4ed5r3oon3row4y3t4ial3vel2tch3h2yor5al2ze1eal2chanic2ek2lee2mber3e3o4ir4rable5ial5y2nace2re2thane1ice3ro2ld3e3itary3l4er4ion2me3ic2nd4ing3i4mal7ly5um4ng4on3k3or5ity3t2racle3ror2tt1oan3t2dal3ular2ld3e2mmy2narch3ey3iker4tor7ing3k3th2od3n3r3t2ral5e5ly4torium3e4over3n4ing3row3tar2th3ion3or5way3to2uld3ntain3rning2vable3e4r3ie2zzarella1ule2ral2tation3e0nail2nny2rrator4ow6ly2tal3ion6al8ity8ly3ural7ly5e2utical2val3e1early3t4ly2bula2on2rve2tball2ural4on3tral5on2ver2wborn3t2xt1ice3he2ece2ne4teen8th5y3th1oble2dding2mad5ic3inal7ly6tion5ee2ne3fiction3profit2ok3n2rm4al6ly2table6y4tion3e3icing4fication4ng4on2un2va3el5ty1ugget2ll2rture2trient5tion3ty1ylon0oath1bey2tain1ccupant4r5ring1dor1ffer3icial8ly2ten1ily1kay1men2it1ngoing2ion2line3y1pal2inion2tic5al4mal4on6al1ral4ly2bit5al5ing2dinary6tion2igin1utage3come4ry3door3er3let4ine3put3rage3ward1val2en3r4all4came5ome4lap6y5oad8ed6ok8ed5y4run4t5ly5urn1wed2ing2ned4r3ing0pace3k4er3t2id3n4t3r2lace4table3e3m3pable2mphlet2ne4l3ic3orama3t4heon2pal3erback2rable4graph4normal3ity3k3lor5ur3rot4y3t4ial7ly5cipant5tion4ly4y2tch3ent3h4etic3ience4o3riarch5ot7ic4on3ty2ve2yer3roll1eace5ful4h3k3t2bble2ck2ek3l3p3r2lican3let2nal5ty4nce3ce4hant4il3ny2ople2pper2rch3fect3k3m2tite3ty1haraoh2otograph1iano2cnic3ture2ece3ty2le3l4ar3ot2ne4apple3g3nacle4ing3point3t4o2pe4line3ing2tch5er3y2vot5al2xel3ie1lace5bo3id4n5tiff3n4ar4e5t4k5ton4t5ation3t4oon3y2ea3nty2ot3y2ug3mber3ral1oem3t4ry2int2lar3e3ice4o4te6ly5ical7o3ka3l4ution3o3ymer2nd3g2ol3r4ly2pe3lar3ping4y3ulace6r7ly2re3t4folio4ion4rait6y7al2tato3ion3tery4y2ultry3nd5ing3r4ing1ractical3y4er2efect7ure5r6able3p4aratory3ttier5y3y2icing3ma5l5rily6y3nt3or2obable7y4e4ing4lem3ctor3file5t3logue3m4otion4pt6ly3of3p4el6ler5r6ly6ty4ortion3to5n5type3ve4ing2uning1uberty2dding2ll3p4it2ncture3t4er2pil3pet4y2re3ge3ple2tt0quarter6t2een3ue2iet3te2ota4e0rabbi5t3id2ccoon3ial3k4et2dar3ial5nt5tion6or4cal4o2ffle3t2id4ing3l4road3n4bow4y2ke2lly2mp2nt2pid5ly3port3tor2re4ly3ity2tio2vaged3e4n1each3dy3lity4ly4m3r2bel5lion3oot4rn3uilt4ttal2ceipt3ite3laim3over3ruit7er3tify4or3urrence8t2dwood2ef3l2fer5ee6nce5ral3ill4ne3rain3ute2group3ular7ly6te2in2lay3evant3iable7y4c4ef3y2make4rk6able6ed3ember3oval5e2new5able5ed5ing3ovate4wn6ed3t2pay3el3ly2quire2take3ire3urn2union5te2veal6ed4l4nge5ue4re6d6nce7d5t6ed3oke6d4lt5ve3ue2ward6ed1hetoric1ibbon2ce3h2ding2fe3f3le3t2gging3id3or2ng4ing2ot4ing2pping2te3ual1oach3d3m3r2bber4ing3e3in3ot2gue2ll2of4ing4top3k4ie3m3t4ing2pe4r2tary3or3ting2uge3nd5ing3t4e5r4ine2wer3ing2yal5ty1ubber4ing4le2ff2in4ing2le4r2mble3or4ur2ng3ner4ing3off2pture2ral0table5t6op4oid3oo2ck3o3t4ic6al2il4or2ke4r2lent3k3l4y2pe2riff3ot3t2ttoo2vern1each2ch4nician2ddy2en4y3th2ll2nacity4nt3t4h3ure2rrier5fic3tiary2xt4ure1haw2eft3matic4e3n4ce3re5after3ta2ick3n4k3rty2ree4w3ice3oat2wart6ed1idal3y2er2ll3t2metable3id4ng2ng3t3y2re3ing2tan5ic6um1oad2fu2ilet2ld3l2mato3b3orrow2nal3e3ic3ne2ol3th2pic5al2rch3n4ado3que3t4illa2tal5ly3e2ur4ney3t1rack5er4t5or3ding5tion3ffic3il4n4t5or3m4p3p3uma3vel6ed7r6led8r3y2eaty3ble3e3k2iad4l3bal4une5te3m4ming3o3p2oll3op3t3uble4t2uce3e3th1ube3ular2ition2lip2mor4ur2na3e3ic3nel2rbine4ulent3f3moil3n4around4er4out5ver3ret3tle2tor5ial1weed4t5ed1ycoon2pe3ical7ly3o2ranny0ugly1ltra1mbrella1nable2bearable5table6en2cut2do4ing2even2fit2ion3que3t4e4y2natural2popular2ravel3eal2true2wind1pbringing2front2heaval2per2roar1rban2ge4nt3ing1tilitarian2opia6n2ter0vacant4tion3cination2le4t3ley3or3ue3ve2por2ry1eal2ctor2gan2lvet2neer4rable3t4ure3ue2rb4al6ly3ge3y2teran3o3ted1iola1ocal4tion2lcanic6o3ley6ball3t2te4r0wade3ing2fer2ge4r3ing2ll4ed2nd4er6ed3ing3t4ed2rd4en4robe3e3fare3m3n4ed4ing3rant7ed4ing5or3y2ter5ed3t1ealth6y3r4able4er4ing3ther7ed2dge2ir2ld4ed3l2nt2re1hale2eat3el3y1idow2fe2ll2nd4ing4ow3g4er3ner4ing2re3ing1onder6ed2od4ed5n4land3f3l2rd4ed4ing3e3king3m3n3rying2unding1rath2eath3n2ong5doing5ed0yang2rd3n2wn1eah3r4book4ly2ll3p1oga3i0zoom"local O=#am//7 local E={"Beginner",0,"Good Start",2,"Moving Up",5,"Good",8,"Solid",15,"Nice",25,"Great",40,"Amazing",50,"Genius",70}local function W(f,H)local u=#f==4 and 1 or#f for d=1,7 do if not f:find(H:sub(d,d),1,true)then return u,false end end return u+7,true end local A,P={},0 local function aF(d)if A[d]then return A[d]end local H=am:sub(d*7-6,d*7)local aW,aS=H:sub(1,1),"[^"..H.."]"local S,M={},""for e,g in aQ:gmatch("(%d)(%l+)")do M=M:sub(1,e)..g if not M:find(aS)and M:find(aW,1,true)then S[#S+1]=M end end local K,ah=0,0 for aa,f in ipairs(S)do local u,a7=W(f,H)K=K+u if a7 then ah=ah+1 end end if P>=3 then A,P={},0 end A[d],P={ls=H,list=S,max=K,pg=ah},P+1 return A[d]end local function X(t,K)local ay,I,T=1,nil,nil for a=1,#E,2 do local ao=(K*E[a+1]+50)//100 if t>=ao then ay=a elseif not I then I,T=E[a],ao end end return E[ay],I,T end local function Y(g,i)local t=0 for a=1,#i do t=t+W(g.list[i:byte(a)-64],g.ls)end return t,#i end local function ai(g,i)if#i==#g.list then return"Hive Master"end return(X(Y(g,i),g.max))end local function aY(c)local e=os.date("*t",c)return os.time({year=e.year,month=e.month,day=e.day,hour=12})//86400 end local N=os.time({year=2026,month=1,day=1,hour=12})//86400 local function J()local c=os.time()if not c or c<1700000000 then return nil end return aY(c)end local function R(e)return(e-N)%O+1 end local b={played=0,streak=0,best=0,last=0,genius=0,master=0,words=0,pangrams=0,pp=0,pgen=0}local k={day=0,f=""}local z={day=0,f=""}local o={idx=0,f=""}local L,h,l=nil,nil,nil local y={}local q,s="",nil local m=1 local p,x,aA="menu",1,"menu"local r,v=nil,0 local _={"played","streak","best","last","genius","master","words","pangrams","pp","pgen"}local function aC()local c={"H1"}for aa,a in ipairs(_)do c[#c+1]=b[a]end for aa,u in ipairs({k.day,k.f,z.day,z.f,o.idx,o.f})do c[#c+1]=u end snail.save(table.concat(c,";"))end local function a4()local g=snail.load()if type(g)~="string"or g:sub(1,3)~="H1;"then return end local i={}for u in(g..";"):gmatch("([^;]*);")do i[#i+1]=u end for d,a in ipairs(_)do b[a]=tonumber(i[d+1])or 0 end local j=#_+1 k.day,k.f=tonumber(i[j+1])or 0,i[j+2]or""z.day,z.f=tonumber(i[j+3])or 0,i[j+4]or""o.idx,o.f=tonumber(i[j+5])or 0,i[j+6]or""end local function aG()local e=J()if e and b.last>=e-1 then return b.streak end return 0 end local function aD()for d=6,2,-1 do local C=math.random(d)y[d],y[C]=y[C],y[d]end end local function V(aw,a1)L=aw local ae if aw=="daily"then local e=J()if k.day~=e then z.day,z.f=k.day,k.f k.day,k.f=e,""end ae,l=R(e),k else if a1 or o.idx<1 or o.idx>O then local e=J()repeat o.idx=math.random(O)until O<2 or not e or o.idx~=R(e)o.f=""end ae,l=o.idx,o end h=aF(ae)for d=1,6 do y[d]=h.ls:sub(d+1,d+1)end aD()q,s,m="",nil,1 p="game"aC()end local function a0(f)for a,u in ipairs(h.list)do if u==f then return a end end end local function bc()local f=q if#f<4 then s="Too short";return end q=""if not f:find(h.ls:sub(1,1),1,true)then s="Missing centre letter";return end local a=a0(f)if not a then s="Not in word list";return end local Q=string.char(64+a)if l.f:find(Q,1,true)then s="Already found";return end local ac=Y(h,l.f)local a8=X(ac,h.max)l.f=l.f..Q local u,U=W(f,h.ls)local an=ac+u local az=X(an,h.max)local at=(h.max*70+50)//100 local aq=ac<at and an>=at if L=="daily"then if#l.f==1 then b.played=b.played+1 b.streak=(b.last==k.day-1)and b.streak+1 or 1 if b.streak>b.best then b.best=b.streak end b.last=k.day end if aq then b.genius=b.genius+1 end if#l.f==#h.list then b.master=b.master+1 end else if#l.f==1 then b.pp=b.pp+1 end if aq then b.pgen=b.pgen+1 end end b.words=b.words+1 if U then b.pangrams=b.pangrams+1 end if#l.f==#h.list then s="Hive Master! Every word found"else s=(U and"Pangram!"or(#f==4 and"Good!"or(#f<7 and"Nice!"or"Superb!"))).." +"..u if az~=a8 then s=s.."  Now "..az end end aC()end local aN="2573".."0189".."9410".."3b10".."10ab".."7a01".."8601".."0702".."0320".."6005".."4050"local aK={up=1,down=2,left=3,right=4}local function ag(ba,i,bd,aR,aX)r={sol=ba,f=i,title=bd,all=false,canAll=aX}v,aA,p=0,aR,"list"end local function ax()local c={}local e=J()if e then local D="Today's hive #"..(e-N+1)local g=A[R(e)]if g and k.day==e and#k.f>0 then D=D.." - "..ai(g,k.f)end c[#c+1]={D,"daily"}else c[#c+1]={"Today's hive: needs the clock","noclock"}end if o.idx>0 then local D="Practice hive"local g=A[o.idx]if g and#o.f>0 then D=D.." - "..ai(g,o.f)end c[#c+1]={D,"practice"}end c[#c+1]={"New practice hive","new"}if h then c[#c+1]={"Found words","found"}end if e then c[#c+1]={"Yesterday's answers","yday"}end c[#c+1]={"Statistics","stats"}c[#c+1]={"How to play","help"}return c end local function a2(a)s=nil if a=="top"then if#q>0 then q=q:sub(1,-2)else p,x="menu",1 end return end local e=aK[a]if e then local j=tonumber(aN:sub((m-1)*4+e,(m-1)*4+e),16)if j>0 then m=j end return end if a~="ok"then return end if m<=7 then if#q>=15 then s="Too long";return end q=q..(m==1 and h.ls:sub(1,1)or y[m-1])elseif m==8 then aD()elseif m==9 then ag(h,l.f,"Found words","game",L=="practice")elseif m==10 then q=q:sub(1,-2)else bc()end end function key(a)if p=="game"then return a2(a)end if p=="menu"then local B=ax()if a=="up"then x=(x-2)%#B+1 elseif a=="down"then x=x%#B+1 elseif a=="ok"then local F=B[x][2]if F=="daily"then V("daily")elseif F=="practice"then V("practice")elseif F=="new"then V("practice",true)elseif F=="found"then ag(h,l.f,"Found words","menu",L=="practice")elseif F=="yday"then local e=J()-1 ag(aF(R(e)),z.day==e and z.f or"","Yesterday's hive #"..(e-N+1),"menu",true)r.all=true else p=F end end return end if p=="list"then if a=="top"then p=aA elseif a=="up"then v=math.max(0,v-1)elseif a=="down"then v=v+1 elseif a=="ok"and r.canAll then r.all,v=not r.all,0 end return end if a=="top"or a=="ok"then p="menu"end end local al={3,4,3,0,6,2,6,6,3,8,0,6,0,2}local ak={1,0,7,0,1,10,7,10}local function aU()local G={}for Z=1,11 do G[Z]={".",".",".",".",".",".",".",".","."}end for d=1,7 do local ap,aV=al[d*2-1],al[d*2]local aT=d==1 and aH or aP local a=0 for as=1,3 do local aB=G[aV+as]for ar=1,3 do if ar==2 and as==2 then local Q=d==1 and h.ls:sub(1,1)or y[d-1]aB[ap+2]=aj(((d==1)~=(m==d)and aJ or 0)+Q:byte()-97)else aB[ap+ar]=aj(aT+a)a=a+1 end end end end for C=1,4 do G[ak[C*2]+1][ak[C*2-1]+1]=aj((m==7+C and aM or aL)+C-1)end for Z=1,11 do G[Z]=table.concat(G[Z])end return table.concat(G,"/")end local function bb(f)return(f:upper():gsub("(.)","%1 "):sub(1,-2))end local function a9()local c,j={},0 for a=#l.f,1,-1 do local f=h.list[l.f:byte(a)-64]if j+#f>30 then c[#c+1]="...";break end c[#c+1]=f j=j+#f+2 end return table.concat(c,", ")end local aO={"shuffle","words","rub out","enter"}local function aZ()local t,j=Y(h,l.f)if L=="daily"then snail.title("Word Hive #"..(k.day-N+1))else snail.title("Word Hive - practice")end snail.center(true)if s then snail.status(s)else snail.status(ai(h,l.f).." - "..t..(t==1 and" point - "or" points - ")..j.." of "..#h.list.." words")end snail.text(#q>0 and bb(q)or"_ _ _ _")if j>0 then snail.small("Found: "..a9())else snail.small("Find words with "..h.ls:sub(1,1):upper().." in them")end snail.board(aU())local a6=m<=7 and("add '"..(m==1 and h.ls:sub(1,1)or y[m-1]):upper().."'")or aO[m-7]snail.hint((#q>0 and"BACK rub out OK "or"BACK options OK ")..a6.." L/R move")end local function a_()local g,i=r.sol,r.f local t,j=Y(g,i)snail.title(r.title)local a5,I,T=X(t,g.max)snail.status(j.." of "..#g.list.." words, "..t.." of "..g.max.." points")local ab=""for a=2,#E,2 do ab=ab..(t>=(g.max*E[a]+50)//100 and"#"or"o")end snail.board(ab,"small")local n={}if j==#g.list then n[1]="Hive Master: every word found!"elseif I then n[1]=a5..". "..(T-t).." more points for "..I.."."else n[1]="Genius! "..(#g.list-j).." words still to find."end if r.all then n[#n+1]="Capitals: words found. * pangram."end for af=4,15 do local w,av=nil,af.." letters: "for a,f in ipairs(g.list)do local au=#f==af and i:find(string.char(64+a),1,true)if#f==af and(r.all or au)then local aa,U=W(f,g.ls)if au and r.all then f=f:upper()end if U then f=f.."*"end if w and#w+#f>38 then n[#n+1]=w;w=nil end w=w and(w..", "..f)or(av..f)av="    "end end if w then n[#n+1]=w end end if j==0 and not r.all then n[#n+1]="No words yet."end if v>#n-1 then v=math.max(0,#n-1)end for d=v+1,math.min(#n,v+15)do snail.text(n[d])end local ad="BACK back"if r.canAll then ad=ad..(r.all and" OK found only"or" OK show all")end snail.hint(ad.." UP/DN scroll")end function draw()if p=="game"then return aZ()end if p=="list"then return a_()end if p=="menu"then snail.title("Word Hive")local B=ax()if x>#B then x=#B end for d,a3 in ipairs(B)do snail.row(a3[1],d==x)end snail.gap()snail.small("Daily streak "..aG()..", best "..b.best..".")snail.hint("BACK leave OK choose UP/DN move")return end if p=="stats"then snail.title("Statistics")snail.text("Daily hives played: "..b.played)local aE=aG()snail.text("Streak: "..aE..(aE==1 and" day"or" days")..", best "..b.best)snail.text("Genius days: "..b.genius..", every word found: "..b.master)snail.text("Words found: "..b.words..", pangrams: "..b.pangrams)snail.text("Practice hives: "..b.pp..", Genius: "..b.pgen)snail.gap()snail.small("A day counts once you find a word in its hive.")snail.hint("BACK back OK back")return end if p=="help"then snail.title("How to play")snail.text("Make words from the seven letters. Every word uses the centre letter.")snail.text("Words have 4 or more letters. Letters can be used again.")snail.text("4-letter words score 1. Longer words score 1 per letter.")snail.text("A pangram uses all seven letters: 7 bonus points.")snail.text("Arrows move, OK picks a letter or button, BACK rubs out.")snail.text("Top: shuffle, found words. Bottom: delete, enter.")snail.text("Ranks go from Beginner to Genius, by share of the points.")snail.hint("BACK back OK back")return end snail.title("Today's hive")snail.text("The daily hive needs the date. Connect to Wi-Fi once so the clock gets set, then come back.")snail.text("Practice hives work any time.")snail.hint("BACK back OK back")end function start()math.randomseed(os.time())a4()if J()then V("daily")end end
