Inlägg

Inlägg som survivalcode har skrivit i forumet
Av survivalcode
Skrivet av lotusxmw:

Hejsan, här har jag en metod som antingen ska tillåta försäljning, alternativt neka försäljning.

(1) Försäljning tillåts ifall det sökta artikelnumret finns och ifall det finns fler än 0 exemplar.

for(int i = 0; i < articles.length; i++){

if(articles[i][0] == artikelnummer){

//försäljning går igenom
if(antal <= articles[i][1] && antal != 0 && articles[i][1] != 0){

articles[i][1] -= antal;
trans = true;
}
}

(2) Här har jag problem med att definiera ett logiskt uttryck som står för att försäljning inte ska gå igenom på grund av att artikelnumret inte finns

articles[i][0] != artikelnummer

- kommer alltid att vara sant då det finns gott om artiklar som har artikelnummer som inte är lika med vad som söks efter

- Hur kan jag formulera detta i en if sats? satsen ska vara sann när man försöker köpa något som inte finns

Artiklarna är sparade så här: articles[10][3]
0 - artikelnummer
1 - Antal
2 - pris

Om articles är din "databas" kanske du vill ha en funktion

int get_article_index(artikelnummer)

som returnerar vilket index ditt artikelnummer har, i de fallen du hittar det och -1 annars.

I övrigt, vad händer i de fall där användaren ger dig ett korrekt artikelnummer, men negativt antal artiklar?

Av survivalcode
Skrivet av abelsson:

Jaha, nu var årets upplaga slut! Några reflektioner?

Det här var första året jag gjorde AoC (och dag 1 var första rust-programmet jag någonsin skrivit) och jag måste säga att det var väldigt tillfredsställande att skapa ihop stjärnor och jag lyckades få ihop alla 50, alla utom en på rätt dag Jag tyckte det var kul variation på problem och svårighetsnivåer, men favoriten är nog dag 22 eller 24 medan dag 16 var den mest frustrerade. Har ni andra någon dag som ni tyckte var speciell?

Om nån - mot förmodan - vill se så finns alla mina lösningar på: https://github.com/abelsson/aoc2022

Kudos till dig, att lära mig rust genom aoc är något jag själv planerat några år men aldrig blivit av.

24 var min favorit.
22 tog mig längst tid att lösa men jag uppskattade hur annorlunda den var mot resterande uppgifter. Den blev även betydligt lättare när jag insåg att

man kunde skapa en fysisk kub av en närliggande postitlapp och slippa belasta närtiddsminnet med en kanterna av en visualiserad 3dkub

Dold text

16 var nog den där jag blev minst nöjd med min lösning. Jag skar bort delar av sökrymden med diverse heuristisks och är inte säker på att lösningen finns kvar för alla typer av inputs.
25 var lite av ett antiklimax för mig. Visst, talbaser är fair game men inte den typen av problem som jag kliver upp klockan 05:45 för

Tack till alla som postat i tråden! Även om jag själv inte bidragit har det varit kul att läsa andras tankar om problemen

Av survivalcode
Skrivet av Mickur:

Okej, jag ber er om lite hjälp här. Hur mycket off är jag på del 1? Jag får 1232219 som svar med denna input.

Jga har steppat igenom koden och jag hittar inga problem, så vet inte om det är jag som misstolkar något eller om det blir något parsingfel. Funkade som sagt på testdatat.

$ cd / $ ls dir dpbwg dir dvwfscw dir hccpl dir jsgbg dir lhjmzsl 63532 mwvbpw.mmg 239480 npj dir pngs dir qhs 303649 shvgmwn.vhv 236905 sjrrgd.phh dir sntcp dir sqs $ cd dpbwg $ ls dir dgh 100731 dpbwg dir rpwnv $ cd dgh $ ls 197049 lhjmzsl.hzj $ cd .. $ cd rpwnv $ ls 10702 qsgv.fmf $ cd .. $ cd .. $ cd dvwfscw $ ls dir bvg dir fbfjs 115450 gjftb.mgd dir gsmnprgz dir hdwdcvv dir mhjtrlqz 75437 qsctddrw 171722 qsgv.zqz $ cd bvg $ ls 56335 cgtzb.szt 139481 shvgmwn.vhv 255200 wzqlgr.mhl $ cd .. $ cd fbfjs $ ls 252977 hmcj 256083 mbgfn.pmh dir qsgv $ cd qsgv $ ls 271506 dchsdfz.bbg 202650 hmcj 32623 lqgmfcp 57614 mgp.fbn 220895 qwzqrrq.wjf $ cd .. $ cd .. $ cd gsmnprgz $ ls dir dzcsldzw dir hrjmfd dir lcwv dir sdp 62355 zrncdmd.lmj $ cd dzcsldzw $ ls dir hmcj $ cd hmcj $ ls 151947 hgtzldbg $ cd .. $ cd .. $ cd hrjmfd $ ls dir drjlhbqf 65599 npj $ cd drjlhbqf $ ls 263623 hzfmzs.mlj 13866 npj 173713 wtnf.qps $ cd .. $ cd .. $ cd lcwv $ ls 44150 hmcj.lds 200694 mpbb $ cd .. $ cd sdp $ ls dir gcwjj dir qzdczvwn $ cd gcwjj $ ls 149603 qsgv.srr $ cd .. $ cd qzdczvwn $ ls dir gnvbm 291187 hmcj.rgm dir msdt dir mwvbpw dir shpr $ cd gnvbm $ ls 259516 dpbwg 120868 mpbb dir vqrcd $ cd vqrcd $ ls 306804 fqqg 34290 mtctcdgd.nmb $ cd .. $ cd .. $ cd msdt $ ls 168438 mpbb 67435 nbqcrdjs $ cd .. $ cd mwvbpw $ ls dir btzqzvbl 308719 npj $ cd btzqzvbl $ ls 177311 bdnrf.jtw 122356 qwhmd.vcd 169153 vzzzccg.hlb $ cd .. $ cd .. $ cd shpr $ ls 290591 nblzc.nmp $ cd .. $ cd .. $ cd .. $ cd .. $ cd hdwdcvv $ ls 96864 hmcj.tjn $ cd .. $ cd mhjtrlqz $ ls dir bzrbsfjp 238772 fpggqqj dir hqzgs 20155 shvgmwn.vhv $ cd bzrbsfjp $ ls 313691 fnscbhfc 17630 llwfdzgg.bsp dir lthr $ cd lthr $ ls 237053 bhbbzt.bmt $ cd .. $ cd .. $ cd hqzgs $ ls 295258 gllsgr.nnz 70743 ptpqd dir rnmsdpmj 205022 rpqh.rpn 158287 tsm.tdq 154025 wmfwr.bcm $ cd rnmsdpmj $ ls 218043 dpbwg.mls 149072 mbgfn.pmh 89388 mwvbpw.qfm 57207 rszcvm.mqc $ cd .. $ cd .. $ cd .. $ cd .. $ cd hccpl $ ls dir blqdjh dir hfqw dir qsgv $ cd blqdjh $ ls dir fbpg $ cd fbpg $ ls 231357 dpbwg $ cd .. $ cd .. $ cd hfqw $ ls 210898 fjblghm.gtg 286252 hmcj.dgz 258768 mpbb 225743 qsgv.pqf 191717 shvgmwn.vhv $ cd .. $ cd qsgv $ ls dir bslqpr dir dpbwg dir lhjmzsl 210707 npj 64435 qhpnrbhq dir rpj 301426 shvgmwn.vhv dir stbgbrw dir vhzmg $ cd bslqpr $ ls 4365 dpbwg dir fpj dir lhjmzsl dir lncmt dir mwvbpw 35725 ncbjtpcb.svf dir njhsmb dir rjzsddlw 41533 shvgmwn.vhv $ cd fpj $ ls 88146 dpbwg $ cd .. $ cd lhjmzsl $ ls 57400 fzngdsh.sbn 198711 mnqz.npt $ cd .. $ cd lncmt $ ls 192228 qsgv.jss $ cd .. $ cd mwvbpw $ ls 65217 hmcj.drs $ cd .. $ cd njhsmb $ ls 157177 dpbwg.wsl 10919 jhfs $ cd .. $ cd rjzsddlw $ ls dir cftp dir flcfwml dir vpdbl $ cd cftp $ ls 89075 dpbwg 57259 mbgfn.pmh 237771 zwglrhh $ cd .. $ cd flcfwml $ ls 51498 pbbgmqn.gfg $ cd .. $ cd vpdbl $ ls 98690 npj $ cd .. $ cd .. $ cd .. $ cd dpbwg $ ls dir wlmdbjh $ cd wlmdbjh $ ls dir pmldd 245468 rdgldw.tzb $ cd pmldd $ ls 145032 mwvbpw.tpc $ cd .. $ cd .. $ cd .. $ cd lhjmzsl $ ls 233642 dpbwg.tbq dir frsggjl dir hmcj dir jmhzlq dir jvdtpzd 251765 npj 169647 shvgmwn.vhv $ cd frsggjl $ ls dir dshv dir fqvpc dir lhjmzsl 313045 npj dir rngqmwgr $ cd dshv $ ls dir pptfqn 85609 wpgz dir zfmqls $ cd pptfqn $ ls 258817 mtctcdgd.nmb 39899 npj $ cd .. $ cd zfmqls $ ls 119006 hlw.mzg 295107 wstvdqn.wgw $ cd .. $ cd .. $ cd fqvpc $ ls dir pqpf $ cd pqpf $ ls 312566 mpbb $ cd .. $ cd .. $ cd lhjmzsl $ ls 157261 dpbwg.bgc 76700 mpbb $ cd .. $ cd rngqmwgr $ ls 42626 dpbwg.dtt 78765 gjsnmzn.fzb $ cd .. $ cd .. $ cd hmcj $ ls 166183 jntzn dir qsgv 254851 rbcgrdr.vqp $ cd qsgv $ ls 256449 dhj.mrm 49207 fbrhl 69922 lhjmzsl 121778 tpdvnb $ cd .. $ cd .. $ cd jmhzlq $ ls dir bbpqsf 245813 ftw.jwq $ cd bbpqsf $ ls 169373 mwvbpw.tjt $ cd .. $ cd .. $ cd jvdtpzd $ ls dir brfln dir dpbwg 263586 fsqzfhj.bzh 85956 lhjmzsl dir mwvbpw dir tcgwhp 91473 vjgt.twz 200413 zlnnrrpn.qqd $ cd brfln $ ls 65066 fpvnm $ cd .. $ cd dpbwg $ ls dir jtqwgc dir lrdjdqn 281885 mpbb $ cd jtqwgc $ ls 219022 spbqn $ cd .. $ cd lrdjdqn $ ls 116830 hmcj.ptr dir mwvbpw $ cd mwvbpw $ ls 251737 ccqlb $ cd .. $ cd .. $ cd .. $ cd mwvbpw $ ls 226329 fztjpfb $ cd .. $ cd tcgwhp $ ls dir grmsl $ cd grmsl $ ls dir hmcj 197995 wzqlr.fqj $ cd hmcj $ ls 239775 mbgfn.pmh dir rrvccjp 95381 shvgmwn.vhv $ cd rrvccjp $ ls dir qsgv $ cd qsgv $ ls 192956 mtctcdgd.nmb $ cd .. $ cd .. $ cd .. $ cd .. $ cd .. $ cd .. $ cd .. $ cd rpj $ ls dir bwc dir ctjwjlzc dir dpbwg dir lhjmzsl 249767 npj dir wqmlz $ cd bwc $ ls 56181 hmcj.dhd 105111 hvw 63869 rqw.srq 8030 shvgmwn.vhv dir stff $ cd stff $ ls dir gsjsc $ cd gsjsc $ ls 514 mtctcdgd.nmb $ cd .. $ cd .. $ cd .. $ cd ctjwjlzc $ ls 39823 qjgnjm.hzn $ cd .. $ cd dpbwg $ ls dir lhqrjr $ cd lhqrjr $ ls 179949 tmvl.zqf $ cd .. $ cd .. $ cd lhjmzsl $ ls 305735 shvgmwn.vhv $ cd .. $ cd wqmlz $ ls 141757 fstftggh $ cd .. $ cd .. $ cd stbgbrw $ ls 196003 dpbwg.shs dir gbr 104091 hmcj 232145 lhjmzsl.nnc dir lhv dir qqqbtpq 51208 qsgv.dbm 235090 vbpzgnr dir vqmnsdrt $ cd gbr $ ls 101809 npj 121922 pcqrmmlt.ghh 125915 ptffhc 128293 wdz.nsd $ cd .. $ cd lhv $ ls 75506 qtwlnvv.nbm 28413 rbwbp $ cd .. $ cd qqqbtpq $ ls 96300 gdf $ cd .. $ cd vqmnsdrt $ ls 146229 mwvbpw.qrc 189540 plldv.vtv dir rtng $ cd rtng $ ls 42730 hrbs.zpc $ cd .. $ cd .. $ cd .. $ cd vhzmg $ ls dir dcmjvhtt dir dpbwg $ cd dcmjvhtt $ ls 85508 hhlctr.bbs 296657 lhjmzsl.zjt 255803 mbgfn.pmh 170803 mtctcdgd.nmb $ cd .. $ cd dpbwg $ ls 156142 hmcj dir lhjmzsl $ cd lhjmzsl $ ls 13590 mtctcdgd.nmb $ cd .. $ cd .. $ cd .. $ cd .. $ cd .. $ cd jsgbg $ ls 202682 hmcj.tbl $ cd .. $ cd lhjmzsl $ ls 197308 lhjmzsl $ cd .. $ cd pngs $ ls 115979 hfpzqf.hjw dir lhjmzsl 125414 mpbb dir mwbffchr $ cd lhjmzsl $ ls 55108 hwhsjr $ cd .. $ cd mwbffchr $ ls 249138 czv.lgd $ cd .. $ cd .. $ cd qhs $ ls 108106 ccmhjzp.ppf 197911 shvgmwn.vhv $ cd .. $ cd sntcp $ ls dir cvgtwsbw dir dpbwg dir dqbzfcq dir gfvtsjmz dir ljsmjsp dir mwvbpw dir phfqzwp dir rpsnfndl dir rrqwcbqm dir rtv dir vnvft dir vqcvbncp dir vsgjds $ cd cvgtwsbw $ ls dir bprbr dir bpw dir dpbwg dir jvjs dir mwvbpw dir nbfzn dir pcr dir rhgltw $ cd bprbr $ ls 126107 dpbwg.jqq 140931 ljhc.gsm 120326 pnjv dir wbrb $ cd wbrb $ ls 28887 ccr.rvd dir gwfpgws 77898 mwvbpw.qrc 280487 pbfbtb.qjp $ cd gwfpgws $ ls 205904 dgm 313203 vpgzr.jfw $ cd .. $ cd .. $ cd .. $ cd bpw $ ls dir lgstpgrn 173334 npj $ cd lgstpgrn $ ls dir rngr $ cd rngr $ ls 291856 czjz.fzp 246123 mpbb 200301 qqfvpnz $ cd .. $ cd .. $ cd .. $ cd dpbwg $ ls 265739 mtctcdgd.nmb dir mwvbpw 76505 ntjn.mnp 227157 pqznms 312879 qzlmsht $ cd mwvbpw $ ls 144523 dpbwg.lgr 39441 mmtrnzqw.mnv 285772 mpbb 306936 rpmgcmqd.qht $ cd .. $ cd .. $ cd jvjs $ ls 51134 lsnvhd.gsj $ cd .. $ cd mwvbpw $ ls 125428 hmcj.bvd 40162 npj 117658 pmzfj.crj $ cd .. $ cd nbfzn $ ls 11429 mwvbpw.swl 5582 qsgv.jrm $ cd .. $ cd pcr $ ls dir dpbwg 95858 mtctcdgd.nmb $ cd dpbwg $ ls dir wmsb $ cd wmsb $ ls 154498 npj $ cd .. $ cd .. $ cd .. $ cd rhgltw $ ls 188447 qsgv.rzs $ cd .. $ cd .. $ cd dpbwg $ ls 261326 cjfszwr 88528 glp.fgc dir lhjmzsl 270470 shvgmwn.vhv 310081 vdhmgb dir wsc $ cd lhjmzsl $ ls 245410 dnnfljbs $ cd .. $ cd wsc $ ls dir lhjmzsl 311302 mbs.tqc 309985 mpbb dir qgpqzr 20812 vhcc.wpw $ cd lhjmzsl $ ls dir dpbwg $ cd dpbwg $ ls 273340 fmvbcphl.crp $ cd .. $ cd .. $ cd qgpqzr $ ls dir fdwgdhrf $ cd fdwgdhrf $ ls 275421 mtctcdgd.nmb $ cd .. $ cd .. $ cd .. $ cd .. $ cd dqbzfcq $ ls 30930 njnz $ cd .. $ cd gfvtsjmz $ ls 290134 mbgfn.pmh 154689 vql $ cd .. $ cd ljsmjsp $ ls 59894 hwggw.rpd 26336 mbgfn.pmh dir mvzchpq dir mwvbpw 122061 zlcr.jsw $ cd mvzchpq $ ls 294618 lhjmzsl.bqm dir mwvbpw 204294 nljhbh.cfc 79337 ntvt.dbw $ cd mwvbpw $ ls dir njwcqcjh 309971 nqdv.vmp $ cd njwcqcjh $ ls 155159 mtctcdgd.nmb $ cd .. $ cd .. $ cd .. $ cd mwvbpw $ ls 43451 lhjmzsl.vjt $ cd .. $ cd .. $ cd mwvbpw $ ls 3144 phvjzs.prf $ cd .. $ cd phfqzwp $ ls dir hmcj dir hnnrw 196279 lhjmzsl 90948 mwvbpw.hvm 275082 shvgmwn.vhv $ cd hmcj $ ls 4346 mtctcdgd.nmb $ cd .. $ cd hnnrw $ ls dir lhjmzsl 103070 qsbrf.tpv dir rdf $ cd lhjmzsl $ ls 158692 dpbwg.bvl $ cd .. $ cd rdf $ ls dir gpj dir lbgpm $ cd gpj $ ls 136508 shvgmwn.vhv $ cd .. $ cd lbgpm $ ls 154457 ccpvr 232065 lhjmzsl 43787 npj 189920 rpgmvv 96362 tlmvpc $ cd .. $ cd .. $ cd .. $ cd .. $ cd rpsnfndl $ ls dir pcbtmcwf $ cd pcbtmcwf $ ls dir qsgv $ cd qsgv $ ls 45662 npj $ cd .. $ cd .. $ cd .. $ cd rrqwcbqm $ ls dir vjm $ cd vjm $ ls 263137 npj $ cd .. $ cd .. $ cd rtv $ ls dir lhjmzsl dir pcwsn dir qsgv dir vvzbsg $ cd lhjmzsl $ ls dir qzsjhsfn $ cd qzsjhsfn $ ls 26909 mbgfn.pmh $ cd .. $ cd .. $ cd pcwsn $ ls 160033 ftz.nbg 145165 wgdjsgsb.hhm $ cd .. $ cd qsgv $ ls dir jqm 136209 mbgfn.pmh 79664 mghdlnh.chv $ cd jqm $ ls 222831 npj $ cd .. $ cd .. $ cd vvzbsg $ ls 84246 dpbwg.tsq $ cd .. $ cd .. $ cd vnvft $ ls dir crqrl dir scdvzsd $ cd crqrl $ ls 13185 dpbwg.twz 109021 qcdqnhg.jjj $ cd .. $ cd scdvzsd $ ls dir hmcj $ cd hmcj $ ls 252155 npj $ cd .. $ cd .. $ cd .. $ cd vqcvbncp $ ls 72128 crnhb dir ddz dir dvhzvdn dir ffsbcmg dir gfs dir jghlb dir llq dir pvn dir rvqmmjgr $ cd ddz $ ls 232302 gdfqpnj.nhf 274940 lhjmzsl.mzv 286217 mpbb $ cd .. $ cd dvhzvdn $ ls 273183 cfnqn.qpz $ cd .. $ cd ffsbcmg $ ls 6544 mtctcdgd.nmb 52511 wndzt.lqb $ cd .. $ cd gfs $ ls 228312 mwvbpw.tdj dir rqjrfzgt 62100 shc.rtj 313984 szsplzq.dpd dir tqtnp $ cd rqjrfzgt $ ls 296460 bvp 272324 mbgfn.pmh 221044 npj 110232 qvcszzv $ cd .. $ cd tqtnp $ ls 98376 tzwh 212247 wzjj.scp $ cd .. $ cd .. $ cd jghlb $ ls dir ddrmsv $ cd ddrmsv $ ls 252143 mbgfn.pmh $ cd .. $ cd .. $ cd llq $ ls dir lhjmzsl 67341 mbgfn.pmh 155159 npj dir qsgv dir vcvnzc $ cd lhjmzsl $ ls 151930 ssldrsf.mzm $ cd .. $ cd qsgv $ ls 233702 ztdmtqb.mhf $ cd .. $ cd vcvnzc $ ls 168179 lhjmzsl.cwf $ cd .. $ cd .. $ cd pvn $ ls 240160 lbd.slf $ cd .. $ cd rvqmmjgr $ ls 24809 gwgcrzp.zhj dir hmcj dir lhjmzsl dir mwvbpw 121997 nbmf 77886 ntp dir qcqrgdm $ cd hmcj $ ls 126073 dpbwg.lhh dir jchccghv dir lhjmzsl 144075 qsgv.lbw 288076 swrngbsq.qzw $ cd jchccghv $ ls 310277 mpbb $ cd .. $ cd lhjmzsl $ ls 193576 bwsz.crv 16002 mbgfn.pmh 57961 mtctcdgd.nmb $ cd .. $ cd .. $ cd lhjmzsl $ ls dir bsfwmcz dir dpbwg 121640 mwvbpw dir pmrfvzw dir qsgv $ cd bsfwmcz $ ls dir fjqqblz 51952 gqbj.fwd dir hmcj dir lctt 81316 lhjmzsl.qqr 6372 mbgfn.pmh 22669 shvgmwn.vhv 130990 zgq.fpv $ cd fjqqblz $ ls 26064 zrqrnb.nwf $ cd .. $ cd hmcj $ ls 14385 mwvbpw.vzq $ cd .. $ cd lctt $ ls 137397 fbgbs.fjf dir jgbzqzq dir qrr 272639 qsgv.vwm $ cd jgbzqzq $ ls 135320 mpbb $ cd .. $ cd qrr $ ls dir dpbwg dir mwvbpw 54143 pnsl.bbm dir wbpzpg $ cd dpbwg $ ls 250653 shvgmwn.vhv $ cd .. $ cd mwvbpw $ ls 2682 fhdh.hmt $ cd .. $ cd wbpzpg $ ls dir bqshqpvm 141398 mtctcdgd.nmb 130729 vtnfmjqm.mgp $ cd bqshqpvm $ ls 252449 shvgmwn.vhv $ cd .. $ cd .. $ cd .. $ cd .. $ cd .. $ cd dpbwg $ ls 82216 gwjwmcbf.gwl $ cd .. $ cd pmrfvzw $ ls dir mwvbpw dir wtzgjspz dir zmb $ cd mwvbpw $ ls 16736 wbzjzz.mqq $ cd .. $ cd wtzgjspz $ ls dir vjb $ cd vjb $ ls 301763 drchphtm $ cd .. $ cd .. $ cd zmb $ ls 201978 mdj dir qgnffw 147889 qzbmwpnm.gjp $ cd qgnffw $ ls 17740 cwz.dhs 222345 mbgfn.pmh 81554 npj 206597 tsnlnzh $ cd .. $ cd .. $ cd .. $ cd qsgv $ ls dir mmsnzr $ cd mmsnzr $ ls 160502 tgrztm $ cd .. $ cd .. $ cd .. $ cd mwvbpw $ ls 40049 qmmdv 313418 qsgv.srp $ cd .. $ cd qcqrgdm $ ls 202848 wtl.qbj $ cd .. $ cd .. $ cd .. $ cd vsgjds $ ls 138690 npj 22984 tpfbnz.sgj $ cd .. $ cd .. $ cd sqs $ ls dir zms $ cd zms $ ls 152096 cvtqph.wwp dir mmwzg $ cd mmwzg $ ls 100870 qsgv

Dold text

Edit: Sorry! Missade helt att du var på del1

Svaret med min lösning blir ~10% större

Av survivalcode
Skrivet av GLaDER:

Dag: 25
Språk: Python 3
Lösning: GitHub

Idag gjorde jag en upptäckt i Python!

Själva steglogiken i min initiala lösning såg ut såhär:

def move(east, south, width, height): new_east = dict() new_south = dict() for (x, y) in east: if ((x + 1) % width, y) not in east | south: new_east[((x + 1) % width, y)] = ">" else: new_east[(x, y)] = ">" for (x, y) in south: if (x, (y + 1) % height) not in south | new_east: new_south[(x, (y + 1) % height)] = "v" else: new_south[(x, y)] = "v" return new_east, new_south

Jag tyckte det var snyggt att jag lyckades hålla isär östgående och södergående sjögurkor i olika ordböcker och sedan bara slå ihop dem vid behov. (Egentligen var jag inne på att göra samma sak, fast med listor, men dit kom jag aldrig.) Lösningen ovan är dock vansinnigt långsam. Jag kan bara anta att just: x | y-operationen är väääldigt långsam.

Skrev om lösningen till att bara använda en ordbok:

def move_east(sea, width): new_sea = dict() for (x, y) in sea: if sea[(x, y)] == ">" and ((x + 1) % width, y) not in sea: new_sea[((x + 1) % width, y)] = ">" else: new_sea[(x, y)] = sea[(x, y)] return new_sea def move_south(sea, height): new_sea = dict() for (x, y) in sea: if sea[(x, y)] == "v" and (x, (y + 1) % height) not in sea: new_sea[(x, (y + 1) % height)] = "v" else: new_sea[(x, y)] = sea[(x, y)] return new_sea

och nu får jag en lösing på typ 1.5 sekunder.

Kan någon av Python-proffsen här i tråden komma med någon insikt här?

Dold text

Det går säkert att golfa lite till och få till ännu snyggare kod, men jag har fortfarande inte tagit tag i uppgift 19; den har prio. Det är dock julfirande på ingång här så det ligger i farans riktning att jag får lösa uppgift 19 på planet tillbaka till Sverige, i mellandagarna.

Tack för i år kamrater. Lika trevligt som alltid!

Hmm, jag har inte helt satt mig in i din lösning men jag tycker det ser ut som att ditt misstag är att du beräknar unionen på nytt mellan east och south, för varje element i east. I och med att du inte uppdaterar east eller south skulle du kunna beräkna unionen (en gång) innan loopen istället. Samma sak i andra loopen med south | new_east.

Dold text
Av survivalcode
Skrivet av Thomas:

Är det fel i beskrivningen för dag 18, eller missförstår jag bara?

Vilka listor är det som de pratar om på varje rad före kolon?
Det ser mera ut som att meningen ska vara t ex "The final sum of the list [[[[3,0],[5,3]],[4,4]],[5,5]] is:"

Har dock inte kollat igenom uppgiften ordentligt och börjat koda, men om det ovan inte stämmer känns det rätt otydligt skrivet.

Det som menas är att om din input är

[1,1] [2,2] [3,3] [4,4]

så ska summan bli

[[[[1,1],[2,2]],[3,3]],[4,4]]

Det är otydligt skrivet.

Av survivalcode

Dag: 15
Språk: Python

from heapq import heapify, heappop, heappush import numpy as np REPEAT_COUNT = 5 p1_world = np.array([[int(c) for c in line.rstrip()] for line in open("15.in")]) p2_world = ( np.tile(p1_world, (REPEAT_COUNT, REPEAT_COUNT)) + np.repeat(np.arange(REPEAT_COUNT), len(p1_world))[:, None] + np.repeat(np.arange(REPEAT_COUNT), len(p1_world))[None, :] ) p2_world[p2_world > 9] -= 9 def calc_risk(pos): return p2_world[pos[0]][pos[1]] def generate_neighbours(world, i, j): HEIGHT, WIDTH = world.shape for di, dj in ((0, 1), (1, 0), (0, -1), (-1, 0)): if 0 <= (n_i := i + di) < HEIGHT and 0 <= (n_j := j + dj) < WIDTH: yield n_i, n_j def find_bottom_right_risk(world): HEIGHT, WIDTH = world.shape goal = (HEIGHT - 1, WIDTH - 1) frontier = [(0, (0, 0))] heapify(frontier) seen = set([(0, 0)]) while frontier: risk, pos = heappop(frontier) if pos == goal: return risk for n in generate_neighbours(world, *pos): if n not in seen: seen.add(n) heappush(frontier, (risk + calc_risk(n), n)) raise NotImplementedError print(find_bottom_right_risk(p1_world)) print(find_bottom_right_risk(p2_world))

Dold text
Av survivalcode

Dag: 14
Språk: Python

from collections import defaultdict, Counter start_string, unparsed_rules = open("14.in").read().split("\n\n") rules = dict(tuple(x.rstrip().split(" -> ")) for x in unparsed_rules.splitlines()) pairs = Counter(start_string[i : i + 2] for i in range(len(start_string) - 1)) char_count = Counter(start_string) def get_maximum_span() -> int: return max(char_count.values()) - min(char_count.values()) for i in range(40): if i == 10: print(get_maximum_span()) new_pairs = defaultdict(int) for pair, cur_count in pairs.items(): if pair in rules: c = rules[pair] new_pairs[pair[0] + c] += cur_count new_pairs[c + pair[1]] += cur_count char_count[c] += cur_count pairs = new_pairs print(get_maximum_span())

Dold text
Av survivalcode

Dag: 13
Språk: Python

from math import prod from typing import Generator, Tuple import numpy as np data = np.zeros((2000, 2000), dtype=bool) folds = [] max_i = 0 max_j = 0 for line in open("13.in"): line = line.rstrip() if "," in line: i, j = list(map(int, line.split(","))) data[j][i] = True max_i = max(max_i, j) max_j = max(max_j, i) elif "fold" in line: folds.append(line) data = data[: max_i + 1 + (max_i % 2), : max_j + 1 + (max_j % 2)] HEIGHT, WIDTH = data.shape def print_matrix(matrix): print("\n".join("".join("x" if c else " " for c in row) for row in matrix)) for f in folds: a, b = f.split(" ")[-1].split("=") HEIGHT, WIDTH = data.shape if a == "y": data = data[: HEIGHT // 2] | np.flip(data, axis=0)[: HEIGHT // 2] if a == "x": data = data[:, : WIDTH // 2] | np.flip(data, axis=1)[:, : WIDTH // 2] print_matrix(data)

Dold text
Av survivalcode
Skrivet av GLaDER:

Dag: 12
Språk: Python 3
Lösning: GitHub

Jag har svårt för det här med rekursion. Jag ser ju direkt att en uppgift som denna lämpar sig väldigt väl för en rekursiv DFS, men trots det sitter jag läääänge och försöker göra en iterativ variant. Tillslut fick jag ge upp och ge mig ut på rekursionsjakt på Internet. Aja. Tillräckligt många sådana här uppgifter så kanske jag ger med mig och lär mig gilla rekursion.

Dold text

Började också på en iterativ variant men gav upp rätt snabbt när det blev för svårt :). Är själv ett fan av rekursionslösningar; identifiera måldefinition samt hur du tar dig till nästa steg så är problemet löst mer eller mindre.

Dold text
Av survivalcode

Dag: 12
Språk: Python

Nej, den är inte optimerad för läsbarhet eller prestanda.

from collections import defaultdict from typing import List neighbours = defaultdict(list) for line in open("12.in"): a, b = line.rstrip().split("-") neighbours[a].append(b) neighbours[b].append(a) def explore(cave: str, seen: List[str], allow_double_visits: bool) -> int: return int(cave == "end") + sum( explore(neighbour, seen + [cave] if cave.islower() else seen, not_seen and allow_double_visits) for neighbour in neighbours[cave] if ((not_seen := (neighbour not in seen)) or allow_double_visits) and cave not in ("start", "end") ) print(sum(explore(start, [], False) for start in neighbours["start"])) print(sum(explore(start, [], True) for start in neighbours["start"]))

Dold text
Av survivalcode

Dag: 11
Språk: Python 3

import numpy as np from scipy.signal import convolve2d grid = np.array([[int(x) for x in line.rstrip()] for line in open("11.in")]) flash_count = 0 step = 0 while grid.any(): step += 1 grid += 1 has_flashed = np.zeros_like(grid, dtype=bool) while not np.all((could_flash := (grid > 9)) == has_flashed): grid += convolve2d(could_flash & ~has_flashed, [[1, 1, 1], [1, 0, 1], [1, 1, 1]], "same") has_flashed[could_flash] = True flash_count += np.sum(has_flashed) grid[could_flash] = 0 if step == 100: print(flash_count) print(step)

Dold text
Av survivalcode
Skrivet av GLaDER:

Dag: 11
Språk: Python 3
Lösning: GitHub

Väldigt straight-forward idag, imho. Det var dock en hel del kod att skriva -- för mig -- så trillade in runt plats 4 000. Blev också rejält biten av att jag inte kunde göra:

grid[np.argwhere(grid > 9)] = 0

Istället var jag tvungen att göra:

for (cx, cy) in np.argwhere(grid > 9): grid[cx, cy] = 0

@MultiMike, @survivalcode eller @Ingetledigtnamn kanske vet varför? (Och har kanske allmäna tips kring hur jag kan banta ner min lösning!?)

Dold text

Förväntade mig mer kod än så när jag klickade på länken, jag har själv någonting liknande :).

Angående np.argwhere så ger det tillbaka en matris där varje rad innehåller index för den cell som uppfyller vilkoret. Dvs

[[i1,j1],[i2,j2],[i3,j3],[i4,j4]]

När du sen försöker indexera med dessa gör du något som kallas "advanced indexing", vilket är en generalisering av hur indexering med integers sker om jag förstår det rätt. Precis som när du indexerar med M[row_idx, col_idx] så kommer M[row_matrix, col_matrix] indexera M genom att kombinera row & col. I ditt fall skickar du bara in row_matrix, vilket gör att du bara indexerar i första dimensionen och får tillbaka alla kolumner för de rader som matchar.

Ett alternativ är np.nonzero(condition) som ger tillbaka två matriser på formatet

([i1,i2,i3,i4],[j1,j2,j3,j4])

, dessa kan du sedan använda för indexering.

Min personliga favorit är dock att använda boolmasken direkt för indexering;

grid[grid > 9] = 0

Av survivalcode

Dag: 10
Språk: Python

from typing import Tuple start_chars = "[{<(" end_chars = "]}>)" char_opposites = dict(zip(start_chars, end_chars)) | dict(zip(end_chars, start_chars)) char_scores = {")": 3, "]": 57, "}": 1197, ">": 25137, "(": 1, "[": 2, "{": 3, "<": 4} def score_line(line: str) -> Tuple[int, int]: valid_score = 0 invalid_score = 0 stack = [] for c in line: if c in start_chars: stack.append(c) elif stack.pop(-1) != char_opposites[c]: return 0, char_scores[c] while stack: c = stack.pop(-1) valid_score = valid_score * 5 + char_scores[c] return valid_score, invalid_score valid_scores, invalid_scores = zip(*((score_line(line.rstrip())) for line in open("10.in"))) valid_non_zero = [x for x in valid_scores if x > 0] print(sum(invalid_scores)) print(sorted(valid_non_zero)[len(valid_non_zero) // 2])

Dold text
Av survivalcode

Dag: 9
Språk: Python

from typing import Generator, Tuple from math import prod data = [[int(x) for x in line.rstrip()] for line in open("9.in")] HEIGHT = len(data) WIDTH = len(data[0]) def generate_neighbours(i: int, j: int) -> Generator[Tuple[int, int], None, None]: for di, dj in ((0, 1), (1, 0), (0, -1), (-1, 0)): if 0 <= (n_i := i + di) < HEIGHT and 0 <= (n_j := j + dj) < WIDTH: yield n_i, n_j def measure_basin(i: int, j: int) -> int: seen = set() frontier = [(i, j)] while frontier: point = frontier.pop(-1) seen.add(point) frontier += [p for p in generate_neighbours(*point) if p not in seen and data[p[0]][p[1]] < 9] return len(seen) low_points = [ (i, j) for i in range(HEIGHT) for j in range(WIDTH) if all(data[n_i][n_j] > data[i][j] for n_i, n_j in generate_neighbours(i, j)) ] p1 = sum(data[i][j] + 1 for i, j in low_points) p2 = prod(sorted(measure_basin(*low_point) for low_point in low_points)[-3:]) print(p1, p2)

Dold text
Av survivalcode

Dag: 8
Språk: Python

Nytt bottenrekord för i år, lyckades missförstå första uppgiften extremt. Oh well

rows = open("8.in").readlines() p1 = sum(len(segment) in [2, 3, 4, 7] for row in rows for segment in row.split(" | ")[1].split()) p2 = 0 for line in rows: inputs, outputs = line.split(" | ") segments = list(map(frozenset, inputs.split())) one = next(x for x in segments if len(x) == 2) four = next(x for x in segments if len(x) == 4) seven = next(x for x in segments if len(x) == 3) eight = next(x for x in segments if len(x) == 7) three = next(x for x in segments if len(x) == 5 and x | one == x) nine = next(x for x in segments if len(x) == 6 and x == four | three) zero = next(x for x in segments if len(x) == 6 and x != nine and x | one == x) six = next(x for x in segments if len(x) == 6 and x != nine and x != zero) five = next(x for x in segments if len(x) == 5 and (nine - one) | x == x) two = next(x for x in segments if len(x) == 5 and x != three and x != five) lookup = dict(zip((zero, one, two, three, four, five, six, seven, eight, nine), map(str, range(10)))) p2 += int("".join(lookup[o] for o in map(frozenset, outputs.split()))) print(p1, p2)

Dold text
Av survivalcode

Dag: 7
Språk: Python

Ugh, mängden tankevurpor på del2 var rätt extrem idag*facepalm*.

data = list(map(int, open("7.in").read().split(","))) dist_costs = [sum(range(x)) + x for x in range(max(data) + 1)] print(min(sum(dist_costs[abs(x - i)] for x in data) for i in range(max(data))))

Dold text
Av survivalcode

Dag: 6
Språk: Python

fishes = list(map(int, open("6.in").readline().split(","))) for num_days in (80, 256): days = [0] * 7 for fish in fishes: days[fish] += 1 tot = len(fishes) prev_spawned = 0 prev_prev_spawned = 0 for day in range(num_days): spawned = days[day % 7] tot += spawned days[day % 7] += prev_prev_spawned prev_prev_spawned = prev_spawned prev_spawned = spawned print(tot)

Dold text
Av survivalcode

Dag: 5
Språk: Python

import re from collections import defaultdict from itertools import zip_longest pos_count = defaultdict(int) for line in open("5.in"): x1, y1, x2, y2 = map(int, re.split("\D+", line.rstrip())) xd = 1 if x2 > x1 else -1 yd = 1 if y2 > y1 else -1 for x, y in zip_longest(range(x1, x2 + xd, xd), range(y1, y2 + yd, yd), fillvalue=y1 if y1 == y2 else x1): pos_count[(x, y)] += 1 print(sum(1 for v in pos_count.values() if v >= 2))

Dold text
Av survivalcode
Skrivet av Ingetledigtnamn:

Dag: 4
Språk: Python, eller rättare sagt list comprehensions och numpy. Under 20 rader, inklusive whitespace och en kommentar

När jag såg uppgift två skrotade jag min första lösning och löste båda på en gång.

import numpy as np l = [l.strip() for l in open("input04").readlines()] numbers = [int(n) for n in l[0].split(",")] lines = [[int(i) for i in line.split()] for line in l[2:] if line] boards = [np.array(lines[i:i + 5]) for i in range(0, len(lines), 5)] def turns_to_win_and_score(board): for i, n in enumerate(numbers): board[np.where(board == n)] = -n # any line or column where all the numbers are negative? if any([line.all() for x in [board < 0, board.transpose() < 0] for line in x]): return i, sum(board[board >= 0]) * n bingos = list(map(turns_to_win_and_score, boards)) print(min(bingos)[1], max(bingos)[1])

Dold text

Snyggt! Mycket enklare än så här går det nog inte göra :). Det verkar som att det smygit med en typo för dina villkor dock, 0 måste inkluderas i jämförelsen för att det ska bli rätt, dvs

board < 0, board.transpose() < 0

blir

board <= 0, board.transpose() <= 0

Dold text
Av survivalcode

Dag: 4
Språk Python

Det var en stund sen numpy användes märker jag, har en känsla av att det går att göra betydligt snyggare lösningar.

import numpy as np with open("4.in") as f: nums, *boards = f.read().split("\n\n") nums = [int(x) for x in nums.split(",")] boards = np.array([[[int(x) for x in row.split()] for row in board.rstrip().split("\n")] for board in boards]) board_states = np.ones_like(boards) def bingos(board_states): return np.any((np.sum(board_states, axis=1) == 0) | (np.sum(board_states, axis=2) == 0), axis=1) p1 = None p2 = None previous_bingos = bingos(board_states) for num in nums: board_states[boards == num] = 0 current_bingos = bingos(board_states) new_bingos = previous_bingos ^ current_bingos if np.any(new_bingos): bingo_id = np.where(new_bingos) score = np.sum(boards[bingo_id] * board_states[bingo_id]) p2 = score * num if p1 is None: p1 = p2 previous_bingos = current_bingos print(p1, p2)

Dold text