Compare commits

..

2 Commits

Author SHA1 Message Date
Lucia Ceionia
3362719e79 day 17 part 2 (almost, it's wrong) 2023-12-17 21:23:54 -06:00
Lucia Ceionia
d1478ac425 day 17 part 1 (hellishly slow) 2023-12-17 19:45:57 -06:00
7 changed files with 1304 additions and 0 deletions

3
17/Makefile Normal file
View File

@ -0,0 +1,3 @@
all:
nasm -g -felf32 main.s && ld -melf_i386 -g main.o

143
17/input Normal file
View File

@ -0,0 +1,143 @@
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$545452221113224242466233542635423355626253426445443455757673665557347647355656433643746353634644662254525636256443646245624542442323123124434$
$423123553224156354662663652662565323453542525447336537477575644434676433736577536377777334455463373535224645325663632555343244432114515143455$
$412533154242243224353222366252356526355257367576363643744576774435663654744573466766563337774647645676664423643264353633522462246212343543534$
$312324515521642422652636445534644554523665356655534343537375547744446437364446564476574363354465364444335526246456466465534642522545221525355$
$431513132425342544645256323442532642676557544454577773477553376746647356735654457637736466555435447757676662446326565224355645426536544353433$
$152515313256642445666534554544332644373336536336456577474544746374336345737444775367547736546647553566343437636426552263525243344634253243155$
$135443325556463563643622655423352436666776776734633546375567453734754553445667477777766555547773656573443454755625255564266524452554644145234$
$241513543232556336524232462424435737746743746575776755464666467353446767477357654573667646735353777447336743456434254233635466225242632525121$
$442114466425542236636355532623577635665736777673573577436763575554353467744376756337466776666746547776573643366373454532562525346426364521212$
$541155622643423523354262433657364363646354575667566357546477534336746476674745444646634665776653773333473375747756253522266653336465444335443$
$315134623523366526522266354747643547566373676536336653534764337367777657666544734333553663574737675665473765764555363545425566323646362446212$
$353142355424432653444565325346456566644744764673467744633777464737845775474776766376767444574545433637456635633567664644636222333626546663624$
$315262562366632565525535545577665554665674353536337736534348577475484854557474447578374345363774654336434544754674634746633244226523442264433$
$335545645535423623266436675456635746457674747674657776647557877646646675874757745664876653556564444533753335375443577665252425255534456546245$
$553355652652264636363367377346645567667346557653434567688677545486848565546546665444456784473354343544647657374633433333555233425565253533356$
$243333363523322443663544336473347367764656335567475568787767645554484767666557847484654575478446467365374457346344653755573346552525256565322$
$666223435352636335653467647754757343776765635446446788867658547858868785684748487568855845688555756333373536554535476756744646434652424342333$
$645455232354462344243445636673564336664747664878865467785568865677886748754847884644784467558578757766455653753346354754754655533565264232532$
$466264662434546564673354575575444753656373744566465676768746765458687768457555786448878877475448775543545436357333657537436536626255346662656$
$654524643332325657443773473345666645437437457786476648665876645875844657466548548677668648768478465858346357657453545354733536252225236325324$
$245235543533534454757574456473757344733876884576864756557877774546778774555757444877858775558546876676464645537473477737556335324623665264554$
$552235662634536547455366376357656336444664848888574766754875756656755876868444465858655555676566668664686665663544655356774567736546326366635$
$353542423524446556643335547536347646576756685775676766655557774844768557867884484585678554847845646654865854437565545635345436754335643323263$
$326635253342553646346557637354574467764875575745775547574584574755667545768464448746656755546475444547874465334763664737345747437656333254563$
$653335566256277556643667467346775367576846755455468867867557557555887765578448878848456454866856764644668486873436476677765536767642445626356$
$353255366565746364356754435755657577566867745558644476548588748884548574488784666876485787774565875677468876756676547447547545755532634442565$
$526256464444756734475435756673776484768854466755657745844446568666657957857746556588454768855565754764675454455437656334744533657457623236224$
$345546363576475673635365446743587548544658648758765765475847775665595995997557889547584448655877685856876666444644644334674665743567346233266$
$533654332435774354776646364446474846575477447574584776856576779765587966968987698878988545587567868486876764888877575753575453556376745642566$
$633636424573637734764776635667487684676748668665568566866889869557556755989955889797856987487464457458644645786764873746476745365753365432463$
$436434525766744544555467765487678745586567856888558789667967898667788975588775596575969899765767668556484474454574865565553453736343757423566$
$562564353763677646656565447585778775865488767878759868968558979588977867688659588986697765665477854856584885664466675345566465573666456355365$
$232544366666336545573336765565884686888688676464687896586586865697669996659769557995958979656645555844656646558777648564373757645766465564263$
$325226433577434645734663776868484484574546847759659798668887755976978658579669665775876995696766765667567564857767757436736433534574356375464$
$233434647657566365675564855678657456764555868565669776899967977985978785677658977569987558877878886856748745484877655877536777645733565672553$
$346247373476565353376638555656666547878646777776699966987887775565755667655885557989588579667655656868844566557565885884763657647737363335464$
$532243475547755575777345844444764678745788878877675956599689759687889958677777568677756559957698788764847454855744856566777557736766676435464$
$262676537574457653774457566747874566475585789698955597778655878869799695678789958999766885657857566894858485757754485588476476734355556634663$
$554273745665445654454755465755788884874769777895865665659996575789596765989769785679566759565995579779754867476767446844747337344367377354722$
$223443465575665667345468464778664565646768567659578566988667856788688568878858975798856895758586987665776878777467678677846363447364466655752$
$356675376476767636478486488564575777675577587995586676557599976687578955896587568597887786867768768799584654454457787674446666776457355366334$
$446346746755447335376878747444548484767989866757676988577659767879598868996657877558889985695985588655575884455566754554678576776575736753747$
$554354566643337445757665664854558565869858866656857656695755689989897768888898967697656665688856899957759956444477448748884634353575536635376$
$534454344735356453685855755866568857866855877775658577698557768996777867979869796665786759779765759587979888785478444554847485657467766647545$
$443436776547774645468645577867656488896978758777798895598889679866888688869967986666655558857856758797976585648874675868764677345555644357543$
$257746743747434447467858858468464667666857679685959656776766788988696989987877767689978775665995977695959698477585465847875658656777474576447$
$645547747335346637656657768676586568997777755987596665968768787877997778697867879896899888669887779959895769844445545565666568367653644677547$
$553466736466736684746886666654678758976976679578775799668666689897777666887669787796967877596969796967796888966448555755588488566576673775433$
$776446577567576687686786446648658876958999656689977798667789899869887868779686996797769789857565999575769965795557567748557544647767643763474$
$445356637656674775556644475678659975969567657958685979868977878989668969687788668968878769775976789797698975665486687555884857456546534543563$
$463645333465775785746547746866865768899858897765787788669686689668888676768786776797687678987958668775876759975857585586487667853553464535457$
$564477673374747676645744768548578875768658857689997867667699686677789987896686787796899786989869758579587756857588556884768666757763734637656$
$753556345564735887488486654567965956577557956858677778979967788997886678979888678999679867786776689598666566999857586845478647775545436555553$
$345365637574455675565456864445579975865657859877896789776886696797878887676788766779699976687768989758796767975696688486546867688535773437576$
$563643757353635744777558764668598788688667657587699768679877688999788976678779987678888899988696779888988599798896845755458568487466666645664$
$543444466456568748754448767568587899956585778776877666796699889797797698667887698787866798988969666759756886776686778745884658447476754743675$
$775555364536476764685787847556888796868878858669787979898869969899798699976896877676666868866868676677787775667578585574574466774833577574646$
$634564673656787575774464768665888587665968667897896986988997878998889897878779887897997869989668679679957889756995447574784558575577733545643$
$577736376747365476448748478477796768757799598789868889798968776688779897897789868968889799788966888869898975668865987448565667558857736635643$
$466345746537546444778477645588885858759799788669769866667686687799778787887998988778696998968788686886759968759855878458545755745583464766353$
$367655547534675485475587886859656798596775967889999876777668999898997779779999977967889897689698666959958577896968754558887878487466364554457$
$653764635533546656444544748669777855769689666767996998967768787987877997777789877879797669966789688659586895965976884575646866457567553356675$
$446653547537785576645688746776557769889589679688779797969868988999887999799878887798996677697677978795956576655686964586475875475887577735776$
$344564775776467555666785757659665856977858698769987778997678797998997999999897899987886899987688889897695889685799576867746777467646546576365$
$654736333377688685576656654998969878958759867686996898766689989879877978777889778787868686788887869786797867597879898644784877645754354536375$
$767747647435455487886768675697877659896578787788669769779799998887879887889788888997789687686768666868776559656566955647588756888764347454776$
$774457766435866645686575458679965688767955998897969876799898877798778987778797797888997778868978867995859657556696594555667474878485536473347$
$366445576358856847557447789956599979755857769987889697967987878888879779878778977978986998889968887667768699579866588587785767748754376363554$
$766344743577475764568847579997598855976966669699688996999998987878789798788998777778898668697689869778596566556756677764576558674474576657474$
$736745557656466465485456767695967885795567669968688899788877778797997779788799999888779699767799986898695888998859665878677555646544465653554$
$577753734565685574848584466665798865998576787897887876898999799789897997898988879777977976686779986687656986997797786567785888786465457333447$
$543537356746774554476444747757978996777959898679879879898977897778987978898988989978978897768898866666796995878796566477765667684545335437676$
$437766576438547766556675687655968789988677789998678687769788997898888998987997777989979796877677699676678769556989886464447864567655446374465$
$774667644357778464657467446768777587599896669768898996799998899788777877898778789789886686796669799666668777585998986876745458765677776336474$
$673456737734575477884884555698977778886667898889798678889979888778788778978887888777789669779686678965957559675775777488875554667477337777664$
$665743475468848468864485465868588566687856668986879966888979797778988898997999899999898796978989787969699597586995555564868557476684777756734$
$646554756444674645545745554559686885658675878898988999988988999789988998987879997879776797879869887967979579868767585566467556584857466573677$
$364764647433677788866778744599756867979797699869867787666678777898999787898989797789767698987787689975759897675779695758585566676486736437565$
$535657367676788744488555688866567598959667976889768897689998888978878888799897997777877889778777976969959559979798875545858676548565476756446$
$633363763563454644784858847895797557969965876677987878976787878779988997777977799998877787677976867878977587865957557486665588466457543463635$
$375433566546784568846466745598558655679968776668798787899889779877878988779887997778797888678778996867596666657866874675645464786473443555447$
$434655743646446455646846467678988778555555686866869776667867788797877999888887888976676979997998988976998588698965984485774787566574577553376$
$757663464775848684556667686775675566755668979679877689867998687897999788888899797969769667797686789969697795968885567685786664865545733646333$
$436536333433585884585488446757557568878876857999666686869666787778897988977877887686867777689966698889899988598867685787566778656564477735445$
$436574534734348886888756757498889965758885899878987888866677979798879779777899977868767868996877788995778656675966566755867567565574633456555$
$564764653563688455554454885545886885979986956966688986677768987888887788888986967968696889979678777755778658995959858577865848685846647676536$
$774666566543587578854654454459798858796687579678788997996798879976879988877696966976978868687797675777579588669865747866555654646757563764356$
$334653746666747767874888446759658578686597896567669986768687786769869666679968799886689699667888658865797857988986544445767866746843445663555$
$775344654767678685848468464575877876687899677597996789798676698776979787769968688886967768966777857569696867798987665668774554657436543557567$
$766543343765565746568886858757686865568578796657979967896798688987979798966679878979878987979679598685776666567766775448885878555657665547357$
$636655364436434455888845888778685568678599896776668766887767676667867787968869876966876666689866987776969877858886687745584764557354464333464$
$675765663744534578545687478578698557858656798867678988867967999777996889699687796687898679786896785675995877868655448555846488877754667477734$
$376666657777454776866467685478859857875585897867777886776668979799679889766696977797676899977576857679985779975754888884877866665753763656567$
$553656636455355675644444444747459698859777767998579698866968997767787668988968899867897668767998695767758686979684446467848778567374445455366$
$754746745637544445664687865676568868689986785689987697689689969698679786996868877777898786786677866785998778985766777464665886563347736757447$
$744657466646636774744445554675666676868675955555767858786996667879668878978868776888798796869879978857865577996565788644766846855557536433763$
$446745655755373767857866885858587788668877866696695565989667697677966767697869689788978969797665869856666577584454657576664775376733565354756$
$654636755367566664586687484447778479787695578876796699778799789899898676987968866887987986956877768755999996846745684654755648755434654444754$
$635344556537573455855776668478688447578999955979699999695669968667779887688976668788756786965858995755576656777877658545555555647667534575366$
$435747556465374336665458878467447445675959779776975698666756899678787988689897869778795885896759756577958888884545566466868655534765435574357$
$437767766643564433747554467577668757587776755668689999998555765778667999677696988696955786556876667667988974746747864478454737537664677453677$
$664347635467563437656868568685484468455677569986876985879577699879986797878559965665568857786598876697898847446667476764656445454547563774635$
$335453357433477464545778558588687458646696878686798565588759596859598855679658897766897786687897896866587457546877768774845653576735343735752$
$655777543774646674548678844477675556474688567958786967887956958887675987768675555986588965589688887889886444888584878476586567343575354445663$
$235453363477465436646567678856678577655849767566798556879779898997989755658656559688876996696676858559457557464577456788673465676535365674745$
$653557535667556645354467867774587468586488865599677669989755886567678697988757889697878875858955878776457675775448445776473464477477767663723$
$423647457774664567367567688588786455886875877685666999576569666558878966575579888958887568875959897748876746485847657558833665657763667534445$
$642244736374347334553476484454457886864876777558556996776685999679967876675775769557785885758655565867454657858447768578474753663535574334625$
$336436733375445675473664646565856555648864767887656769899695675757975675565687699957587897798858758888587654455645575843733477364463637346554$
$335435534663443676666667487578676657684784777487588895569858889859686655956678559995599665976775765566474568674477774565755333637557456443362$
$544553574555543574737357456786577646746577857444859685759965869665959565775665768787565556566764745674557877684464784337435554455363447424542$
$532466367673434664644354657754588778676755775886768666885868799568878785557855988668678578786766445778646767754547786674353344647665577622636$
$254546266574455447676333746874647468845746684454766755965578588856776657996755995866665756584754744857764888446555686474747766466477373363255$
$266564352377575777574547445766866788765476854777647777755855596796559556988877659996958566787777584545576775754474473767554467654656553554332$
$522256355666446675564456747738664767486874667675476687786478896698989959668656659687968467645876545646468576457566664435353565756335325455423$
$444323436545645543755363664545566464457866856586678787858786757778956969568579798946747584467867878657848746487767644665534735673753556344635$
$323454432324636457364755566663657568465848475587778876786656855775678985985658687848774858847777567884787865845753573673347657574545444662333$
$634265532422373635667776375763433576454587888546578776578558775467647857865566478665585765455686464585664454657577753367736355637473456622255$
$622652422623346667557377766536775386775555647476757786588468585876875775475874454678454778445754858785856648473657737554774554374752234543644$
$626444363465537553657447547553534338748756846655465484858676444775654756856447485566556646575845685575686466474566556633663543776752343555663$
$535442263436653363546357777754675735775658785476758746846756747484788667788686756847555568587746787644556655745755367533554735377434563655355$
$554342625636334436643667447345746337765466846668685587767846687654478458468576565878864858748845754784458634476773434474546454344452263624345$
$565345336254245667667673464644643655375486646848574888844888558867884754554747767566586664467557686445654336335375474476363464323325434436625$
$332442354652352554553756635666445463456537777656657588588744485464885685786874588448866685887758677684775654736344634537577646434553463233633$
$264423644454226544363333743363353543453764748557767447766744574745865865746448687884547865745856555847664474444567466455356545323344624233336$
$624364424324325525254434475736744543756757746455757545887885684854876555585578764754564576867554753746356355666473343373737424256554255423523$
$662433222232665256245775334733557673537364464544457667464687655758776565487564647678487555685857676544475746676457447467754565543233223432355$
$335526225663422356565753436745336336337473673334447858766557576685575848668868544646668474687675476677666534474734376777532524234366425532456$
$224434544223322234353647375646454645545464356533655787476846747488548474786866778666778547634433667755755733766475767655364426634454342243225$
$115343665234633546565263376447534744657646576367346453768575867668478755786458868487856743347563663553647377756353665654344434266256634336435$
$542522653445666245465264554744743545554757337454635474734676576664554868545884455857744457443343774776545543664436646636526654445346625264641$
$212345454243326345366432525643537663566453477653467557566745535745888465744676443367676664343457436353346547364465644462456633524632446434245$
$152256444334346664644636266764544353565677537647674477765463657665645367433374777437633774465675755553674563647647452223353432253226324623542$
$543314543643455255443324653447436466475546347473733756375574455574647736546663676737753633747536667644363433373577625266565562536523653263531$
$323324156556533366424334223663556664354675665737455445654473743546365645433344367436563477354677564675374746774552632626523436564364436333125$
$235252143234364223446642636543224575373637463676356753733454753456563336535346777535556775743565435544465673644434525462634226464524365541444$
$132152313563645443345466655333626644763757433545675545554636757343657777557575474647543744454353557547677667745433252345352224344346244251442$
$145324252553642322332363652223266265665333337557545545565467373344435373577653536363764744455463574577733745442455342654643644622632454545141$
$532551554325522544422365464343624222657554543453736435733353775644654357356557335773453777745644576533447446326624326254632635265444511254421$
$231415354245432533366263463246653334334533336463333665345436677477356745734756355353637773745467756534536353223454622442252244524633251135155$
$115313455335154364554632663442562633255536347755433457547673466773633747543655343555654635633737643533463222323433222456626424343225333455422$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

15
17/input_test Normal file
View File

@ -0,0 +1,15 @@
$$$$$$$$$$$$$$$
$2413432311323$
$3215453535623$
$3255245654254$
$3446585845452$
$4546657867536$
$1438598798454$
$4457876987766$
$3637877979653$
$4654967986887$
$4564679986453$
$1224686865563$
$2546548887735$
$4322674655533$
$$$$$$$$$$$$$$$

422
17/main.s Normal file
View File

@ -0,0 +1,422 @@
%include "utils.s"
global _start
[bits 32]
[section .text]
; len +2 for padding
%define LINE_LEN (141+2)
%define FILENAME "input"
;%define LINE_LEN (13+2)
;%define FILENAME "input_test"
%define DBG_PRINT
_start:
; convert input file to useful data
mov esi, file
mov edi, cost
convert_input:
lodsb
cmp al, 10 ; \n
je .cont
cmp al, '$'
jne .num
mov al, 0xFF
stosb
jmp .cont
.num:
sub al, '0'
stosb
.cont:
cmp esi, file.over
jb convert_input
; im lazy so doing dijkstra
; thanks wikipedia
; for each vertex v in Graph.Vertices:
; dist[v] ← INFINITY
; prev[v] ← UNDEFINED
; add v to Q
mov ecx, LINE_LEN*LINE_LEN*32
mov eax, 0xffffffff
mov edi, dist
rep stosd
mov ecx, LINE_LEN*LINE_LEN*32
mov eax, 0xffffffff
mov edi, prev
rep stosd
mov ecx, LINE_LEN*LINE_LEN*32
mov eax, 1
mov edi, q
rep stosb
; for all real dir:
; dist[source@dir] ← 0
mov dword [dist+((((LINE_LEN*32)+(32*1)))|0b00_000)*4], 0
mov dword [dist+((((1*(LINE_LEN*32))+(32*1)))|0b10_000)*4], 0
; while Q is not empty and any dist[u] in Q < inf:
; u ← vertex in Q with min dist[u]
while_q:
xor ebp, ebp ; test node
mov ecx, 0xffffffff ; best dist
mov edx, 0xffffffff ; best node
.find_min:
cmp byte [q+ebp], 1
jne .cont
cmp [dist+ebp*4], ecx
cmovb ecx, [dist+ebp*4]
cmovb edx, ebp
.cont:
inc ebp
cmp ebp, LINE_LEN*LINE_LEN*32
jb .find_min
cmp ecx, 0xffffffff
je while_q_done
%ifdef DBG_PRINT
pushad
call newline
mov ebp, edx
mov eax, edx
xor edx, edx
shr eax, 5
mov ebx, LINE_LEN
div ebx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, ebp
and eax, 0b11111
call print_dec
call space
mov eax, ecx
call print_dec
call newline
popad
%endif
; remove u from Q
mov byte [q+edx], 0
; for each neighbor v of u still in Q:
; alt ← dist[u] + Graph.Edges(u, v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
mov ebp, LINE_LEN*32 ; whatever
for_neighbor:
; turning neighbor 0
neighbor_0:
; neighbors += v@dir(u, ~u.dir & 0b10_000)
mov ebx, edx
not ebx
and ebx, 0b10000
; tmp := 32
mov edi, 32
; bt dir, 4
bt ebx, 4
; if CF tmp := LINE_LEN
cmovc edi, ebp
; bt dir, 3
; if CF tmp := -tmp
mov esi, edi
neg esi
bt ebx, 3
cmovc edi, esi
mov eax, edi
; v.dir := dir
or edi, ebx
; v := u + tmp
; CheckBounds(v)
; Graph.Edges(u, v) := cost(v)
; v := v + tmp
; CheckBounds(v)
; Graph.Edges(u, v) += cost(v)
; v := v + tmp
; CheckBounds(v)
; Graph.Edges(u, v) += cost(v)
; v := v + tmp
; CheckBounds(v)
; Graph.Edges(u, v) += cost(v)
mov ebx, eax
mov esi, edx
and esi, ~0b11111
add edi, esi ; v := u + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_1 ; off graph
mov esi, eax ; Graph.Edges(u, v) := cost(v)
add edi, ebx ; v := v + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_1 ; off graph
add esi, eax ; Graph.Edges(u, v) += cost(v)
add edi, ebx ; v := v + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_1 ; off graph
add esi, eax ; Graph.Edges(u, v) += cost(v)
add edi, ebx ; v := v + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_1 ; off graph
add esi, eax ; Graph.Edges(u, v) += cost(v)
; alt ← dist[u] + cost(v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
add esi, ecx
%ifdef DBG_PRINT
pushad
call space
mov esi, eax
mov eax, edi
shr eax, 5
mov ecx, LINE_LEN
xor edx, edx
div ecx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, edi
and eax, 0x1f
call print_dec
call space
mov eax, esi
call print_dec
call newline
popad
%endif
cmp esi, [dist+edi*4]
jae neighbor_1 ; not better
mov [dist+edi*4], esi
mov [prev+edi*4], edx
; turning neighbor 1
neighbor_1:
; neighbors += v@dir(u, (~u.dir & 0b10_000) | 0b01_000)
mov ebx, edx
not ebx
and ebx, 0b10000
or ebx, 0b01000
; tmp := 32
mov edi, 32
; bt dir, 4
bt ebx, 4
; if CF tmp := LINE_LEN
cmovc edi, ebp
; bt dir, 3
; if CF tmp := -tmp
mov esi, edi
neg esi
bt ebx, 3
cmovc edi, esi
mov eax, edi
; v.dir := dir
or edi, ebx
; v := u + tmp
; CheckBounds(v)
; Graph.Edges(u, v) := cost(v)
; v := v + tmp
; CheckBounds(v)
; Graph.Edges(u, v) += cost(v)
; v := v + tmp
; CheckBounds(v)
; Graph.Edges(u, v) += cost(v)
; v := v + tmp
; CheckBounds(v)
; Graph.Edges(u, v) += cost(v)
mov ebx, eax
mov esi, edx
and esi, ~0b11111
add edi, esi ; v := u + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_2 ; off graph
mov esi, eax ; Graph.Edges(u, v) := cost(v)
add edi, ebx ; v := v + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_2 ; off graph
add esi, eax ; Graph.Edges(u, v) += cost(v)
add edi, ebx ; v := v + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_2 ; off graph
add esi, eax ; Graph.Edges(u, v) += cost(v)
add edi, ebx ; v := v + tmp
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_2 ; off graph
add esi, eax ; Graph.Edges(u, v) += cost(v)
; alt ← dist[u] + cost(v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
add esi, ecx
%ifdef DBG_PRINT
pushad
call space
mov esi, eax
mov eax, edi
shr eax, 5
mov ecx, LINE_LEN
xor edx, edx
div ecx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, edi
and eax, 0x1f
call print_dec
call space
mov eax, esi
call print_dec
call newline
popad
%endif
cmp esi, [dist+edi*4]
jae neighbor_2 ; not better
mov [dist+edi*4], esi
mov [prev+edi*4], edx
; straight - neighbor 2
neighbor_2:
mov ebx, edx
and ebx, ~0b11111
cmp edx, (((LINE_LEN*32)+(32*1)))
je while_q_cont
; if u.dir & 0b00_111 < 6
; neighbors += v@dir(u, u.dir + 1)
mov ebx, edx
and ebx, 0b00111
cmp ebx, 6
jae while_q_cont ; neighbors done
mov ebx, edx
and ebx, 0b11111
inc ebx
; tmp := 32
mov edi, 32
; bt dir, 4
bt ebx, 4
; if CF tmp := LINE_LEN
cmovc edi, ebp
; bt dir, 3
; if CF tmp := -tmp
mov esi, edi
neg esi
bt ebx, 3
cmovc edi, esi
; v := u + tmp
mov esi, edx
and esi, ~0b11111
add edi, esi
; v.dir := dir
or edi, ebx
; alt ← dist[u] + cost(v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
mov eax, edi
shr eax, 5
movzx eax, byte [cost+eax]
cmp al, 0xff
je while_q_cont ; off graph
add eax, ecx
%ifdef DBG_PRINT
pushad
call space
mov esi, eax
mov eax, edi
shr eax, 5
mov ecx, LINE_LEN
xor edx, edx
div ecx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, edi
and eax, 0x1f
call print_dec
call space
mov eax, esi
call print_dec
call newline
popad
%endif
cmp eax, [dist+edi*4]
jae while_q_cont ; not better
mov [dist+edi*4], eax
mov [prev+edi*4], edx
while_q_cont:
jmp while_q
while_q_done:
call newline
; last dist values
mov ebx, ((((LINE_LEN-2)*(LINE_LEN*32))+((LINE_LEN-2)*32))+0b00000)
print_last_dist:
mov eax, [dist+ebx*4]
call print_sign_dec
inc ebx
mov ecx, ebx
and ecx, 0b111
cmp ecx, 0b111
jne .space
call newline
mov ecx, ebx
and ecx, 0b11111
cmp ecx, 0b11111
je .done
inc ebx
jmp .cont
.space:
call space
.cont:
jmp print_last_dist
.done:
game_over:
jmp exit
[section .data]
file: incbin FILENAME
.over:
[section .bss]
dist: resd LINE_LEN*LINE_LEN*32
prev: resd LINE_LEN*LINE_LEN*32
q: resb LINE_LEN*LINE_LEN*32
cost: resb LINE_LEN*LINE_LEN
new_file: resb len(file)

363
17/main_part1.s Normal file
View File

@ -0,0 +1,363 @@
%include "utils.s"
global _start
[bits 32]
[section .text]
; len +2 for padding
%define LINE_LEN (141+2)
%define FILENAME "input"
;%define LINE_LEN (13+2)
;%define FILENAME "input_test"
;%define DBG_PRINT
_start:
; convert input file to useful data
mov esi, file
mov edi, cost
convert_input:
lodsb
cmp al, 10 ; \n
je .cont
cmp al, '$'
jne .num
mov al, 0xFF
stosb
jmp .cont
.num:
sub al, '0'
stosb
.cont:
cmp esi, file.over
jb convert_input
; im lazy so doing dijkstra
; thanks wikipedia
; for each vertex v in Graph.Vertices:
; dist[v] ← INFINITY
; prev[v] ← UNDEFINED
; add v to Q
mov ecx, LINE_LEN*LINE_LEN*16
mov eax, 0xffffffff
mov edi, dist
rep stosd
mov ecx, LINE_LEN*LINE_LEN*16
mov eax, 0xffffffff
mov edi, prev
rep stosd
mov ecx, LINE_LEN*LINE_LEN*16
mov eax, 1
mov edi, q
rep stosb
; for all real dir:
; dist[source@dir] ← 0
mov dword [dist+((((LINE_LEN*16)+16))|0b0000)*4], 0
mov dword [dist+((((LINE_LEN*16)+16))|0b1000)*4], 0
; while Q is not empty and any dist[u] in Q < inf:
; u ← vertex in Q with min dist[u]
while_q:
xor ebp, ebp ; test node
mov ecx, 0xffffffff ; best dist
mov edx, 0xffffffff ; best node
.find_min:
cmp byte [q+ebp], 1
jne .cont
cmp [dist+ebp*4], ecx
cmovb ecx, [dist+ebp*4]
cmovb edx, ebp
.cont:
inc ebp
cmp ebp, LINE_LEN*LINE_LEN*16
jb .find_min
cmp ecx, 0xffffffff
je while_q_done
%ifdef DBG_PRINT
pushad
call newline
mov ebp, edx
mov eax, edx
xor edx, edx
shr eax, 4
mov ebx, LINE_LEN
div ebx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, ebp
and eax, 0b1111
call print_dec
call space
mov eax, ecx
call print_dec
call newline
popad
%endif
; remove u from Q
mov byte [q+edx], 0
; for each neighbor v of u still in Q:
; alt ← dist[u] + Graph.Edges(u, v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
mov ebp, LINE_LEN*16 ; whatever
for_neighbor:
; turning neighbor 0
neighbor_0:
; neighbors += v@dir(u, ~u.dir & 0b1000)
mov ebx, edx
not ebx
and ebx, 0b1000
; tmp := 16
mov edi, 16
; bt dir, 3
bt ebx, 3
; if CF tmp := LINE_LEN
cmovc edi, ebp
; bt dir, 2
; if CF tmp := -tmp
mov esi, edi
neg esi
bt ebx, 2
cmovc edi, esi
; v := u + tmp
mov esi, edx
and esi, 0xFFFFFFF0
add edi, esi
; v.dir := dir
or edi, ebx
; alt ← dist[u] + cost(v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
mov eax, edi
shr eax, 4
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_1 ; off graph
add eax, ecx
%ifdef DBG_PRINT
pushad
call space
mov esi, eax
mov eax, edi
shr eax, 4
mov ecx, LINE_LEN
xor edx, edx
div ecx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, edi
and eax, 0xf
call print_dec
call space
mov eax, esi
call print_dec
call newline
popad
%endif
cmp eax, [dist+edi*4]
jae neighbor_1 ; not better
mov [dist+edi*4], eax
mov [prev+edi*4], edx
; turning neighbor 1
neighbor_1:
; neighbors += v@dir(u, (~u.dir & 0b1000) | 0b0100)
mov ebx, edx
not ebx
and ebx, 0b1000
or ebx, 0b0100
; tmp := 16
mov edi, 16
; bt dir, 3
bt ebx, 3
; if CF tmp := LINE_LEN
cmovc edi, ebp
; bt dir, 2
; if CF tmp := -tmp
mov esi, edi
neg esi
bt ebx, 2
cmovc edi, esi
; v := u + tmp
mov esi, edx
and esi, 0xFFFFFFF0
add edi, esi
; v.dir := dir
or edi, ebx
; alt ← dist[u] + cost(v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
mov eax, edi
shr eax, 4
movzx eax, byte [cost+eax]
cmp al, 0xff
je neighbor_2 ; off graph
add eax, ecx
%ifdef DBG_PRINT
pushad
call space
mov esi, eax
mov eax, edi
shr eax, 4
mov ecx, LINE_LEN
xor edx, edx
div ecx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, edi
and eax, 0xf
call print_dec
call space
mov eax, esi
call print_dec
call newline
popad
%endif
cmp eax, [dist+edi*4]
jae neighbor_2 ; not better
mov [dist+edi*4], eax
mov [prev+edi*4], edx
; straight - neighbor 2
neighbor_2:
; if u.dir & 0b0011 < 2
; neighbors += v@dir(u, u.dir + 1)
mov ebx, edx
and ebx, 0b0011
cmp ebx, 2
jae while_q_cont ; neighbors done
mov ebx, edx
and ebx, 0b1111
inc ebx
; tmp := 16
mov edi, 16
; bt dir, 3
bt ebx, 3
; if CF tmp := LINE_LEN
cmovc edi, ebp
; bt dir, 2
; if CF tmp := -tmp
mov esi, edi
neg esi
bt ebx, 2
cmovc edi, esi
; v := u + tmp
mov esi, edx
and esi, 0xFFFFFFF0
add edi, esi
; v.dir := dir
or edi, ebx
; alt ← dist[u] + cost(v)
; if alt < dist[v]:
; dist[v] ← alt
; prev[v] ← u
mov eax, edi
shr eax, 4
movzx eax, byte [cost+eax]
cmp al, 0xff
je while_q_cont ; off graph
add eax, ecx
%ifdef DBG_PRINT
pushad
call space
mov esi, eax
mov eax, edi
shr eax, 4
mov ecx, LINE_LEN
xor edx, edx
div ecx
call print_dec
call space
mov eax, edx
call print_dec
call space
mov eax, edi
and eax, 0xf
call print_dec
call space
mov eax, esi
call print_dec
call newline
popad
%endif
cmp eax, [dist+edi*4]
jae while_q_cont ; not better
mov [dist+edi*4], eax
mov [prev+edi*4], edx
while_q_cont:
jmp while_q
while_q_done:
call newline
; last dist values
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b0000)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b0001)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b0010)*4]
call print_sign_dec
call newline
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b0100)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b0101)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b0110)*4]
call print_sign_dec
call newline
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b1000)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b1001)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b1010)*4]
call print_sign_dec
call newline
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b1100)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b1101)*4]
call print_sign_dec
call space
mov eax, [dist+((((LINE_LEN-2)*(LINE_LEN*16))+((LINE_LEN-2)*16))+0b1110)*4]
call print_sign_dec
call newline
game_over:
jmp exit
[section .data]
file: incbin FILENAME
.over:
[section .bss]
dist: resd LINE_LEN*LINE_LEN*16
prev: resd LINE_LEN*LINE_LEN*16
q: resb LINE_LEN*LINE_LEN*16
cost: resb LINE_LEN*LINE_LEN
new_file: resb len(file)

73
17/pseudo Normal file
View File

@ -0,0 +1,73 @@
v@dir(u, dir) {
v.dir := dir
tmp := 32
bt dir, 4
if CF
tmp := LINE_LEN*32
bt dir, 3
if CF
tmp := -tmp
if dir & 0b0_111 = 0
v := u + tmp
CheckBounds(v)
Graph.Edges(u, v) := cost(v)
v := v + tmp
CheckBounds(v)
Graph.Edges(u, v) += cost(v)
v := v + tmp
CheckBounds(v)
Graph.Edges(u, v) += cost(v)
v := v + tmp
CheckBounds(v)
Graph.Edges(u, v) += cost(v)
else
v := u + tmp
CheckBounds(v)
Graph.Edges(u, v) := cost(v)
}
neighbors(u@dir) {
; can always turn
neighbors += v@dir(u, ~u.dir & 0b10_000)
neighbors += v@dir(u, (~u.dir & 0b10_000) | 0b01_000)
; can go forward if consec < 6
if u.dir & 0b00_111 < 6
neighbors += v@dir(u, u.dir + 1)
}
; 28 possibilities, use 32 so we can do bit hacks
; 00000 00001 00010 00011 00100 00101 00110 00111
; 0 1 2 3 4 5 6 7
dir = { R4, R5, R6, R7, R8, R9, RA, XX,
; 01000 01001 01010 01011 01100 01101 01110 01111
; 8 9 10 11 12 13 14 15
L4, L5, L6, L7, L8, L9, LA, XX,
; 10000 10001 10010 10011 10100 10101 10110 10111
; 16 17 18 19 20 21 22 23
D4, D5, D6, D7, D8, D9, DA, XX,
; 11000 11001 11010 11011 11100 11101 11110 11111
; 24 25 26 27 28 29 30 31
U4, U5, U6, U7, U8, U9, UA, XX}
dist[(x,y),dir]
prev[(x,y),dir]
q[(x,y),dir]
for each vertex v in Graph.Vertices:
dist[v] ← INFINITY
prev[v] ← UNDEFINED
add v to Q
for all real dir:
dist[source@dir] ← 0
while Q is not empty and any dist[u] in Q < inf:
u ← vertex in Q with min dist[u]
remove u from Q
for each neighbor v of u still in Q:
alt ← dist[u] + Graph.Edges(u, v)
if alt < dist[v]:
dist[v] ← alt
prev[v] ← u
done

285
17/utils.s Normal file
View File

@ -0,0 +1,285 @@
[bits 32]
[section .text]
; call # val val2
; int $0x80 eax eax edx -
;
; arg1 arg2 arg3 arg4 arg5 arg6 arg7
; ebx ecx edx esi edi ebp -
exit:
mov eax, 1 ; exit
int 0x80
; filename in EBX
; return handle in EBX
; read only
open_file:
push eax
push ecx
mov eax, 5 ; open
xor ecx, ecx ; read only
int 0x80
mov ebx, eax
pop ecx
pop eax
ret
; file handle in EBX
; buffer in ECX
; count of bytes to read in EDX
; return bytes actually read in EAX
; exits on error
read_file:
mov eax, 3 ; read
int 0x80
test eax, eax
js .err
ret
.err:
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, .err_str
mov edx, 21
int 0x80
jmp exit
.err_str: db `Could not read file.\n`
; string input in ESI
; value in EAX
; CF set if none, clear if some
; ESI set past checked area
dec_parse:
push ebx
push edx
push edi
xor eax, eax
xor edi, edi
mov ebx, 10 ; base
lodsb
sub al, '0'
js .no_input
cmp al, 9
jle .got_char
.no_input:
stc ; set CF
jmp .done
.loop:
xor eax,eax
lodsb
sub al, '0'
js .dec_done
cmp al, 9
jg .dec_done
.got_char:
xchg edi,eax
mul ebx
add edi,eax
jmp .loop
.dec_done:
clc ; clear CF
.done:
mov eax,edi
pop edi
pop edx
pop ebx
ret
; string input in ESI
; value in EAX
; CF set if none, clear if some
; ESI set past checked area
sign_dec_parse:
push ebx
push ecx
push edx
push edi
xor eax, eax
xor edi, edi
xor ecx, ecx ; neg flag
mov ebx, 10 ; base
cmp byte [esi], '-'
jne .no_minus
inc esi
mov cl, 1
.no_minus:
lodsb
sub al, '0'
js .no_input
cmp al, 9
jle .got_char
.no_input:
stc ; set CF
jmp .done
.loop:
xor eax,eax
lodsb
sub al, '0'
js .dec_done
cmp al, 9
jg .dec_done
.got_char:
xchg edi,eax
mul ebx
add edi,eax
jmp .loop
.dec_done:
test ecx, ecx
jz .not_neg
neg edi
.not_neg:
clc ; clear CF
.done:
mov eax,edi
pop edi
pop edx
pop ecx
pop ebx
ret
; modifies no regs
newline:
pushad
push 10
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, esp ; string
mov edx, 1 ; length
int 0x80
add esp, 4
popad
ret
; modifies no regs
space:
pushad
push 9
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, esp ; string
mov edx, 1 ; length
int 0x80
add esp, 4
popad
ret
; input in EAX, all regs unmodified
print_dec:
pushad ; save regs
; max 4294967296 is 10 chars
; round to nearest 32-bit boundary
sub esp, 12
; string in ECX, length in EDX
lea ecx, [esp+11] ; last possible byte
; check for 0
test eax, eax
jz .zero
mov ebx, 10 ; base 10
xor esi, esi ; counter
.div_shit:
xor edx, edx
; divide
div ebx
dec ecx ; next char
inc esi
; store
add dl, '0'
mov byte [ecx], dl
; check if done
test eax, eax
jnz .div_shit ; continue
mov edx, esi ; counter in edx
jmp .write
.zero:
mov byte [ecx], '0'
mov edx, 1 ; length
.write:
mov eax, 4 ; write
mov ebx, 1 ; stdout
int 0x80
add esp, 12 ; restore stack
popad ; restore regs
ret
; input in EAX, all regs unmodified
print_sign_dec:
pushad ; save regs
; range -2147483648 to 2147483647 is 11 chars
; round to nearest 32-bit boundary
sub esp, 12
; string in ECX, length in EDX
lea ecx, [esp+11] ; last possible byte
; check for 0, negative
xor ebp, ebp
test eax, eax
jz .zero
jns .positive
neg eax
mov ebp, 1
.positive:
mov ebx, 10 ; base 10
xor esi, esi ; counter
.div_shit:
xor edx, edx
; divide
div ebx
dec ecx ; next char
inc esi
; store
add dl, '0'
mov byte [ecx], dl
; check if done
test eax, eax
jnz .div_shit ; continue
mov edx, esi ; counter in edx
jmp .write
.zero:
mov byte [ecx], '0'
mov edx, 1 ; length
.write:
test ebp, ebp
jz .no_minus
dec ecx
inc edx
mov byte [ecx], '-'
.no_minus:
mov eax, 4 ; write
mov ebx, 1 ; stdout
int 0x80
add esp, 12 ; restore stack
popad ; restore regs
ret
; input in ESI, len in ECX, all regs unmodified
print_string:
pushad ; save regs
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov edx, ecx ; length
mov ecx, esi ; string
int 0x80
popad ; restore regs
ret
; input in AL, all regs unmodified
print_char:
pushad ; save regs
push eax
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov edx, 1 ; length
mov ecx, esp ; string
int 0x80
add esp, 4
popad ; restore regs
ret
; --- MACROS ---
%define len(x) x %+ .over - x
%macro p_string 1
push esi
push ecx
mov esi, %1
mov ecx, len(%1)
call print_string
pop ecx
pop esi
%endmacro