CAPCHA za programerje :D

  1. Napiši RegExp izraz, ki v vrne pravilno za naslednje vnešene vrednosti:
    "3.432.432,45 €" , "54.543 €" , "543,8 €"

  2. Napiši SQL stavek, ki vrne poleg stolpcev(Ime,Priimek) iz tabele Osebe še stolpec Zaporedna_Stevilka, ki vsebuje zaporedno številko vrstice rezultata.

  3. Napiši vrednost izraza 100! (klicaj je matematični simbol za je faktorelo ali fakulteto)

Zanima me če se vam zdijo prelahka ali pretežka . Če so dovolj razumljivo napisana. Imate kakšne boljše predloge. Vprašanja naj ne bodo vezana na specifičen programski jezik ali framework.

7 odgovorov

Popravki

  1. Odgovor je preenostaven ".*" moral bi napisati "ki vrne pravilno samo za naslednje primere" .
  2. Stvar bi moral narediti malo bolj realno. Tabela tekmovalci. Stolpci (Id,Točke,Ime,Priimek).
  3. Zahteva se natačna vrednost.

Pojasnila

Prvo vprašanje preverja znanje RegExp, kar se mi zdi da je sedaj že skoraj obvezno znanje pri programiranju v skoraj vseh jezikih. Drugo vprašanje je mogoče malo težje, sploh ker sem jaz preveč šlampasto napisal. Gre se za enumeracijo, ki pride prav pri rangiranju. Tretje pa je enostaven problem računanja z velikimi števili.

Vprašanja niso toliko namenjena za dejansko CAPCHA-o (bi jih moralo biti veliko več) ampak bolj za preverjanje nekega malo naprednejšega znanja programiranja, na primer pri razgovoru za službo.

Bom otvoru s tretjo :)
pr tretji uporabmo stirlinga, da ne skurmo procesorja (z rekurzijo ali for stavkom) :P potem pa zaokrožmo na 0 decimalk ;)

sicer takole:

<?
function fakulteta($x){
    if($x==1)
    {
    return 1;
    }
    else
    {
    return $x * fakulteta($x-1);
    }
}
$rezultat=fakulteta(100);
echo $rezultat;
?>

Vprašanja sem dal tudi na php-si.com
http://www.php-si.com/?lokacija=forumprikazitemo&forum=3&tema=6890&stran=1
In so jih še isti dan tudi rešili :D

Tam boš tudi videl zakaj tvoja funkcija ni vredu in kje tiči dejanski problem.

Alkimisticus, tisti, ki je prvi napisal odgovor na drugo vprasanje, ima kar prav. Podal ti je najhitrejso in najelegantnejso resitev (sicer res le za MySQL), tista, ki si jo ti napisal, je noro storasta in povrh vsega se hudo pocasna.

v Oraclu se zadeva resi se precej bolj elegantno, saj ima Oracle prav v ta namen rezervirano besedo ROWNUM, in bi bil query res precej enostaven:

SELECT Id, Tocke, Ime, Priimek, ROWNUM AS Zaporedna_Stevilka
FROM Tekmovalci ORDER BY Tocke DESC;

V PostgreSQL bi to resil nekako takole:

CREATE TEMP SEQUENCE rownum;
SELECT Id, Tocke, Ime, Priimek, nextval('rownum') AS Zaporedna_Stevilka
FROM Tekmovalci ORDER BY Tocke DESC;

Priznam, da je skoraj vsaka druga rešitev boljša in ima manj pomankljivosti, vendar pa ni tako zanimiva.

Alkimisticus:
Vprašanja sem dal tudi na php-si.com
http://www.php-si.com/?lokacija=forumprikazitemo&forum=3&tema=6890&stran=1
In so jih še isti dan tudi rešili :D

Tam boš tudi videl zakaj tvoja funkcija ni vredu in kje tiči dejanski problem.

Sej osebno bi uporabu stirlinga pa zaokrožu na 0 decimalk, kar bi blo najhitrejš, najboljš... sam bi blo še zmer problem zarad velikih številk rešit...

Malo sem prehitro napisal tisto o Oraclu :) V bistvu zadeva crkne, takoj ko uporabis ORDER BY po polju, ki ni primary key oziroma primarni sort. Pravilen primer bi bil takle:

SELECT Id, Tocke, Ime, Priimek, ROWNUM AS Zaporedna_Stevilka
FROM (SELECT Id, Tocke, Ime, Priimek FROM Tekmovalci ORDER BY Tocke DESC);

Malo manj elegantno, vem :)

Rahlo prehitro sem tudi izjavil tisti "prav v ta namen", ni res, zadeva se uporablja vecinoma v povsem druge namene, Oracle namrec ne pozna izraza LIMIT, pa se da zadevo blazno elegantno resit prav z ROWNUM...

Ampak zdaj sem ze rahlo zasel s teme :P