Tagad — arī ar iespēju komentēt!

Programmētāju sacensības: ICFP-2022

Nesen beidzās ikgadējās ICFP sacensības — ikgadējs onlaina pasākums, kurā katru gadu vienu nedēļas nogali savā starpā sacenšas ap simts programmētāju grupiņām, risinot kādu viltīgu uzdevumu, un es tajās piedalos ik gadu jau kopš 2010. gada.

Atkarībā no tā gada organizētāju jaudas un uzņēmības, uzdevumi un tos apvijošie stāsti mēdz būt visdažādākie. Pāris gadus atpakaļ organizētāji bija īpaši pacentušies, un mums bija jāuzraksta realizācija no tālas planētas saņemtas ziņas, kuras saturēja specifikāciju īpatnējiem mašīnkodiem, kurus realizējot, radās iespēja iedarbināt citplanētiešu atsūtītu kodu, izveidojot pat galaktisko datora termināli, kuru, pienācīgi izpētot, varēja mesties, ak, kosmiskās kuģu cīņās pret citām komandām.

Šīgada uzdevums nebija tik piņķerīgs, un es varu te pat nodoties nelielām vizualizācijām.

Tātad, uzdevums. Tev tiek iedots 400x400px balts dēlītis un aprakstītas iespējamās darbības, itin vienkāršas, piemēram —

  1. salauzt bloku divos mazākos taisnstūra blokos, laužot to pa vertikāli vai horizontāli,
  2. salauzt bloku četros mazākos taisnstūra blokos,
  3. apvienot divus blakus stāvošus taisnstūra klucīšus,
  4. izkrāsot bloku kādā vienā krāsā.

un uzdevums ir ar šīs darbības uzrakstīt nelielu skriptu, kurš, laužot un krāsojot, izveidos attēlu, iespējami līdzīgu uzdotiem piemēriem.

Daži no uzdevumiem

Problēmas sāls ir tajā, ka katra darbība maksā kādu punktu skaitu, un izmaksas ir atkarīgas no tā, cik mazs ir bloks — jo mazāks bloks, jo proporcionāli dārgāk ir to nokrāsot vai sadalīt mazākos.

Jo mazāku krāso vai salauž, jo grandiozi dārgāk tas maksā: oriģinālā 400x400 bloka nokrāsošana vienā krāsā maksā 7 punktus, kamēr niecīga 1x1px bloka krāsošana izmaksā jau virs miljona.

Neiedziļinoties punktu skaitīšanas detaļās (to var izlasīt uzdevuma aprakstā), miljoni uz pikseļu krāsošanu ir nepieņemami, tāpēc uzdevums ir attēlu ģenerēšana, kuri nav pārāk dārgi izveidē, bet ir pietiekami līdzīgi oriģināliem.

Trīs dienas intensīva kopdarba, un mūsu risinātājs darbojās kaut kā šādi:

Mūsu risinājums Vermēra meitenei ar pērļu kaklarotu. Ar klikšķi aizies animācija

Not good, not terrible, un 29. vieta kopvērtējumā.

Salīdzinājumam, šādi darbojās uzvarētāju algoritms:

Sacensību līderu — Unagi komandas — risinājums šim pašam uzdevumam

Var novērot, kā attēls tiek veidots šaurās strēmelītēs no vienas malas, visu laiku krāsojot maksimāli lielu dēli. Velni!

Kaut kādi atzinumi:

  • Rust ir brīnišķīga valoda, un “cargo doc”, kurš uzģenerē bibliotēku aprakstu, iekļaujot visādus dzīva koda testu piemērus, kļūst par teicamu kopdarbošanās pieredzi, pat strādājot pie viena un tā paša projekta pie blakus galdiem,
  • bugi līdīs tieši tajās vietās un tajās funkcijās, kurās tu neuzrakstīsi testu (doh!),
  • turnīra tabula, kuru regulāri refrešot, ir tāāāāāāds dopamīna avots, no kura ir grūti atrauties sacensību laikā,
  • divdesmit devītā vieta nerulz.

Izmēģini arī tu, sacensības ir baigais kaifs, un varbūt tiekamies nākamgad!