Hoe apart, waarom daar niet?quote:Op zondag 11 december 2005 22:34 schreef SuperRembo het volgende:
Die truck met de X werkt in dit geval niet
1 |
Ik ben wel benieuwd naar je oplossing, volgens mij wordt ie niet genoemd op phpfreakz.quote:Op maandag 5 december 2005 01:46 schreef Ro�a� het volgende:
Is er ook een prijs voor meest originele inzending. Heb nog een leuke gevonden, die is echter wel 60 tekens, dus niet helemaal optimaal.
Roonaan wordt daar helemaal niet genoemd, vreemd genoeg.quote:Op zondag 11 december 2005 23:05 schreef SuperRembo het volgende:
[..]
Ik ben wel benieuwd naar je oplossing, volgens mij wordt ie niet genoemd op phpfreakz.
Ja...quote:Op zondag 11 december 2005 23:02 schreef Light het volgende:
printf verwacht een string met format specifiers, en een bijpassend aantal variabelen. Zie sprintf voor de mogelijkheden. %.2f geeft iig aan dat de parameter een floating point variabele met een precisie van twee decimalen is. Da's precies wat de bedoeling is
En die preg_replace is wat flauw natuurlijk. De constante X evalueert naar een lege string (omdat de constante X niet bestaat) en op die string wordt een lege expressie losgelaten. NOrmaal gesproken gebruik je delen van de expressie weer in de tweede variabele (met $0 of $1 bijvoorbeeld), maar hier dus niet. De /e modifier bij de expressie geeft aan dat de resultaatsting (de tweede parameter van de functie preg_replace dus) moet worden geevalueerd als php code.
End ten slotte levert het laatste element van de array op. De volgorde van de elementen in het formulier was met opzet gekozen.
Zo werkt het niet.quote:Op zondag 11 december 2005 23:02 schreef Light het volgende:
En die preg_replace is wat flauw natuurlijk. De constante X evalueert naar een lege string (omdat de constante X niet bestaat) en op die string wordt een lege expressie losgelaten.
Nee, X wordt gezien als een constante die leeg is. Als het als een string zou worden gezien zou de regexp niet meer werken. Maar dan snap ik nog steeds niet waarom het niet werkt in de code van Lightquote:Op zondag 11 december 2005 23:16 schreef SuperRembo het volgende:
[..]
Zo werkt het niet.
X is onbekend en wordt daarom gezien als constante string 'X'.
De // regexp matcht het begin en eind van de string 'X' (denk ik).
Correctquote:Op zondag 11 december 2005 23:16 schreef Swetsenegger het volgende:
wacht even, je gaat de input dus gewoon behandelen als php code, welke dus gewoon 2*3/4 uit zal voeren en de printf geeft die uitkomst als float met 2 decimalen.
Klopt dit?
Owja, als ik printf weghaal uit de functie en gewoon 2+3 als invoer geef dan krijg ik 5X5 als uitvoer. En X is natuurlijk geen nummer, dus bij de convertering naar een getal verdwijnt die.quote:Op zondag 11 december 2005 23:16 schreef SuperRembo het volgende:
[..]
Zo werkt het niet.
X is onbekend en wordt daarom gezien als constante string 'X'.
De // regexp matcht het begin en eind van de string 'X' (denk ik).
Het begin en eind wordt gereplaced door de uitkomst van de eval van de input ('3+4*5/3' => 9.6666666666667). Dit levert de string '9.6666666666667X9.6666666666667'.
Printf verwacht een float, en converteert daarom de string naar een float, dat levert 9.6666666666667. Dat getal wordt afgerond op 2 decimalen en geconverteerd naar een string: '9.67'.
quote:Op zondag 11 december 2005 23:05 schreef SuperRembo het volgende:
[..]
Ik ben wel benieuwd naar je oplossing, volgens mij wordt ie niet genoemd op phpfreakz.
1 |
Round levert bij 2+8 de uitkomst 10, niet 10.00.quote:Op zondag 11 december 2005 23:47 schreef SuperRembo het volgende:
Wel creatief, maar die gebruikt dus intern ook eval. Ik zie nergens dat je round niet mocht gebruiken.
het schijnt dat er áltijd twee cijfers achter de komma moest hebben, round doet dat niet, die geeft gewoon 2.5 voor 5/2, ipv 2.50.quote:Op zondag 11 december 2005 23:47 schreef SuperRembo het volgende:
Wel creatief, maar die gebruikt dus intern ook eval. Ik zie nergens dat je round niet mocht gebruiken.
1 |
jups. mijn fout. misread de opdracht klaarblijkelijk.quote:Op zondag 11 december 2005 23:47 schreef Light het volgende:
En je oplossing van 52 tekens, was dat ook met een round?
Dat round() iets anders doet dan de %.2f van printf() betekent niet dat je round() niet mag gebruiken.quote:Op zondag 11 december 2005 23:48 schreef Light het volgende:
[..]
Round levert bij 2+8 de uitkomst 10, niet 10.00.
1 2 3 4 5 | <form method="POST" action="base64.php"> <input type="text" name="input"> <input type="submit" value="base64"> </form> |
In dit geval wel. Uit de opdracht:quote:Op zondag 11 december 2005 23:49 schreef JeRa het volgende:
[..]
Dat round() iets anders doet dan de %.2f van printf() betekent niet dat je round() niet mag gebruiken.
quote:Output moet bestaan uit twee decimalen en de punt wordt als scheidingsteken gebruikt.
Dus volgens jou mag deze oplossing niet?quote:Op zondag 11 december 2005 23:52 schreef Light het volgende:
[..]
In dit geval wel. Uit de opdracht:
[..]
quote:Op maandag 12 december 2005 00:01 schreef JeRa het volgende:
[..]
Dus volgens jou mag deze oplossing niet?
<?=printf('%.2f',round(preg_replace('//e',end($_POST),''),2));
(naast het feit dat het dubbelop is)
Als kortste oplossing komt die niet in aanmerkingquote:Op maandag 12 december 2005 00:01 schreef JeRa het volgende:
[..]
Dus volgens jou mag deze oplossing niet?
<?=printf('%.2f',round(preg_replace('//e',end($_POST),''),2));
(naast het feit dat het dubbelop is)
Ik heb 'm nu in 283 karakters. 228 is wel erg weinig zegquote:Op zondag 11 december 2005 23:51 schreef crisp het volgende:
Iemand zin in een tussendoortje?
Men neme dit formulier:
[ code verwijderd ]
Schrijf nu base64.php zo kort mogelijk; de output moet hetzelfde zijn als de output van base64_encode() maar deze functie mag je uiteraard niet gebruiken
Verder dezelfde regels als voor reguliere Golfs, oplossingen mogen naar crisp@xs4all.nl (privacy gewaarborgt). Einddatum is Zondag 18 december 18:00 uur.
Om het scherp te zetten: ik heb zelf een oplossing van 228 karakters
De functie die je dan moet hebben heet wel printf, maar de argumenten zijn iets anders (en bieden ook meer mogelijkheden).quote:Op maandag 12 december 2005 22:51 schreef Chandler het volgende:
in basic ofzo kon je altijd printen met printf "##.##", getal maar dat werkt blijkbaar niet in PHP
zó ingewikkeld om php.net/printf is het toch niet?quote:Op maandag 12 december 2005 22:51 schreef Chandler het volgende:
in basic ofzo kon je altijd printen met printf "##.##", getal maar dat werkt blijkbaar niet in PHP
Dat vind ik al een aardige prestatiequote:Op maandag 12 december 2005 22:06 schreef SuperRembo het volgende:
[..]
Ik heb 'm nu in 283 karakters. 228 is wel erg weinig zeg![]()
Nee, dat is een implementatie van base64 en niet zozeer het algoritme zelf. Zo is het uitsplitsen naar lijnen van max 76 karakters geen karakteristiek van base64 zelf, dus ook niet nodig (base64_encode() doet dat ook niet).quote:Op dinsdag 13 december 2005 00:46 schreef JeRa het volgende:
Ik neem aan dat base64.php zich volledig aan het RFC 2045 moet houden?
Zat ik net eentje onder je vorige schepsel, kom je met dit nieuwsquote:Op dinsdag 13 december 2005 16:30 schreef crisp het volgende:
Ik zit zelf inmiddels op 208
Het is er niet netter op geworden though..
Ik neem aan dat zo'n beetje iedereen dezelfde bitwise operaties uitvoert om dit een beetje compact te kunnen uitvoeren. Dan kom ik nóg met geen mogelijkheid aan de 230-quote:Op dinsdag 13 december 2005 23:29 schreef crisp het volgende:
dat wordt een leuk lesje bitwise rekenen
Mwa, ik kan daar nog wel wat variaties op bedenken hoor.quote:Op dinsdag 13 december 2005 23:43 schreef JeRa het volgende:
[..]
Ik neem aan dat zo'n beetje iedereen dezelfde bitwise operaties uitvoert om dit een beetje compact te kunnen uitvoeren. Dan kom ik nóg met geen mogelijkheid aan de 230-
Je geeft me een geweldig idee *uitwerkt*quote:Op dinsdag 13 december 2005 23:48 schreef crisp het volgende:
[..]
Mwa, ik kan daar nog wel wat variaties op bedenken hoor.
Een groot deel van mijn code zit in het initialiseren van de geldige karakters (57 bytes). Daarna volgt het daarwerkelijke algoritme (78 bytes) en het verwerken van de 'rest' en padding (45 bytes). Input en output verwerking en nog wat verplichte overhead zit dan nog op 28 bytes...
Ben erg benieuwd naar de resultaten straksquote:Op woensdag 14 december 2005 00:52 schreef crisp het volgende:
Er zijn 2 algemene approaches voor dit probleem. De meest voorkomende is dat je 3 bytes gelijktijdig omzet naar base64 (4 bytes); ik doe echter een byte-naar-bit approach waarbij ik een remainder bijhou
Enig idee hoeveel tekens een return-statement inneemt?quote:Op woensdag 14 december 2005 08:46 schreef SuperRembo het volgende:
Misschien is het een idee om de opdracht iets aan te passen. Maak de body van een functie, in plaats van een heel script dat een form verwerkt. Dan hou je dingen als pos($_POST) er buiten, die kent iedereen toch wel.
Nou nee, ik zit op 262 maar bij dat aantal is het nog goed mogelijk om de boel leeg te laten lopenquote:Op woensdag 14 december 2005 09:57 schreef crisp het volgende:
Oeh, 206
Ik kan wel raden welke approach je hebt genomen dan; omzetten naar base128 (7 bits naar een byte) zou wel lastiger zijn dan denk ik?
Na de einddatum wellicht?quote:
Heb je eigenlijk al een idee op welke strings je de inzendingen gaat testen? Het zou namelijk best wel eens zo kunnen zijn dat een scriptje schrikt van een lege string, eentje met niet-ascii tekens, etcquote:Op woensdag 14 december 2005 23:39 schreef crisp het volgende:
JeRa is goed bezig zo te horen
Ik ben erg benieuwd, ik denk dat hier best wel wat leuke dingen uit gaan komen
Mja, ik zat vooral met dat formulier in gedachten ja. De drempel is dan wat lager om het alleen met user(/ascii)input te proberen ipv ook binaire dataquote:Op donderdag 15 december 2005 00:10 schreef crisp het volgende:
base64_encode is natuurlijk primair juist bedoelt om binaire data te transporteren, dus daar zal het zeker mee overweg moeten kunnen (hoewel dat via een form wat lastiger te testen is). Een lege string zou gewoon ook een lege string terug moeten geven
Oh die van mij zit prima in elkaarquote:Op donderdag 15 december 2005 11:59 schreef crisp het volgende:
als je algoritme goed in elkaar zit zou binaire input geen probleem mogen zijn
Zeg eens, je hebt de wedstrijd verzonnen terwijl je al een vrij geoptimaliseerde versie had liggen, en dan doe je nog mee ook?quote:Op vrijdag 16 december 2005 18:10 schreef crisp het volgende:
En de eerste inzending is binnen
Aangezien ik natuurlijk nu inspiratie op zou kunnen doen daaruit hou ik het bij mijn 195-er, hoewel het een heel andere approach is dan degene die ik heb genomen
Ik weet zeker dat jij er wel onder komtquote:Op zaterdag 17 december 2005 00:45 schreef JeRa het volgende:
[..]
Zeg eens, je hebt de wedstrijd verzonnen terwijl je al een vrij geoptimaliseerde versie had liggen, en dan doe je nog mee ook?
I'll try, maar ik moet nog eerst het probleem oplossen dat ie gvd één tekentje uit een subset van 256 tekentjes niet piktquote:Op zaterdag 17 december 2005 01:08 schreef crisp het volgende:
[..]
Ik weet zeker dat jij er wel onder komt
Ik had dus ook eerst een werkende versie die ik vervolgens ging optimaliserenquote:Op zaterdag 17 december 2005 13:49 schreef crisp het volgende:
Ik heb tot nog toe enkel getest met wat random strings - niet echt uitputtend yet.
De JS versie van mijn algoritme gebruik ik echter voor binaire strings en die heb ik meermalen met base64_encode() vergeleken.
Tja, maar ik doe in essentie iets verkeerd.quote:Op zaterdag 17 december 2005 21:31 schreef crisp het volgende:
Ziet er goed uit JeRa
Een aantal dingen heb je korter opgelost dan ik; als ik dat in mijn script zou integreren kom ik op 182(maar ik doe uiteraard voor spek en bonen mee)
1 2 3 4 5 | echo eval($code); //ik verwacht 2 - klopt echo preg_replace('//e', $code, ''); //ik verwacht 2 - maar krijg 1! |
1 2 3 4 5 6 7 8 9 10 | $b = "0"; if ($a) { echo '$a is!'; } if ($b) { echo '$b is!'; } |
1 2 3 | echo 'just great!'; } |
Leuk idee, ik heb alleen geen tijd om zoiets helemaal op te zetten en te ontwerpen. Ik kan wel een subdomein van gmta.nl leveren (golf.gmta.nl bijvoorbeeld) en alles wat je nodig zou kunnen hebben op een webserverquote:Op zondag 18 december 2005 11:44 schreef Chandler het volgende:
Waarom begint GOLF of jullie niet een globale website voor wedstrijden die een maand duren, dan heb je er wel 12 per jaar en kun je echt zien hoe divers mensen programmeren... (scripten).
Dat valt ook weer mee, denk ik zo. De ingrediënten:quote:Op zondag 18 december 2005 15:12 schreef SuperRembo het volgende:
Het is een hoop werk om te maken en om te onderhouden, terwijl een topic ook prima voldoet.
Dat valt wel mee hoor, ik begrijp de code primaquote:Op zondag 18 december 2005 19:12 schreef JeRa het volgende:
Zondag 18:00! Geweestik heb medelijden met Crisp en de onbegrijpelijke stukken code waar hij lappen tekst over moet schrijven
Tof.quote:Op zondag 18 december 2005 19:13 schreef crisp het volgende:
[..]
Dat valt wel mee hoor, ik begrijp de code prima
Ik ben al begonnen en zal het in de loop van de avond af proberen te maken
Zo, nog even wat dingen geregeld voor de aankomst van onze zoon overmorgen maar nu zit ik er echt voorquote:Op zondag 18 december 2005 19:19 schreef JeRa het volgende:
[..]
Tof.Wat vind je van het idee van Chandler trouwens?
1 |
1 |
1 |
1 |
1 |
1 2 3 4 5 6 7 8 9 | $t.='+/='; for($l=strlen($s=pos($_POST)."\0\0");$j<$l;) { $a=ord($s{$j++}); $b=ord($s{$j++}); $c=ord($s{$j++}); echo$t{$a>>2}.$t{$a<<4&48|$b>>4&15}.$t{$l-$j>1?$b<<2&60|$c>>6:64}.$t{$l-$j>2?$c&63:64}; } |
1 2 3 4 5 6 | $b.='0123456789+/'; $l=strlen($s=end($_POST)); while($i<$l)$x.=sprintf('%08b',ord($s{$i++})); while($j<8*$l)echo$b{bindec(sprintf('%0-6s',substr($x,-6+$j+=6,6)))}; while($l++%3>0)echo'='; |
1 2 3 4 5 6 7 8 | for($s=pos($_POST);($a=$s{$p})!='';) { $b=$p++*2%6; $c=ord($a)>>$b+2|($b?$d:0); $d=ord($a)<<4-$b&63;echo$t{$c}.($b>3?$t{$d}:''); } if($p%3)echo$t{$d}.'='.($b?'':'='); |
1 2 3 4 5 6 7 | $l=strlen($s=pos($_POST)),$d=array_merge(range(A,Z),range(a,z),range(0,9),'+','/','='); $i<$l||$b%8&&++$e; $o.=$d[$e>1?64:$r>>$b],$r&=(1<<$b)-1 ) $b+=$b<6?($r=$r<<8|ord($s[$i++]))?2:2:-6; echo$o; |
Ik gebruik geen '=' in mijn base, en als je die bij jouw methode weglaat is het aantal tekens ook 52quote:Zelfs mijn eigen methode was met 56 duidelijk nog langer dan noodzakelijk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | { $b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $result = ''; $i = 0; $l = strlen($string); $bitpointer = 0; $remainder = 0; while ($i < $l) { if ($bitpointer < 6) { $remainder = $remainder << 8 | ord($string[$i++]); $bitpointer += 8; } $bitpointer -= 6; $result .= $b64[$remainder >> $bitpointer]; $remainder &= (1 << $bitpointer) - 1; } if ($bitpointer) { $result .= $b64[$remainder << 6 - $bitpointer]; $bitpointer -= 6; while ($bitpointer % 8) { $result .= '='; $bitpointer -= 6; } } return $result; } |
1 2 3 4 5 6 | $s=pos($_POST),$d=join(range(A,Z)).join(range(a,z)).'0123456789+/='; $s[$i]!=''||$b%8&&++$e; print$d[$e>1?64:$r>>$b],$r&=(1<<$b)-1 ) $b+=$b<6?($r=$r<<8|ord($s[$i++]))?2:2:-6; |
Die ,'=' had ik al buiten beschouwing gelatenquote:Op maandag 19 december 2005 00:06 schreef JeRa het volgende:
Ik gebruik geen '=' in mijn base, en als je die bij jouw methode weglaat is het aantal tekens ook 52
Nee, samen met die OR gaat dat niet goed...quote:edit2: $r=$r<<8; is hetzelfde als $r<<=8; mocht je dat nog niet in je kleinere versie hebben
Shame on me...quote:Op maandag 19 december 2005 00:43 schreef crisp het volgende:
Nee, samen met die OR gaat dat niet goed...
En jij bent ook zeker een winnaar, 176 tekens is wel schandalig kleinquote:Overigens mag iedereen zich wel een beetje winnaar noemen; ik had niet verwacht dat ik zulke goede inzendingen zou krijgen, en zelfs dat foutje van SuperRembo is nog te vergeven aangezien het volgens mij best wel eenvoudig te fixen is
Waar gebruik je die compressie voor? Is het ook ergens in actie te bewonderen?quote:Op maandag 19 december 2005 00:32 schreef crisp het volgende:
Het grote voordeel van deze aanpak is dat het eenvoudig is om te zetten naar een andere macht-van-2-basis zoals base32 of base128 (dat laatste gebruik ik bijvoorbeeld voor een javascript-compressie algoritme).
Een uitwerking van LZW/LZS met nog een aantal verbeteringen in javascript: http://therealcrisp.xs4all.nl/upload/jscompress.htmlquote:Op maandag 19 december 2005 07:43 schreef SuperRembo het volgende:
[..]
Waar gebruik je die compressie voor? Is het ook ergens in actie te bewonderen?
1 2 3 4 5 6 7 8 9 10 | 001 = 1 010 = 2 011 = 3 100 = 4 101 = 5 1100 = 6 1101 = 7 1110 = 8 1111 = 9 |
Een beetje voor de lol eigenlijk. Ik had LZW al geimplementeerd in mijn javascript GIF generator (WIP) en wou eens kijken of het ook bruikbaar zou zijn voor een javascript compressor/obfuscatorquote:Op maandag 19 december 2005 19:27 schreef SuperRembo het volgende:
Ziet er gaaf uit
Heb je dit gemaakt als studie, voor de lol of heb je ook een echte toepassing?
Kom maar op hoorquote:Op vrijdag 6 januari 2006 17:45 schreef JeRa het volgende:
Wanneer komt eigenlijk de volgende PHP Golf?
Ik heb namelijk een vrij nutteloze maar best uitdagende PHP-puzzel bedacht die we misschien als extra tussendoortje kunnen doen
1 |
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |