Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Minimalizacja kodu
Forum PHP.pl > Inne > Hydepark
kszychu
Przeglądając ostatnio stare skrypty natknąłem się na napisany kiedyś skrypcik wypisujący selektor daty. Zoptymalizowałem go wtedy do 484 bajtów, z czego byłem szalenie dumny. teraz jednak przyglądając ten skrypcik wprowadzilem kilka poprawek i... troche go zmniejszylem!

Proponuję więc zabawę: napisanie takowego selektora za pomocą jak najmniejszego kodu. Jest tylko jeden warunek, skrypt ma wyświetlić selektor daty czyli rok, miesiac, dzien z zaznaczonym aktualnym dniem. Np. tak:

  1. <select name=dzien><option value=1>1<option value=2>2<option value=3>3<option value=4>4<option value=5>5<option value=6>6<option value=7>7<option value=8>8<option value=9>9<option value=10>10<option value=11>11<option value=12>12<option value=13>13<option value=14>14<option value=15>15<option value=16>16<option value=17>17<option value=18>18<option value=19>19<option value=20>20<option value=21>21<option value=22 selected>22<option value=23>23<option value=24>24<option value=25>25<option value=26>26<option value=27>27<option value=28>28<option value=29>29<option value=30>30<option value=31>31</select><select name=miesiac><option value=1>1<option value=2>2<option value=3>3<option value=4>4<option value=5>5<option value=6>6<option value=7>7<option value=8>8<option value=9 selected>9<option value=10>10<option value=11>11<option value=12>12</select><select name=rok><option value=1995>1995<option value=1996>1996<option value=1997>1997<option value=1998>1998<option value=1999>1999<option value=2000>2000<option value=2001>2001<option value=2002>2002<option value=2003>2003<option value=2004 selected>2004<option value=2005>2005<option value=2006>2006<option value=2007>2007<option value=2008>2008<option value=2009>2009<option value=2010>2010</select>


Czyj skrypt będzie ważył mniej, ten wygrywa smile.gif
Kto się ze mną zmierzy?.. party.gif
kicaj
Nie lepiej zastosowac trzy peltle for" title="Zobacz w manualu PHP" target="_manual()
kszychu
Cytat(kicaj_ @ 2004-09-22 16:27:21)
Nie lepiej zastosowac trzy peltle for" title="Zobacz w manualu PHP" target="_manual()

Może lepiej, a może nie lepiej, głównym założeniem jest "jak najkrócej".
kicaj
  1. <?php
  2. echo &#092;"<select name=\"dzien\">\";
  3. for( $i = 1; $i <= 31; $i++ )
  4. {
  5.     echo &#092;"<option>\" . $i . \"</option>\";
  6. }
  7. echo &#092;"</select>
  8.          <select name=&#092;"miesiac\">\";
  9. for( $i = 1; $i <= 12; $i++ )
  10. {
  11.     echo &#092;"<option>\" . $i . \"</option>\";
  12. }
  13. echo &#092;"</select>
  14.          <select name=&#092;"rok\">\";
  15. for( $i = 1995; $i <= 2010; $i++ )
  16. {
  17.     echo &#092;"<option>\" . $i . \"</option>\";
  18. }
  19. echo &#092;"</select>\";
  20. ?>
radzaw
394 winksmiley.jpg
  1. <?php
  2.  
  3. $a='';$b='';$c='';$d=explode(&#092;"-\",date(\"j-n-Y\"));$z='<option value=\"';$y='</option>';$s=' selected';$r='<select name=\"';$t='</select>';
  4. for($i=1;$i<=31;$i++){$a.=$z.$i.'\"'.(($i==$d[0])?$s:'').'>'.$i.$y;$b.=($i<13)?$z.$i.'\"'.(($i==$d[1])?$s:'').'>'.$i.$y:'';}
  5. for($i=1995;$i<=2010;$i++)$c.=$z.$i.'\"'.(($i==$d[2])?$s:'').'>'.$i.$y;
  6. echo $r.'dzien\">'.$a.$t.$r.'miesiac\">'.$b.$t.$r.'rok\">'.$c.$t;
  7.  
  8. ?>


aaa... nie zauwazylem wczesniej - kszychu Twoj html nie jest zgodny ze standardem tongue.gif moglym usunac " i byloby jeszcze pare bajtow mnie smile.gif
kszychu
radzaw: niezle, podoba mi się! Poprawiłem moją wersję, żeby była zgodna ze standardami i ma teraz 285 ;-)
Wersja, którą wygenerowałem ten html miała 265 bajtów :-P

----------------update------------

kicaj_: zgodność ze standardami OK, jednak czytelność kodu odpada. Bo co to znaczy czytelność kodu? Dla mnie np. czytelny kod to taki, który ma komentarze do wszystkiego, u Ciebie nie widzę komentarzy tongue.gif
Dlatego, by ukrócić wszelkie tego typu dywagacje czytelność kodu nie jest brana pod uwagę.
Założenie jest tylko jedno: skrypt ma generować czysty html zgodny ze standardami.

Jako, że narazie prowadzę tongue.gif swój kod podam jutro, czekam jeszcze na innych chętnych do stanięcia w szranki!
kicaj
Hehe, no to zrobmy tak:
1. Zgodnosc ze standartami
2. Czytelnosc kodu
tongue.gif

Moj nastepny przyklad:
  1. <?php
  2. function do( $intMinRows, $intMaxRows, $strName )
  3. {
  4. echo &#092;"<select name=\"\" . $strName . \"\">\";
  5.  
  6. for( $intIter = $intMinRows; $intIter <= $intMaxRows; $intIter++ )
  7. {
  8. echo &#092;"<option value=\"\" . $intIter . \"\">\" . $intIter . \"</option>\";
  9. }
  10.  
  11. echo &#092;"</select>\";
  12. }
  13.  
  14. // wywolanie:
  15. do( 1, 31, 'dzien' );
  16. do( 1, 12, 'miesiac' );
  17. do( 1995, 2010, 'rok' );
  18. ?>
radzaw
eh.. no tak - prosta funkcja - zmylily mnie te powyzsze fory, i polecialem nimi winksmiley.jpg
kicaj
Cytat(kszychu @ 2004-09-22 21:31:56)
kicaj_: zgodność ze standardami OK, jednak czytelność kodu odpada. Bo co to znaczy czytelność kodu? Dla mnie np. czytelny kod to taki, który ma komentarze do wszystkiego, u Ciebie nie widzę komentarzy tongue.gif

Czytelnosc mialem na mysli nie piszac wszytkiego w jednej lini...
A jakbym uparl sie na komentarze to zajeloby to nastepne linijki i bajty tongue.gif
Kinool
no ok wiec jesli kod jesyt malo czytelny (niemal w jednej lini) to doszedlem do 217 bajtow coprawda nie nie uwzglednia ilosci dni w poszczeglonych miesiacach i lat przestepnych smile.gif

zmniejszajac nazwe funkcji do 2 znakow da sie to jeszcze "odchudzic" o pare bajtow smile.gif

po totalnym znmnijszeniu uzyskalem 186 b (bez znacznikow poczatku i konca skryptu) jesli liczyc z nimi (wersjia minimalistyczna <? ?>) uzyskuje 191 b. smile.gif heh ciekaw jestem czy da sie mniej smile.gif
radzaw
ehh.. a ja stanalem na 270 - oczywiscie z uwzglednieniem pokazywania aktualnego dnia

update - 258 winksmiley.jpg

ps.
licze bez <??>
Kinool
o fuck zapomnialem o zaznaczeniu aktualnego dnia smile.gif zaraz to poprawie i zobacze ile bede mial smile.gif

------
doniesienia z placu boju smile.gif 273 ze znacznikami i zaznaczona akyualna data smile.gif walcze dalej :]

269 i dalej juz nie wiem co biggrin.gif (ze znacznikami)
Sh4dow
krzychur czy na ircu kiedys tego nie przerabialismy ? btw. Wracaj na irca tongue.gif
kszychu
Dobra, kawa na ławę, kto ma mniej, oto mój kod maj±cy zaledwie 267 bajtów:
  1. <?php
  2. foreach(array(array('dzien',1,31,date('j')),array('miesiac',1,12,date('n')),array('rok',1995,2010,date('Y')))as$t){echo&#092;"<select name=\"{$t[0]}\">\";for($i=$t[1];$i<=$t[2];)echo\"<option value=\"$i\"\".($t[3]==$i?\" selected\":\"\").\">\".$i++.\"</option>\";echo\"</select>\";}
  3. ?>

Oczywi¶cie policzyłem krótkie znaczniki skryptu. Pokażcie wasze.

Sh4dow: faktycznie, zainspirowała mnie tamta rozmowa, a co do powrotu, chwilowo nie mam zadnego klienta. Którego klienta irca najlepiej użyć?
radzaw
261 smile.gif
  1. <?function x($s,$w){$o='option';return&#092;"<$o value=\"$w\"\".(($w==date($s))?' selected':'').\">$w</$o>\";}
  2. function y($n,$e,$f){$s='select';for($i=($e<40)?1:1995;$i<$e;$i++)$a.=x($f,$i);echo&#092;"<$s name=\"$n\">$a</$s>\";}
  3. y(dzien,32,j);y(miesiac,13,n);y(rok,2020,Y);?>


---
update - jednak $s i $o nic nie daje, wiec :
253 :
  1. <?function x($s,$w){return&#092;"<option value=\"$w\"\".(($w==date($s))?' selected':'').\">$w</option>\";}
  2. function y($n,$e,$f){for($i=($e<40)?1:1995;$i<$e;$i++)$a.=x($f,$i);echo&#092;"<select name=\"$n\">$a</select>\";}
  3. y(dzien,32,j);y(miesiac,13,n);y(rok,2020,Y);?>
Kinool
moje 262 smile.gif
  1. <?php
  2. function m($s,$k,$n,$z){$d=&#092;"<select name=\"$n\">\";for($i=$s; $i<$k; $i++){$i==$z?$u='selected':$u='';$d.=\"<option $u value=\"$i\">$i\";}echo$d.='</select>';}$t=split('-',(date('d-m-Y')));m(1,32,'dzien',$t[0]);m(1,13,'miesiac',$t[1]);m(1995,2011,'rok',$t[2]);
  3. ?>
bregovic
przypomne tylko ze wg standardu XHTML zaznaczona opcja listy wyboru powinna miec atrybut selected="selected" a nie po prostu selected winksmiley.jpg
Kinool
  1. <? function m($s,$k,$n,$z){$d=&#092;"<select name=\"$n\">\";for($i=$s; $i<$k; $i++){$d.=\"<option \".($i==$z?'selected':'').\" value=\"$i\">$i\";}echo$d.='</select>';}$t=split('-',(date('d-m-Y')));m(1,32,'dzien',$t[0]);m(1,13,'miesiac',$t[1]);m(1995,2011,'rok',$t[2]);?>


259 smile.gif
radzaw
heh, kiedy sie konczy konkurs ? winksmiley.jpg
217 :
  1. <?function y($n,$e,$f){for($i=($e<40)?1:1995;$i<$e;$i++)$a.=&#092;"<option value=\"$i\"\".(($i==date($f))?' selected':'').\">$i</option>\";echo\"<select name=\"$n\">$a</select>\";}
  2. y(dzien,32,j);y(miesiac,13,n);y(rok,2020,Y);?>

Kinool - mamy prawie tak samo smile.gif
Kinool
nieco zmodyfikowane (split zajowalo za duzo bajtow smile.gif ) podpatrzylem nieco u konkurencji smile.gif

  1. <? function m($s,$k,$n,$z){$w='select';$d=&#092;"<$w name=\"$n\">\";for($i=$s; $i<$k; $i++){$d.=\"<option \".($i==date($z)?$w.'ed':'').\" value=\"$i\">$i\";}echo$d.=\"</$w>\";}m(1,32,'dzien','d');m(1,13,'miesiac','m');m(1995,2011,'rok','Y');?>


wynik: 230

kosmetyczne zmiany smile.gif

  1. <? function m($k,$n,$z,$i=1){$w='select';$d=&#092;"<$w name=\"$n\">\";for($i; $i<$k; $i++){$d.=\"<option \".($i==date($z)?$w.'ed':'').\" value=\"$i\">$i\";}echo$d.=\"</$w>\";}m(32,'dzien','d');m(13,'miesiac','m');m(2011,'rok','Y',1950);?>


wynik 225

poprawki ....
  1. <? function m($k,$n,$z,$i=1){$w=select;$d=&#092;"<$w name=\"$n\">\";for($i; $i<$k; $i++){$d.=\"<option \".($i==date($z)?$w.'ed':'').\" value=\"$i\">$i\";}echo$d.=\"</$w>\";}m(32,dzien,d);m(13,miesiac,m);m(2011,rok,Y,1950);?>


wynik 211
radzaw
ok, wygrales ;P
ale jak widac nasz kod jest niemalze ten sam.

moze tak comiesieczny konkursik w php.pl, bez nagrod, na najkrotszy kod, ale juz nie tak otwarty - czyli do danej godziny wyslac rozwiazanie, bez poprawek pozniejszych ? cool.gif
Kinool
pomysl jest dobry smile.gif jedynie podawac osogane wyniki zeby zdopingowac przeciwnika biggrin.gif

co do kodu to dobry przyklad Open Source biggrin.gif
kszychu
No niezle, musze przyznac, ze rozwiazanie z funkcjami okazalo sie mniejsze niz moje rozwiazanie z tablicami. Co do comiesięcznego konkursu to jestem za. Jesli znajdzie sie wiecej chetnych to moge taki konkurs poprowadzic; przysylacie mi prace a ja je publikuje po uplywie terminu. Jesli jestescie za to czekam na propozycje konkursow.

BTW: Kinool: zszedłem Twoim kodem z 211 do 204 tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.