Veckans problem nr2 - 1bit bitmap to vector

Permalänk
Medlem

Eftersom jag lovade vara med i denna tävlig få jag väll iaf skriva några rader.

Jag satt säkert i två timmar och fundera på grymma algortimer, men kom inte fram till nått. Så jag ger officiellet upp. Fett med creds till alla andra som försöker. Jag hade en ide ett tag men den visade sig inte så bra. Kod kom jag ens inte till, har massa skisser på papper men ingen kod, så jag hoppas jag får en snilleblixt nästa gång.

Ska bli skoj att se folks lösningar.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Don_Tomaso
http://jmb.mine.nu/~matricks/veckansproblem/
http://jmb.mine.nu/~matricks/veckansproblem/submit.php

Skicka upp innehållet i points.txt dit.

Jorå... Jag skall bara se till att generera ut resultatet med

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Medlem

Jag tar också och ger upp, min fastnar hela tiden efter ca 5-10 punkter.. och jag fattar verkligen inte varför :\

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Medlem

Kul med tävlingar, men vore det inte bättre att ha dem över lite längre tid?

Permalänk
Medlem

oops

EDIT: Äsch... nu ändrades ju bilden... Trädet var på fel håll förut... Det var lite roligare

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ooije
Kul med tävlingar, men vore det inte bättre att ha dem över lite längre tid?

Det är helgtävlingar, men bäst vore väl egentligen att ha allt redo på fredagen, typ klockan 18.00 och sen hålla på till söndag 18.00 så har man 48 timmar på sig.

Pelle76: Haha

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Myris
Jag tar också och ger upp, min fastnar hela tiden efter ca 5-10 punkter.. och jag fattar verkligen inte varför :\

Kom igen nu! KÄMPA!!! som gunde skulle sagt

Citat:

Ursprungligen inskrivet av Ooije
Kul med tävlingar, men vore det inte bättre att ha dem över lite längre tid?

Mjo.. funderar på att köra Måndag-Söndag eller något

Citat:

Ursprungligen inskrivet av Pelle76
oops

*bild*

Mjo.. såg den.. snygg miss

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk
Medlem

Kom precis hem och ska duscha, äta, och fixa ett par saker.

Skulle verkligen uppskatta om vi sköt upp det till 21:00. Det är en mycket finare och jämnare tid än 20:00, tycker ni inte det?

Edit: Jag tar tillbaka det. Får satsa lite hårdare till nästa gång. Har iaf skickat min ofärdiga lösning till Matricks, så kanske någon Delphi-programmerare lär sig något.

Visa signatur
Permalänk
Medlem

Fråga till dom som kodar java:

Vad skall jag använda för kommando för att skriva ut resultatet. Just nu så använder jag mig bara av System.out.println(resultat); ?

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Medlem

0 @ 373

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Medlem

Nepp... Jag måste nog lägga ned... Hinner inte tyärr...

Bra uppgift. Hade man haft lite mer tid så... Men nåt blev det ju iaf

Hoppas detta kan blie en tradition. Man lär sig mycket av att tävla i programmering.

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Medlem

Ah, har lyckats med lite trixande och tweakande nu fått 865 @ 20. Tar endast 17 sekunder på min burk (P4, 2.4 GHz).

Med lite mer extrem bruteforcing har jag lyckats komma ner till 857 @ 20, men då stod programmet och tuggade i ~40 min...

Tänkte jag skulle nå ner under 700, men har inte riktigt en aning om hur det ska gå till. Är nog min metod som sätter gränsen. Råkade visst bli lite spaghettiröra av koden också så det blir nog inga mer större ändringar nu.

Citat:

Ursprungligen inskrivet av Daniel
http://jmb.mine.nu/~matricks/veckansproblem/results/Daniel_0f...
0 @ 373

Det lägsta antalet punkter som man kan få 0 fel med?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av madah
...
Det lägsta antalet punkter som man kan få 0 fel med?

Vet inte, men jag tror inte det.
Just nu har jag bara tagit bort raka linjer på 0, 45 samt 90 grader. Går nog att få ner mer än detta.

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Citat:

Ursprungligen inskrivet av Myris
Jag tar också och ger upp, min fastnar hela tiden efter ca 5-10 punkter.. och jag fattar verkligen inte varför :\

Posta gärna din kod ändå.

Det är intressant att se olika sätt att lösa ett problem på, även om de inte är kompletta.

Visa signatur

Python-IRC på svenska: #python.se

Permalänk

Har haft mycket att göra i helgen, annars hade jag varit med. Ska försöka vara med nästa gång dock, och det ska bli kul att se hur ni har löst veckans.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Sebastianj
Posta gärna din kod ändå.

Det är intressant att se olika sätt att lösa ett problem på, även om de inte är kompletta.

Hm, okej, men det är en riktigt rutten lösning..

Visa signatur

I just love the fact that there is a global integer variable named 'i'. Just think, you will never need to declare your loop variable again!
To avoid collisions where a loop that uses 'i' calls another function that loops with 'i', be sure to stack 'i' and restore it when your function exits.

Permalänk
Medlem

Blunda!

Här kommer ett riktigt fulhack

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Medlem

Ja grabbhalvor och heltjejer.. 15 minuter kvar att lämna in på.

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk
Medlem

Och jag kommer lämna in, för det löste sig

Permalänk
Medlem

Vore skoj om alla som skickat in skriver en liten kort förklaring om hur de har tänkt sig att koden ska fungera. Går mycket snabbare att läsa istället för att tugga igenom kod.

Permalänk
Medlem

Han inte lägga till kommentarer på min innan jag skickade den.
Men skriver dem här istället:
Min algoritm letar först fram innerkonturen på bilden och lagrar dessa pkter.
Sen utifrån hur många maxlines är så väljer den var n:te pkt.
Simpelt och ineffektivt, men den löser uppgiften i alla fall.

Däremot har jag en version som tar fram lösning med 0fel (eller väldigt nära på extrema bilder).

Provade med en version som testar hur mycket fel det är och sedan flyttar pkterna lite slumpvis, dock var min testfunktion så långsam så jag la ner projektet.

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk

Jag misstänker att jag har en lite udda lösning på problemet, det ger knappast bra resultat och den är inte så snabb heller skulle jag inte tro, men den är iaf lite annorlunda. Den går ut på att den skapar en cirkel med det antal punkter som man har angett som parameter när man kör programmet, och sedan flyttar den alla punkterna mot mitten tills den träffar något som är vitt. Som ni förstår så fungerar detta extremt dåligt på former som t ex gap.raw om ni har sett den, men den borde lämpa sig relativt bra på trädet om man jämför med andra former. Ändå så fick jag sämst resultat tror jag..
Här är koden om någon vill se: http://files.blinkenlights.se/independence_bitmaptovector.cpp

Permalänk
Medlem

All kod etc kommer upp på sidan.

http://jmb.mine.nu/~matricks/veckansproblem/

Om ni har skickat in. Kolla att erat namn finns med. Jag kommer nu gå igenom alla lösningarna med alla tester.

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av independence
Jag misstänker att jag har en lite udda lösning på problemet, det ger knappast bra resultat och den är inte så snabb heller skulle jag inte tro, men den är iaf lite annorlunda. Den går ut på att den skapar en cirkel med det antal punkter som man har angett som parameter när man kör programmet, och sedan flyttar den alla punkterna mot mitten tills den träffar något som är vitt. Som ni förstår så fungerar detta extremt dåligt på former som t ex gap.raw om ni har sett den, men den borde lämpa sig relativt bra på trädet om man jämför med andra former. Ändå så fick jag sämst resultat tror jag..
Här är koden om någon vill se: http://files.blinkenlights.se/independence_bitmaptovector.cpp

Hade också den principen först innan jag ändrade.

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Medlem

Min lösning hör garanterat till de simplaste. Bilden delas upp i många mindre områden, och varje sådant område söks av var för sig. Om området innehåller både svart och vitt (i mitt program är det dock rött och vitt, fråga in varför), betyder det att området innehåller en kantbit av bilden. Om det är så, placerar en punkt mitt i det lilla området.

Det är väldigt enkelt, men tar också väldigt lite tid på sig. Från att programmet har startats, till att bilden är laddad och analyserad, och punkterna är utsatta, går det mindre än 0.3 sekunder. Punkterna placerat ut relativt bra, tycker jag.

Felet i programmet är att punkterna skapas i fel ordning. De skapas från vänster till höger, uppifrån och ner, villket gör att Matricks testprogram connectar punkterna fel.
Postar bilden som förklarar felet igen;

Visa signatur
Permalänk
Medlem

Så här funkar mitt program:

Först letar den fram innerstrukturen, dvs tar fram en linje för varje pixel (så man får en bild med 0 fel). Den första vita pixeln letas upp, sedan trace:ar den enligt alltid-följa-vänster-vägg regeln tills den kommit till startpositionen igen.

Sedan så sker en avvägning, där den linje som har minsta vinkeldifferensen tas bort. På detta sätt tas linje för linje bort tills man har så många som önskats (t ex 20 linjer). När en linje tas bort så räknas vinkeldifferensen om för föregående/efterföljande linjer.

Förbättring 1: Avvägningen baseras också på linjens längd, kortare linjer har större chans att tas bort. Använde denna formel: A = vinkeldiff * längd.

Förbättring 2: Längdens betydelse kan varieras. Använde formeln A = vinkeldiff * (längd ^ p) , där p är ett värde som jag lät variera mellan 0.0625 upp till 8. Lägre värden visade sig vara bra på bilder med massor med korta "spröt" och högre för bilder med långa linjer.

För varje nytt värde på p så räknades hela bilden om med poängen, och den bästa poängen (med de bästa linjerna) sparades.

Förbättring 3: Bruteforce. Värdet för x,y på punkten för varje linje ändrades, och för varje ändring så räknades poängen för hela bilden om. Den bästa sparades hela tiden osv.

Jag lyckades dock aldrig få poängberäkningen att helt överensstämma med matricks, så min lösning är nog inte helt optimal.

Permalänk
Medlem

Ni kommer få vara lite tålmodiga.. kommer ta ett tag att fixa alla resultat.

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.

Permalänk
Medlem

Min tänkta lösning är väldigt lik madah:s ovan. Men jag hann bara koda så jag fick ut innerkonturen. Sen orkade jag inte längre så då fulade jag till det lite. Medans jag letade fram innerkonturen så sparade jag för varje vit kantpixel hur många svarta den angränsade emot. Sen tog jag de punkterna som hade mest angränsande svarta och plockade ut lika många punkter som det skulle vara linjer. Lösningen är inte särskillt bra men den är ganska snabb

EDIT: Medans ni ändå väntar på resultatet så kan ni ju ta och hjälpa mig lite http://forum.sweclockers.com/showthread.php?s=&threadid=34963...

Visa signatur

Man kan inte polera en bajskorv

Permalänk
Medlem

Min algoritm dummar sig när det är hackiga former, så jag fulade till det genom att köra en slags guassian blur på det hela. Tog och kollade pixlarna runtom varje pixel och om det var 4 stycken eller mer blev den vit, annars svart. Detta kördes 3 gånger på bilden.
När jag tänker efter kan bilden faktiskt kapas om man har otur och därmed sabotera hela alltet, nåja, det fungerade iallfall på alla testbilder.

Sen letades alla konturpixlar fram och lades i en lista. Den listan loopades igenom och så kollades lutningen på varje pixel genom att ta ett medelvärde på lutningen på pixelns andra grannar och dess fjärde grannar. När lutningen hade överstigit gränsvärdet 8 gånger så lades den första pixeln som översteg värdet till som en vektorpunkt, och sen nollställdes räknaren. Detta loopades tills den hade gått runt hela konturen.
Efter det så loopade jag igenom alla vektorpunkter och raderade bort punkter som låg på en och samma rad, så fick man bort lite onödiga punkter.

Detta loopades i sin tur tills antalet punkter låg under maxgränsen man specifierade, och för varje loop så ökades dessa gränsvärden så att antalet punkter minskade.

Lite luddig beskrivning och lösning. Men den fungerade och jag är riktigt stolt över min förmåga. När matricks släppte uppgiften så fick jag panik och trodde inte jag skulle klara det.

Permalänk
Medlem

Snart gått igenom alla program. Hittils har jag sett C/C++, Python och QUICK BASIC! användas

EDIT: Java också

Visa signatur

Teeworlds - För dig som gillar gulliga saker med stora vapen.