Gå til innhold

Dabear's PHP Programming challenges[4th challenge]


Anbefalte innlegg

Dabear's PHP Programming challenges

 

Vinnere:

 

1st challenge: Gommle

2nd challenge: ZoRaC og MC2

3rd challenge:phatscum

 

Heppsann. Denne kategorien ser ut til å dø ut, i den form at det nesten utelukkende er standardspørsmål som "finnes den i arrayet?", "hvorfor funker ikke ditt og datt?" etc. mao lite krevende spørsmål. Det er kanskje derfor jeg oftere og oftere har holdt meg unna dette underforumet.

 

Jeg har nå satt meg som mål å komme med diverse programmeringsutfordringer i PHP, alt fra det enkle til det litt mer komplekse. Denne posten og trådens tittel vil bli oppdatert når det kommer nye utfordringer. Bruk denne tråden til diskusjon, og send inn ditt forslag til meg per PM eller ved bruk av skjul-tager. Vi vil uansett se hvem som oppfører seg som copycats. Husk å legge ved link til utprøvingsside.

 

Vinner vil bli kåra av først og fremst meg og de som svarer i denne tråden. Det vil bli lagt vekt på følgende kriterier:

 

 

- Koden faktisk fungerer.

- God logikk, lite "unødvendig" kode.

- Du holder deg til én kodestil, helst så nærme PEAR-standarden som mulig (se bort ifra eviglange kommentarer)

- kodekjøretid.

 

 

Første utfordring:

Klikk for å se/fjerne innholdet nedenfor

Vi begynner ganske enkelt, så alle kan komme med sine forslag. Lag ei webside der en kan sende inn et form. Denne skal sjekke om input er et årstall, og dersom dette stemmer, sjekke om årstallet er skuddår. Google og wikipedia kan hjelpe.

Det vil legges vekt på ei oversiktelig side, men design trenger ikke være veldig forseggjort.

 

 

Andre utfordring:

Klikk for å se/fjerne innholdet nedenfor

Lag funksjonen unscramble(). Denne skal ta imot ett parameter, $input og gjøre om denne til en forståelig tekst.

<?php
function unscramble($astr)
{
 /* decode*/

 return $decoded;
}

echo 'stringen er', unscramble($input);

?>

 

 

innholdet i $input ligger her:

https://www.diskusjon.no/index.php?act=Atta...=post&id=128642

 

Tredje utfordring:

Klikk for å se/fjerne innholdet nedenfor

Denne oppgaven kan kreve installasjon/enabling av phpmoduler. Her får du gitt svaret, hva er spørsmålet? Jeg vil i tillegg ha hovedkonkurrenten sitt navn.

 

Svaret:

post-51505-1170788086_thumb.jpg

 

 

Fjerde utfordring:

 

Her er det viktig at du har PHP 5.2.1 eller nyere, som kom ut 14. Februar. Jeg brukte flerfoldige timer på denne oppgaven fordi jeg fikk feilmeldinger som ikke skulle være der, så viste det seg at det var i php skylda lå. Mulig du kan bruke eldre versjoner, men ei oppgradering er uansett smart. Enkelte utvidelser kan være nødvendig å enable i php.ini/httpd.conf.

 

Lag funksjonen provideNumberAndName, send denne funksjonen og svaret (i form av tall&navn) per PM. Som dere ser, har jeg nå lagt føring på kodestil på funksjonen, og koden inni funksjonen må derfor følge samme syntaks

 

<?php

function provideNumberAndName(/*velg antall parametere sjøl*/)
{

}

?>

 

NB! Svaret er ikke det som tilsynelatende er rett ved første overblikk.

 

Her_er_svaret.zip

 

Har du problemer med installasjon av WAMP/LAMP? Jeg har noen guider som kan være aktuelle, skrevet av meg sjøl:

 

Guide til installasjon av PHP 5.2, mysql, phpmyadmin (linux) | (windows)

 

 

Lykke til!

 

PS! Svaret sendes helst per PM til meg!

Endret av dabear
Lenke til kommentar
Videoannonse
Annonse

Her er min.

Eksempel på siden min.

 

Klikk for å se/fjerne innholdet nedenfor

PHP

<?php

// Sjekk om et år er et skuddår

 

function leapyear($year) {

if($year == 0) {

if($year 100 &#33;= 0 || $year % 400 == 0) {

return true;

}

} else {

return false;

}

}

 

$tall $_GET['tall'];

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/2001/REC-xhtml11-20010531/DTD/xhtml11-flat.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Language" content="no-NO" />

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859" />

<link rel="stylesheet" type="text/css" media="screen" href="style.css" />

<title>Skuddårsjekker</title>

</head>

 

<body>

 

<div id="container">

<h1>Skuddårsjekker</h1>

<div id="box">

<p>På denne siden kan du skrive inn et årstall og finne ut om det er et skuddår eller ikke.</p>

<form action="?" method="get">

<input type="text" name="tall" />

<input type="submit" value="Sjekk" />

</form>

<?php

if($tall) {

if(leapyear($tall)) {

echo "<p>Året <i>$tall</i> <b id=\"er&#092;">er</b> et skuddår.</p>";

} else {

echo "<p>Året <i>$tall</i> <b id=\"ikke&#092;">er ikke</b> et skuddår.</p>";

}

}

?>

</div>

</div>

 

</body>

</html>

 

Som du ser er siden XSS-himmel, men det betyr ikke noe akkurat nå...

 

Og i fremtidige oppgaver, kan vi ikke heller bare lage selve funksjonen? Å lage siden var mye mer arbeid enn funksjonen.

Endret av gommle
Lenke til kommentar

5 min in a toxicated state of mind gives you this ;)

Klikk for å se/fjerne innholdet nedenfor
<html>

<body>

<?

$date = $_REQUEST['date'];

if (is_numeric($date)) {

if (date ('L', mktime (1,1,1,1,1,$date))) {

echo ' It's a frikkin leap year... Would you believe that....';

}

}

?>

<form action='?' method='post'>

År: <input type='text' name='date'>

<input type='submit'>

</form>

</body>

</html>

Endret av zreak
Lenke til kommentar

Fort og gale versjonen.

http://munio.no/tools/leapyear.php

 

Klikk for å se/fjerne innholdet nedenfor

PHP

<?php

 

/**

 * First, some input validation

 * If you don't know the functions used here: http://no2.php.net/filter

 * Go PHP 5! ;)

 */

if(filter_has_var(INPUT_GET'year')) {

$year filter_input(INPUT_GET'year'FILTER_VALIDATE_INT);

if($year &#33;== false) {

/**

 * Ok, fine, we got an integer with the year. Let's check it.

 */

 

 $yearTimetsamp=mktime(1,1,1,1,1,$year);

 $leapYear=date('L'$yearTimetsamp);

 echo "<h1>Results: </h1>";

 if($leapYear == 1) {

 echo $year." is a leap year.";

 } else {

 echo $year." is NOT a leap year.";

 }

}

} else {

$year date('Y'); // Default value if none entered

}

 

?>

<h1>Leap year tester!</h1>

 

<form action="" method="GET">

<fieldset>

<input type"text" name="year" value="<?=$year?>"><br>

<input type="submit" value="Check">

</fieldset>

</form>

Liten kommentar, det ser ut som av forumet her ikke helt liker !== i koden, og dette ender da opp som & #33;== :/

 

Forresten, digger slike små utfordringer som dette. ;)

Endret av xqus
Lenke til kommentar

Måtte prøve jeg også, er alltid morsomt med utfordringer!

http://thecriminals.1go.dk/stuff/shotyear.php

Klikk for å se/fjerne innholdet nedenfor
<?php
$year = $_POST['year'];
if (isset($_POST['submit']) && is_numeric($year)) {

$checkdays = cal_days_in_month(0, 2, $year);
if ($checkdays == 29) {
echo $year." er et skuddår<br />";
} else {
echo $year." er ikke et skuddår<br />";
}
}
?>
<form action="shotyear.php" method="POST">
Årstall: <input type="text" name="year" /><br />
<input type="submit" value="Sjekk" name="submit" />
</form>

 

EDIT: url endret

Endret av Rasks
Lenke til kommentar

Ok, da setter vi fristen til natt til mandag, dvs mandag klokka 00:00, da går jeg gijennom alle bidrag og ser hva som funker best, ser best ut, og om de gir korrekt resultat.

 

 

Som du ser er siden XSS-himmel, men det betyr ikke noe akkurat nå...

Sikkerhet vil alltid være veldig relevant, og betyr forsåvidt veldig mye.

 

Og i fremtidige oppgaver, kan vi ikke heller bare lage selve funksjonen? Å lage siden var mye mer arbeid enn funksjonen.

7859461[/snapback]

Det var planen, men ettersom første utfordring ikke var allverden, måtte jeg ha litt mer innhold i oppgaven.

 

Ellers; send gjerne inn forslag til utfordringer på PM. Jeg har allerede noen ideer, men alltid bra med innspill.

Lenke til kommentar

Edit: la til en sjekk etter og ha lest litt om skuddår

 

Mitt bidrag:

www.zize.org/dabear_challenges/challenge1.php

 

Klikk for å se/fjerne innholdet nedenfor

PHP

<form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>" >

<input type="text" name="year" value="" >

<input type="submit" name="checkYear" value="Sjekk årstall" >

</form>

<hr>

<?php

$nowY sprintf('%d'$_POST['year']);

 

if($nowY 0)

{

if(substr($nowYstrlen($nowY)-22) == '00' && $nowY 400 == 0)

echo $nowY .' er ett skuddår!';

elseif(($year 4) === && substr($nowYstrlen($nowY)-22) &#33;= '00')

echo $nowY .' er ett skuddår!';

else 

echo $nowY .' er ikke ett skuddår.. :\'(';

}

else 

echo 'Skriv inn ett årstall som ett positivt heltall';

?>

 

men date('L', mktime(0,0,0,2,0,$year)); vil være enkelere hvertfall

Klikk for å se/fjerne innholdet nedenfor

PHP

<form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>" >

<input type="text" name="year" value="" >

<input type="submit" name="checkYear" value="Sjekk årstall" >

</form>

<hr>

<?php

 

$nowY sprintf('%d'$_POST['year']);

if($nowY 0)

{

if(date('L'mktime(00020$nowY)) == 1)

echo $nowY .' er ett skuddår!';

else 

echo $nowY .' er ikke ett skuddår.. :\'(';

}

else

echo 'Skriv inn ett årstall som ett positivt heltall';

 

echo '<hr>';

//kortere måte og gjøre det på

if($nowY > 0)

echo $nowY . ($nowY > 0 && date('L', mktime(0,0,0,2,0,$nowY)) == 1 ? ' er ett skuddår&#33;':' er ikke ett skuddår.. :\'(');

else

echo 'Skriv inn ett årstall som ett positivt heltall';

 

?>

Endret av ZiZe
Lenke til kommentar
Mitt bidrag:

www.zize.org/dabear_challenges/challenge1.php

 

Vil tro dette er den raskeste måten hvertfall

Klikk for å se/fjerne innholdet nedenfor

PHP

<form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>" >

<input type="text" name="year" value="" >

<input type="submit" name="checkYear" value="Sjekk årstall" >

</form>

<hr>

<?php

$nowY sprintf('%d'$_POST['year']);

 

if($nowY 0)

{

if(($year 4) === 0)

echo $nowY .' er ett skuddår!';

else 

echo $nowY .' er ikke ett skuddår.. :\'(';

}

else 

echo 'Skriv inn ett årstall som ett positivt heltall';

?>

 

andre versioner som kan brukes er:

Klikk for å se/fjerne innholdet nedenfor

PHP

<form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>" >

<input type="text" name="year" value="" >

<input type="submit" name="checkYear" value="Sjekk årstall" >

</form>

<hr>

<?php

$nowY sprintf('%d'$_POST['year']);

 

if($nowY 0)

{

if(($year 4) === 0)

echo $nowY .' er ett skuddår!';

else 

echo $nowY .' er ikke ett skuddår.. :\'(';

}

else 

echo 'Skriv inn ett årstall som ett positivt heltall';

?>

7866807[/snapback]

 

Bare for å være ekkel så er scriptet ditt sårbart for XSS :p

 

I tillegg er testen heller ikke helt korrekt..

http://no.wikipedia.org/wiki/Skudd%C3%A5r

 

Bare prøv med år 2008, som er et skuddår.

Endret av xqus
Lenke til kommentar

Jeg har nå sett igjennom alle kodene, og kommet til følgende konklusjon:

 

 

Vinner, første runde er Gommle:

 

-Kort kode

-Funker

-Ingen funksjonskall

(- Fint design)

 

Jeg la ikke noen vekt på kodekjøretid denne gangen, da oppgaven var såpass enkel at det i praksis ikke utgjør noe.

 

--

 

Forøvrig kan jeg nevne at koder ala dette er unødvendig:

        if($isleap == 1) {
            return true;
        } else {
            return false;
        }

Det holder med "return $isleap", evt "return $isleap == 1", noe som trekker ned (det var flere som hade gjort dette)

Lenke til kommentar

Stemmer, men nå strippa jeg ut og testa bare funksjonene. se på oppgave 1 som oppvarming :)

 

--

 

Oppgave 2:

Lag funksjonen unscramble(). Denne skal ta imot ett parameter, $input og gjøre om denne til en forståelig tekst.

<?php
function unscramble($astr)
{
 /* decode*/

 return $decoded;
}

echo 'stringen er', unscramble($input);

?>



 

 

 

 

 

$input =

Klikk for å se/fjerne innholdet nedenfor

%%41%%)%%58%%:%%32%% %%33%%!%%103%%t%%110%%a%%105%%v%%114%%e%%100%%q%%114%%e%%111%%b%%102%%s%%116%%g%%117%%h%%32%% %%101%%r%%114%%e%%100%%q%%110%%a%%97%%n%%32%% %%114%%e%%101%%r%%32%% %%101%%r%%116%%g%%116%%g%%101%%r%%68%%Q%%41%%)%%58%%:%%32%% %%33%%!%%103%%t%%110%%a%%105%%v%%114%%e%%100%%q%%114%%e%%111%%b%%102%%s%%116%%g%%117%%h%%32%% %%101%%r%%114%%e%%100%%q%%110%%a%%97%%n%%32%% %%114%%e%%101%%r%%32%% %%101%%r%%116%%g%%116%%g%%101%%r%%68%%Q

 

 

edit: som fil:

text.txt

Endret av dabear
Lenke til kommentar

Resultatet skal bli en string som har med denne tråden å gjøre. Kun funksjoner fra PHP er brukt (ingen eksterne systemkall eller liknende). Om det ikke var opplagt; førstemann som sender rett svar på PM, vinner.

 

edit: du må strippe vekk noe gjentakelse i den scramblede teksten.

edit 2: originalteksten inneholder ingen tall

 

nå kan jeg ikke gi mer tips på ei stund :p

Endret av dabear
Lenke til kommentar
Kommentar til vinneren, var det meningen at det skulle sjekkes om inputet faktisk var et år?

 

"Året andreas er et skuddår."

7878809[/snapback]

 

Nei, jeg "gadd" ikke å lage noe validering av input. Hvis dette skulle blitt brukt til noe ordentlig hadde jeg selvfølgelig gjort det.

Lenke til kommentar
Kommentar til vinneren, var det meningen at det skulle sjekkes om inputet faktisk var et år?

 

"Året andreas er et skuddår."

7878809[/snapback]

Nei, jeg "gadd" ikke å lage noe validering av input. Hvis dette skulle blitt brukt til noe ordentlig hadde jeg selvfølgelig gjort det.

7879925[/snapback]

Det står i reglene/oppgaven at den skal skjekke om det er et år.

Skal vi følge reglene eller ikke her?

Endret av endrebjorsvik
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...