Iedere maand wordt er op het forum van phpfreakz.nl een nieuwe opgave gepost.quote:Beste PHP-ers,
--[ Wat is PHP Golf?
De bedoeling is een PHP script te maken met zo min mogelijk karakters.
Dus zo min mogelijk letters, nummers, spaties, newlines en dergelijke.
Met het script moet je een doelstelling bereiken.
We gaan ervan uit dat je de recenste PHP 4.x, op het moment 4.4,
versie hebt en standaard php.ini configuratie. Tenzij anders vermeld.
(Standaard: register_globals = off)
Het script moet op UNIX-gebaseerde en Windows systemen werken.
--[ Voor wie is PHP Golf?
De competitie is voor iedereen toegankelijk.
--[ Inzendingen
Je kunt je oplossing sturen naar:
phpgolf [at] gmail [dot] com
(Disclaimer: je e-mail zal niet worden gebruikt voor
spam of worden doorgegeven aan derden)
quote:--[ Doelstelling
Het script moet de volgende output genereren:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
BCDEFGHIJKLMNOPQRSTUVWXYZA
CDEFGHIJKLMNOPQRSTUVWXYZAB
DEFGHIJKLMNOPQRSTUVWXYZABC
EFGHIJKLMNOPQRSTUVWXYZABCD
FGHIJKLMNOPQRSTUVWXYZABCDE
GHIJKLMNOPQRSTUVWXYZABCDEF
HIJKLMNOPQRSTUVWXYZABCDEFG
IJKLMNOPQRSTUVWXYZABCDEFGH
JKLMNOPQRSTUVWXYZABCDEFGHI
KLMNOPQRSTUVWXYZABCDEFGHIJ
LMNOPQRSTUVWXYZABCDEFGHIJK
MNOPQRSTUVWXYZABCDEFGHIJKL
NOPQRSTUVWXYZABCDEFGHIJKLM
OPQRSTUVWXYZABCDEFGHIJKLMN
PQRSTUVWXYZABCDEFGHIJKLMNO
QRSTUVWXYZABCDEFGHIJKLMNOP
RSTUVWXYZABCDEFGHIJKLMNOPQ
STUVWXYZABCDEFGHIJKLMNOPQR
TUVWXYZABCDEFGHIJKLMNOPQRS
UVWXYZABCDEFGHIJKLMNOPQRST
VWXYZABCDEFGHIJKLMNOPQRSTU
WXYZABCDEFGHIJKLMNOPQRSTUV
XYZABCDEFGHIJKLMNOPQRSTUVW
YZABCDEFGHIJKLMNOPQRSTUVWX
ZABCDEFGHIJKLMNOPQRSTUVWXY
Nu mag jij het script programmeren en liefst zo kort mogelijk.
--[ Deadline:
De deadline is over 8 dagen.
Vrijdag 19:00 4 november 2005
-----
quote:Post in dit topic vragen/suggesties.
GEEN OPLOSSINGEN!
Warnings en notices mogen, want die worden niet getoond.quote:Op zondag 30 oktober 2005 09:54 schreef Chandler het volgende:
ah... dus het hoeft code technisch dus niet perfect te zijn
Ik zie het jaquote:Op zondag 30 oktober 2005 10:06 schreef SuperRembo het volgende:
Als je de ?> weglaat dan moet je wel afsluiten met een ;, dus het scheelt maat 1 teken.
Het weglaten van ?> geeft geen notice. Mijn scriptje werkt zelfs helemaal zonder notices
Dan heb je vast nog geen 50 tekens.quote:Op zondag 30 oktober 2005 10:17 schreef Chandler het volgende:
hier echt welheb namelijk alle notice etc aan staan
quote:Op zondag 30 oktober 2005 10:54 schreef Swetsenegger het volgende:
He light, heb je je ZCE gehaald?
Gefeliciteert!quote:Op zondag 30 oktober 2005 10:58 schreef Light het volgende:
[..]
Het staat al een ruime week in m'n sig, maar dat valt niemand op
Dankquote:Op zondag 30 oktober 2005 11:03 schreef Swetsenegger het volgende:
[..]
Gefeliciteert!
Je moet 'm ook klikbaar maken naar je certificaat he
Textonly heeft geen sigsquote:Op zondag 30 oktober 2005 10:58 schreef Light het volgende:
[..]
Het staat al een ruime week in m'n sig, maar dat valt niemand op
Dank. Dit ben ik.quote:Op maandag 31 oktober 2005 11:38 schreef Roonaan het volgende:
[..]
Textonly heeft geen sigs
Gefeliciteerd. Welke ben je? (yellow pages)
1 |
1 |
1 |
1 |
53 vind ik ook wel leuk eigenlijkquote:Op zaterdag 3 december 2005 23:10 schreef SuperRembo het volgende:
Ok 56 en dan hou je nu op he.
Er staat in de opdracht dat je de functie eval() niet mag gebruiken.quote:Op zondag 4 december 2005 23:53 schreef Ro�a� het volgende:
een preg met /e valt onder eval toch?
Nee, maar ik vind eigenlijk van wel. Weet niet hoe de source code van preg_replace() eruit ziet maar ik gok er heel erg op dat het in feite een interne eval()-aanroep is.quote:Op zondag 4 december 2005 23:53 schreef Ro�a� het volgende:
een preg met /e valt onder eval toch?
Was toch gewoon een vraag?quote:Op maandag 5 december 2005 01:18 schreef Wifibro het volgende:
He jongens, we hadden gevraagd om geen oplossingen te geven, nou zie ik toch weer een heel duidelijke aanwijzing!
jups.quote:Roonan, heb je je 52 tekens inzending getest op juiste output met de in de opdracht gegeven sommetjes?
Alsof op phpfreakz geen aanwijzingen worden gegeven zeker.quote:Op maandag 5 december 2005 01:18 schreef Wifibro het volgende:
He jongens, we hadden gevraagd om geen oplossingen te geven, nou zie ik toch weer een heel duidelijke aanwijzing!
Ik heb de oplossing van Roonaan niet gezien, maar ik denk dat zijn oplossing dezelfde is als die van mij, en die is getest met de gegeven sommen.quote:Roonan, heb je je 52 tekens inzending getest op juiste output met de in de opdracht gegeven sommetjes?
Op PFZ is geen functie genoemd.quote:Light:
Alsof op phpfreakz geen aanwijzingen worden gegeven zeker.
Tjee, wat goed....quote:Ik heb de oplossing van Roonaan niet gezien, maar ik denk dat zijn oplossing dezelfde is als die van mij, en die is getest met de gegeven sommen.
Ik heb hier ook geen volledige functie genoemd zien worden eigenlijk. Ja, eval(), met als opmerking dat die niet gebruikt mag worden.quote:Op maandag 5 december 2005 01:32 schreef Wifibro het volgende:
[..]
Op PFZ is geen functie genoemd.
[..]
Zoveel keuze is er niet bij heel weinig tekens hoorquote:Tjee, wat goed....
Roönaän had het over een functie met een bepaalde modifier die alleen bij één functie kan voorkomenquote:Op maandag 5 december 2005 01:39 schreef Light het volgende:
[..]
Ik heb hier ook geen volledige functie genoemd zien worden eigenlijk. Ja, eval(), met als opmerking dat die niet gebruikt mag worden.
Detailquote:Op maandag 5 december 2005 01:42 schreef JeRa het volgende:
[..]
Roönaän had het over een functie met een bepaalde modifier die alleen bij één functie kan voorkomen
Roonaan geeft toch geen oplossing? Dit soort opmerkingen zie je ook op phpfreakz staan in de diverse golven. De mensen welke weten wat /e doet, komen er zelf ook wel opquote:Op maandag 5 december 2005 01:18 schreef Wifibro het volgende:
He jongens, we hadden gevraagd om geen oplossingen te geven, nou zie ik toch weer een heel duidelijke aanwijzing!
Ik ook niet. Meestal komt het toch op een reguliere expressie uit, maar ik probeer de uislagen altijd wel te begrijpen. Je leert er heel veel van.quote:Op maandag 5 december 2005 08:30 schreef Chandler het volgende:
Ik wacht rustig af... ken het zelf toch niet...![]()
Uiteraardquote:Op maandag 5 december 2005 08:45 schreef Light het volgende:
Uitleggen komt pas nadat de wedstrijd is afgesloten![]()
Is er eigenlijk een system function die dit kan? of zou dat niet mogenquote:Op maandag 5 december 2005 08:45 schreef Light het volgende:
Uitleggen komt pas nadat de wedstrijd is afgeslotenHet enige dat ik kwijt wil ik dat ik geen enkele ruimte meer zie om het nog korter te maken.
Ik zou er zo geen weten. De logische namen kan ik hier iig niet vindenquote:Op maandag 5 december 2005 09:03 schreef Ro�a� het volgende:
[..]
Is er eigenlijk een system function die dit kan? of zou dat niet mogen
ik ook niet, maar ik ben ook niet zo'n dosfreak.quote:Op maandag 5 december 2005 09:13 schreef Light het volgende:
[..]
Ik zou er zo geen weten. De logische namen kan ik hier iig niet vinden
Nou voorlopig zit ik nog op de 57 en zie ik nog steeds geen ruimte voor verbeteringquote:Op maandag 5 december 2005 08:26 schreef Swetsenegger het volgende:
Ik wacht nog op een briljante zet van SUperRembo
Tja, als ik een scriptje op mijn server host en simpelweg remote de inhoud van het resultaat opvraag kan ik ook alles oplossen, en het zal ook niet mogen, maar het staat niet in de regels!quote:
Nee hoorquote:Op dinsdag 6 december 2005 22:08 schreef crisp het volgende:
minder had gekunt als de submit-button geen name-attribuut had gehad
Ook wel *tak tik*quote:Op vrijdag 9 december 2005 22:03 schreef Ro�a� het volgende:
*tik tak* ;-)
Ik heb even gekeken, maar op basis van mijn oplossing van 52 tekens zie ik echt niet waar er nog een teken te besparen is.quote:Op vrijdag 9 december 2005 23:51 schreef Ro�a� het volgende:
[..]
niet per ongeluk get ipv post gebruikt?
*naarstig op zoek is naar kortere oplossing*
Dat klopt, het is zelfs een functie in PHP. Het is echter noodzakelijk om je output 'toonbaar' te maken aangezien compressie meestal binaire data oplevert. Daarbij is het verlies door base64 (33%) juist weer een extra uitdaging om je compressie zo optimaal mogelijk te maken (standaard LZW doet al gauw zo'n 50%)quote:Op zaterdag 10 december 2005 00:01 schreef Light het volgende:
Voor base64 encoden is volgens mij al een standaardalgoritme. En je kunt vooraf zeggen hoeveel bytes een resultaat wordt (overigens is een base64 resultaat groter dan het origineel). Maar een optie voor het verkleinen van een standaarddocument (tekst ofzo) zou op zich wel een uitdaging zijn
Dat zouden ze eigenlijk opnieuw moeten proberen, nu doet Fok! mee en iedereen weet dat je voor PHP-vraagstellingen hier moet zijn en niet bij PHPFreakzquote:Op zaterdag 10 december 2005 11:05 schreef SuperRembo het volgende:
Zo'n soort opgave is er al geweest: PHP Golf 3. Die opgave heeft geen inzendingen opgeleverd.
1 |
1 |
Die hint van mij was misschien ook niet echt duidelijkquote:Op zondag 11 december 2005 22:03 schreef SuperRembo het volgende:
Het winnende scriptje van crisp:
[ code verwijderd ]
Ik heb er dus echt geen moment aan gedacht om de parameters om te wisselen (ondanks de hint van Light).
Maar hij kan nog korter
[ code verwijderd ]
49 tekens. bcadd() rondt trouwens naar beneden af.
1 |
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 |
Ja, dat staat er welquote:Op zaterdag 7 januari 2006 17:35 schreef Chandler het volgende:
Dus ff ter vertaling, je de output van het script moet het zelfde zijn als de broncode van het script?
quote:Op zaterdag 7 januari 2006 02:14 schreef JeRa het volgende:
De opdracht
"... De output en het script zelf dienen dus identiek te zijn."
Ja inderdaad. Maargoed dan kom je nog maar op 65 tekens uit.quote:Op zaterdag 7 januari 2006 15:24 schreef SuperRembo het volgende:
Er staat er zelfs een in de comments bij de functie xxxxxx op php.net
Heb er maar één ontvangenquote:Op zaterdag 14 januari 2006 17:33 schreef SuperRembo het volgende:
Crisp had toch 3 versies?
Ik heb je later nog een mail gestuurd met daarin 3 alternatieven - welliswaar allemaal gebaseerd op voorbeelden die je ook op het web vind, maar toch...quote:
Daar heb je helemaal gelijk in.quote:Op zaterdag 14 januari 2006 17:54 schreef crisp het volgende:
[..]
Ik heb je later nog een mail gestuurd met daarin 3 alternatieven - welliswaar allemaal gebaseerd op voorbeelden die je ook op het web vind, maar toch...
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
GEEN OPLOSSINGEN POSTENquote:Doelstelling
Je ontmoet wel eens leuke meiden waarvan jij je nummer wilt geven. Alleen is het veel cooler als jij je nummer in woorden kan geven. Op meeste telefoons zitten de letters op deze nummers:
0 => 0
1 => 1
2 => abc
3 => def
4 => ghi
5 => jkl
6 => mno
7 => pqrs
8 => tuv
9 => wxyz
Dus 0900-8844 (nummer van politie) kan 0Z00-TUIG worden en 09008844 wordt 0Z00TUIG. Nu is de bedoeling dat jij een script schrijft die alle mogelijkheden geeft wanneer je een telefoonnummer ingeeft. Elk mogelijke uitkomst moet worden weergeven op haar eigen regel.
Voorbeelden van geldige telefoonnummers:
06-12345678
0612345678
0900-8844
09008844
000-1234567
0001234567
Je mag er vanuit gaan dat de nummer uit $_GET komt met key 'nr' en dat deze altijd set is.
Deadline
De deadline is over 8 dagen.
Dinsdag 18:00 20 juni 2006
224 219 217 216 214 tekens inmiddels.quote:Op woensdag 14 juni 2006 16:04 schreef JeRa het volgende:
Ook maar eens een poging gewaagd met 229 tekens
Je zat er op te wachten hèquote:Op donderdag 15 juni 2006 09:02 schreef Roönaän het volgende:
Okee, dan is het 197 met zero warnings.
Er staat dus niét dat er op elke regel een uitkomst moet staan. Misschien helpt dit mensen als ze een loopje met een echo "\n" willen combinerenquote:Elk mogelijke uitkomst moet worden weergeven op haar eigen regel.
Oh god had ik nou maar niks gezegdquote:Op donderdag 15 juni 2006 10:23 schreef Roönaän het volgende:
het moet toch sowieso <br>'s worden?
Kijk vooral bij de oplossingen van de vorige puzzels; staan een hoop truukjes bij die je gegarandeerd later weer wilt vergeten (maar die wel helpen om de boel korter te krijgen)quote:Op donderdag 15 juni 2006 11:20 schreef _Flash_ het volgende:
mijn eerste keer dat ik zo'n puzzel maak.
Zit nu op 296 chars
substr_replace() is alleen handig als je meerdere tekens in één keer wilt wijzigen, is dit bij jou het geval? Zo niet, dan kun je nog altijd de string als een array beschouwen of de string accessors ($string{$pos}) gebruiken. Die accessors zijn wel obsolete vanaf PHP6 dacht ik.quote:Op donderdag 15 juni 2006 14:25 schreef _Flash_ het volgende:
Gebruikt iemand ook substr_replace als kern? Of andere tips?
1 2 3 4 5 6 7 | ?> <?php $lines = file(__FILE__); $line = $lines[0]; // <-- de regel in het bestand waar je oplossing staat. echo '<br/>Mijn oplossing is '.strlen($lines[$line]).' tekens lang'; ?> |
Ehm...wat is er mis met de bestandsgrootte?quote:Op donderdag 15 juni 2006 17:15 schreef Roönaän het volgende:
Als je hele oplossing op 1 regel staat (lijkt me wel) kan je simpelweg het statement tellen met:
[ code verwijderd ]
-r-
ik heb error_reporting E_ALL op de eerste regel staanquote:Op donderdag 15 juni 2006 22:17 schreef SuperRembo het volgende:
[..]
Ehm...wat is er mis met de bestandsgrootte?
Ging niet bij mij zonder een warning helaasquote:Op donderdag 22 juni 2006 00:44 schreef crisp het volgende:
Ik heb maar 1 echo, ik doe aan het begin al $g=$_GET[nr]."\n";
1 2 | "; |
Ja, maar die had ik nog niet ingestuurd omdat ik dacht dat als ik nog even tijd had hem nog iets kon bijslijpen. Alleen vergeten dat er ook een deadline wasquote:Op donderdag 22 juni 2006 14:44 schreef JeRa het volgende:
Roönaän had toch een veel kortere oplossing dan 197 tekens? Of is het een typo?
Verder mooie oplossingen! Gefeliciteerd crisp
1 |
1 |
Nou, enerzijds is $k natuurlijk korter dan $p[$i] en anderszijds is het een smerige manier om m'n pointerarray te initializeren - ik gebruik immers een iteratieve approach itt een recursieve.quote:Op vrijdag 23 juni 2006 00:17 schreef SuperRembo het volgende:
Crisp, wat doet die reference nou precies in $a{$k=&$p[$i]}?
1 2 3 4 | $k =& $p[$i]; $k = 10; print_r($p); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //Notice: Undefined variable: b // $b is nog steeds undefined $c = & $d; // levert $d = NULL $e = & $f[0]; // levert $f = array(1) { [0]=> &NULL } $g = & $h{0}; // levert $h = array(1) { [0]=> &NULL } $i = & $j->k; // levert $j = object(stdClass)(1) { ["k"]=> &NULL } |
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |