Inloggen
Username:
Password:



Password vergeten?
Menu
Home
Forums
Wiki
Script Library
Forum tracker
RSS Feed
Sponsoren
Vacature plaatsen

Aanmelden
Huisregels
Vereniging

Adverteren
Disclaimer
Zoeken

In:
Aantal leden
PHPFreakz kent momenteel 50394 geregistreerde leden.
Opties
Printversie
Navigatie
Vorige 30  |  Volgende 30 Kies een ander forum:
PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 12-06-2006 11:27
Laatste wijziging:12-06-2006 11:38

Beste PHP-ers,


--[ PHP Golf
Een nieuwe editie van PHP Golf! Het leeft weer!

--[ 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 5.x !!! 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.com
(Disclaimer: je e-mail zal niet worden gebruikt voor
spam of worden doorgegeven aan derden)

Het liefst heb ik de code in de body van de email, geen bijlage svp.

--[ 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

-----

Post in dit topic vragen/suggesties.
GEEN OPLOSSINGEN!

Mocht je een oplossing hebben, dan mag je gerust je karakter aantal posten.
Dit om andere te stimuleren ;)

Diegene die het minste karakters heeft gebruikt, wint!

Veel succes,

Tri Pham


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Koos van Klojum / www.watbenjedan.com
Gepost op: 12-06-2006 11:45

Geinig! Vroegah had je op de Commodore64 ook prijsvragen om binnen 1 regel een compleet 'programma' te maken. Helaas nog geen php5 hier...


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Edwin V. » MoneyBird.nl (Verenigingslid)
Gepost op: 12-06-2006 14:11

1e poging: 294 tekens


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Berry Langerak (Moderator)
Gepost op: 12-06-2006 16:08

Ik ga er vanuit dat we testen met E_ALL?


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Roönaän .nl
Gepost op: 12-06-2006 16:08
Laatste wijziging:12-06-2006 20:19

1e poging: 249 tekens
2e poging: 233 tekens als ik het @-teken weghaal :')


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Simon Pool www.393sofware.nl (Verenigingslid)
Gepost op: 12-06-2006 18:47
Laatste wijziging:12-06-2006 18:51

kan je de definitie van een geldig telefoonnummer iets specifieker maken?

[edit]
aanvullende vraag:valideren hoeft neem ik aan niet?
[/edit]


Re: PHP Golf #8: 0900-PFZ1
Gepost door: PgVincent www.yapf.net (Verenigingslid)
Gepost op: 12-06-2006 19:55

yes! weer een PHPgolf. Goed werk Tri!

Hmm.. mogen er alleen lettercombinaties voorkomen, of mag 0900-LOVE2PHP ook?
En dat streepje moet er natuurlijk ook tussen blijven staan?


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 12-06-2006 20:06

Een telefoonnummer is in principe niet langer dan 10 cijfers, maar hier hoef je dat niet te valideren. Bij de golfs gaat het altijd om de functionaliteit en dat dan zo kort mogelijk.

E_ALL is niet standaard ingesteld in php.ini bij PHP 5.x. Het streepje blijft behouden en er mogen alleen letter combinaties, dus 0900-LOVE2PHP is niet geldig.


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Lennard --> (Verenigingslid)
Gepost op: 12-06-2006 20:25

Dus:
09008844 wordt 0Z00TUIG, of wordt 0Z00TUIG 09008844 ?


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 12-06-2006 20:27

Ja, 09008844 wordt 0Z00TUIG. De input bevat altijd een telefoonnummer.


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Lennard --> (Verenigingslid)
Gepost op: 13-06-2006 20:55

En hij moet álle mogelijke combinaties geven?
Of slechts eentje?


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Arakrys (Verenigingslid)
Gepost op: 13-06-2006 21:05
Laatste wijziging:13-06-2006 21:51

@Berry: in de vorige runs mocht je notices uitzetten. (EDIT: maar dat was php 4 en ik weet niett wat php 5's standaard php.ini instellingen zijn)
@Simon: valideren hoeft ook niet...
@Lennard: 'Elk mogelijke uitkomst moet worden weergeven op haar eigen regel.'


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Arakrys (Verenigingslid)
Gepost op: 13-06-2006 21:37
Laatste wijziging:13-06-2006 21:49

Vorige PHP Golfs:

PHP Golf #1 3l337 sp34k (Leet speek)
 http://www.phpfreakz.nl/forum.php?iid=581935

PHP GOLF #2 Romeinen
 http://www.phpfreakz.nl/forum.php?iid=585097#id588816

PHP Golf #4 Sorteren die hap
 http://www.phpfreakz.nl/forum.php?iid=688294

PHP Golf #5: Kamelen praatjes?
 http://www.phpfreakz.nl/forum.php?iid=705810

PHP Golf #6 Alfabet
 http://www.phpfreakz.nl/forum.php?iid=721061

PHP Golf #7 calc
 http://www.phpfreakz.nl/forum.php?iid=741097


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Frits77 <{{{><
Gepost op: 14-06-2006 07:19

Als ik goed tel, mis ik nr 3:

PHP Golf #3 cryptografie en efficientie samenvoegen
http://www.phpfreakz.nl/forum.php?forum=5&iid=594777


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Corne Dickens (Verenigingslid)
Gepost op: 14-06-2006 08:44

@Frits: nummer 3 was wat aan de grote kant, en heeft weinig success gehad.
*zucht wil ook meedoen* heeft er iemand een beetje tijd over? Mijn tijd is namelijk op.


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Boyd Pappot (Bestuurslid)
Gepost op: 14-06-2006 09:23

Ook ik heb helaas geen tijd om mee te doen deze keer.
Ik hoop uiteraard dat jullie weer smerige code zullen produceren..
Ik ben benieuwd, veel succes!


Re: PHP Golf #8: 0900-PFZ1
Gepost door: crisp
Gepost op: 14-06-2006 23:40

200 met notices (zonder 210) :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Roönaän .nl
Gepost op: 15-06-2006 01:53
Laatste wijziging:15-06-2006 01:59

197 met warning, onderdrukt 198, 200 zonder.
194 met shorttags + warning. (<? ipv <?php)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Lennard --> (Verenigingslid)
Gepost op: 15-06-2006 14:46

@ Roönaän: Staan short tags niet standaard uit? :P


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Roönaän .nl
Gepost op: 15-06-2006 14:50

@Lennard

Op dit moment zou het dan met shorttags 185 zijn, zonder 188.


Re: PHP Golf #8: 0900-PFZ1
Gepost door: crisp
Gepost op: 16-06-2006 12:12
Laatste wijziging:16-06-2006 12:12

ik bied 11 minder: 174 dus :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 16-06-2006 12:24

Even voor de duidelijkheid: een GET request is niet mogelijk met CLI (Command Line Interface). Dus de newline \n is niet mogelijk.


Re: PHP Golf #8: 0900-PFZ1
Gepost door: crisp
Gepost op: 16-06-2006 13:00

Onzin dat een newline dan niet mogelijk is; een newline is precies wat het zegt, een nieuwe regel, en daarmee voldoe je imo aan het gestelde criterium. Dat een browser de output als HTML parsed en het dan anders weergeeft doet daar niets aan af, het criterium was niet dat de output HTML-formatted moest zijn dus je doet maar mooi view-source :P


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 16-06-2006 13:22

Je hebt gelijk crisp, mijn specificatie is gewoonweg onvoldoende. \n is dus toegestaan :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: crisp
Gepost op: 16-06-2006 13:58

Niet dat het echt boeiend is hoor want anders vervang ik de \n wel gewoon door <br> en werkt het nog steeds - alleen is het dan 2 karakters meer :P


Re: PHP Golf #8: 0900-PFZ1
Gepost door: PgVincent www.yapf.net (Verenigingslid)
Gepost op: 21-06-2006 10:24

en en en en en? :-)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 21-06-2006 10:27

Vanavond anders morgen staan de resultaten online :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: PgVincent www.yapf.net (Verenigingslid)
Gepost op: 21-06-2006 10:41

Top!


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 22-06-2006 14:34
Laatste wijziging:22-06-2006 14:37

PHP Golf #8 oplossingen

--[Oplossingen
We beginnen met de inzending van Sandro, met 347 karakters.
[code]
<?php $n=''.$_GET['nr'];$p='ABCDEFGHIJKLMNOPQRSTUVWXYZ';$q=0;for($x=2;$x<=9;$x++)
{
$z=3;if
(
$x==7||$x==9)$z=4;for($y=1;$y<=$z;$y++){$l[$x][$y]=$p{$q};$q++;}}function
x($p,$w=''){global
$n,$l;if(strlen($w)>=strlen($n))echo"$w<br>";
else{
$c=substr($n,$p,1);
if(
strpos('23456789',$c))
{foreach(
$l[$c]as$v){x($p+1,''.$w.$v);}}else
x($p+1,''.$w.$c);}}x(0);
[/
code]?>

Een inzending die werkt, maar niet genoeg is voor de eerste plaats. Hier is meer creativiteit voor nodig. Een gouden tip voor volgende keer Sandro :)
Toch knap dat hij tot een oplossing is gekomen.

Ferry Hupse heeft een oplossing van 237 karakters.
[code]
<?$c=$_GET['nr'];$b=$c;$v=explode(" ","0 1 abc def ghi jkl mno pqrs tuv wxyz");$v["-"]="-";d(0);Function d($p)
{Global
$v,$c,$b;$f=$v[$c{$p}];
For(;
$a<strlen($f);$a++)
{
$b{$p}=$f{$a};
If(
$p<strlen($c)-1)d($p+1);
Else echo
"$b<br>";}return $b;}
[
code]?>

Maar verbeterde later zich goed naar 211 karakters.

[code]
<?$c=$_GET[nr];$b=$c;$v=explode(" ","0 1 abc def ghi jkl mno pqrs tuv wxyz");$v["-"]="-";d(0);Function d($p){global$v,$c,$b;
$f=$v[$c{$p}];for(;$f{$a}<>"";$a++)
{
$b{$p}=$f{$a};echo $c{$p+1}<>""?d($p+1):"$b<br>";}}
[/
code]?>

JeRa bleef mij maar volspammen met steeds kortere oplossing :)
Hij begon aanvankelijk met 229 karakters.
[code]
<?$l=strlen($n=$_GET[nr]);
$a=array('0','1',abc,def,ghi,jkl,mno,pqrs,tuv,wxyz,
'-'=>'-');
do{while(
$i<$l)$r[$i++]=0;$i--;$j=0;
while(
$j<$l)
echo
$a[$n{$j}]{$r[$j++]};
echo
"\n";while(++$r[$i]==strlen($a[$n{$i}])&&$i--);$i++;}
while(
$i);
[/
code]?>

Zoals je misschien, een oneindige loop. Bij geen user input kun je al raden wat er gebeurt. Zo krijg ik ze het liefst aangevoerd, functioneel maar lelijk en te-erg-om-te-vertonen :)
Na meedere keren karakters afsnoepen, is hij uiteindelijk tot een oplossing van 188 chars gekomen.

[code]
<?while(++$j){for($a=array($j='0','1',abc,def,ghi,jkl,mno,pqrs,tuv,wxyz,'-'=>'-');
$j<strlen($n=$_GET[nr]);)echo$a[$n{$j}]{$r[$j++]};echo"\n";
for(;++
$r[--$j]==strlen($a[$n{$j}]);$r[$j]=0);}
[/
code]?>

Wat je misschien opmerkt is dat hij newline \n gebruikt. Dit is ook correct, zie topic post hierboven.

Roonaan is ook weer van de partij, met een 197 oplossing.
[code]
<? a($_GET[nr]);function a($a,$s=''){$z=array('0','1',ABC,DEF,GHI,JKL,MNO,PQRS,TUV,WXYZ,'-'=>'-');
if(!
$a)
{echo
"$s<br/>";return;}
for(
$i=0;$i<strlen($x=$z[$a{0}]);$i++){a(substr($a,1),
$s.$x{$i});}}?>
[/code]

Jammer is dat hij de laatste closing tag van PHP gebruikt, deze is niet nodig. Zonder deze was het een 195 oplossing geweest. Tip voor volgende keer :)

Er kan er maar een de beste zijn, alweer crisp! Dit keer met een grote marge, want hij heeft een oplossing van 174 tekens.

[code]
<?for($g=$_GET[nr]."\n";$g{$j}>'';)for($i=$j=0;($a=($a=$g{$i})>1?
substr(ABC0DEF0GHI0JKL0MNO0PQRSTUV0WXYZ,$a*4-8,4):$a)>'';$k=$j==$i++&&!$a{++$k}?0&$j++:
$k)echo$a{$k=&$p[$i]};
[/
code]?>

Petje af crisp. Ik heb zelf heel lang naar deze code gekeken, maar ik ben er nog niet helemaal uit. Zou je je code misschien kunnen uitleggen zodat anderen ook kunnen begrijpen wat jouw creativiteit heeft kunnen opbrengen? :)
Is toevallig ranzige code schrijven ook je beroep? :)

Crisp is weer de winnaar van een PHP Golf, gefeliciteerd!


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Koos van Klojum / www.watbenjedan.com
Gepost op: 22-06-2006 14:37

"We're not worthy..! Hail Crisp! " :-)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Lennard --> (Verenigingslid)
Gepost op: 22-06-2006 14:38

Mooie inzendingen!

Gefeliciteerd Crisp!


Re: PHP Golf #8: 0900-PFZ1
Gepost door: PgVincent www.yapf.net (Verenigingslid)
Gepost op: 22-06-2006 15:08

Goed werk heren, knap staaltje buiten-het-boekje denken!


Re: PHP Golf #8: 0900-PFZ1
Gepost door: crisp
Gepost op: 22-06-2006 15:28

Nee, ranzige code schrijven is niet mijn beroep; ik schrijf doorgaans hele nette code ;)
Ik denk dat je ook goed en netjes moet kunnen programmeren om ook iets heel ranzigs in elkaar te kunnen zetten; dat heeft alles te maken met inzicht in de taal en de mogelijkheden daarvan - iets wat alle inzenders zo te zien wel hebben :)
Ik zal vanavond een uitleg proberen te maken - was de stiekume reference je al opgevallen?


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 22-06-2006 15:43

Ja, die was mij wel opgevallen maar waarom die daar staat is mij niet geheel duidelijk. Ik zie je uitleg wel verschijnen.

Verder ben ik met je eens dat je netjes moet kunnen programmeren om dit soort code te schrijven. Ook denk ik dat deelnemers met perl en/of javascript ervaring een voorsprong hebben op alleen PHP coders. De algemene PHP coder houdt zich hier helemaal niet bezig, in tegenstelling tot perl/js programmeurs. Natuurlijk ook enig creativiteit en het kennen van 'dustier corners' van PHP (ternary, string offset met {} etc)

Verder een algemene tip: systematisch te werk gaan is goed, maar daar win je geen golfs mee :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: SuperRembo -
Gepost op: 22-06-2006 19:38
Laatste wijziging:22-06-2006 19:38

Gefeliciteerd Crisp met 174 tekens. En toch kan het nog korter:
Vervang
<?[code]
$g=$_GET[nr]."\n";
[/
code]?> 
door
<?[code]
$g="$_GET[nr]
"
;
[/
code]?> 

172 tekens :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Arakrys (Verenigingslid)
Gepost op: 22-06-2006 20:29

Jemig wat ziet dat er knap uit. Ik had geen tijd om een werkend algoritme te bedenken. Ik kon nog net bedenken hoe je 0 en 1 niet vervangt.

En gelukkig is SuperRembo er nog om er wat foute dingen in te doen, want ik vond het best netjes. Maar ik heb het nog niet helemaal uitgeplozen, hiervoor zou ik wel een Zend studio willen hebben.


Re: PHP Golf #8: 0900-PFZ1
Gepost door: crisp
Gepost op: 23-06-2006 01:22
Laatste wijziging:23-06-2006 01:24

Ok, even wat uitleg. In de eerste plaats heb ik - net als JeRa - gekozen voor een iteratieve methode ipv een recursieve, globaal ziet zoiets er zo uit in nette code:

<?php

$a
= array(    array(1,2,3),
        array(
4,5,6),
        array(
7,8,9)
);

//-- pointerarray initializeren
$p = array_fill(0, count($a), 0);

do
{
   
//-- print loopje
   
for ($i = 0; $i < count($a); $i++)
    {
        echo
$a[$i][$p[$i]];
    }
    echo
'<br>';

   
//-- volgende iteratie
   
for ($i = 0; $i < count($a); $i++)
    {
       
//-- pointer ophogen
       
$p[$i]++;
        if (
$p[$i] == count($a[$i]))
        {
           
//-- pointer resetten
           
$p[$i] = 0;
        }
        else
            break;
    }
}
while (
$i < count($a));

?>

De truuk is nu natuurlijk om in ieder geval te proberen de printloop binnen de iteratieloop te krijgen, want 2 x dezelfde for-construct is een waste of precious bytes :P
Dan zit je nog met hoe te bepalen welke mogelijkheden er zijn voor een bepaald karakter; in feite zijn er alleen voor de cijfers 2 t/m 9 meerdere mogelijkheden, dus enkel voor die cijfers wil ik iets extra doen, en anders gewoon het cijfer zelf (of karakter in het geval van het minteken) in een var zetten; dat doe ik dus dmv $a=($a=$g{$i})>1?substr(ABC0DEF0GHI0JKL0MNO0PQRSTUV0WXYZ,$a*4-8,4):$a hetgeen korter is dan de array-varianten.
Checken of een string-index buiten de string valt doe je het best dmv >'' afvragen; alleen in die gevallen krijg je immers een lege string terug.
Last but not least is het gebruik van de reference $k=&$p[$i]. Vreemd, want $p komt verder nergens voor dus wat is dat dan? Well, dat is nou mijn pointerarray :) Het leuke is in PHP dat als $p of $p[$i] niet bestaat PHP die voor mij aanmaakt als ik ernaar refereer :) Geen initialisatie nodig dus. Het mooie is ook dat ik daarna $k kan gebruiken ipv $p[$i] wat weer de nodige bytes scheelt.
Voor de rest enkel de usual smerigheden zoals toewijzingen combineren met increments:

$k = 0&$j++; // increment $j en zet $k op 0

en dat weer conditioneel in een ternary:

$k=$j==$i++&&!$a{++$k}?0&$j++:$k

bovenstaande is eigenlijk wat het mogelijk maakt om de printloop met de iteratieloop te combineren :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Tri Pham
Gepost op: 23-06-2006 09:42

Briljant, heel goed doordacht. Je haalt wel het onderste uit de kan :)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Matthijs Huisman
Gepost op: 24-10-2006 16:25

Woow, zit even te kijken en ik moet nog een boel leren. Ik blijf toch liever netjes scripten dan zo;-)


Re: PHP Golf #8: 0900-PFZ1
Gepost door: Lennard --> (Verenigingslid)
Gepost op: 14-12-2006 20:46

Misschien wordt 't weer eens tijd voor # 9? :P


Recente topics
Website layout hu...
selecteer tekst t...
Weergaven form in...
Website Hulp gezocht
Refresh na invoeren.
Weeknummers selec...
jquery table sort...
Meerdere menu's i...
jQuery slide content
HTML SELECT met 2...
TCPDF geeft é nie...
session_id(); > b...
Nieuwe regel
Variabele analyseren
heleboel foutmeld...
Recente Wiki's
JavaScript: High Performance
MagicQuotes
Escapen
Datamanipulatie
RabbitVCS
Continuous integration
Apache Veilig Maken
Charactersets
Het Wiel Uitgevonden:Formulieren
XSD

Meer wiki ...
Recente Scripts
Unieke `random` n...
twitterPHP 0.1 (a...
CSS minifier
PINI - PHP >>INI<...
Sudoku [StateSolver]
base64 file encoder
Session class

Meer scripts ...
Gehost door
RedKnot Hosting