Scrie o funcție în PHP 7+ care să verifice un număr natural

Scrie o funcție în PHP 7+ care să verifice un număr natural.

Reguli:

  • Funcția poate să aibă un singur parametru, care poate fi și omis
  • Parametrul dat poate fi de orice tip, orice resursă. Nu e număr, nu-i valid
  • Numărul maxim acceptat este 9876543210
  • Funcția trebuie să conțină cât mai puține caractere sau spații
  • Răspunsul funcției trebuie să fie de tip boolean
  • Înafară de funcția cerută mai poți folosi 0 funcții.

PS: Fără clase, fără metode, fără prăjeli, fără vrăjeli.

@anon80386878

Salut,

In cateva zeci de minute am ajuns la forma asta:

<?php

function nenat($numar){
if ((empty($numar)) || (!is_int($numar)) || ($numar>9876543210) || ($numar<0))
{
    echo "False";
   return false;
}
else
{
    echo "True";
    return true;   
}
}

nenat(42);

Cred ca indeplineste majoritatea cerintelor.
Daca is_int() si empy() se incadreaza la vrajeli, prajeli, ma gandeam sa verific daca e numar intreg calculand restul impartirii la 1. daca e diferit de 0, nok. Iar daca e empty, cred ca oricum nu satisface restul cerintelor.

trebuie sa recunosc ca n-am inteles foarte bine partea cu un singur parametru, care poate fi omis. Acum daca e omis, da eroare, pentru ca verify empty(). partea cu un singur parametru…cred ca as mai fi putut face un if care sa verifice ceva, dar n-am vazut sensul. sigur exista o alta metoda.

iar partea de php 7, codul asta sigur merge pe 7.1, nu stiu daca voiai sa folosesc anumite functii aparute strict in 7.

Anyway, arunca cu pietre/sugestii/pareri.

Thx:)

1 Like

Scoate echo-urile din functie. :slight_smile:

Poti sa scazi '0' din $numar.
De mentionat ca in acest mod “42” poate fi convertit, “42abc” il converteste, dar primesti notice, 42abc2 nu poate fi convertit.

De asemenea mai poti folosi si un RegEx + preg_match. Nu respecta cerintanat insa !

Sunt oricum mai multe metode :slight_smile:


function nenat($numar){
    /*if ((empty($numar)) || (!is_int($numar)) || ($numar>9876543210) || ($numar<0))
    {
        echo "False";
        return false;
    }
    else
    {
        echo "True";
        return true;
    }*/

    return $numar - '0';
}


echo(nenat("42abc"));

Rezultat:

Notice: A non well formed numeric value encountered in C:\Users\cosmi\untitled2\Number.php on line 21 - datorita lui 'abc'
42

Cu pietre n-arunc, dar n-ai respectat prea multe cerințe.

În primul rând că is_int și empty sunt funcții.

Și preg_match este o funcție.

Am spus fără alte funcții. Doar cea care verifică numărul.

1 Like

Eşti sigur că ai formulat bine cerinţele? Habar n-am cu ce vine php 7 in plus, dar nu-mi imaginez nicio metodă de a testa dacă o resursă este integer sau array fără să folosesc is_int() si is_array().

Workaround.

Un workaround ar fi utilizarea casting-ului, de genul “$nr == (int)$nr”. Dar in acest caz trebuie precizat ce anume inseamna “numar”. De exemplu, string-ul “0020” este valid sau invalid?

Invalid, căci nu e număr natural.

1 Like

Serios? :slight_smile: De ce nu e număr natural? Mie mi se pare că e, singura problemă cu type casting-ul din php este ca va face diferenta intre 0020 şi “0020” (atenţie la ghilimele), sau chiar între 123 şi “123”.

function is_natural($nr)
{
    return $nr === (int)$nr && $nr >= 0 && $nr <= 9876543210;
}

echo is_natural(0020) ? "este numar natural" : "nu-i numar natural";
echo is_natural("0020") ? "este numar natural" : "nu-i numar natural";

Ah, mai e ceva. Numerele prefixate cu zero sunt considerate a fi in sistem octal, am uitat de chestia asta.

LE Apropo de sistemele de numeraţie, mi-am dat seama de o chestie care ar putea părea o bizarerie (dar nu, e perfect logică).

$i = 020;
$j = "020";

echo (int)$i . " != " . (int)$j;

Rezultat: 16 != 20

4 Likes

Din câte știu eu, 0020 nu este un număr natural.

Apoi, is_natural((object)null) aruncă eroare de tip notice. Scapă de ea. Fără erori la vedere sau în logs.

Și is_natural() aruncă eroare. Prima regulă este că parametrul poate fi omis.

.

1 Like

Ma rog, scopul meu nu era sa dau o rezolvare, ci sa atrag atentia ca sunt niste inadvertente in cerinte. Nu am inteles pe ce te bazezi cand spui ca “0020” nu este numar natural. Păi dacă nu e număr natural, ce e?

Referitor la rezolvare, habar n-am cum se verifica un obiect de tip null, banuiesc ca ceva in stilul de mai jos (poate exista si alte metoda mai ortodoxe):

function is_natural($nr = null)
{
    return (object)$nr != (object)null && $nr === (int)$nr && $nr >= 0 && $nr <= 9876543210;
}

Din punctul meu de vedere, numere naturale sunt si 123, si 1e3, si 013, si 0x20 samd. Ca diferă baza de numeraţie sau că e reprezentare cu exponent, e irelevant.

3 Likes

intreb si eu ca sa nu mor prost… care-i sensul cerintelor? in ce caz o sa trebuiasca sa scrii funtia aia fara nici un parametru? sau in ce caz o sa iei un obiect si o sa-l verifici daca-i numar? nu inteleg… numerele mai mari de 9876543210 nu mai sunt naturale? ce legatura are formatarea codului cu functionalitatea? ai scris deja ca nu ai voie sa folosesti alte functii. sau metodele sunt alteceva? defineste prajeli si vrajeli.

4 Likes

Ideea postarii era ca omul dorea sa ii fie testat nivelul. @anon80386878: a scris niste cerinte, iar rezultatul nu a fost pe masura cerintelor.

La respectivul test, nivelul de " a intelege cerintele si a le respecta" este foarte jos. E bine sa stie Razvan.

De multe ori am fost pus in situatia sa dau specifcatii (functionale sau non-functionale) intr-un task unui coleg si acesta sa le elimine la implementare(din diverse motive) si sa dea “done” la task. Nu este OK.

Corect este

  • sa ceri clarificări acolo unde nu înțelegi cerințele sau rolul lor
  • sa spui ce cerințe nu ai putut aplica si din ce motiv
2 Likes

Simplu: vezi inventivitatea celui testat.

Același motiv și pentru faimoasele - și ciudatele - întrebări de la interviurile Microsoft sau Google (câte mingi de ping-pong încap într-un avion, câte frunze sunt în copacul ăla șamd).

1 Like

Interesul meu a fost să testez cunoștiințele utilizatorului. Pentru că asta a și cerut.

Dar ți le argumentez:

  • Funcția poate să aibă un singur parametru, care poate fi și omis

În general, când înveți să faci o funcție, lucrul cu parametri sunt pe locul 2. Așa stă treabă, ăsta-i mersul. Faptul că i-am cerut ca parametrul să poată fi omis era doar ca să văd dacă știe că parametrul poate fi opțional. Și nu știe. Uită-te în codul lui și în comentariu.

  • Parametrul dat poate fi de orice tip, orice resursă. Nu e număr, nu-i valid

Nu înveți despre clase și obiecte înainte să înveți despre variabile. Trebuia să văd dacă știe ce e ăla un obiect. Și de ce nu, acolo unde nu aștepți să umbli cu obiecte. Nu-mi pare că știe prea multe.

  • Numărul maxim acceptat este 9876543210

Pentru că următoarea regulă din listă este să folosească cât mai puține caractere, eram curios dacă o să folosească “<= 9876543210” sau “< 9876543211”. Deci, trebuia să pun o limită.

  • Funcția trebuie să conțină cât mai puține caractere sau spații

Ai putea scrie funcția în 1000 de moduri. Nu este interesant în programare ca codul tău să fie cât mai scurt și în același timp să facă ceea ce ne dorim ? Nu cu toții defineam 18 mii de variabile ca în condiții să o verificăm pe ultima definită ?

  • Răspunsul funcției trebuie să fie de tip boolean

A returnat cineva rezultatul unei funcții în format boolean înainte să returneze rezultatul în tipul “Da/Nu” sau trimițând rezultatul “” ? Oare nu-ți poți da seama de ce cunoștințe are în programare cerându-i asta ? Și uită-te, de exemplu, cum returnează răspunsul, față de cum îl returnează funcția lui serghei (care e ceva mai bună).

  • Înafară de funcția cerută mai poți folosi 0 funcții.

Da. Chiar așa. Mi-am permis să văd dacă știe de casting. Și dacă știe, cum o face, având în vedere că exista și cerința cât mai puține caractere.

Prăjeală, vrăjeală se referă la ce am spus înainte. Fără clase, fără metode. Pentru că în felul ăsta ai fi putut extinde lucrurile (că doar n-am zis nimic de metode). Și, de ce nu, ai putea umbla la configurația php-ului doar ca să scapi de erori de exemplu. Lucru care ar suna a prăjeală în cazul ăsta. Când, dacă chiar e musai, ar putea folosi operatorul @ care e fancy și nu înveți despre el chiar când abia te-ai apucat de programare.

Una peste alta, intenția mea n-a fost să mă contrariez cu nimeni. Toate cerințele mele sunt motivate, au logică și, repet, au ca scop să testeze cunoștințele utilizatorului și nivelul la care e (asta a cerut). Că vreți să spuneți că “stai domnule, că n-ai nevoie de așa ceva acolo”… foaie verde… hai să facem o petiție și să cerem celor de la PHP ca în viitoarea versiune să implementeze numai ce folosim noi.

Din punctul meu de vedere, cerințele nu sunt deloc ambigue. Totuși, se putea cere clarificări. Era culmea să-i zic “descurcă-te”.

Dar, na, când rămâi fără soluții începi să spui că nu știi ce e ăla număr natural, să folosești sistemul hexa, binar etc, când eu am vorbit despre numere naturale, așa cum le învățăm la școală în primele clase.

Deci, nu sunt o nebunie cerințele mele.

Ar putea fi o nebunie faptul că nici până acum n-am primit funcția.

Nici nu mai e nevoie. Am dat atâtea detalii de zici că i-am făcut documentație.

5 Likes

Eu as vrea sa vad solutia ta la problema. :slight_smile:

Ce-ar fi să-ți zic că nu se poate crea funcția pe cerințele mele ? :laughing:

1 Like

Ahh…
Atunci le folosim pe cele built in. Oricum sunt “mai bine facute” :slight_smile:


Imi aminteste de o intrebare pe Quora

https://www.quora.com/How-do-you-write-a-program-that-writes-hello-world-ten-times-in-Java
Unele abordari…sunt mai exotice

La cum ai definit tu “numărul natural” nu se poate face cu nimic ce vrei tu, nici cu funcţii nici fară funcţii :slight_smile:

function test($nr)
{
    echo "LEN=" . strlen($nr) . " VAL=" . $nr;
}

$nr = 0x16;
test($nr);

Result: LEN=2 VAL=22

PHP-ul nu-ţi oferă absolut nicio metodă prin care să poţi determina ce sistem de numeraţie ai folosit când ai asignat o valoare variabilei $nr.

Ba se poate crea funcția exact așa cum am cerut-o.

Eu am vorbit despre numere naturale. Inițiatorul a înțeles asta și a creat funcția respectând cerința ăsta.

Oricum, eu n-am auzit până acum ca 0020 să fie număr natural.

O simplă căutare pe google o să te lămurească și pe tine.