Permalänk
Medlem

så tiden är ute.. ända som kommer få ändra är cide (han var lite sen.. skall bencha han och sedan skall han få en snabb titt på sin kod ifall något går fel) och don_tomaso som failar testet på sin senaste uppdatering. Dom har några minuter på sig.

Preliminära siffror är som följer:

matricks 175.193775 ms Passed ice 179.987680 ms Passed psionicist 291.940735 ms Passed vg132 324.199863 ms Passed ookk 339.116843 ms Passed madah 363.781710 ms Passed sunray 405.471366 ms Passed etono 418.461564 ms Passed eighty 400.709587 ms Passed micke 465.012732 ms Passed don_tomaso 347.960146 ms Failed

Jag skall hård köra algorithmerna 50ggr sedan så vi får fina siffror.. sedan skall jag lägga upp allt.

Visa signatur

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

Permalänk
Medlem

Ojoj, meddelandet blev nästan för långt när jag skulle skicka koden. Detta bådar inte gott

EDIT: Jag la inte till någon funktion för att läsa in filen.. Jag antog att du lägger till det i benchen, matricks. Hoppas jag inte har fel

Visa signatur

CTMod Developer (WoW UI Mod)
http://www.CTMod.net

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av cide
Ojoj, meddelandet blev nästan för långt när jag skulle skicka koden. Detta bådar inte gott

EDIT: Jag la inte till någon funktion för att läsa in filen.. Jag antog att du lägger till det i benchen, matricks. Hoppas jag inte har fel

Sånt lägger jag till ja.

EDIT:
Cide: din kod klarade testet

Snart klar med allt för att göra det slutgiltiga testet. Sunray kommer testa det hela på en P4:a också.

Visa signatur

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

Permalänk
Medlem

Trevligt. Frågan är hur snabb den är bara

Visa signatur

CTMod Developer (WoW UI Mod)
http://www.CTMod.net

Permalänk
Medlem

Peta lite på nån moderator så kanske vi kan få en tråd klistrad till nästa helg där det står tid.

Permalänk
Medlem

Test Source Name Opteron 242 P4 P4 Opt matricks 174.947095 ms 216.885945 ms 119.306504 ms Source ice 180.564569 ms 167.446421 ms 150.565784 ms Source psionicist 292.634678 ms 227.442035 ms 215.746135 ms Source vg132 324.636232 ms 272.374282 ms 248.200260 ms Source ookk 336.539979 ms 264.661011 ms 269.197901 ms Source madah 363.856580 ms 307.051595 ms 248.140755 ms Source eighty 396.796241 ms 275.758511 ms 268.071780 ms Source sunray 403.229461 ms 312.517094 ms 271.837342 ms Source etono 417.711190 ms 221.111901 ms 221.471444 ms Source micke 458.879550 ms 353.592426 ms 354.795651 ms Source don_tomaso 426.084600 ms 477.967451 ms 449.259054 ms Source cide 4739.216856 ms 4142.804463 ms 4068.235767 ms Source

Så, där har vi resultatet. Opteron är kompilerat på min burk med Blend optimeringar endast. P4 är Opteron exe:n körd på Sunrays P4 burk. P4 Opt är kompilerad med P4 specifika optimeringar och körd på Sunrays burk. Kolla in Ice och min kod. Båda två gör bra ifrån sig men är skrivna på olika sätt.

Creds till alla som ställde upp. Det var fler än jag trodde som faktiskt ställde upp vilket är kul.
Lite extra creds till cide som tog sig ann utmaningen även fast resultatet inte blev så bra men han gjorde något iallafall och löste problemet.

Jag skall försöka tänka ut något fint tills nästa söndag. Det är ganska svårt att hitta på saker och som ni ser så varierar det hela rätt fint beroende på hur man kompilerar det hela.

EDIT: fixa ordningen.

Visa signatur

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

Permalänk
Medlem

Haha, trevligt

EDIT: Blir att titta igenom er kod nu då.

Visa signatur

CTMod Developer (WoW UI Mod)
http://www.CTMod.net

Permalänk
Medlem

Lite lustigt hur många olika sätt samma uppgift kan lösas på.

Permalänk
Medlem

Det vore trevligt om folk kunde säga hur de tänkt...
matricks kod var...intresant... massa siffror... fattar inte ett ord av den

Visa signatur

LAN i stockholmv9
http://www.hazard.nu

Permalänk
Medlem

Mest kod vinner eller vad är det man säger?

/Viktor

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av BoBo
matricks kod var...intresant... massa siffror... fattar inte ett ord av den

Inte så många ord att fatta.

Jag la upp en sexdimensionell array (max 6 "tecken" i varje morseord) där varje dimension motsvarade ett tecken, en etta = ".", en tvåa = "-" och en nolla är ingenting. Sen kollade jag bara varje morseord och kollade upp vilket tecken det motsvarade i arrayen.
Det jag gjorde här i slutet som jag tjänade 60-70ms på var att göra om till en vanlig endimensionell array, och gjorde om de... um... "morsetal" av 0er, 1er och 2er (talbas 3) till ett decimaltal så man slipper alla dimensioner som segade ner allt.
Men jag missade lite tecken här och var i konverteringen, närmare bestämt 1, 9 och ?.

Jag hittade alla fel (tror jag) 21:25, har inte hittat fler än. Nåja, dödslinjen ska följas.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av BoBo
Det vore trevligt om folk kunde säga hur de tänkt...
matricks kod var...intresant... massa siffror... fattar inte ett ord av den

Den är lite speciellt, men den är snabb.

Citat:

Ursprungligen inskrivet av vg132
Mest kod vinner eller vad är det man säger?

/Viktor

Om du kollar på min kod så är det inte direkt mycket faktiskt. Huvudloopen är bara 3 rader. Sedan är det bara en fet tabell.

Om det finns intresse kan jag skriva exakt hur den fungerar.

Visa signatur

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

Permalänk
Medlem

Gör det... Det känns som om jag har lite att ta igen

Visa signatur

CTMod Developer (WoW UI Mod)
http://www.CTMod.net

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av matricks
Om du kollar på min kod så är det inte direkt mycket faktiskt. Huvudloopen är bara 3 rader. Sedan är det bara en fet tabell.

Tänkte mest på min kod

/Viktor

Permalänk
Medlem

Jag lät '.' stå för 1 och '-' för 0 och lagrade koderna som bitsträngar (eller ints, som ungdomarna kallar det) i en tvådimensionell array, ena dimensionen för längden av koden och andra dimensionen för nummerrepresentationen av koden. Sedan byggde jag upp talen medan jag tuggade igenom pSrc.

Sedan försökte jag en andra gång, men det gick mycket långsammare (512ms enligt matricks). I princip en enda stor state machine med en massa gotos. Om man utvecklar all kod (jag använde makros) skulle den bli 600 rader. Så jag borde ha vunnit "mest kod"-tävlingen.

Visa signatur

:€

Permalänk
Medlem

Rolig tävling
Tycker absolut du ska beskriva hur din fungerar (fattar typ 0 ).. så ska jag ta och skriva ihop nått litet hur min fungerar också..

Sen en sak till bara för att jag inte gillar att komma tvåa.. hur mycket minne tar din algoritm? Min klarar sig på ynka 64+12 bytes

Visa signatur

"Anyone who puts a small gloss on a fundamental technology, calls it proprietary, and then tries to keep others from building on it, is a thief."
-Tim O'Reilly "http://iiice.net/~ice/stuff/secret_msg.wav" - who?

Permalänk
Glömsk

Min kod har juste prestanda/läslighet. Bonuspoäng!

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem

matricks: det vore kul om du skrev hur din kod funkar .. fattar nada av den

Visa signatur

flippy @ Quakenet

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ante84
matricks: det vore kul om du skrev hur din kod funkar .. fattar nada av den

på g. om 30 minuter kanske. tar ett tag

Visa signatur

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

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Psionicist
Min kod har juste prestanda/läslighet. Bonuspoäng!

Poäng till dig, 1an och tvåan är ju bara oläsliga...

Jag röstar på att du vinner tills nån förklarat de andras kod...
Vem vet, kan kanske har olagliga optimeringar

Permalänk
Medlem

Mycket intressant kodläsning! Min kod var ändå kortast

Lookup-tabellen i min kod genereras på ungefär samma sätt som Ice's har gjort med sin.

Men det jag inte riktigt förstår hur mitt morse-program kan vara så mycket slöare? Kan det vara den extra switch-satsen jag har?

Här är iaf koden som räknar fram lookup-tabellen:

#include <stdlib.h> #include <stdio.h> unsigned int get_index( const char *s ) { unsigned int i = 1; while( *s ) { i = i << 1; if( *s == '-' ) i = i | 1; s++; } return i; } int main(int argc, char * argv[] ) { char * morse_text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,?"; char * morse_code_array[] = { ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--", "-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..", "-----",".----","..---","...--","....-",".....","-....","--...","---..","----.", ".-.-.-","--..--","..--..",NULL}; int index_array[117] = {0}; int i; for(i=0; morse_code_array[i]; ++i) { index_array[ get_index( morse_code_array[i] ) ] = morse_text[i] ; } printf("const char morsetable[] = \""); for(i=0; i<116; ++i) { if( index_array[i] == 0 ) putchar( ' ' ); else putchar( index_array[ i ]); } printf("\";\n"); return 0; }

Permalänk
Medlem

Okej, hela min algorithm bygger på något man kallar LUT (Lookup Table). Det är en gammal teknik som använts mycket inom demo kodande. Det hela går ut på att försöka räkna ut så mycket som möjligt i förväg så man slipper sedan räkna samma sak flera gånger. Det är en klassisk memory <-> cpu tradeoff. Man tjänar i cputid men förlorar minnet på det. Nu kommer jag plocka ner detta på en mindre skala så det blir lättare att förstå. Säg att vi har ett mycket mindre alphabet där max längden är 2. . = a - = b .. = c -. = d .- = e -- = f Så för att exakt veta vilket kod det är som kommer så måste vi minst läsa 2st morsetecken framåt. Då finns det dessa som vi kan stöta på " " space ". " a "- " b ".." c "-." d ".-" e "--" f Så för att koda-av så ser det ut så här (halv c++ pseudo kod): int loopnr = 1 while(*pSrc) { c = hämtatvåtecken(pSrc) switch(c) { case " ": *pDst++ = ' '; pSrc += 2; break; case ". ": *pDst++ = 'A'; pSrc += 2; break; case "- ": *pDst++ = 'B'; pSrc += 2; break; case "..": *pDst++ = 'C'; pSrc += 3; break; case "-.": *pDst++ = 'D'; pSrc += 3; break; case ".-": *pDst++ = 'E'; pSrc += 3; break; case "--": *pDst++ = 'F'; pSrc += 3; break; } loopnr++; } ---- exempel ". - - -. -- . -." << pSrc 1122334445566677888 << loop nummer A B B D _ F A D << pDst Så när han läser F och D så plockar han bprt lite extra Problemet med denna kod är att den där switchen inte funkar. Man skulle behöva göra en massa strcmp och allt skulle gå jätte slött. Svart på det hela är att ifrån dom två tecknen vi har skapa ett index nummer. Vi har tre möjliga tecken vi kan stöta på. space . och -. Låt oss sätta nummer på dessa. Jag upptäckte efter att ha studerat en asciitabell att man kunde göra detta väldigt snabbt genom denna teknik: char dec bin sp 32 100000b - 45 101101b . 46 101110b Observera dom två bakersta bitarna i varje tecken. 100000b&0x3 = 00b = 0 101101b&0x3 = 01b = 1 101110b&0x3 = 10b = 2 Smidigt! Detta ger oss: sp = 0 - = 1 . = 2 Att spara ett morsetecken tar asså 2bit och eftersom vi läser skall koda av 2st samtidigt små får vi ett index på 4bitar. Vi kan sätta ihop dessa två morsetecken på detta sätt: int index = (pSrc[0]&0x3)|((pSrc[1]&0x3)<<2); Nu kommer index vara från 0-8 och motsvara något av dom följande alternativen: nr code char morselen 0 " " space 2 1 ". " a 2 2 "- " b 2 3 " ." Invalid 0 4 ".." c 3 5 "-." d 3 6 " -" Invalid 0 7 ".-" e 3 8 "--" f 3 Två av dessa är som sagt ogiltiga och dom kommer vi aldrig få upp om inkommande data är korrekt. Sedan är morselen alltid ett större än antalet morsetecken eftersom vi måste äta upp spacetecknet efter varje morsekod också. Vi har nu skapat våran LUT som då ser ut: const int aCharLUT[] = {' ','a','b',0,'c','d',0,'e','f'}; const int aLenLUT[] = {2,2,2,0,3,3,0,3,3}; Vi kan nu koda av på detta vis: while(*pSrc) { int index = (pSrc[0]&0x3)|((pSrc[1]&0x3)<<2); *pDst++ = aCharLUT[index]; pSrc += aLenLUT[index]; } VACKERT! Eftersom vi inte har några if-satser alls så slipper vi branch-prediction fel som kan stalla CPUn och ta en massa tid. Ända problemet just nu är att vi kommer få massa onödiga cache missar efter vi har två onödigt stora array. Vi kan slå ihop dom på detta sätt: const int aLUT[] = { ' '|(2<<8), 'a'|(2<<8), 'b'|(2<<8), 0, 'c'|(3<<8), 'd'|(3<<8), 0, 'e'|(3<<8), 'f'|(3<<8)}; Och koda av genom: while(*pSrc) { int c = aLUT[ (pSrc[0]&0x3)|((pSrc[1]&0x3)<<2) ]; *pDst++ = c&0xff; pSrc += c>>8; } Jämför ni den där funktionen med den i source koden så är dom relativt lika bara det att den andra jobbar på 6st istället för 2st. Sedan skrev jag givetvis koden för att generera den stora LUT:en som finns med i filen.

EDIT: gjorde lite fel på slutet.

Visa signatur

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

Permalänk
Medlem

Jag använder binäraträd i min lösning. För att det ska gå snabbare använder jag en array istället för noder med pekare för att representera trädet. Ett komplett träd kan man lätt representera med hjälp av en array. Om vi då står på i i trädet så är det vänstra barnet 2*i + 1 och det högra barnet 2*i + 2.

Eftersom . och - ligger väldigt nära varandra i asciitabellen '.' - '-' = 1 ger detta perfekt för att switcha mellan vänster och höger.

Så ponera att vi vill räkna fram .-- då ska vi först gå till höger och sedan två vänster. Detta representeras av

(0 * 2 + 2) ((0 * 2 + 2) * 2 + 1) (((0 * 2 + 2) * 2 + 1)) * 2 + 2) = 12

Sedan plockar vi bara index 12 ur arrany och får fram våran char.

Detta kan skrivas om som

for(i=0; i < 3; i++) { if( p[i] == '.' ) // . -> gå höger +2 id = 2*id + 2; else // - -> gå vänster +1 id = 2*id + 1; }

Men eftersom vi inte gillar if satser och tecknena har den fina egenskapen beskriven tidigare kan vi ersätta +2/+1 med p[i] - '-' (45) + 1 och få samma sak.

Vi slutar alltså på att räkna fram indexet i tabellen med hjälp av:

id = (id + id) + (*p - 45 + 1);

Nu behöver vi ju egentligen en branching (if-sats) för att avgöra om tecknet vi står på är ett mellanslag eller en morse-code.. nej det vill vi inte. Så vi utökar arrayn lite.. som alla vet är space = 32 och 32 - 45 + 1 = 12 alltså behöver vi ett space på index -12 då gör vi det

Visa signatur

"Anyone who puts a small gloss on a fundamental technology, calls it proprietary, and then tries to keep others from building on it, is a thief."
-Tim O'Reilly "http://iiice.net/~ice/stuff/secret_msg.wav" - who?

Permalänk
Medlem

IcE: stilig lösning.

Visa signatur

:€

Permalänk
Medlem

Damnit, här satt man och spelade så jag missade hela... En till tävlig imorrn skulle vara kul.

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
Citat:

Ursprungligen inskrivet av Myris
Damnit, här satt man och spelade så jag missade hela... En till tävlig imorrn skulle vara kul.

Får nog bli nästan söndag då.. tog alldelles för mycket tid för att klaras på en vardag

Visa signatur

"Anyone who puts a small gloss on a fundamental technology, calls it proprietary, and then tries to keep others from building on it, is a thief."
-Tim O'Reilly "http://iiice.net/~ice/stuff/secret_msg.wav" - who?

Permalänk
Medlem

Kom igen nu.. jag har ingen skola imorrn

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

söndag!

Visa signatur

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

Permalänk
Medlem

Lördag och söndag, två helgdagar = två tävlingar.

Permalänk
Medlem

Borde tillsätta en kommité som bestämmer tävlingarna då Har bestämt tänkt att delta varenda gång, behöver träningen(4739ms, hoho)

Visa signatur

CTMod Developer (WoW UI Mod)
http://www.CTMod.net