https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Ballmer peakDrak0z schreef op zondag 03 februari 2013 @ 00:46:
[..] Ik breek alleen m'n kop over wat ze nou in 's hemelsnaam willen bij die CardGame... Ik heb net m'n eerste biertje gepakt, misschien helpt dat met nadenken ;-)
Re: Card Game: je moet je vooral niet blindstaren op die modulo-operatie. Die staat er alleen maar bij zodat je het probleem ook gewoon met 32-bits integers op kan lossen.
[ Voor 38% gewijzigd door Soultaker op 03-02-2013 00:57 ]
@CodeCaster - Volgens mij snap ik hem nu... Ik zal het zo even uitwerken, maar ik kwam er vooral niet uit dankzij het voorbeeld :-)
Nadeel is dat ik natuurlijk ook nog weer kan zakken als iemand die sneller was met de eerste opdrachten ook nog de laatste inlevert.
Security vond ik verdacht makkelijk, daar zal ik wel iets fout gedaan hebben
DeadPixels breek ik nog steeds mijn brein over de optimale oplossing. De brute force is erg simpel maar gaat uiteraard ruim over de 6 minuten heen wanneer extreme waarden gebruikt worden. Ik weet dat ik nooit van z'n langzalzeleven in de top500 zal belanden (mede doordat ik dus een foutieve CardGame gesubmit heb), maar ik wil 'm gewoon klaar hebben voor mezelf :-) Ik blijf hier nog lekker aan doorpuzzelen (tot ik met m'n hoofd op het toetsenbord in slaap val)
PS: Soultaker, leuke blogposts. Lees het met veel plezier.
https://www.facebook.com/...php?round=189890111155691
Net toch mijn (zeer) suboptimale oplossing voor de dooie pixels geprobeert te genereren. "java.lang.OutOfMemoryError: Java heap space" error... Oeps! Dat was zeker zeer sub-optimaal :-) Nouja, 10 minuten tot de uitslag en volgend jaar beter. Hopen dat ik dan niet zo veel koorts en hoofdpijn heb.
[ Voor 46% gewijzigd door Drak0z op 03-02-2013 18:51 ]
@Drak0z: jammer, maar je hebt tenminste geprobeert. Respect voor het doorwerken tot de deadline
[ Voor 9% gewijzigd door Soultaker op 03-02-2013 19:18 ]
Mijn oplossing voor Card Game (in pseudo-java):
MaxHanden berekenen door fac(n)/(fac(n-k)*(fac(k)))
k--;
zolang het aantal handen > 0 is en ik nog kaarten heb:
pak de laatste kaart (sorted list dus altijd hoogste waarde)
n--;
result += kaartwaarde*min(MaxHanden, fac(n)/(fac(n-k)*(fac(k))));
MaxHanden -= fac(n)/(fac(n-k)*(fac(k)));
Ik kwam hier alleen in de problemen omdat de faculteiten over de MaxValue van long heen gingen (nooit aan gedacht....

De andere twee zal ik later uitwerken... Nu eerst slapen!
Nette code, maar ik volg niet helemaal wat je bij Security precies probeert te doen, en volgens mij klopt 't ook niet helemaal, want ik krijg er net wat andere uitvoer uit. Bijvoorbeeld voor deze testcase:MrHaas schreef op zondag 03 februari 2013 @ 19:34:
Mijn oplossingen in Python: https://gist.github.com/63b92ee871fe975446d1
27 ?dd???ea???a?aadfade??d??fe?a??ecd????af??ccaaac??adb? ?ab?ad??a???e?be????db????d?f?db??de?c???dcd?f??c?b??a
Mijn antwoord:
addaaaeaaaaaaaadfadeaadaafeaaaaecdbabaafdbccaaacdbadbe
Jouw antwoord:
addaaaeaaaaaaaadfadeaadabfeaaabecddadbafdbccaaacfaadbe
De 25e letter is bij mij een 'a' en bij jouw een 'b'.
Mijn Card Game oplossing gebruikt dezelfde combinatoriek als Soultaker, maar ik bereken de nCr waarden niet vooraf, maar elke keer opnieuw in de loop, met gmpy.comb in Python. Dit is in dit geval snel genoeg (5sec voor de 20 cases)
Mijn oplossing voor de dead_pixels was ongeveer dit:
- Reken de posities van de dead pixels uit en sla ze op in een map van kolomnr -> set van rijnummers
- Initialiseer een kolom-vector met elke rij = 0
- Voor alle kolommen:
- als het rijnummer niet in de set van rijnummers van deze kolom zit => rij-waarde++
- als het rijnummer wel in de set van rijnummers van deze kolom zit => rij-waarde = 0
- maximum rij-waarde is de breedte van het te plaatsen blokje
- elke range met waarde van minimaal breedte van het te plaatsen blokje en lengte van de range van minimaal hoogte van het te plaatsen blokje => verhoog uiteindelijke resultaat met aantal keer dat de hoogte in die range past
000000 123456 123333 000000 123456 123333 001000 => 120123 => 120123 000000 123456 123333 000000 123456 123333
Omdat het aantal dead pixels relatief laag is vergeleken met het totaal aantal pixels, kan dit sparse worden opgeslagen (elke rij is een kolom uit de bovenstaande tabel):
[(0,4,1)] [(0,4,2)] [(0,1,3), (2,2,0), (3,4,3)] [(0,1,3), (2,2,1), (3,4,3)] [(0,1,3), (2,2,2), (3,4,3)] [(0,1,3), (2,2,3), (3,4,3)] = [(0,4,3)]
Dat scheelt in aantal berekeningen en maakt het berekenen van de lengte van de range ook een stuk makkelijker. Wel moet er na elke kolom gemerged worden (zie laatste regel)
Ik wed sowieso dat de huidige nummer 1 faalt, en dat Eryk (nu tweede) deze ronde gaat winnen, want van Eryk weet ik dat 'ie heel goed was (hij haalde in 2011 ook de finale), en zijn tijd is enorm scherp (ter vergelijking: als je elk probleem in exact 10 minuten oplost, heb je een cumulative straftijd van 60 minuten, en dan sta je nóg onder 'm
Ja, zag t ook, waarschijnlijk pak ik niet de optimale sequence qua alfabetische volgorde.Soultaker schreef op zondag 03 februari 2013 @ 21:15:
[...]
Nette code, maar ik volg niet helemaal wat je bij Security precies probeert te doen, en volgens mij klopt 't ook niet helemaal, want ik krijg er net wat andere uitvoer uit. Bijvoorbeeld voor deze testcase:
27 ?dd???ea???a?aadfade??d??fe?a??ecd????af??ccaaac??adb? ?ab?ad??a???e?be????db????d?f?db??de?c???dcd?f??c?b??a
Mijn antwoord:
addaaaeaaaaaaaadfadeaadaafeaaaaecdbabaafdbccaaacdbadbe
Jouw antwoord:
addaaaeaaaaaaaadfadeaadabfeaaabecddadbafdbccaaacfaadbe
De 25e letter is bij mij een 'a' en bij jouw een 'b'.
Mijn idee bij de Dead Pixels (waar ik uiteindelijk op vast kwam te zitten); letterlijke copy/paste uit mijn code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| numPossibilities = (w-p+1)*(h-q+1); while (deadPixels.size() > 0) { Pixel pixel = deadPixels.pollFirst(); int invalidPos = invalidPositions(pixel, w, h); if (deadPixels.size() > 0) { // chance for overlap // "revalidate" double invalidated positions --- where the square overlaps multiple dead pixels // I know there is a mathematically correct way to do this, my brain's just failing :-) // TODO: check the pixels again, check how many are in range of the current pixel ... ? profit! } numPossibilities -= invalidPos; } return numPossibilities; int invalidPositions(Pixel pixel, int w, int h) { if (x-(p-1) < 0) { multiX += x-(p-1); } // overlaps left if (y-(q-1) < 0) { multiY += y-(q-1); } // overlaps top if (x+p > w) { multiX -= ((x+p)-w); } // overlaps right if (y+q > h) { multiY -= ((y+q)-h); } // overlaps bottom return multiX*multiY; } |
De oplossing die ik uiteindelijk gewoon ging proberen was alle 'top left' coordinaten van een invalid square opslaan in een hashset (zodat ze altijd uniek zijn) en dat aftrekken van numPos.... Maar dat ging dus over z'n memorylimit heen :-)
Heeft er behalve Soultaker nog iemand anders de volgende ronde gehaald?
Dat bleek achteraf dus best mee te vallen!Woy schreef op zaterdag 02 februari 2013 @ 20:48:
Helaas geen tijd nu, ik kijk morgen ochtend nog wel even, maar dan heb ik natuurlijk al geen enkele kans meer om door te gaan naar de volgende ronde.
Ja, inderdaad, had ik maar iets meer tijd genomen om problem 3 nog x te testen...Soultaker schreef op maandag 04 februari 2013 @ 22:34:
Dat die vraag onbeantwoord blijft voorspelt niet veel goeds...
[...]
Dat bleek achteraf dus best mee te vallen!
Heb problem 2 trouwens gefixt in de Gist, jammer dat ik ook die niet direct goed heb getest.
Succes btw in de volgende ronde!
[ Voor 4% gewijzigd door MrHaas op 05-02-2013 13:52 ]
Nou heb ik 's ochtends ook niet echt geredSoultaker schreef op maandag 04 februari 2013 @ 22:34:
Dat bleek achteraf dus best mee te vallen!
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Wel irritant dat 't nu zo laat is (van 10 uur 's avonds tot 1 uur 's nachts); ik hoop dat ik een beetje helder kan denken. Ik vond het vorige week juist fijn dat ik rond een uur of tien klaar was.
In ieder geval: Veel geluk.
Eens zien of ik een T-shirt kan scoren vanavond.
edit:
Blegh, m'n oplossing voor probleem 3 werkt niet. Balen. Ik vermoed dat ik nu rond de 250e plek uitkom.
[ Voor 59% gewijzigd door Soultaker op 10-02-2013 01:08 ]
Ik ga morgen es kijken hoe ver ik kom...
• USACO Training Program is meer traditioneel van opzet, en bouwt goed op qua moeilijkheid, hoewel niet alle testdata even goed is (maar daar heb je vooral later last van).
Als je live wedstrijden leuk vind, kun je mee doen met TopCoder of CodeForces (die laatste is wat moeilijker, mede doordat het door Russen geschreven Engels soms lastig te decoderen is). Wel een aanrader als je wil oefenen voor de Facebook Hacker Cup of de Google Code Jam (die volgende maand gehouden wordt, geloof ik?)
Verder worden/werden er op dit subforum nog wel eens programmeerwedstrijden gehouden, georganiseerd door de crew of door users. Ik geloof dat de crew een nieuwe contest gepland had voor in de zomer van 2010 ofzo, maar dat is er nooit van gekomen helaas.
UVa Online Judge
Veel oude opgaven van ICPC wedstrijden. Insturen in Java, C++ of C en de server runt en valideert jouw programma automatisch.. Al raad ik Java niet aan, dat werkt helaas niet zo goed.
SPOJ Zelfde opzet als UVa.
En de USACO training tool is altijd goed om wat in te doen. Er zitten erg geavanceerde onderwerpen tussen die goed uitgelegd worden.
Als je Python leuk vindt (alhoewel je ook andere taal kan gebruiken voor meeste challenges), kijk dan ook eens naar Python Challenge. Wat minder algoritmisch van aard, maar wel leuk om mee bezig te zijn.
Ronde | Start | Duur | Eind |
---|---|---|---|
Online Qualification Round | vrijdag 22 november 01:00 | 72 uur | maandag 25 november 01:00 |
Online Elimination Round 1 | zaterdag 7 december 19:00 | 24 uur | zondag 8 december 19:00 |
Online Elimination Round 2 | zaterdag 14 december 19:00 | 3 uur | zaterdag 14 december 22:00 |
Online Elimination Round 3 | zaterdag 21 december 19:00 | 3 uur | zaterdag 21 december 22:00 |
Onsite Finals at Facebook | 20 en 21 februari 2014 |
https://www.facebook.com/hackercup
[ Voor 81% gewijzigd door Eärendil op 18-11-2013 01:39 ]