Sabtu, 24 Maret 2018

Menutup Poligon

Phew, baru sempet nulis lagi...

Aslinya banyak yang terjadi, kayak kesalahan konyol di Kickstart Round A, kehidupan kuliah yang tambah broken, sama kegeblekan lainnya. Cuma kayaknya sekarang mau fokus nulis tentang salah satu soal yang kuurus di TOKI Open Contest Maret 2018, Menutup Poligon (Sulit & Mudah).

Jadi kalau mungkin belum sadar, di pengumuman TOC, ada namaku nongol di belakang. Yep, mulai bulan ini, aku juga ikut jadi panitia TOC. Bantu ngurus-ngurus gitu. Moga aja gak jadi beban T_T Btw, dari panitia TOC cuma aku yang sekarang domisilinya di Indonesia :")

Buat TOC kemaren, sebenernya aku ngurus testcase buat 3 soal, yakni Menutup Poligon (Sulit & Mudah), sama Lapangan Tembak (Sulit). Walaupun sebenernya jadi kayak ngurus 4 soal, karena runner Lapangan Tembak (Sulit) juga diedit jadi versi mudah-nya, sama Ammar tapi. Tapi well, mari fokus ke soal yang bikin testcase-nya itu kayak neraka.

Oiya, tulisan di bawah mungkin aja mengandung spoiler ya. Sudah saya tulis warning di sini :P

Btw, ini cara aku buat testcase. Kalau ada cara yang lebih elegan (dan aku sangat berharap ada), bisa komentar di bawah :D

Jadi, soal versi sulit kan intinya ngecek bisa tutup pake persegi 2 x 2. Nah, cuma gimana caranya bisa bikin testcase yang ukurannya besar, dan jawabannya "YA"?  Yang pertama kepikiran sih jelas, bikin persegi 2 x 2 yang nempel-nempel. Jadi pertama bikin grid, terus pasang-pasang persegi. Kalo udah,  transformasi grid-nya jadi format masukan yang diminta. Idenya sih gitu.

Cuma, pertama-tama, sebelum aku ngoding itu....
Aku harus bikin validator constraint-nya.
Terus aku gak tau caranya ngecek poligon gak ada motong diri sendiri selain dalam O(N^2).
Mantap gan.

Berhubung soal ini harusnya gak perlu bikin testcase yang banyak garis miringnya, aku jadinya bikin 4 pengecekan: motong horizontal-horizontal, vertikal-vertikal, horizontal-vertikal, sama garis miring-bebas. 3 Pertama bisa O(N log N), yang terakhir O(garis_miring * N). Jadi selama garis miringnya gak banyak, harusnya ngeceknya gak lama. Cuma ini ngodingnya neraka :"""

Oiya, kalo ada yang tau cara ngecek apakah poligon gak ada motong diri sendiri yang cepet, mungkin bisa komentar di bawah juga :"""

Nah, setelah bikin validator constraint, balik ke bikin jawaban "YA" yang gede.

Aku pertama bikin cara transformasi grid-nya jadi poligon, sesuai format masukan. Sebenernya gak terlalu susah, cuma nelusurin sisi-sisi poligon menurut arah jarum jam doang. Agak hardcode sih, nanganin jalan sama beloknya. Gak terlalu susah, cuma ngerasa ini bisa jadi 1 soal sendiri.

Habis meyakini transformasinya dah bener, aku bikin generator nempel-nempel persegi 2 x 2. Iseng, cek kalo perseginya 5, bisa. Langsung hajar gede, coba perseginya 50.000. Gagal, ada constraint yang dilanggar. Ada titik yang muncul 2 kali di input. Hmmm, harusnya gak mungkin gini. Coba perseginya 10. Gak gagal, tapi jawabannya "TIDAK".

wat. wat. wat. wat.

Aku coba cetak poligon sama petak-petak grid yang ditempeli persegi. Hasilnya kayak gini:


Yang disilangin itu petak yang ditempeli persegi. Pas sadar ada petak bolong, yakni petak yang dihitamkan itu, rasanya:


Jadi ya, intinya gak bisa main tempel sembarangan aja. Aku harus periksa juga apakah dengan masang itu, bakal bikin "lubang" di poligon akhirnya. Jadi yang begini ya gak boleh:


Cuma gimana coba ngeceknya? Berhubung "lubang"-nya bisa ukurannya apa aja, aku cuma kepikiran flood-fill awalnya, yang gak mungkin feasible kalo untuk bikin testcase. Pusing parah itu.

Cuma gak mungkin nyerah untuk bikin testcase-nya, berhubung TOC-nya udah dekat :"" Jadinya aku coba pikir lagi gimana cara ceknya. Aku curiga bisa dibikin pake properti planar graph. Rasanya dulu pas matdis 2 pernah dapet formula terkait vertex, edge, sama face di planar graph. Terus nemu laman di Wikipedia terkait itu.

Jadinya aku coba modelkan jadi  planar graph: anggap petak 1 x 1 itu 1 vertex. Lalu, buat edge di antara 2 vertex yang bersebalahan dan udah ditempeli. Aku bisa itung face yang berupa persegi 2 x 2. Kalau gak ada "lubang", harusnya total face yang bisa kuitung itu sama dengan v - e + f = 1, dikurangi satu karena ada face di luar grafnya. Misal untuk gambar di atas, graf-nya artinya begini:

Ada 12 vertex, 16 edge, sama 4 face persegi 2 x 2. Tapi, 12 - 16 + 4 = 0, artinya ada satu face yang gak kuitung, yakni yang di tengah. Maintain banyak vertex, edge, sama face gak terlalu susah. Artinya, secara ajaib aku bisa nanganin agar tidak ada "lubang".

Jadi ini rasanya mendapatkan pencerahan.

Habis aku tambahin pengencekan itu, code-ku udah berantakan banget. Aku coba generate testcase lagi.

Gagal. Ada titik yang muncul 2 kali di poligon.


Jadi ini rasanya frustrasi.

Aku coba cetak poligonnya lagi. Kurang lebih begini potongannya:

intinya gambar yang di tengah
Pas liat gambar kurang lebih ngeh sih. Jadi, ada 2 petak yang sharing sudut doang (yang ditandai titik di atas), bikin "lubang" lagi. Bingung sih ini harus diapain. Cuma firasatku, cukup cek apakah ada petak yang sharing sudut doang udah cukup, karena kalo nggak sudut doang, "lubang" pasti kena kasus planar sebelumnya. Pas dicoba, udah gak ada yang gagal lagi. Yey!

Setelah bikin untuk nempel-nempel 2 x 2, aku juga bikin untuk nempel 1 x 1, karena bakal berguna untuk bikin testcase invalid dan bikin testcase versi mudah soal ini. Setelah itu, aku juga bikin fungsi buat hapus sembarang titik, niatnya biar poligonnya jadi punya garis miring. Cuma ngebug-ngebug, hingga akhirnya jalan. Ini fungsi dibutuhin soalnya buat versi mudah dari soal ini.

Habis itu, nambahin testcase manual dari Ammar, sama pattern pemasangan persegi dari Jonmul. Udah beres, sisa di-review. Pas review, baru sadar kalo validator perpotongan vertikal-vertikal sama horizontal-horizontal ngebug T_T Jadinya beberapa testcase manual Ammar lolos. Habis benerin validator, testcase-nya Ammar jadi harus diubah dikit. Udah deh.

Btw, ini gak tau gimana rasanya yang nge-review. > 1000 baris. Sebenernya bisa aja di-refactor karena beberapa fungsi mirip, cuma otakku udah overheat. Parah. Btw, untuk versi mudah sih gak terlalu susah begitu yang versi sulit udah jadi. Tinggal comot validator, masang 1 x 1, sama hapus titik.

Habis entah gimana caranya ini runner bisa lolos review, soalnya dipasang. Di kontesnya, soal ini mayan berdarah-darah hasilnya.


Gak papa, yang bikin testcase-nya juga berdarah-darah kok. Seenggaknya ada 3 soal di pembuatan testcase-nya: solusi-nya, transformasi grid ke poligon, sama cek planar. Ini juga gak ngitungin soal ke-4, ngecek validitas testcase.

Sampai sekarang, kayaknya ini soal paling berdarah-darah yang pernah kuurus deh. Semoga gak ngurus soal beginian hingga beberapa waktu lagi :""

Mungkin sekian aja kali ya, sampai bertemu di post selanjutnya :D

Sabtu, 03 Maret 2018

Daily Life #4

Wah minggu lalu skip :(

Jadi minggu lalu aku kelarin Mario Rabbids di Switch-ku. Mayan sih main strategi gitu, aku lumayan suka. Chapter 100%, Chest 100%, Challenge 88%. Gak kuat ngerjain Ultimate Challenge-nya, jadinya aku anggap sudah saja mainnya :)) Sekarang aku main Super Mario Odyssey, tapi harus nahan diri karena masih banyak kerjaan :"(

Minggu lalu, pas weekend juga ada setup environment buat PPL.  Semua baik-baik saja sampai pas harus nambahin badge di README buat pipeline sama coverage. Kayaknya regex-nya gitlab bermasalah, jadi harus diakal-akalin sampe bener. Habisin waktu parah. Jalan sih akhirnya, cuma ya.. capek.

Oiya, aku jadi inget soal yang kutulis buat Oprec CP Ristek. Menurutku lucu sih. Intinya gini: 

Dikasih complete graph dengan $N$ node, dan $N$ bilangan $A_i$. Jalan antara node $i$ dan node $j$ panjangnya $A_i + A_j$. Cari cost MST dari graf tersebut.

Aku set N-nya gak lebih dari $1.000$ biar bisa solusi MST klasik, cuma aslinya soal ini N-nya bisa sampai $10^5$. Terus ya, menurutku solusinya cukup lucu sih :))

Btw, tadi malam ada COCI Round #7, round terakhir sebelum olympiad-nya. Aku ikut cuma karena diajak Irvin sih. Baca soal, paham A, B, C, E (skip D karena males panjang, dan pas dicek lagi gak sesuai jalan ninjaku), terus mulai kerjain. Ngebug-ngebug :| terus baca F dan "oh max-flow", terus ngoding. Iseng, gak copas template max flow dan coba ngoding dari scratch lagi :)) Ternyata masih bisa yey. Terus aku cek E, baru kepikiran kalo DP-ku ada bug-nya, jadi harus nambah kondisi state lagi. Masih sisa 1.5 jam, tapi males ngerjain D :P Jadinya aku urus hal-hal lain.

Pas pagi-pagi cek, loh ternyata E-ku WA semua testcase :( Aku cek codingan, ternyata ada 1 baris menyedihkan.

yang disubmit:
dp[now][i + j + 1][2] = max(dp[now][i + j + 1][1], temp[i][0] + dp[nex][j][0]);

harusnya:
dp[now][i + j + 1][2] = max(dp[now][i + j + 1][2], temp[i][0] + dp[nex][j][0]);

Yaudah deh, mayan geli sih tapi haha.

Hmm sekian dulu deh, semoga minggu depan gak skip lagi buat nge-post :D

Sabtu, 17 Februari 2018

Daily Life #3

Minggu ini rasanya gak sibuk-sibuk banget (atau menipu diri sedang tidak sibuk). Kesibukan di luar kuliah, paling terkait Ristek sama Pelatnas. Untuk Pelatnas, aku udah harus nyicil ngerjain bagianku daripada ntar mati '_' Kalo Ristek, kemarin nyiapin soal untuk open recruitment CP SIG, yang sekarang lagi jalan. Kontesnya sih dari jum'at sampai minggu ini. Semangat deh buat para peserta :)

Hmm, rasanya ada yang lain. Oh iya. Kemaren ada 2 hal berfaedah yang (akhirnya) kulakuin:

  • Nambah partisi Ubuntu di laptopku. Ini wacana dari tahun lalu cuma baru sekarang dilakuin.
  • Bikin script untuk automasi bikin tc dari tcframe, ke format zip yang diminta HackerRank.
Dan 1 hal yang kurang berfaedah:

  • Tamatin nonton anime Love Live! Sunshine!! S2
Btw, itu nambah partisi tanpa bikin backup sama sekali. Bermodal keyakinan kalo semua data penting di Ubuntu sama Windows udah ada di cloud juga. Untung gak ada masalah :")

ketika berhasil modif partisi tanpa ngerusak apapun
Oiya, aku juga ngerjain soal open recruitment-nya NetSos cuma gak niat-niat banget :P Berhenti pas skornya udah di angka cantik :P Btw buat yang ikut, namaku emang gak ada di Scoreboard :))

Minggu ini gak nambah banyak Kattis dan SPOJ D: Untuk Kattis, akhirnya tembus rank 200an :O Habis ini pasti perkembangannya melambat deh haha.

Sekian dulu deh minggu ini, moga minggu depan bisa lebih berfaedah yang dikerjain. Bikin tutorial gitu misalnya :"

Minggu, 11 Februari 2018

Final Arkavidia 4.0

Setelah lolos penyisihan CP sama CTF Arkavidia, sabtu kemarin aku ikut final lombanya. Ikut lomba yang mana? Well, dua-duanya. Jadi habis nanya panitia (Turfa), aku bisa ikut CP dulu, terus keluar tengah jalan pindah ke CTF, cuma gak boleh balik ke tempat CP lagi. Aku sendiri mutusin pindah kalo udah ada seenggaknya 2 kondisi berikut:

  • Udah gak bisa dikejar lagi
  • Soal yang tersisa nggak sesuai jalan ninjaku
Karena lombanya di Bandung, aku mikirnya buat sekalian ketemu kakakku yang kerja di Bandung. Pas cek jadwal lomba, duh mepet. Aha, ada jam istirahat dari jam 4-7. Aku jadi kontak kakakku buat ketemuan jam segitu. Rencananya juga malamnya mau nginep di tempat kakakku.

Jumat malam aku sama Ricky nginep di ruang Ristek, soalnya bakal berangkat sabtu pagi ke Bandung. Untung bisa bangun. Kami jalan ke tempat travel, terus ketemu Fahmi di situ. Reynaldo juga naik travel yang sama ternyata. Terus yaudah, cabut ke Bandung. Nyampe Bandungnya sekitar jam 9. Itu aku jadinya kontak Jauhar (PIC CP) kalau datangnya agak molor, karena udah ngerasain gak enaknya ngurus lomba yang pesertanya telat dateng registrasi :""" Maafkan saya panitia :"

Sampe di ITB, aku pisah sama Ricky Fahmi karena mau regis CP. Habis regis, dibawa ke ruangan yang dulu kalo gak salah dipake ngasih materi pas jamanku masih Pelatnas (dih udah tua). Sebelum lomba, ada sesi sama Bukalapak dulu, intinya ngenalin Bukalapak gitu. Habis itu kami dibawa ke lab yang dipake lomba, untuk bagi tempat sama briefing.

Baris tempatku ada 3 orang, paling kiri Degol, tengah aku, kanan Rafael. Ada kayak briefing, cuma rada gaje gitu. Walaupun mungkin penting sih, soalnya ada safety-nya. Cuma beberapa fakta di slidenya malah bikin serem.

Terus nyoba-nyoba kompinya.Yey Linux! Nyoba-nyoba compiler sama text editor lancar. Terus nyoba internet sama login ke DOMJudgenya. Internet lancar, DOMJudge-nya ee. Susah bedain l (l kecil) sama I (i besar) di password. Beberapa kali nyoba baru bisa login. Yang kocak, aku iseng buka google. Ternyata gak diblok :O :O :O buka github juga bisa :O Dari panitia cuma diperingatkan kalo bakal ketahuan seandainya buka yang kayak gitu. Oke deh, cuma masih prefer sekalian diblok aja sih. Terus karena masih ada yang belum bisa login, jadinya bebas gitu. Panitia juga bolehin ngetik-ngetik dulu, mo ngetik template juga boleh. Hmm... kurang sreg tapi yaudahlah. Aku gak ngoding template karena emang gak punya. Sebenernya bisa aja ngopas isi citsit, cuma males.

Setelah semua udah beres, nunggu 5 menit buat kontes mulai. Kemudian, kontes dimulai! Karena dikasih versi cetak soalnya, aku buka aja amplop isi soalnya, terus baca. Lebih enak baca di kertas daripada baca di komputer :P Skimming:

  • A: Duh, sort BigInteger. Oh ada constraint X[i] + Y[i] = C untuk tiap i. Bisa lah pake itu. cuma mager
  • B: Dih jorok. skip
  • C: Kayaknya ada hubungannya sama upper hull. skip
  • D: Terlihat DP-ish. Gak langsung keliatan solusinya. skip
  • E: Bentar ini kenapa sample-nya gini? Kayaknya salah ngerti soal. skip
  • F: (liat gambar lingkaran) skip
  • G: Wah math. Kayaknya bakal ribet. skip
  • H: Oh BIT 2D, harus kompres. mager. skip
  • I: loh soalnya sampe H doang
.
.
.
INI GAK ADA SOAL BONUS GITU YA?

Dari semua soal, yang keliatannya paling gampang A. Cuma, kalo itu yang paling mudah, udah kerasa kalo ini kontes bakal berdarah-darah. Aku jadinya mulai dari A. Intinya, dia minta sort berdasarkan X[i] * Y[i], terus X[i] + Y[i] = C untuk suatu C. Awalnya mau hajar Java BigInteger aja, cuma rasanya bakal TLE. Yaudah aku coba mikir C++ aja. Aku mikirnya misal X[i] < Y[i], bisa sort berdasarkan Y[i] - X[i]. Jadinya, aku bikin supaya X[i] sama Y[i] di-pad dengan 0 di depan, terus lakuin pengurangan BigInteger. Ngodingnya gitu aja, cuma ya, hih. Submit. Nunggu. Nunggu. Lama, bisa bikin kopi dulu. Nunggu. Wrong Answer. Ee.

Habis itu, aku coba baca soal lain dulu. Akhirnya, aku ngerti maksud soal E: dikasih array S[i] sama D[i], ada Q query yang isinya hitung max(T * D[i] + S[i]) untuk $L \le i \le R$ . Pas awal baca aku kira hitungnya jumlah, bukan max :s Palingan solusinya Segment Tree isi Convex Hull Trick. Aku jadinya balik ke A lagi. Hmm, gak ada yang keliatan salah. Terus aku baru nyadar kalo di suatu tempat ada yang salah, kutulis '-' bukannya '+'. Habis ganti itu, tes sample, bener. Submit. Nunggu. Nunggu. Accepted. A - Mengurutkan Bilangan AC! Pas itu jadinya rank 3. FYI, setengah jam baru max. AC 1 dari 8 soal. Fix berdarah-darah ini bakalan.

Karena yang saat ini kepikiran E sama H, terus H rasanya lebih capek, aku ngoding E dulu. Aku cukup pede ngerjain E gara-gara beberapa minggu lalu rada sering ngerjain soal pake CH Trick di Kattis. Setelah beres, tes sample, OK. Submit. Nunggu. Nunggu. Wrong Answer.

Kampret ini salah di mana. Terus pas baca kodingan, ternyata ada 2 bug fatal. Salah bikin komparasi untuk nge-pop stack sama ada variabel yang lupa ditambah :"" Jadinya aku coba cek isi semua convex hull-nya dulu. Habis ngerasa yakin, submit. Nunggu. Lama pisan. AcceptedE - Meretas Password Wifi AC!

Habis itu aku baca D sekilas lagi, masih gak dapet ide. Inti D itu gini: Dikasih rooted tree ukuran N dan bilangan X, bikin supaya tiap node nilainya non-negatif, jumlahnya X, dan nilai parent harus lebih kecil atau sama dengan nilai anaknya. Terus yaudah, aku nyicil ngoding H. Pas nyicil ngoding, tiba-tiba kepikiran sesuatu buat D: bisa anggap nambah di suatu node itu sebagai nambah di subtree-nya, dan ini akan mempertahankan kondisi terakhir. Jadi yaudah, aku pindah ke D.

Solusiku rada aneh gitu sih jadinya. DP, tapi ada kombin sama loop harmonic-nya. Harusnya $O(NX \log X)$. Untungnya ngetes kasus terburuknya mudah, bikin chain, terus N = 5000 dan X = 5000. Pas dicoba di local sekitar 0.98 s. TL 2s. Hajar aja dah. Submit. Nunggu. Nunggu. Lama. AcceptedD - Hari Gajian AC!

Pas liat scoreboard, beneran berdarah-darah. Itu aku rank 1 dengan AC 3, peringkat 2 sampe berapa gitu AC 1. Masih banyak yang AC 0. Brutal.

Aku terus lanjut ngoding H. Gara-gara jaman Pelatnas dulu sering ngerjain soal DS 2D gini jadi udah lumayan kebiasa. Yey, kelar. Pas mau ngambil sample di DOMJudge, loh gak dimasukin. Yaudah aku ketik manual. Coba run. Hmm, gak nampilin apa-apa. Hmm, ini kok komputernya tambah lemot.

.
.
.
.
.

Rapidly smashing CTRL+C in panic

Gara-gara kebiasaan ada memory jebol, pasti ini ada yang bikin nambah memory terus-menerus. Kayaknya ada logic kompresinya yang ngawur. Bener aja, ada yang pas dicari indeks-nya malah dapet 0. Ya loop BIT-nya gak bakal berhenti. Habis benerin bagian itu, tes sample lagi. Hmm, terlihat benar. Bodo amat, submit aja. Nunggu. Nunggu. Mau bikin kopi dulu. Nunggu. AcceptedH - Kotak Coklat AC!

Kembali lagi liat scoreboard. Pas menit 100an, akhirnya ada yang AC 2. Degol dapet soal B. Gap-nya udah jauh sih, tapi masih bisa dikejar, masih lama soalnya. Cuma aku gak mau ngerjain B. Jadinya aku nyoba liat soal C sama G.

Pas ngoret soal G, setelah nanganin kasus p = 0 dan p = 1 sendiri, aku udah berhasil ngerjain sampe tinggal nyari k terkecil sehingga $p^{k} \equiv y \pmod{m}$. Cuma gak nemu. Di citsit juga gak ada yang keliatan ngebantu. Coba bikin rumus, cuma rasanya kalo bisa bikin rumus bisa bikin paper (ini ngawur sih). Terus aku coba baca C. Intinya gimana cara memelihara upper hull. Bau-bau pake Mo's Algorithm, cuma gak tau cara nge-restore upper hull kalo ada yang dibuang. Rasanya bisa pake Linked List gitu, cuma semakin dipikir semakin pusing.

Karena dah waktunya sholat, aku turun dulu buat sholat. Pas wudhu, mikir. G. Tiba-tiba dapet inspirasi: k pasti kurang dari m, terus sebenernya bisa lakuin meet-in-the-middle buat nyari k-nya. Bagi bit, jadi bit 0-15 di awal, 16-30 di akhir. Brute force, terus MITM. Terlihat OK. Pas kepikiran rasanya: Eureka! Eureka!

Habis sholat, aku lari ke lab buat ngoding. Ngos-ngosan. Anjir, ini badan emang kurang olahraga. Setelah beberapa saat, mulai ngoding. Kodingannya gak panjang-panjang banget, cuma math yang biasa kepake. Coba sample, loh kok salah. Aha, ada bug. Benerin lagi. Yey, lolos sample. Cuma rasanya ada yang aneh. Asik, ada bug lagi. Habis ditambal, udah cukup yakin kalo itu bener. Submit. Nunggu. Nunggu. Nunggu. Nunggu. Krik. Krik. AcceptedG - Random Generator AC! Yay! Secara gak sadar bilang "yes" sambil ngepalin tangan. Berpotensi mengintimidasi yang melihat.

Pas AC G, liat scoreboard lagi. Rank 1 AC 5. Rank 2-5 AC 2. Rank 6-15 AC 1. Sisanya AC 0. Well...

Habis itu, kerjaanku malah nontonin Christo yang duduk di depanku ngoding. Dia pas itu AC 2, masih berpotensi nyusul. Aku liat jam. Hmm, masih 1 jam 35 menit lagi. Yaudah nontonin Christo dulu. Kalo Christo nambah pindah ke CTF-nya diundur. Kalo gak nambah yaudah pindah ke CTF. Sampe sisa 1 jam 20 menit dia gak nambah, yaudah aku bawa tas terus pindah ke CTF.

Sesampainya di sana, Ricky sama Fahmi lagi ngerjain Forensic sama Web. Aku langsung ngerjain Pwn-nya. Wew, soalnya ada pre-requisite-nya gitu. Auth1 - Auth4 1 program, alurnya urut. Kalo gak solve 1 gak bisa dapet lanjutnya. Aku mulai dari Auth1 dulu. Pas lagi baca assembly-nya, Fahmi dapet Forensic yang 100. Yey, kami gak 0 :""))) Aku baca lagi Auth1, intinya ada ngecek input dengan suatu nilai hasil rand(). Cuma, ternyata seed-nya sama gak di-set. Jadinya harusnya nilainya sama terus. Yaudah, aku coba, eh dapet flag :")) Yey bisa berkontribusi 40 poin :"))

Habis itu aku udah puyeng banget. Dah jam 4, loh kok lombanya belom kelar. Kata Ricky lombanya mulainya molor, tadi mulainya dari jam 1. Selesainya jam 6. Anjir. Karena CTF rada bebas, aku buka FB terus kontak kakakku, bilangin masalah ini. Habis itu aku coba Auth2, gak dapet ide. Mikirnya gimana caranya biar open() bisa masukin path dev/urandom, tapi yang dibuka dev/zero. Gak dapet ide. Sampe 10 menit terakhir, baru nyadar kalo di servicenya bisa nambahin file di tmp/ :"""" Jadinya bikin tmp/dev/urandom, terus Auth2 ngerjainnya buka file itu. Dapet flag Auth2 :"""))) Habis itu lombanya beres. Total akhir 180, rekt parah :")) Timnya Wira, Rakha, Aldi (Arkavidia 9) kayaknya bakal menang, sebelum freeze 505 poin.

Iya, nama timku sama timnya Wira emang ngajak gelut. Dua-duanya reference ke CompFest.

Pas lombanya beres, aku mau ketemu kakakku, cuma kakakku bilang waktunya mepet Gala Dinner Arkavidia, jadi bilangnya ketemunya nanti aja habis Gala Dinner. Jadinya aku bareng peserta CTF lainnya aja habis itu. Btw, si Fahmi udah balik duluan ke Jakarta/Depok, gak tau kenapa pengen langsung pulang gitu. Kami ke Masjid Salman buat sholat, terus jalan ke aula timur untuk Gala Dinner.

Yang CTF sampe aula timur duluan dari CP. Pas yang CP dateng, aku ngobrol-ngobrol sama FJ + Degol tentang kontes tadi. Degol tetep di AC 2, terus kata FJ Binus juga paling banyak AC 2. Wew. Soal-soalnya tadi susah, tapi rasanya terlalu gak balance. Ketika kemaren CompFest udah brutal, masih ada yang bisa lebih ganas :| Komentar tentang lombanya nanti di bawah deh.

Pas Gala Dinner, udah ngerasa ini bakal lama. Aku dikontak mamaku, intinya mending kakakku balik aja kalo gak ada kepastian gini, kasian soalnya udah nunggu dari jam 4. Jadinya aku chat kakakku, bilang kalo ketemuannya mungkin besok aja sebelum aku balik ke Depok, terus kakakku balik ke apartemennya. Still feeling guilty for this :'(

Acaranya akhirnya mulai, terus habis sambutan atau apapun itu yang gak pernah kuperhatiin, akhirnya ada makan-makan. Udah laper banget, jadinya langsung ngantri. Apesnya, antrian yang kuambil itu yang sering diselip-selipin orang penting, jadinya aku ngantrinya mayan lama. Dari dulu udah kebiasa ngantri dapet antrian yang paling lama, entah kenapa ini selalu terjadi padaku :"")))

Akhirnya ada pengumuman juara! Untuk CP, juaranya dari 1-3 + 1 HM. Juaranya:

  1. Muhammad Ayaz Dzulfikar
  2. Degoldie Sonny
  3. Christopher Samuel
  4. Andreas Martin
Hasil akhir selama masih up bisa dilihat di https://scoreboard-arkavidia.cf/
Untuk CTF, Arkavidia 9 juga juara 1!

Scoreboard akhir


buat lucu-lucuan aja, pegang gabus CTF

Jingga Boyz

Setelah penutupan dan foto-foto, kami lalu pergi ke penginapan yang disediain panitia. Tidur, terus besoknya balik ke Depok. Aku akhirnya gak jadi ketemuan sama kakakku btw, kakakku gak bisa ke tempat travelnya pas besok paginya :"

Udah lama gak lomba yang perorangan, mayan juga ada ginian. Ternyata aku masih nggak sekaratan itu haha :") Moga aja sebelum pensiun masih bisa dapet sesuatu lagi ._.v


Trivia:
  • Degol: "Lu keluar di satu jam pertama juga bisa menang Yaz", dan emang iya AC 2 di menit ke-45 harusnya udah menang
  • Pertama kalinya euy ikut dua kontes onsite bersamaan
Notes

Btw, ini komentar tentang kontes CP-nya. Mungkin bisa untuk feedback. Aku gak bermaksud menyinggung siapa-siapa di sini ._. Bisa skip bagian ini kalo males baca hehe.

Problemsetnya aku rasa susah. Mungkin kesulitannya mirip CompFest. Cuma, mungkin kurang seimbang? Di CompFest selama 2 tahun terakhir aku mastiin biar peserta bisa AC seengaknya 1-2. Ini di akhir ada yang gak AC sama sekali T_T Jadi kayak bonus gitu gak ada. Terus ini kontesnya perorangan, jadi mayan susah gitu. Di ICPC, biasanya bisa bagi-bagi kerjaan. Kebetulan aja, E sama H itu soal yang kalo di ICPC pasti dilempar ke aku, makanya aku (harus) lancar ngerjainnya. Cuma buat kebanyakan peserta pasti susah. Kalo habis ngobrol sama FJ + Degol, "E sama H itu idenya simple tapi ngodingnya males"

Sama rada penasaran masalah difficulty. Ini rasanya:

  • Easy: A
  • Medium: B, D
  • Medium-Hard: E, H (implementation hell)
  • Hard: C, F, G
Tapi spike difficulty-nya loncat banget. Dan aku aslinya gak bakal bilang A easy sih...

Mungkin untuk CP Arkavidia tahun depan bisa dibikin lebih balanced lagi, sama naikin jumlah AC pesertanya :")) Sama kalo bisa cari server yang cepetan, sebelum refresh button-nya rusak :"")) Pertahankan yang bagus dari tahun ini (soal menantang, editorial) dan perbagus lagi untuk tahun mendatang!

Overall, dari penyisihan-final, aku suka soal D, E dari penyisihan sama D, G dari final. G dari final keren, walaupun aku gak tau itu di editorial baby-step (baby shark?) giant-step apaan, kayaknya teknik yang gak pernah aku baca. 

Catatan gak penting, kalo inget netijen:

Netijen: "Emangnya lu bisa bikin kontes ?!?!?!?!?"
Me: "Bisa"

Senin, 05 Februari 2018

Daily Life #2

Hola!

Baru aja kelar TOKI Camp jadinya gak ngeblog di akhir minggu huehue :'3 Btw akhirnya Kattis nembus 500 poin :D

Setelah ngeblog yang terakhir, aku langsung TOKI Open Contest yang Januari 2018. IMHO soalnya not bad, D > A > C > B. Yang D asal nembak ternyata AC :O Aku juga bikin screencast, yang bisa diliat di sini. Kalo ditanya kenapa gak bikin commentary, karena aku tidak sepede itu dan lagi gak ada tools voice recording yang bagus :P

Btw, habis kontes, secara ajaib kursiku patah :" untung gak lagi pake earphone, bisa-bisa laptop keseret jatuh juga :"

Setelah TOC yang mayan, besoknya diajak Irvin ikut ARC. rekt pisan euy :"""))) dah lama banget semenjak main di Atcoder haha. C menarik sih menurutku.

Oiya, kemarin juga minggu terakhir magang di SIRCLO. Yah udah harus kuliah T_T Semoga aja yang kemarin dikerjain gak ada yang nge-break. 

Habis last day di SIRCLO, besoknya cabut TOKI Camp. Di rombongan dari SIRCLO ada Ammar yang bawa Nintendo Switch titipanku. Yey, akhirnya setelah bertahun-tahun aku ada beli console baru :"D Baru punya 2 game, nanti kalo udah kelar baru beli lagi. Dari SIRCLO cabut ke wisma TOKI. Lumayan lama, kira-kira 5 jam. Di jalan niatnya main Switch, tapi ternyata mual jadinya tidur :" bangun-bangun malah main LLSIF di HP :P Mendekati Bandung, main lateral puzzle (puzzle yang ada moderator ngasih potongan cerita dan pemain harus nebak cerita lengkapnya). Lumayan seru dan menghabiskan waktu, hingga akhirnya sampai wisma TOKI.

Di TOKI Camp aku masuk ke task force ngurusin P2, mostly bahas tentang penyelenggaran Pelatnas, diskusi sama yang tahun lalu peserta, ngomongin materi + soal. Kalo pas bosen paling nontonin task force tetris main tetris atau tidur. Malam pertama ada diskusi menarik beberapa orang sampai jam 3 pagi, yang tengah jalan aku udah mulai kehilangan fokus :"))

Anyway TOKI Camp udah berakhir, dan sekarang udah masuk kuliah :"))) ngasdosin TKTPL kayaknya huehue. Semoga bisa ngebantailatih orang-orang >:) Selain itu, aku juga jadi Head of CP SIG Ristek, semoga aja lancar hehe. Buat orang fasilkom, daftar CP SIG ya :P

Sekian dulu, sampai nanti lagi~

Note:

  • Classifier ngadet hiks, lanjut lagi 2 minggu lagi kayaknya karena ada Arkavidia akhir minggu ini
  • WATER BLUE NEW WORLD lagunya ENAK PISAN CUY
  • Macaron ternyata ENAK PARAH CUY


Jumat, 26 Januari 2018

Daily Life #1

Kembali lagi di mencoba konsisten menulis :P Dan ya, bingung cari judulnya. Nyari nama variabel aja udah susah, ini sekarang nyari judul.

Jadi kemarin baru menyadari kalau di SIAK, ada kelasku yang dipindah entah oleh siapa. Sebelum dipindah, posisi 55 / 50. Terus, pas ngecek lagi, kelas tersebut sekarang kuotanya 60 ~_~ Syedih. Konspirasi agar tidak mendapatkan kelas yang diinginkan.

Anyway, minggu kemaren ada pengumuman Arkavidia. Lolos CP, dan ternyata lolos CTF juga. Entah nanti belajar kagebunshin sama siapa. Oiya, itu nama tim CTF-nya ngajak gelut emang, Ini CompFest ITB?. Tapi bukan aku yang bikin namanya ya :P kalo mo gelut sama Ricky aja :P

Selain itu, aku juga ikut 2 kontes minggu kemaren, CodeCraft di CF sama Round 66 di CSAcademy. Yang CF rada fail, gagal C sama D. C kena tricky, D gara-gara ada bug off-by-one yang hebatnya baru kena di tc terakhir, yakni yang ditambah karena hack. Sejujurnya, udah rada males sama kontesnya. Tanpa bermaksud buruk, aku kurang suka kontes yang diadain orang India. Entah sejak kapan, aku udah mengasosiasikannya dengan soal-soal math aneh atau teknik-teknik yang bosenin. Bosenin di sini maksudku ngodingnya lebih sulit dari mikirnya, atau kalo gak tau yaudah mampus. Makanya aku gak aktif di OJ-OJ India kayak CodeChef dll.

Untuk contoh mudahnya sih, dari CodeCraft kemaren, ada soal G. Pas liat soal:

  • "Ah, ini yang or gampang pake loop 3 pangkat"
  • "Hmm, ini xor sama and kayaknya perlu aneh-aneh"
  • "Kayaknya kemaren Firman ada nunjukin tutorial sejenis FFT buat xor"
Habis itu aku googling dan nemu tutorialnya di CSAcademy. Bener-bener copas doang untuk ngerjain soal itu. Such wow, much fun. Soal D sama E juga aku rada males gitu ngerjainnya. Input gede dan TL gede, rada strict. Hazek.

Anyway, ini cuma opini pribadi aja ya. Terkadang ada soal-soal dari OJ India yang mindblowing, cuma karena udah rada negatif gitu opininya mungkin aku sering skip hehe. Ingetku ada beberapa soal dari Snackdown 2 tahun terakhir ini yang aku lumayan suka, cuma aku lupa soalnya yang mana.

Habis kontes rating-ku -3, kupikir padahal habis fail gitu bakal turun warna haha. Tinggal tunggu waktu aja sih turun dari merah :")

Setelah itu, ada juga round 66 CSAcademy, yang notabene cuma untuk div. 2. Yep, aku emang baru-baru aja aktif di CSA. Itu round 66 baru kontes ketigaku xD Kemaren pas kontes diselamatkan sama sistem penilaiannya CSA. Jadi, awalnya kukira D konstruktif parah, jadi aku skip karena lemah di konstruktif. Pas baca E, langsung tau itu pasti pakai eulerian tour, terus aku harus nyari-nyari codinganku dulu untuk nyari eulerian tour :""))) Setelah itu aku ngoding, dan ada masalah implementasinya, jadinya pusing gitu :"""")))

Habis itu, aku balik ke soal D. Melototin sample, rasanya ini kalo ada solusi pasti ada solusi yang nuker baris doang. Yaudah jadinya ngoding bipartite matching, eh AC :") Habis gitu balik ke E, dapet WA-WA karena nge-bug, terus berhasil benerin, dan AC :") Itu kalo pake sistem CF atau TopCoder pasti poinku rendah banget D sama E xD Untung sistem penilaiannya liat last submission sama penalty yang mayan rendah. Jadinya di round 66, rank 3 overall dan rank 1 official :") Naik div. 1 yeay 

Minggu depan udah TOKI Camp. Mau gak mau harus datang atau disembelih sama Agus padahal pengen naik gunung. Kemungkinan bakal ada perbincangan terkait OSN juga di camp. Masih galau pengen jadi SC OSN lagi atau ngajar di SMA-ku dulu. Sayang euy udah beberapa tahun gak ada medali lagi :"

Sekian dulu dah, hehe. Sampai ketemu di post selanjutnya

Sabtu, 20 Januari 2018

Post Awal Tahun

LOL udah setengah tahun gak nge-post apa-apa :P

Secara pribadi, ada banyak hal yang pengen ditulis, misalnya:

  • ICPC Yangon 2016 (krazy, parah)
  • ICPC WF 2017 (terutama drama visa)
  • OSN 2017 (salah satu bucket list sudah terpenuhi :D)
  • CPC CompFest 9 (Innalillahi)
Cuma, entah kenapa males gitu buat nulis, hehe.

Well, melihat 2017, rasanya luar biasa. Spike emosinya banyak. Kayak, jatuh-naik-jatuh-naik mulu:

  • WTF lolos WF
  • Stres karena takut bikin satu tim gagal pergi WF
  • Bisa jadi SC OSN + jalan-jalan ke Pekanbaru
  • Ngurusin CPC CompFest yang bikin asdadsadsadsa
  • Kenalan dengan binary exploitation (seru cuy)
  • Gak lolos Gemastik CTF karena pemerataan
  • Harusnya ada lagi tapi lupa hehe
Banyak banget yang dialami pas 2017 ini. Mungkin pertama kalinya ngerasa burnout, sampe males banget berurusan sama Competitive Programming. Serius, burnout pas mendekati akhir CPC, untung CPC-nya kelar, phew.

Ngomong-ngomong soal CP, pas akhir tahun lalu, aku mikir tahun 2018 udah mau retire, gak peduli lolos WF atau nggak. Hanya saja, akhir-akhir ini entah kenapa jadi galau gitu, mau berhenti nge-CP dan nyoba hal lain, atau simply nge-CP sambil nyoba hal lain. Entahlah, liat aja ntar bakal ICPC lagi atau nggak.

Aku juga karena bosen (dan iseng) mencoba ngerjain Kattis. Siang baca soal, di kereta coba mikir solusi, malam sebelum tidur atau pagi sebelum berangkat magang nyoba ngoding. Pengennya biar bisa bikin kayak classifier soal-soal Kattis gitu. Hari ini harusnya aku nyicil classify soal-soal SPOJ yang udah aku solve, cuma karena SIAK War semalam bangke jadinya hari ini ngantuk parah, dan aku jadinya tidur mayan lama. Bangun-bangun lemes gitu buat ngerjain. Moga aja classify soal SPOJ ini bisa mulai secepatnya. Motivasi bikin classifier ini gak tau sih, mungkin biar bisa dihibahkan ke matkul CP UI tahun depan. Atau ya, iseng doang.

Hmm, semoga aja habis ini bisa lebih niat nge-blog, menulis apa yang harusnya dari dulu kutulis, sama mungkin sharing teknik-teknik aneh-aneh lagi. Semoga aja bisa konsisten nulis >:)

Note:
Gak terasa sekarang udah 20 tahun. Terus, tiap pulang ke Bontang atau nelpon Mama udah sering ditanya udah punya pacar apa nggak. Hiks. Mohon bersabar Ma. Ini lagi nyari yang 3D.