FOK!forum / Digital Corner / [Centraal] PHP - Golf wedstrijd
Quinazolinevrijdag 28 oktober 2005 @ 18:24
Van PHP-Freakz.nl :
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)
Iedere maand wordt er op het forum van phpfreakz.nl een nieuwe opgave gepost.
Discussieer hier over mogelijke oplossingen (en andere shit zodat t php voor dummies topic schoon blijft )

Eerdere opgaves :

Golf #1
Golf #2
Golf #3
Golf #4
Golf #5

Huidige opgave :

Golf #6
ikke_ookvrijdag 28 oktober 2005 @ 18:27
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

-----
SuperRembovrijdag 28 oktober 2005 @ 18:32
quote:
Post in dit topic vragen/suggesties.
GEEN OPLOSSINGEN!
JeRavrijdag 28 oktober 2005 @ 19:56
Die oplossing in het centrale topic, waarom een <br> het lijkt mij dat een \n korter is en in een terminal levert dat toch echt dezelfde output op
Chandlervrijdag 28 oktober 2005 @ 21:06
idd, je kan gewoon \n geven want er staat niet dat het in je browser moet functioneren. Maar ik laat het goede werk aan Professionals als SuperRembo en Roonaan over
SuperRembozaterdag 29 oktober 2005 @ 10:12
De regels moeten gescheiden zijn door HTML breaks, niet door newlines.
Dan zit ik weer op 52 tekens
Lightzaterdag 29 oktober 2005 @ 11:46
Daar moeten er nog zeker twee af te halen zijn.
Swetseneggerzaterdag 29 oktober 2005 @ 13:37
tvptje
_Endymion_zaterdag 29 oktober 2005 @ 14:33
86
crispzaterdag 29 oktober 2005 @ 23:55
5150

[ Bericht 9% gewijzigd door crisp op 30-10-2005 00:06:28 ]
SuperRembozondag 30 oktober 2005 @ 00:42
Ja, heb 'm nu ook in 50
Chandlerzondag 30 oktober 2005 @ 09:40
prachtig hoor; 50 tekens is dat incl <br> en ?> ?
Lightzondag 30 oktober 2005 @ 09:49
Inclusief "<br>" en exclusief ?>

Het weglaten van ?> geeft namelijk een notice, en dat mag nog.
Chandlerzondag 30 oktober 2005 @ 09:54
ah... dus het hoeft code technisch dus niet perfect te zijn
SuperRembozondag 30 oktober 2005 @ 10:06
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
SuperRembozondag 30 oktober 2005 @ 10:06
quote:
Op zondag 30 oktober 2005 09:54 schreef Chandler het volgende:
ah... dus het hoeft code technisch dus niet perfect te zijn
Warnings en notices mogen, want die worden niet getoond.
Lightzondag 30 oktober 2005 @ 10:17
quote:
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
Ik zie het ja
Chandlerzondag 30 oktober 2005 @ 10:17
hier echt wel heb namelijk alle notice etc aan staan
Lightzondag 30 oktober 2005 @ 10:19
quote:
Op zondag 30 oktober 2005 10:17 schreef Chandler het volgende:
hier echt wel heb namelijk alle notice etc aan staan
Dan heb je vast nog geen 50 tekens.
Swetseneggerzondag 30 oktober 2005 @ 10:54
He light, heb je je ZCE gehaald?
Lightzondag 30 oktober 2005 @ 10:58
quote:
Op zondag 30 oktober 2005 10:54 schreef Swetsenegger het volgende:
He light, heb je je ZCE gehaald?

Het staat al een ruime week in m'n sig, maar dat valt niemand op
Swetseneggerzondag 30 oktober 2005 @ 11:03
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
Gefeliciteert!
Je moet 'm ook klikbaar maken naar je certificaat he
Lightzondag 30 oktober 2005 @ 11:09
quote:
Op zondag 30 oktober 2005 11:03 schreef Swetsenegger het volgende:

[..]

Gefeliciteert!
Je moet 'm ook klikbaar maken naar je certificaat he
Dank
En klikbaar maken kan altijd nog
Roonaanmaandag 31 oktober 2005 @ 11:38
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
Textonly heeft geen sigs

Gefeliciteerd. Welke ben je? (yellow pages)
Lightmaandag 31 oktober 2005 @ 19:02
quote:
Op maandag 31 oktober 2005 11:38 schreef Roonaan het volgende:

[..]

Textonly heeft geen sigs

Gefeliciteerd. Welke ben je? (yellow pages)
Dank. Dit ben ik.
SuperRembowoensdag 2 november 2005 @ 22:13
Nog 21 uur

Heeft iemand nog een briljante oplossing (onder de 50 tekens)?
SuperRembozondag 6 november 2005 @ 19:00
Crisp (Tino) gefeliciteerd

De oplossing van crisp:

1<?for($i=702;$i;)echo--$i%27?chr(90-$i%26):'<br>';


Mijn oplossing:

1<?for($i=702;$i--;)echo$i%27?chr(90-$i%26):"<br>";


De complete uitslag
crispzondag 6 november 2005 @ 23:10
Jij ook gefeliciteerd SuperRembo

Het zat er dik in dat onze oplossingen nagenoeg identiek zouden zijn. Dit zou ook nog kunnen - dan print je alleen geen <br> op het eind:
1<?for($i=702;--$i;)echo$i%27?chr(90-$i%26):'<br>';
SuperRembozondag 6 november 2005 @ 23:20
Ik had deze nog voor als je een newline in plaats van een <br> mocht gebruiken (47 tekens)

1<?for($i=702;$i--;)echo chr($i%27?90-$i%26:10);
crispzondag 6 november 2005 @ 23:41
Dat is dan weer een logische afgeleide ja
Lightmaandag 7 november 2005 @ 01:03
Ik heb er hier al op gehint dat ik een oplossing met 50 tekens had Maar ik heb niets ingestuurd, omdat ik het flauw vond om een oplossing in te sturen die afgeleid was van een (grotere) oplossing die al eerder hier gepost was.
Chandlermaandag 7 november 2005 @ 11:12
gefeli mensen. Was weer een stukje strak programmeren snap nog steeds niet hoe dat met die chr precies in elkaar zat maar ok!?
JeRazaterdag 3 december 2005 @ 22:09
Voor de nieuwe PHP golf #7 heb ik zojuist een oplossing van 57 tekens ingestuurd was niet bijster lastig deze
SuperRembozaterdag 3 december 2005 @ 22:09
Ik heb 'm ook in 57
JeRazaterdag 3 december 2005 @ 22:34
Nu in 56 tekens
SuperRembozaterdag 3 december 2005 @ 23:10
Ok 56 en dan hou je nu op he.
Lightzondag 4 december 2005 @ 23:12
quote:
Op zaterdag 3 december 2005 23:10 schreef SuperRembo het volgende:
Ok 56 en dan hou je nu op he.
53 vind ik ook wel leuk eigenlijk
JeRazondag 4 december 2005 @ 23:32
quote:
Op zondag 4 december 2005 23:12 schreef Light het volgende:

[..]

53 vind ik ook wel leuk eigenlijk
En volledig functioneel? Zou tof zijn
Lightzondag 4 december 2005 @ 23:37
quote:
Op zondag 4 december 2005 23:32 schreef JeRa het volgende:

[..]

En volledig functioneel? Zou tof zijn
Ja, uiteraard
Lightzondag 4 december 2005 @ 23:38
Tenminste, voor zover ik kan testen wel
Roonaanzondag 4 december 2005 @ 23:53
een preg met /e valt onder eval toch?
Lightmaandag 5 december 2005 @ 00:04
quote:
Op zondag 4 december 2005 23:53 schreef Ro�a� het volgende:
een preg met /e valt onder eval toch?
Er staat in de opdracht dat je de functie eval() niet mag gebruiken.
JeRamaandag 5 december 2005 @ 00:26
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.
Roonaanmaandag 5 december 2005 @ 01:14
52.
Lightmaandag 5 december 2005 @ 01:16
Dat sluit ik niet uit, maar in de regeltjes staat alleen dat eval niet mag. Anders kan het nog veel korter natuurlijk
Lightmaandag 5 december 2005 @ 01:17
quote:
Op maandag 5 december 2005 01:14 schreef Ro�a� het volgende:
52.
Ik ook
Roonaanmaandag 5 december 2005 @ 01:18
quote:
Op maandag 5 december 2005 01:17 schreef Light het volgende:

[..]

Ik ook
zag het net idd @ phpfz
Wifibromaandag 5 december 2005 @ 01:18
He jongens, we hadden gevraagd om geen oplossingen te geven, nou zie ik toch weer een heel duidelijke aanwijzing!

Roonan, heb je je 52 tekens inzending getest op juiste output met de in de opdracht gegeven sommetjes?
Roonaanmaandag 5 december 2005 @ 01:22
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!
Was toch gewoon een vraag?

Voor hetzelfde geld had ik gevraagd of je antwoord wel of niet crossbrowser compatible moest zijn..
quote:
Roonan, heb je je 52 tekens inzending getest op juiste output met de in de opdracht gegeven sommetjes?
jups.
Lightmaandag 5 december 2005 @ 01:23
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!
Alsof op phpfreakz geen aanwijzingen worden gegeven zeker.
quote:
Roonan, heb je je 52 tekens inzending getest op juiste output met de in de opdracht gegeven sommetjes?
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.
Wifibromaandag 5 december 2005 @ 01:32
quote:
Light:
Alsof op phpfreakz geen aanwijzingen worden gegeven zeker.
Op PFZ is geen functie genoemd.
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.
Tjee, wat goed....
Lightmaandag 5 december 2005 @ 01:39
quote:
Op maandag 5 december 2005 01:32 schreef Wifibro het volgende:

[..]

Op PFZ is geen functie genoemd.
[..]
Ik heb hier ook geen volledige functie genoemd zien worden eigenlijk. Ja, eval(), met als opmerking dat die niet gebruikt mag worden.
quote:
Tjee, wat goed....
Zoveel keuze is er niet bij heel weinig tekens hoor
JeRamaandag 5 december 2005 @ 01:42
quote:
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.
Roönaän had het over een functie met een bepaalde modifier die alleen bij één functie kan voorkomen
Lightmaandag 5 december 2005 @ 01:46
quote:
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
Detail
Roonaanmaandag 5 december 2005 @ 01:46
Is er ook een prijs voor meest originele inzending. Heb nog een leuke gevonden, die is echter wel 60 tekens, dus niet helemaal optimaal.
Lightmaandag 5 december 2005 @ 01:47
Niet dat ik weet, maar je kunt 'm natuurlijk insturen en dan hopen dat'ie vermeld wordt.
Wifibromaandag 5 december 2005 @ 01:53
Tri Pham geeft meestal een leuk overzicht, daar is altijd plek in voor leuke oplossingen. Ik heb zelf ook een leuke andere methode gevonden van 66 tekens.
Roonaanmaandag 5 december 2005 @ 02:14
Beide ingezonden. Ga er in principe vanuit dat die van light en mij hetzelfde zijn. Zoals gezegd is er niet meer zoveel speelruimte op een gegeven moment. Het zou leuker zijn als bepaalde functies uitgesloten waren, maar goed.

-r-
Swetseneggermaandag 5 december 2005 @ 08:26
Ah, de ZCE'ers bieden tegen elkaar op.
Ik wacht nog op een briljante zet van SUperRembo

Even kijken op phpfreakz, ik had 'm gemist. En 52 tekens ga ik sowieso niet halen vrees ik.
Chandlermaandag 5 december 2005 @ 08:30
Ik wacht rustig af... ken het zelf toch niet...
Swetseneggermaandag 5 december 2005 @ 08:32
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!
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 op
Swetseneggermaandag 5 december 2005 @ 08:34
quote:
Op maandag 5 december 2005 08:30 schreef Chandler het volgende:
Ik wacht rustig af... ken het zelf toch niet...
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.

Ik wil dan ook voorstellen dat de Fokkers (welke trouwens weer bovenaan staan en kortere inzendingen hebben dan de PHPfreakz) hun oplossingen hier in detail uitleggen als ze dat willen. Voor ons mindere geesten is dat best handig .
Lightmaandag 5 december 2005 @ 08:45
Uitleggen komt pas nadat de wedstrijd is afgesloten Het enige dat ik kwijt wil ik dat ik geen enkele ruimte meer zie om het nog korter te maken.
Swetseneggermaandag 5 december 2005 @ 08:47
quote:
Op maandag 5 december 2005 08:45 schreef Light het volgende:
Uitleggen komt pas nadat de wedstrijd is afgesloten
Uiteraard
Roonaanmaandag 5 december 2005 @ 09:03
quote:
Op maandag 5 december 2005 08:45 schreef Light het volgende:
Uitleggen komt pas nadat de wedstrijd is afgesloten Het enige dat ik kwijt wil ik dat ik geen enkele ruimte meer zie om het nog korter te maken.
Is er eigenlijk een system function die dit kan? of zou dat niet mogen
Chandlermaandag 5 december 2005 @ 09:04
We wachten af
Lightmaandag 5 december 2005 @ 09:13
quote:
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 zou er zo geen weten. De logische namen kan ik hier iig niet vinden
Roonaanmaandag 5 december 2005 @ 09:21
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
ik ook niet, maar ik ben ook niet zo'n dosfreak.
JeRamaandag 5 december 2005 @ 10:11
Nou, ik ben wel zo'n DOS-freak (vroegâh) en tegenwoordig een Linux-freak, en met het commando 'bc' (zoals bcmath als extension in PHP) kun je dit soort berekeningen prima uitvoeren. Alleen werkt het dan niet op Windows-systemen; en hetzelfde geldt waarschijnlijk ook als je iets vindt in Windows

Overigens is dat een externe binary en geen system function, met die laatste ga je het sowieso niet redden gezien de grote verschillen tussen elk OS
Lightmaandag 5 december 2005 @ 12:36
Het lijkt me niet echt de bedoeling om system() te gebruiken. Op die manier kun je alles wel oplossen, gewoon een C programmaatje schrijven die alles doet en die verder aanroepen. Wel kort, maar vast niet de bedoeling
SuperRembomaandag 5 december 2005 @ 12:59
quote:
Op maandag 5 december 2005 08:26 schreef Swetsenegger het volgende:
Ik wacht nog op een briljante zet van SUperRembo
Nou voorlopig zit ik nog op de 57 en zie ik nog steeds geen ruimte voor verbetering
JeRamaandag 5 december 2005 @ 14:11
quote:
Op maandag 5 december 2005 12:36 schreef Light het volgende:
maar vast niet de bedoeling
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!
Wifibromaandag 5 december 2005 @ 17:07
Je mag dacht ik best een system call doen, maar inderdaad, dat moet op alle systemen werken. En trucjes met externe scripts leidt tot eerverlies, en eer is toch wel het enige dat hier te winnen is.

Ik krijg 'm maar niet korter dan 54. Elke ingeving die ik nu nog krijg leidt steevast tot een paar extra tekens. Of een Parse Error. Ik ben weer heel benieuwd!
crispdinsdag 6 december 2005 @ 22:08
56 met correcte output
minder had gekunt als de submit-button geen name-attribuut had gehad
JeRadinsdag 6 december 2005 @ 22:26
quote:
Op dinsdag 6 december 2005 22:08 schreef crisp het volgende:
minder had gekunt als de submit-button geen name-attribuut had gehad
Nee hoor maakt weinig uit of die submit-button er is.
crispdinsdag 6 december 2005 @ 23:34
Ah, inderdaad; 52 is mogelijk
SuperRembovrijdag 9 december 2005 @ 21:48
Ik krijg zo 't gevoel dat ik iets wat heel erg voor de hand ligt over het hoofd zie
Roonaanvrijdag 9 december 2005 @ 22:03
*tik tak* ;-)
Lightvrijdag 9 december 2005 @ 22:06
quote:
Op vrijdag 9 december 2005 22:03 schreef Ro�a� het volgende:
*tik tak* ;-)
Ook wel *tak tik*
crispvrijdag 9 december 2005 @ 23:15
Net een 51-er opgestuurd
Lightvrijdag 9 december 2005 @ 23:17
51? Damn, dan moet ik toch nog verder zoeken
Roonaanvrijdag 9 december 2005 @ 23:39
hmmm...
Lightvrijdag 9 december 2005 @ 23:39
Ik houd het toch bij mijn inzending van 52 tekens. Daar kan gewoon niets meer af
Roonaanvrijdag 9 december 2005 @ 23:47
Je moet A1GP updaten, of is dat al afgelopen?
Lightvrijdag 9 december 2005 @ 23:49
Nee, ik liep achter met updaten.
crispvrijdag 9 december 2005 @ 23:50
Dan ben ik toch heel benieuwd naar jouw inzending; blijkbaar heb ik dan toch een andere insteek
Roonaanvrijdag 9 december 2005 @ 23:51
quote:
Op vrijdag 9 december 2005 23:15 schreef crisp het volgende:
Net een 51-er opgestuurd
niet per ongeluk get ipv post gebruikt?

*naarstig op zoek is naar kortere oplossing*
crispvrijdag 9 december 2005 @ 23:53
Nee, is met een post

crosspost:

Voor een volgende Golf zou ik wel eens iets echt spannends willen zien, bijvoorbeeld het schrijven van een eigen compressie-algorithme. Je zou dan een standaard tekst van zeg zo'n 2000 karakters losless moeten compressen en de output base64_encoded moeten outputten.
Je score kan dan berekent worden door <bytes originele tekst> - <bytes output> - <bytes van je code>
Dus stel je weet 2000 bytes terug te brengen naar 1300 (base64_encoded) met een 300 byte script dan heb je 400 punten. Uiteraard moet je ook een script leveren die de output weer kan omzetten naar de originele tekst.

Ene Peter zegt dat dat veel meer tijd zou kosten voor deelnemers, maar stiekum denk ik dat het minder deelnemers zou trekken omdat het simpelweg te moeilijk is voor de meesten
Lightzaterdag 10 december 2005 @ 00:01
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
Lightzaterdag 10 december 2005 @ 00:05
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*
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.
crispzaterdag 10 december 2005 @ 00:05
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 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%)
Lightzaterdag 10 december 2005 @ 00:08
Ah wacht, je moet eerst de input compressen, dat stukje had ik even niet gelezen. Dan wordt het wel weer een uitdaging natuurlijk.
crispzaterdag 10 december 2005 @ 00:11
Mwa, een implementatie van base64 is natuurlijk ook wel leuk, maar een stuk minder moeilijk...
SuperRembozaterdag 10 december 2005 @ 11:05
Zo'n soort opgave is er al geweest: PHP Golf 3. Die opgave heeft geen inzendingen opgeleverd.
JeRazaterdag 10 december 2005 @ 12:00
quote:
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.
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 PHPFreakz
crispzaterdag 10 december 2005 @ 12:24
Golf #3 had ik nog niet eerder doorgelezen, ik had er wel raad mee geweten
Chandlerzaterdag 10 december 2005 @ 12:25
Ja die was idd nogal pittig en gaat zo ie zo veel tijd in zitten, niet dat veel gebruikers dat hebben.
Lightzaterdag 10 december 2005 @ 14:12
quote:
Op vrijdag 9 december 2005 22:06 schreef Light het volgende:

[..]

Ook wel *tak tik*
Overigens was dit bedoeld als waarschijnlijk veel te ver gezochte hint
SuperRembozondag 11 december 2005 @ 22:03
Het winnende scriptje van crisp:

1<?printf('%.2f',preg_replace('//e',end($_POST),X));


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

1<?=bcadd(preg_replace('//e',end($_POST),''),0,2);


49 tekens. bcadd() rondt trouwens naar beneden af.

[ Bericht 19% gewijzigd door SuperRembo op 11-12-2005 22:11:10 ]
crispzondag 11 december 2005 @ 22:11
nee, bcadd kapt af op het aantal decimalen dat je opgeeft als precisie; da's wat anders (en daarom ook niet correct)

het voorbeeld '3+4*5/3' zal dus 9.66 geven ipv 9.67 - daarmee voldoet het dus al niet aan de regels...
Lightzondag 11 december 2005 @ 22:25
quote:
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.
Die hint van mij was misschien ook niet echt duidelijk

1<?=bcadd(preg_replace('//e',end($_POST),X),0,2);

Zo dan, 48 tekens
crispzondag 11 december 2005 @ 22:29
Light: still invalid
Lightzondag 11 december 2005 @ 22:32
quote:
Op zondag 11 december 2005 22:29 schreef crisp het volgende:
Light: still invalid
Ja, door afkappen ipv afronden.
SuperRembozondag 11 december 2005 @ 22:34
Die truck met de X werkt in dit geval niet
Lightzondag 11 december 2005 @ 22:41
Ah, je hebt gelijk. Ik had het niet getest
JeRazondag 11 december 2005 @ 22:43
quote:
Op zondag 11 december 2005 22:34 schreef SuperRembo het volgende:
Die truck met de X werkt in dit geval niet
Hoe apart, waarom daar niet?
Swetseneggerzondag 11 december 2005 @ 22:47
Kan iemand 'm even uitleggen want ik begrijp werkelijk niet hoe dit
1<?printf('%.2f',preg_replace('//e',end($_POST),X));

Kan optellen, aftrekken EN vermenigvuldigen

de formatted string is me sowieso niet erg duidelijk
Lightzondag 11 december 2005 @ 23:02
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.
SuperRembozondag 11 december 2005 @ 23:05
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.
Ik ben wel benieuwd naar je oplossing, volgens mij wordt ie niet genoemd op phpfreakz.
Lightzondag 11 december 2005 @ 23:06
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.
Roonaan wordt daar helemaal niet genoemd, vreemd genoeg.
Lightzondag 11 december 2005 @ 23:13
Toch maar even gemeld op phpfreakz
Swetseneggerzondag 11 december 2005 @ 23:16
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.
Ja...
Ik begrijp er nu nog geen ruk van. Ik zie dus een regelcode welke feitelijk niets doet, maar wel de juiste output geeft

Geef eens een voorbeeldje met input.

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?
SuperRembozondag 11 december 2005 @ 23:16
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.
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'.
JeRazondag 11 december 2005 @ 23:23
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 ).
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 Light
Lightzondag 11 december 2005 @ 23:23
quote:
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?
Correct
Lightzondag 11 december 2005 @ 23:26
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'.
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.
Roonaanzondag 11 december 2005 @ 23:27
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<?$_=create_function('',"echo round($_POST[input],2);");$_()


Maar die is ongeldig, aangezien je geen round mocht gebruiken.

[ Bericht 7% gewijzigd door Roonaan op 11-12-2005 23:34:42 ]
SuperRembozondag 11 december 2005 @ 23:47
Wel creatief, maar die gebruikt dus intern ook eval. Ik zie nergens dat je round niet mocht gebruiken.
Lightzondag 11 december 2005 @ 23:47
En je oplossing van 52 tekens, was dat ook met een round?
Lightzondag 11 december 2005 @ 23:48
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.
Round levert bij 2+8 de uitkomst 10, niet 10.00.
Roonaanzondag 11 december 2005 @ 23:48
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.

Anders is er ook een 45 character oplossing met
1<?=round(preg_replace('//e',end($_POST),x),2)
Roonaanzondag 11 december 2005 @ 23:49
quote:
Op zondag 11 december 2005 23:47 schreef Light het volgende:
En je oplossing van 52 tekens, was dat ook met een round?
jups. mijn fout. misread de opdracht klaarblijkelijk.
JeRazondag 11 december 2005 @ 23:49
quote:
Op zondag 11 december 2005 23:48 schreef Light het volgende:

[..]

Round levert bij 2+8 de uitkomst 10, niet 10.00.
Dat round() iets anders doet dan de %.2f van printf() betekent niet dat je round() niet mag gebruiken.
crispzondag 11 december 2005 @ 23:51
Iemand zin in een tussendoortje?

Men neme dit formulier:
1
2
3
4
5
<title>Base64</title>
<form method="POST" action="base64.php">
   <input type="text" name="input">
   <input type="submit" value="base64">
</form>

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
Lightzondag 11 december 2005 @ 23:52
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.
In dit geval wel. Uit de opdracht:
quote:
Output moet bestaan uit twee decimalen en de punt wordt als scheidingsteken gebruikt.
JeRamaandag 12 december 2005 @ 00:01
quote:
Op zondag 11 december 2005 23:52 schreef Light het volgende:

[..]

In dit geval wel. Uit de opdracht:
[..]
Dus volgens jou mag deze oplossing niet?

<?=printf('%.2f',round(preg_replace('//e',end($_POST),''),2));

(naast het feit dat het dubbelop is)
Roonaanmaandag 12 december 2005 @ 00:03
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)
Lightmaandag 12 december 2005 @ 00:09
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 aanmerking
SuperRembomaandag 12 december 2005 @ 22:06
quote:
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
Ik heb 'm nu in 283 karakters. 228 is wel erg weinig zeg
Chandlermaandag 12 december 2005 @ 22:51
in basic ofzo kon je altijd printen met printf "##.##", getal maar dat werkt blijkbaar niet in PHP
Lightmaandag 12 december 2005 @ 22:53
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
De functie die je dan moet hebben heet wel printf, maar de argumenten zijn iets anders (en bieden ook meer mogelijkheden).
Roonaanmaandag 12 december 2005 @ 23:00
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?
crispdinsdag 13 december 2005 @ 00:24
quote:
Op maandag 12 december 2005 22:06 schreef SuperRembo het volgende:

[..]

Ik heb 'm nu in 283 karakters. 228 is wel erg weinig zeg
Dat vind ik al een aardige prestatie
Zelf had ik uiteraard al een JS implementatie liggen die vrij ver doorontwikkeld was; heerlijk bitshifting enzo
JeRadinsdag 13 december 2005 @ 00:46
Ik neem aan dat base64.php zich volledig aan het RFC 2045 moet houden?
crispdinsdag 13 december 2005 @ 09:03
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?
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).
De padding-karakters daarentegen zijn wel onderdeel van het algoritme.
JeRadinsdag 13 december 2005 @ 13:56
Ok, tnx ben ermee bezig.
JeRadinsdag 13 december 2005 @ 14:49
Grmbl...zit op 248 tekens voor volledig functionele base64_encoder...moet...kleiner...kunnen!

edit: niet dus, hij hield geen rekening met één bepaalde character

edit2: Foutje eruit gewerkt, nu op 243 tekens.

edit3: 234 232 tekens nog een béétje verder...

[ Bericht 23% gewijzigd door JeRa op 13-12-2005 15:58:43 ]
crispdinsdag 13 december 2005 @ 16:30
Ik zit zelf inmiddels op 208
Het is er niet netter op geworden though..
GlowMousedinsdag 13 december 2005 @ 17:06
quote:
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..
Zat ik net eentje onder je vorige schepsel, kom je met dit nieuws nog even verder prutsen
crispdinsdag 13 december 2005 @ 23:29
Leuk overigens dat er toch een aantal mensen de uitdaging aangaan
Het was voor mij ook weer een inpuls om goed naar mijn eigen implementatie te kijken en die nog wat verder te optimaliseren.
Verwacht in elk geval ook uitgebreide uitleg van mij na afloop; dat wordt een leuk lesje bitwise rekenen
SuperRembodinsdag 13 december 2005 @ 23:37
Het lastige is dat je van te voren niet weet of de aanpak die je kiest goed te optimaliseren is. Als je de code eenmaal compact opgeschreven hebt dan is geen doen meer om dingen om te gooien.

Met een kleine aanpassing zit ik nu op 279.
JeRadinsdag 13 december 2005 @ 23:43
quote:
Op dinsdag 13 december 2005 23:29 schreef crisp het volgende:
dat wordt een leuk lesje bitwise rekenen
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-
crispdinsdag 13 december 2005 @ 23:48
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-
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...
JeRadinsdag 13 december 2005 @ 23:57
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...
Je geeft me een geweldig idee *uitwerkt* er zit wel degelijk verschil in ja, aangezien ik het daadwerkeiljke algoritme en het verwerken van rest/padding in één stuk heb beschreven

Ik stel mijn aantal bij trouwens, zit weer op 272 dit omdat ik het niet vond kunnen om een hoop niet-ascii tekens in m'n script te gooien. En dat waren er een heleboel. mét de niet-ascii tekens zit ik nu op 213.

[ Bericht 9% gewijzigd door JeRa op 14-12-2005 00:18:14 ]
crispwoensdag 14 december 2005 @ 00:52
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
JeRawoensdag 14 december 2005 @ 01:22
quote:
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
Ben erg benieuwd naar de resultaten straks ik zit nu op 262 en 206 tekens. En nu ga ik slapen.
SuperRembowoensdag 14 december 2005 @ 08:46
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.
JeRawoensdag 14 december 2005 @ 09:09
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.
Enig idee hoeveel tekens een return-statement inneemt?
crispwoensdag 14 december 2005 @ 09:57
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?

Tsja, voor de input/output zal iedereen wel zo'n beetje hetzelfde gebruiken, dus of we het omzetten naar een functie boeit dan ook niet zo...
JeRawoensdag 14 december 2005 @ 10:55
quote:
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?
Nou nee, ik zit op 262 maar bij dat aantal is het nog goed mogelijk om de boel leeg te laten lopen

edit: 254 tekens

edit2: 245 tekens maar het wordt krap.

[ Bericht 7% gewijzigd door JeRa op 14-12-2005 18:53:08 ]
JeRawoensdag 14 december 2005 @ 19:20
Overigens vind ik dit gedrag van PHP ietwat hinderlijk:

ord(chr(0)) === ord('')

Oftewel, de waarde van een binary null is hetzelfde als de waarde van een lege string.

Op 221 tekens nu trouwens. De riem wordt strak aangetrokken

[ Bericht 12% gewijzigd door JeRa op 14-12-2005 19:41:24 ]
Chandlerwoensdag 14 december 2005 @ 22:36
En wanneer komt de uitslag?
JeRawoensdag 14 december 2005 @ 22:40
quote:
Op woensdag 14 december 2005 22:36 schreef Chandler het volgende:
En wanneer komt de uitslag?
Na de einddatum wellicht?

Ik zit nu op 220 219 tekens

[ Bericht 8% gewijzigd door JeRa op 14-12-2005 22:53:38 ]
SuperRembowoensdag 14 december 2005 @ 23:07
Na wat gekut met bitshiften zit ik nu op 253.
crispwoensdag 14 december 2005 @ 23:39
JeRa is goed bezig zo te horen
Ik ben erg benieuwd, ik denk dat hier best wel wat leuke dingen uit gaan komen
JeRawoensdag 14 december 2005 @ 23:47
quote:
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
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, etc (tot nu toe zit ik nog safe, gelukkig heb ik een kortere workaround gevonden voor het probleem met ord() zoals ik een paar posts hierboven had beschreven).

edit: handige eigenschap van de taal die PHP heet brengt mijn aantal nu naar 217. En nou stop ik voor vandaag de kleine versie van m'n script staat op 202 tekens.

edit2: spontane ingeving brengt me naar 214. Ooit moet ik leren stoppen.

[ Bericht 8% gewijzigd door JeRa op 14-12-2005 23:56:25 ]
crispdonderdag 15 december 2005 @ 00:10
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
JeRadonderdag 15 december 2005 @ 10:31
quote:
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
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 data zit nu trouwens op 210 209 208 tekens, sinds gisteravond nog vier vijf zes tekentjes eraf kunnen halen. De kleine versie staat op 188 tekens.

[ Bericht 2% gewijzigd door JeRa op 15-12-2005 11:57:54 ]
crispdonderdag 15 december 2005 @ 11:59
als je algoritme goed in elkaar zit zou binaire input geen probleem mogen zijn
JeRadonderdag 15 december 2005 @ 12:05
quote:
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
Oh die van mij zit prima in elkaar maar af en toe erger ik me dus aan het gedrag van PHP die ord() altijd iets laat teruggeven waardoor een lege string gelijk wordt gesteld aan chr(0). Dat hebben ze bij strpos() toch beter gedaan nu heb ik dat nu niet meer nodig, dus ik ga maar eens verder met het verkleinen van m'n script.
JeRadonderdag 15 december 2005 @ 14:16
Grmbl hij kon niet overweg met chr(48), ik denk dat een aantal mensen wel weet waarom. Weg 208 tekens
crispvrijdag 16 december 2005 @ 15:19
195
crispvrijdag 16 december 2005 @ 18:10
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
JeRazaterdag 17 december 2005 @ 00:45
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
Zeg eens, je hebt de wedstrijd verzonnen terwijl je al een vrij geoptimaliseerde versie had liggen, en dan doe je nog mee ook?
crispzaterdag 17 december 2005 @ 01:08
quote:
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?
Ik weet zeker dat jij er wel onder komt
JeRazaterdag 17 december 2005 @ 01:40
quote:
Op zaterdag 17 december 2005 01:08 schreef crisp het volgende:

[..]

Ik weet zeker dat jij er wel onder komt
I'll try, maar ik moet nog eerst het probleem oplossen dat ie gvd één tekentje uit een subset van 256 tekentjes niet pikt

Puur uit nieuwsgierigheid; ik test mijn methode door vele malen een random input string van willekeurige lengte en willekeurige inhoud (bytes van 0 t/m 255) te genereren en de output van mijn methode te vergelijken met de output van base64_encode(). Heb jij ook iets dergelijks gedaan of bewijs je je code? (ik deed het eerst met het laatste totdat ik erachter kwam dat PHP eigenlijk niet zo heel consequent is)
crispzaterdag 17 december 2005 @ 13:49
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.
JeRazaterdag 17 december 2005 @ 14:23
quote:
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.
Ik had dus ook eerst een werkende versie die ik vervolgens ging optimaliseren waarna bleek dat bepaalde optimalisaties ervoor zorgden dat het in het geheel niet meer werkten als ie een bepaald teken tegenkwam. Ben benieuwd naar de oplossingen morgen

Ik zit nu op 214 tekens.

[ Bericht 3% gewijzigd door JeRa op 17-12-2005 14:28:59 ]
crispzaterdag 17 december 2005 @ 16:30
Inmiddels ook getest met random binairy strings en mijn versie werkt prima. Ook de inzending die ik al heb gekregen is goedgekeurd
crispzaterdag 17 december 2005 @ 21:31
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)
JeRazaterdag 17 december 2005 @ 21:47
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)
Tja, maar ik doe in essentie iets verkeerd. heb me vannacht dood lopen staren op substituties, extracties, transponaties en deleties, maar ik zag niets meer
crispzaterdag 17 december 2005 @ 23:18
Ik heb uiteindelijk het probleem van de padding toch in de 'mainloop' weten te integreren, dat scheelt toch weer een byte of wat
SuperRembozaterdag 17 december 2005 @ 23:25
Ik kap er mee. 248 tekens ingestuurd.
JeRazaterdag 17 december 2005 @ 23:28
Ik heb nu dus wel twee belangrijke dingen in PHP geleerd. Dit werkt niet zoals ik zou verwachten:
1
2
3
4
5
$code = '$a = 1; return $a + 1;';

echo eval($code);    //ik verwacht 2 - klopt

echo preg_replace('//e', $code, '');    //ik verwacht 2 - maar krijg 1!

Het blijkt dat intern preg_replace() zend_string_eval() aanroept, die kennelijk de eerste de beste evaluatie retourneert. Dit in tegenstelling tot eval(), die de code écht als PHP code uitvoert. Een 'echo' kun je bij de preg_replace()-versie dan ook niet uitvoeren.

En dit:
1
2
3
4
5
6
7
8
9
10
$a = chr(0);
$b = "0";

if ($a) {
    echo '$a is!';
}

if ($b) {
    echo '$b is!';
}

Een "0", dat is toch hartstikke logisch, die wordt gecast naar de integer 0 en vervolgens ziet PHP dat als de conditie 'false' en dat terwijl een wérkelijke nul-waarde (chr(0)) gewoon wél wordt gepikt!

Oh, en nog die ene waar ik het al eerder over had:
1
2
3
if (ord(chr(0)) == ord('')) {
    echo 'just great!';
}

Oftewel, genoeg valkuilen.

[ Bericht 13% gewijzigd door JeRa op 17-12-2005 23:43:31 ]
crispzondag 18 december 2005 @ 00:07
idd ook de entry van SuperRembo binnen; weer een heel andere approach, maar dat was ook de opzet uiteraard
Dat wordt morgen een flinke lap uitleg schrijven
Chandlerzondag 18 december 2005 @ 11:44
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).
JeRazondag 18 december 2005 @ 15:09
quote:
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).
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 webserver
SuperRembozondag 18 december 2005 @ 15:12
Het is een hoop werk om te maken en om te onderhouden, terwijl een topic ook prima voldoet.
JeRazondag 18 december 2005 @ 15:15
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 ook weer mee, denk ik zo. De ingrediënten:
- een layout
- een gebruikerssysteem met minimale rechten (user/admin) + registreersysteem
- een topicsysteem (om nieuwe wedstrijden te starten)
- een reageersysteem (zodat mensen kunnen reageren)

Voila
JeRazondag 18 december 2005 @ 16:43
Oh, dan moeten we het wel anders noemen natuurlijk. Golf komt een beetje van phpfreakz af.
SuperRembozondag 18 december 2005 @ 17:10
PHP-Limbo
Chandlerzondag 18 december 2005 @ 18:04
PHPCOMPO ofzo
JeRazondag 18 december 2005 @ 19:12
Zondag 18:00! Geweest ik heb medelijden met Crisp en de onbegrijpelijke stukken code waar hij lappen tekst over moet schrijven
crispzondag 18 december 2005 @ 19:13
quote:
Op zondag 18 december 2005 19:12 schreef JeRa het volgende:
Zondag 18:00! Geweest ik heb medelijden met Crisp en de onbegrijpelijke stukken code waar hij lappen tekst over moet schrijven
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
JeRazondag 18 december 2005 @ 19:19
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
Tof. Wat vind je van het idee van Chandler trouwens?
Chandlerzondag 18 december 2005 @ 20:57
woei, ik kan zelfs wel een layout regelen en dat code werk wil ik ook wel doen... alleen de opgaven ben ik zekers NIET goed in
crispzondag 18 december 2005 @ 22:19
quote:
Op zondag 18 december 2005 19:19 schreef JeRa het volgende:

[..]

Tof. Wat vind je van het idee van Chandler trouwens?
Zo, nog even wat dingen geregeld voor de aankomst van onze zoon overmorgen maar nu zit ik er echt voor

Ik vind het idee van Chandler wel aardig, maar ben zelf bang dat op een gegeven moment de aandacht van een dergelijke opzet toch wel zal gaan verslappen. Ik heb nu een paar keer meegedaan met de Golfs en in het verleden ook wel aan een aantal andere contests meegedaan, maar ik zie aan mezelf dat ik het op een gegeven moment ook wel weer gezien heb en er dan weer een tijd niet naar omkijk...

Verwacht van mij voorlopig ook niet teveel input aangezien ik de komende tijd druk ben met andere zaken
crispzondag 18 december 2005 @ 23:50
Here goes:

Golf Intermezzo: Base64 encoding

Base 64 is letterlijk een numerings systeem met een basis van 64, de hoogste macht van 2 die met standaard ASCII karakters kan worden weergegeven. Base64-encoding wordt daarom voornamelijk gebruikt om binaire data te encoden voor gebruik in transport-formaten die enkel ASCII-karakters kunnen bevatten zoals bijvoorbeeld e-mail.
De gebruikte karakters zijn A t/m Z, a t/m z, 0 t/m 9 aangevuld met, in standaard base64 encoding, het + en / symbool.

Het algoritme om data om te zetten naar base64-encoded data is vrij eenvoudig. Neem bijvoorbeeld de string 'FOK!'. Elke letter in deze string heeft een karakter-code, respectievelijk 70, 79, 75 en 33. Binair met 8 bits per byte ziet dat er zo uit:

101000110 01001111 01001011 00100001


Bij het encoden worden telkens 6 bits uit deze reeks bytes genomen, en vervangen door het symbool uit de base64-karaktersset dat staat op de index gevormd door het 6-bit getal:

1010001 100100 111101 001011 001000 01

117     36     61     11     8

1R      k      9      L      I


In dit geval houden we nog 2 bits over; die worden aangevuld met 0-en, dus het laatste karakter wordt het karakter op index 010000, oftewel 16 = Q

Je ziet dus dat voor elke 3 bytes input er 4 bytes geoutput worden. Als er op het eind minder dan 4 bytes geoutput hoeven worden (zoals in dit geval) dan wordt de base64-encoded string aangevuld met een zogenaamd 'padding'-karakter, in dit geval het '='-teken. In totaal komt de encoded string er dus zo uit te zien:

1Rk9LIQ==


Tot zover de theorie

De inzendingen

In totaal mocht ik 3 inzendingen ontvangen: van GlowMouse, JeRa en SuperRembo en voor zover ik heb kunnen beoordelen zijn 2 van deze inzendingen correct; die van SuperRembo gaat bij sommige stringlengtes de mist in, zo output hij bij de input 'FOK' 'Rk9=AA==' ipv 'Rk9L'.
Opvallend is wel dat elke inzending uniek is in de manier waarop het probleem is aangepakt

Ik begin even met de drie oplossingen, van groot naar klein:

SuperRembo, 248 tekens:
1
2
3
4
5
6
7
8
9
for(;$i++<62;$t.=chr($i<53?$i<27?$i+64:$i+70:$i-5));
$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};
}


GlowMouse, 228 tekens:
1
2
3
4
5
6
while($k++<52)$b.=chr(64+$k+6*($k<27?0:1));
$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'=';


JeRa, 214 tekens:
1
2
3
4
5
6
7
8
$t=join(range(A,Z)).join(range(a,z)).'0123456789+/';
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?'':'=');


(whitespace moet je even wegdenken en <? moet je ervoor denken )

De uitleg (leermomenten )

Over het algemeen kunnen we het probleem in 3-en hakken: ten eerste moet je een string of array samenstellen van de karakters die gebruikt mogen worden; de 'base' als het ware, dan volgt het daadwerkelijk encoden en als laatste het eventuele aanvullen met '='-tekens.

Het eerste punt is duidelijk te herkennen in de scripts en het is ook duidelijk dat JeRa daarvoor de kortste methode heeft gevonden; JeRa had slechts 52 tekens nodig om de base-string samen te stellen tegenover de 61 van SuperRembo en 62 van GlowMouse. Zelfs mijn eigen methode was met 56 duidelijk nog langer dan noodzakelijk

Dan komt het lastige stuk, namelijk de implementatie van het algoritme zelf
Zoals gezegd zie je duidelijk aan de drie inzendingen dat er ook 3 heel verschillende oplossingen gekozen zijn. Heel in het kort kan ik het als volgt samenvatten:

GlowMouse heeft ervoor gekozen om mbv de string formatting functie sprintf() eerst de input om te zetten naar een string-representatie van de individuele bits. Uiteindelijk krijg je dus een lange string met enkel enen en nullen die hij vervolgens vakkundig weer in stukjes van lengte 6 hakt, omzet naar een decimaal getal en het juiste base64-karakter output. Geen bitshifting dus en daarmee ook origineel, begrijpelijke code en vooral ook korte code

SuperRembo schuwt het bitshiften echter niet en gaat voor de aanpak waarbij hij telkens 3 bytes inleest en meteen 4 bytes output, samengesteld door te AND-en, te OR-en en te shiften (een oplossing die je overigens vaak tegenkomt voor dit probleem). Jammer dat het bij sommige stringlengtes fout gaat...

JeRa tenslotte komt met een oplossing die ook in de richting komt van mijn eigen idee hieromtrent: een loop waarin je telkens een karakter inleest, en 1 (of 2 - als je genoeg bits over hebt) encoded karakter output. Binnen de loop houdt hij de overtollige bits vast in een variabele voor de volgende iteratie.

JeRa en GlowMouse moeten na de encoding slag nog de padding regelen in een klein loopje; dat kan idd door slim gebruik te maken van de modulus van de input-counter

Ten slotte wil ik jullie mijn eigen 196-er (die na toepassing van enkele truuks uit o.a. JeRa's oplossing nog terug te brengen is tot 182 tekens) niet onthouden; ik heb hier door gebruik te maken van een 'end'-indicator $e de padding geintegreerd in de main-loop wat mij de nodige besparing opleverde.
Dit is zondermeer de slechts begrijpbare oplossing, en ik ga 'm ook niet volledig uitleggen In plaats daarvan zal ik in de volgende post een (imho) nette oplossing presenteren met uitleg

1
2
3
4
5
6
7
for(
  $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;


Ter afsluiting roep ik JeRa uit tot winnaar; hij komt imho het dichtst bij een 'ideale' oplossing en heeft op een aantal punten z'n code korter weten te schrijven dan ikzelf. Verder laat hij zien goed thuis te zijn in het werken met bits en is zijn code to-the-point en zelfs voor de ervaren bitneuker nog goed te volgen (wat van mijn eigen versie niet te zeggen is).

JeRa: gefeliciteerd!
JeRamaandag 19 december 2005 @ 00:06
Yay! *bier voor iedereen* Ik vind die oplossing van GlowMouse enorm leuk, omdat ie zo origineel is je bent vaak zo erg met getallen aan het rekenen dat je soms niet inziet dat het ook verrekte kort kan met een simpele string-representatie

Ook erg benieuwd naar Crisp's uitleg over zijn (gecleanede) methode

edit:
quote:
Zelfs mijn eigen methode was met 56 duidelijk nog langer dan noodzakelijk
Ik gebruik geen '=' in mijn base, en als je die bij jouw methode weglaat is het aantal tekens ook 52

edit2: $r=$r<<8; is hetzelfde als $r<<=8; mocht je dat nog niet in je kleinere versie hebben

[ Bericht 20% gewijzigd door JeRa op 19-12-2005 00:18:53 ]
crispmaandag 19 december 2005 @ 00:32
Nou JeRa, ik denk dat je in 1 oogopslag zelf wel zult zien wat het doet
Ik heb het even in een functie gegoten omdat je het meestal ook in die vorm zult gebruiken. De truuks met pos($_POST) kennen we allemaal wel, dus hier gewoon een 'nette' uitvoering:

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
function mybase64_encode($string)
{
   $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;
}

Wat het doet is simpel; ik hou een bitpointer en een 'remainder' bij. De bitpointer laat zien hoeveel bits er nog in mijn 'remainder' zitten.
De while-loop loopt door tot ik alle bytes van mijn input-string heb gehad. Als eerste check ik of ik genoeg bits in mijn 'remainder' heb zitten - zo niet, dan vul ik 'm aan met blokjes van 8 bits (1 byte) uit mijn inputstring tot ik genoeg heb.
Vervolgens pak ik zoveel bytes als ik nodig heb voor mijn encoding (6 in dit geval) en vul mijn result aan met het bijbehorende karakter uit mijn base-set. Die bits zet ik in mijn remainder vervolgens op 0 dmv de AND-constructie met een mask van $bitpointer 1-bits die ervoor zorgt dat enkel de niet-gebruikte bits (low-order) overblijven.

Als ik op deze manier door de hele inputstring heen ben gegaan kan het zijn dat ik nog iets in mijn remainder heb staan ($bitpointer is dan niet 0); ik moet dus nog een karakter outputten door die remainder te left-shiften met 6 - $bitpointer bits.
Als vervolgens na aftrek van het aantal te encoden bits de bitpointer nog niet 0 is moet ik gaan padden totdat de bitpointer modulus 8 de 0 bereikt.

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).

De 196 van mij heb ik momenteel overigens terug weten te brengen tot 176:

1
2
3
4
5
6
for(
  $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;


[ Bericht 0% gewijzigd door crisp op 19-12-2005 00:47:59 ]
SuperRembomaandag 19 december 2005 @ 00:36
JeRa gefeliciteerd

Ik heb er geen moment aan gedacht om range() te gebruiken.
Mijn aanpak was misschien wat te lomp, maar ik had ook geen zin meer om opnieuw te beginnen.
crispmaandag 19 december 2005 @ 00:43
quote:
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
Die ,'=' had ik al buiten beschouwing gelaten
quote:
edit2: $r=$r<<8; is hetzelfde als $r<<=8; mocht je dat nog niet in je kleinere versie hebben
Nee, samen met die OR gaat dat niet goed...

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
JeRamaandag 19 december 2005 @ 01:12
quote:
Op maandag 19 december 2005 00:43 schreef crisp het volgende:
Nee, samen met die OR gaat dat niet goed...
Shame on me... na zoveel uittesten zou operator precedence er nu toch wel in moeten zitten bij mij.
quote:
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
En jij bent ook zeker een winnaar, 176 tekens is wel schandalig klein
SuperRembomaandag 19 december 2005 @ 07:43
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).
Waar gebruik je die compressie voor? Is het ook ergens in actie te bewonderen?
crispmaandag 19 december 2005 @ 11:21
quote:
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?
Een uitwerking van LZW/LZS met nog een aantal verbeteringen in javascript: http://therealcrisp.xs4all.nl/upload/jscompress.html
Ik gebruik hier dus base128 encoding voor het resultaat (overhead van base64 is 33%, van base128 slechts 14%).
Ik gebruik hier phased-in binary coding om de compressie-ratio met zo'n 10% te verhogen tov standaard LZW en werk nog aan een manier om de dictionary sneller aan te vullen wat over het algemeen ook nog zo'n 10% winst op kan leveren. Standaard LZW geeft meestal een compressie-ratio van zo'n 50% bij gemiddelde teksten, dit algoritme zou 60-70% moeten halen zonder alteveel in te boeten op performance of complexiteit.
Phased-in binary coding is wel een aardige techniek; stel dat je dictionary 10 codes bevat. In normaal LZW zou je die codes dan outputten als 4-bit, maar met phased-in binary coding kan je voor de kleinere codes toch nog 3 bits gebruiken:
1
2
3
4
5
6
7
8
9
10
 000 = 0
 001 = 1
 010 = 2
 011 = 3
 100 = 4
 101 = 5
1100 = 6
1101 = 7
1110 = 8
1111 = 9
SuperRembomaandag 19 december 2005 @ 19:27
Ziet er gaaf uit
Heb je dit gemaakt als studie, voor de lol of heb je ook een echte toepassing?
Chandlermaandag 19 december 2005 @ 20:14
idd, hoe langer de text hoe meer compressie geweldig... kan het helaas zelf niet maken want snap er de balle van maar goed!
crispmaandag 19 december 2005 @ 21:43
quote:
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?
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/obfuscator
SuperRembomaandag 19 december 2005 @ 21:59
Ik had eigenlijk niet gedacht dat compressie zo simpel was, in ieder geval goed te begrijpen. En de hoeveelheid code valt helemaal mee. Misschien moet ik m'n php animated gif class nog eens herschrijven met een eigen compressie routine. (Nu maak ik gebruik van gd)
JeRavrijdag 6 januari 2006 @ 17:45
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
crispzaterdag 7 januari 2006 @ 01:26
quote:
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
Kom maar op hoor
JeRazaterdag 7 januari 2006 @ 02:14
Poging tot PHP Golf Intermezzo #2
Deze keer een probleemstelling die niet zozeer heel erg nuttig is, maar behoorlijk veel inzicht kan opleveren. Een aantal hier kent vast wel het probleem van een programma dat de eigen code moet laten zien zonder simpelweg via een externe weg de broncode te laten zien. In PHP bestaat dat probleem ook, je kunt niet zomaar iets als dit gaan doen:

1<?echo '<?echo \'<?echo \\\'<?.....\';?>';?>


Er is dus een slimmere methode nodig om dat te doen. Deze golf gaat over het vinden van zo'n methode, in zo weinig mogelijk tekens uiteraard.

De opdracht
"Maak een zo'n kort mogelijk script dat, wanneer het door de PHP-parser wordt gehaald, het eigen script oplevert in de output. De output en het script zelf dienen dus identiek te zijn."

De voorwaarden
1. Het script mag geen warnings opleveren, PHP draait niet in strict mode.
2. Het script moet platformonafhankelijk werken (m.a.w., geen commands).
3. Het script moet een daadwerkelijk PHP-script zijn en niet zomaar een leeg (of tekst-)bestand.
4. De output van het script dient tot in de bits identiek te zijn als het script zelf.
5. Er wordt uitgegaan van niet-HTML output, dus no need for <br>
6. Het script mag het eigen script niet openen (helaas, geen echo file_get_contents()).
7. Alle zwakke oplossingen zoals het opvragen van externe bronnen leiden tot groot eerverlies en uitsluiting van deelname.

De deelname
Mocht je een oplossing hebben bedacht, dan kan dat worden gestuurd naar golf@gmta.nl. Het punt van sluiting is zaterdag 14 januari om 18:00.

[ Bericht 3% gewijzigd door JeRa op 07-01-2006 02:22:21 ]
SuperRembozaterdag 7 januari 2006 @ 10:58
* SuperRembo trapt af met 54
crispzaterdag 7 januari 2006 @ 13:15
Een quine dus
SuperRembozaterdag 7 januari 2006 @ 15:24
Er staat er zelfs een in de comments bij de functie xxxxxx op php.net
Me_Wesleyzaterdag 7 januari 2006 @ 15:59
Whehe heb er nu eentje met 117 tekens, vindt het al heel wat dat het me gelukt is
Tis wel heel erg simpeltjes hoor, hoe ik het heb gedaan
crispzaterdag 7 januari 2006 @ 17:04
Ik heb er al 3; een van 140, van 130 en van 56
Chandlerzaterdag 7 januari 2006 @ 17:35
Dus ff ter vertaling, je de output van het script moet het zelfde zijn als de broncode van het script?
Lightzaterdag 7 januari 2006 @ 17:59
quote:
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?
Ja, dat staat er wel
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."
Me_Wesleyzaterdag 7 januari 2006 @ 19:23
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
Ja inderdaad. Maargoed dan kom je nog maar op 65 tekens uit.
Mijne zit nu trouwens op 116 tekens, dom dingetje over het hoofd gezien .
crispzondag 8 januari 2006 @ 11:50
Woei, 44
crispmaandag 9 januari 2006 @ 22:49
Heb ik de lat nu al te hoog gelegd?
JeRamaandag 9 januari 2006 @ 22:57
Misschien heeft SuperRembo nog iets...?
crispvrijdag 13 januari 2006 @ 23:37
< 1 dag te gaan...
Chandlerzaterdag 14 januari 2006 @ 07:53
sjit geen tijd voor gehad (onzin natuurlijk, geheel vergeten) wil de uitkomsten wel zien!
JeRazaterdag 14 januari 2006 @ 16:58
In die 62 minuten die iedereen nog heeft kunnen er best nog wel wat meer inzendingen gedaan worden maakt niet uit of het de kortste is, ik wil alleen wel wat meer variatie zien dan alleen de 2 die ik nu binnen heb anders is het typen ook zo gauw gedaan.
SuperRembozaterdag 14 januari 2006 @ 17:33
Crisp had toch 3 versies?
JeRazaterdag 14 januari 2006 @ 17:44
quote:
Op zaterdag 14 januari 2006 17:33 schreef SuperRembo het volgende:
Crisp had toch 3 versies?
Heb er maar één ontvangen
crispzaterdag 14 januari 2006 @ 17:54
quote:
Op zaterdag 14 januari 2006 17:44 schreef JeRa het volgende:

[..]

Heb er maar één ontvangen
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...
JeRazaterdag 14 januari 2006 @ 17:56
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...
Daar heb je helemaal gelijk in.

Ik heb er nu vijf zes, ik zal proberen straks nog een stukje hier te zetten, anders wordt het vannacht pas.

[ Bericht 2% gewijzigd door JeRa op 14-01-2006 18:36:39 ]
crispzondag 15 januari 2006 @ 00:56
Het is nacht

Anyway, ik weet niet of het posten van het zoekwoord 'quine' nu debit is geweest aan de respons. Ik had gehoopt dat het makkelijk kunnen vinden van voorbeelden juist zou bijdragen...

De meeste PHP-gerelateerde voorbeelden zijn echter nogal 'lang' op het voorbeeld in de usercomments voor de printf() functie na...
JeRazondag 15 januari 2006 @ 03:08
PHP Golf Intermezzo #2 - de uitslagen
De opdracht van deze tussen-golf was het maken van een PHP-script dat als output het eigen script omvatte. Al snel werd het keyword 'quine' genoemd waardoor het niet zo moeilijk was om een codevoorbeeld te vinden, maar zoveel korte voorbeeldquines in PHP zijn er helaas niet... Gruwelijk veel mensen zijn hier mee bezig geweest maar uiteindelijk wisten slechts twee mensen de mailknop te vinden om toch nog binnen de tijd hun brouwsels op te sturen. We beginnen met de oplossing met het meest aantal tekens;

Crisp - 131 tekens:

1<?$a='PD8kYT0nKic7ZWNobyBzdHJfcmVwbGFjZShjaHIoNDIpLCRhLGJhc2U2NF9kZWNvZGUoJGEpKTs=';echo str_replace(chr(42),$a,base64_decode($a));


Dit is een klassieker in de quine-wereld. De variabele $a bevat een base64 geëncoded stukje code die na een base64_decode() er zo uit ziet:
1<?$a='*';echo str_replace(chr(42),$a,base64_decode($a));


chr(42) is de benoeming voor de asterisk ('*') en dit tekentje wordt dan ook na de base64_decode() vervangen door de inhoud van variabele $a, de geëncodeerde code. Hierdoor kom je op exact dezelfde code uit als hetgeen je mee begint.

SuperRembo - 113 tekens:
1<?$s="6563686F273C3F24733D22272E24732E27223B272E7061636B2822482A222C2473293B";echo'<?$s="'.$s.'";'.pack("H*",$s);


SuperRembo maakt slim gebruik van de pack() functie die PHP heeft overgeërfd vanuit Perl. Het resultaat van de pack() functie zoals hij hierboven staat is dit:
1echo'<?$s="'.$s.'";'.pack("H*",$s);


Dit zorgt ervoor dat na uitvoering net zoals bij de base64_decode() variant van Crisp de output exact hetzelfde is als het script.

Crisp - 63 tekens:
1<?eval($c='echo\'<?eval($c=\\\'\'.addslashes($c).\'\\\');\';');


Een aanzienlijk kortere quine met een duidelijk andere aanpak. Crisp maakt gebruik van het feit dat een toewijzing aan een variabele ($c=...) de inhoud van de toewijzing zelf terug geeft en dus gebruikt kan worden als parameter van eval(). De inhoud van $c is echter een PHP-scriptje met een echo welke de inhoud van het script toont. Dit werkt doordat éérst $c wordt toegewezen tijdens het verwerken van de parameter van eval(), waarna vervolgens de eval daadwerkelijk wordt uitgevoerd. Een slimme aanpak die we straks nog terug zullen zien.

Crisp - ongeldig:
1<?=printf($a='<?=printf($a=%c%s%c,39,$a,39);',39,$a,39);


Het idee is goed, alleen vergeet Crisp hier dat printf() de lengte van de geoutputte string teruggeeft en dat de output in dit geval niet gelijk is aan het PHP-script zelf.

SuperRembo - 54 tekens:
1<?printf($x='<?printf($x=%c%s%c,39,$x,39);',39,$x,39);


Nu wordt het serieus, SuperRembo heeft in principe dezelfde quine als de voorgaande met het verschil dat deze foutloos is en dus geen '<?=' bevat. printf() kan worden gebruikt om een string te 'formatten' met variabelen. Dit houdt in dat je in de string zelf bepaalde codes opgeeft die je later laat vervangen door de inhoud van variabelen. printf() neemt als eerste argument de string die geformat dient te worden, en als volgende argumenten de variabelen die in die string geplaatst dienen te worden. De code '%c' staat voor 'character' en geeft in principe de waarde terug van chr($n). De code '%s' staat voor 'string' en plaatst op die plek het argument als een string.

Code 39 staat voor de apostrofe (') en $x wordt in de string geplaatst waardoor de output verdacht veel op het script zelf lijkt hier is dit ook weer mogelijk aangezien in PHP de argumenten van links naar rechts worden verwerkt en $x dus éérst gevuld wordt voordat het in de string wordt gezet.

Crisp - 44 tekens:
1<?eval($c='echo"<?eval(\$c=\x27$c\x27);";');


Crisp laat duidelijk zien waar hij toe in staat is en verbetert zijn eval()-quine door slim gebruik te maken van escaped characters in dubbel quoted strings. De '\x27' is een speciale manier om in dubbel quoted strings de apostrofe weer te geven waardoor er nu geen apostrofes meer hoeven te worden ge-escaped. Een addslashes() neemt vrij veel tekens in en dit is dan ook een slimme manier om aan de geweldige 44 tekens te komen.

Crisp, gefeliciteerd!
SuperRembozondag 15 januari 2006 @ 12:43
Gefeliciteerd

Het wordt tijd voor een php sectie op The Quine Page.
SuperRembowoensdag 14 juni 2006 @ 00:20
Na een lange stilte is er weer een nieuwe editie van PHP Golf bij PHP Freakz.nl
quote:
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
GEEN OPLOSSINGEN POSTEN

De volledige opgave staat in het topic bij phpfreakz.nl.
Nevermindwoensdag 14 juni 2006 @ 11:45
tvp. Ik ben er twee uur mee bezig geweest, maar nog niks wat enigzins klein is. Ik ben niet zo goed in ranzige code Maar ik moet en zal iets inleveren voor dinsdag
SuperRembowoensdag 14 juni 2006 @ 13:01
Ik heb nog geen php5 draaien, dus ik denk dat ik deze oversla. Misschien dat is een poging waag in php4.
fokME2woensdag 14 juni 2006 @ 13:34
Ik heb hier nog nooit aan meegedaan. Tips iemand?
Nevermindwoensdag 14 juni 2006 @ 14:20
Even de uitslagen van vorige keren doorlezen. Een lijstje staat in een reactie bij de huidige opdracht.
JeRawoensdag 14 juni 2006 @ 16:04
Ook maar eens een poging gewaagd met 229 tekens
JeRawoensdag 14 juni 2006 @ 16:39
quote:
Op woensdag 14 juni 2006 16:04 schreef JeRa het volgende:
Ook maar eens een poging gewaagd met 229 tekens
224 219 217 216 214 tekens inmiddels.

[ Bericht 3% gewijzigd door JeRa op 14-06-2006 17:45:02 ]
crispdonderdag 15 juni 2006 @ 00:16
200 hier
Roonaandonderdag 15 juni 2006 @ 02:02
194 met 1 warning
JeRadonderdag 15 juni 2006 @ 06:39
Even voor de goede orde; dit zijn wat standaard relevante (dist) instellingen van PHP 5.1.4

Warnings niet toegestaan, notices wel:
error_reporting = E_ALL & ~E_NOTICE

Geen globals vanuit $_GET, $_POST etc:
register_globals = Off

Het is toegestaan om <? te gebruiken:
short_open_tag = On

[ Bericht 1% gewijzigd door JeRa op 15-06-2006 07:25:11 ]
Chandlerdonderdag 15 juni 2006 @ 08:22
Leuke opdracht, ik ga eens kijken wat iedereen er van bakt!
JeRadonderdag 15 juni 2006 @ 09:00
Zit nu op 200 198 tekens.
Roonaandonderdag 15 juni 2006 @ 09:02
Okee, dan is het 197 met zero warnings.
JeRadonderdag 15 juni 2006 @ 09:03
quote:
Op donderdag 15 juni 2006 09:02 schreef Roönaän het volgende:
Okee, dan is het 197 met zero warnings.
Je zat er op te wachten hè
Roonaandonderdag 15 juni 2006 @ 09:09
Nee, in principe was de vorige keer toch alles okee behalve fatals?

edit: ah, ik zie het. de timing kwam netjes uit.
JeRadonderdag 15 juni 2006 @ 09:22
Ja nu zit ik dus ook op 197 zijn we mooi klaar mee. Iemand iets lagers?

196 tekens
Roonaandonderdag 15 juni 2006 @ 10:04
194 zonder warnings.
JeRadonderdag 15 juni 2006 @ 10:11
De opdrachtomschrijving laat op dit punt wat ruimte over:
quote:
Elk mogelijke uitkomst moet worden weergeven op haar eigen regel.
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 combineren

Oh, en 193 tekens zonder fatal omgwtf core dumps!

[ Bericht 8% gewijzigd door JeRa op 15-06-2006 10:23:03 ]
Roonaandonderdag 15 juni 2006 @ 10:23
het moet toch sowieso <br>'s worden?
JeRadonderdag 15 juni 2006 @ 10:27
quote:
Op donderdag 15 juni 2006 10:23 schreef Roönaän het volgende:
het moet toch sowieso <br>'s worden?
Oh god had ik nou maar niks gezegd het staat nergens dus nee, PHP gaat verder dan HTML

191 188 tekens. De code wordt er niet mooier op

[ Bericht 8% gewijzigd door JeRa op 15-06-2006 10:59:58 ]
_Flash_donderdag 15 juni 2006 @ 11:20
mijn eerste keer dat ik zo'n puzzel maak.
Zit nu op 296 chars
Zou niet weten hoe ik dit korter kan maken
JeRadonderdag 15 juni 2006 @ 11:22
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
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)
_Flash_donderdag 15 juni 2006 @ 13:09
253
Roonaandonderdag 15 juni 2006 @ 14:04
185
_Flash_donderdag 15 juni 2006 @ 14:25
Gebruikt iemand ook substr_replace als kern? Of andere tips?
Roonaandonderdag 15 juni 2006 @ 14:31
een functie met zo'n lange naam is meestal al de moeite waard om er iets anders voor te zoeken.
JeRadonderdag 15 juni 2006 @ 14:31
quote:
Op donderdag 15 juni 2006 14:25 schreef _Flash_ het volgende:
Gebruikt iemand ook substr_replace als kern? Of andere tips?
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.
_Flash_donderdag 15 juni 2006 @ 16:02
226 op dit moment

wie gebruikt er ook een function of juist niet?

edit: 225
_Flash_donderdag 15 juni 2006 @ 16:58
Trouwens 241 inclusief spaties. (tel ze met Word.)
Roonaandonderdag 15 juni 2006 @ 17:15
Als je hele oplossing op 1 regel staat (lijkt me wel) kan je simpelweg het statement tellen met:

1
2
3
4
5
6
7
<?oplossing
?>
<?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';
?>


-r-
SuperRembodonderdag 15 juni 2006 @ 22:17
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-
Ehm...wat is er mis met de bestandsgrootte?
Roonaanvrijdag 16 juni 2006 @ 05:51
quote:
Op donderdag 15 juni 2006 22:17 schreef SuperRembo het volgende:

[..]

Ehm...wat is er mis met de bestandsgrootte?
ik heb error_reporting E_ALL op de eerste regel staan

En meerdere oplossingen in één file.
crispvrijdag 16 juni 2006 @ 12:10
174
_Flash_woensdag 21 juni 2006 @ 09:06
Zijn ze altijd zo traag met de uitslag van PHPgolf?

De deadline was gistermiddag.
SuperRembowoensdag 21 juni 2006 @ 13:21
Hij moet al de inzendingen testen en er een leuk verhaaltje van maken. Daar moet je ff tijd voor hebben, dus 't kan een paar dagen duren.
JeRawoensdag 21 juni 2006 @ 13:31
Vooral als je beseft dat ik alleen al 12 inzendingen heb gedaan waarmee ik helaas niet lager dan 188 tekens kwam (maar dat lag vast aan de methode).
_Flash_woensdag 21 juni 2006 @ 15:51
haha JeRa
Ik heb er ook een stuk of 4 ingestuurd. Ben alleen nog niet geregistreerd op dat forum dus ik weet niet of ze geplaatst worden. Kortste was 211 karakters. Maar hij werkt wel met telefoonnummers van alle lengtes en met zoveel streepjes als je wil
_Flash_woensdag 21 juni 2006 @ 16:02
Ik ben heel benieuwd naar de andere oplossingen.
Mijn oplossing werkt met een array met de 0, 1, abc, etcetera en een function die zichzelf weer aanroept en iedere combinatie op het scherm print. De termen 'function', 'global' en de declaraties van een aantal variabelen nemen veel karakters in.
crispwoensdag 21 juni 2006 @ 23:12
Ik gebruik dit: ABC0DEF0GHI0JKL0MNO0PQRSTUV0WXYZ
en verder een loop in een loop en een hoop ranzigheden
JeRadonderdag 22 juni 2006 @ 00:29
Ik heb een array met een hoop smerige zooi, twee for-loops in een while-loop en een echo "\n" en _Flash_, je weet dat je $GLOBALS kunt gebruiken als je een variabele in de rootscope wilt aanspreken? (scheelt wat tekens t.o.v. global $a; als je de variabele maar één keer nodig hebt)
crispdonderdag 22 juni 2006 @ 00:44
Ik heb maar 1 echo, ik doe aan het begin al $g=$_GET[nr]."\n";
JeRadonderdag 22 juni 2006 @ 01:39
quote:
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";
Ging niet bij mij zonder een warning helaas
SuperRembodonderdag 22 juni 2006 @ 08:52
"\n" is 4 tekens. Een "echte" newline tussen qoutes is maar 3 tekens

Werkt dit ook? Het scheelt een puntje.
1
2
$g="$_GET[nr]
";
crispdonderdag 22 juni 2006 @ 10:37
Ja, dat zal vast wel werken en scheelt idd 2 tekens

Ik heb overigens niet getest in PHP 5 omdat ik dat nog niet heb draaien hier, dus de mogelijkheid bestaat dat mijn inzending uiteindelijk toch niet voldoet aan de criteria, maar da's dan jammer
_Flash_donderdag 22 juni 2006 @ 14:39
De resultaten zijn geplaatst!

http://www.phpfreakz.nl/forum.php?forum=5&iid=836601
JeRadonderdag 22 juni 2006 @ 14:44
Roönaän had toch een veel kortere oplossing dan 197 tekens? Of is het een typo?

Verder mooie oplossingen! Gefeliciteerd crisp
crispdonderdag 22 juni 2006 @ 15:30
en is 'ie ranzig genoeg?
JeRadonderdag 22 juni 2006 @ 15:34
Je reference is leuk, ik wist niet dat je met PHP een reference kon maken naar een niet-bestaande array (en een niet-bestaand element uit die array ook nog eens) mooie oplossing!
Roonaandonderdag 22 juni 2006 @ 16:28
quote:
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
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 was

185:
1<?@a($_GET[nr]);function a($a,$s){$z=array('0','1',ABC,DEF,GHI,JKL,MNO,PQRS,TUV,WXYZ,'-'=>'-');if(!$a){echo"$s\n";return;}for(;$i<strlen($x=$z[$a{0}]);$i++){a(substr($a,1),$s.$x{$i});}}


[ Bericht 2% gewijzigd door Roonaan op 22-06-2006 23:39:56 ]
Chandlerdonderdag 22 juni 2006 @ 22:29
@Roonaan: dat ziet er funky uit...
crispvrijdag 23 juni 2006 @ 00:10
Roonaan: volgens mij gaat jouw script fout als het nummer eindigd op een nul (plus hij kan nog een stukje korter door de accolades bij de laatste for weg te laten en de increment in de substr te doen ipv los in de for - dan kom je op 181)

edit: met wat tweaks is je bug verholpen en kom je uit op 177:
1<?@a($_GET[nr]);function a($a,$s){$z=array('0','1',ABC,DEF,GHI,JKL,MNO,PQRS,TUV,WXYZ,'-'=>'-');if($a>'')for($x=$z[$a{0}];$x{$i}>'';)a(substr($a,1),$s.$x{$i++});else echo"$s\n";}



[ Bericht 50% gewijzigd door crisp op 23-06-2006 00:21:19 ]
SuperRembovrijdag 23 juni 2006 @ 00:17
Crisp, wat doet die reference nou precies in $a{$k=&$p[$i]}?
crispvrijdag 23 juni 2006 @ 00:28
quote:
Op vrijdag 23 juni 2006 00:17 schreef SuperRembo het volgende:
Crisp, wat doet die reference nou precies in $a{$k=&$p[$i]}?
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.
It boils down to this:
1
2
3
4
$i = 0;
$k =& $p[$i];
$k = 10;
print_r($p);

geeft Array ( [0] => 10 ), dus ik heb van $p een array gemaakt en daar een item aan toegevoegd zonder enige initialisatie. Vziw is PHP ook de enige taal waarin dat kan - het levert zelfs geen notice of warning op
SuperRembovrijdag 23 juni 2006 @ 00:44
Dat je geen notice krijgt is wel het vreemdste. Zelfs met een object werkt het

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$a = $b;
//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 }