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

Păi… în cazul ăsta eşti invitatul meu să faci o funcţie prin care să detectezi ca argumentul 0020 NU este număr natural. Succes :slight_smile:

N-are legătură cu funcția mea :slight_smile:

E convertit înainte să ajungă la ea.

Aha, te-ai prins şi tu că e ceva legat de conversie şi că sistemul de numeraţie n-are nicio treabă cu numărul natural sau supranatural :slight_smile: Ideea e alta, ce te faci cu numerele care NU SUNT convertite? Funcţia ta va interpreta in mod diferit 020 şi “020”.

020 este o convenţie a php-ului prin care poţi să reprezinţi numere în sistem de numeraţie octal, 020 în sistem zecimal fiind egal cu 16. Pe de alta parte, “020” e cu totul altceva, type casting-ul la integer pur si simplu va elimina primul zero şi vei obţine “20”.

Din acest motiv trebuie să fii extrem de atent cum enunţi o cerinţă pentru inputul unei funcţii, mai ales la un limbaj ca PHP unde tipurile variabilelor sunt dinamice. Altfel te vrei trezi că funcţia ta funcţionează, dar funcţioneaza anapoda.

În JS cred că se poate. Am omis vreun test?

(btw, cred că ar fi mai util dacă cerințele ar include testele iar rezultatul să treacă acele teste :wink: )

1 Like

Aș vrea să nu te contrazic, dar trebuie …

Când trimiți un input prin HTTP el devine automat un string.

Dacă trimiți de exemplu 0020, PHP o să-l primească ca string.

Înafară de asta, nu poți trimite 0020 ca parametru decât manual.

Nici dacă jonglezi cu el.

Ori, să fim serioși, vorbim despre programare…

Deci ce vrei să zici, că funcţia ta care poate primi orice tip de variabilă poate de fapt să lucreze corect doar cu string-uri? :slight_smile:

N-am testat funcția ta foarte mult, dar la prima vedere pare că îndeplinește toate cerințele.

Să n-aveți dubii că în PHP nu se poate.

Nu numai cu string-uri. Ci cu ce primește funcția, cu parametrul pe care îl primește.

Dacă parametrul este alterat pe drum, nu putem spune că funcția e de vină.

Funcţia lui Ionuţ are exact aceeaşi problemă pe care am ridicat-o şi eu.

0111454013352 dă true
111454013352 dă false

LE De fapt acum mi-am dat seama cum a rezolvat Ionuţ problema consistenţei, pur şi simplu nu accepta numere ca string-uri. Lasă conversia pe seama caller-ului şi e problema lui cum îşi dă peste deşte :slight_smile:

Parametrul nu este alterat pe drum, funcţia respectivă alterează parametrul, făcând in mod inconsistent type cast-ul. Hai să vorbim pe concret, implementeaza tu funcţia is_natural() şi să vedem dacă rezistă la teste.

Înseamnă că mai are de lucru la ea :laughing:

Nu știu ce să zic, testele astea trec:

assert.isFalse(parse(0111454013352));
assert.isFalse(parse(111454013352));

Ba da, acceptă numere ca stringuri, dar doar numere. E.g. "42" e ok. "a42" sau "42a" nu.

Eu nu înțeleg cum de n-ai reușit să faci funcția. Ai doar 2 lucruri pe care le-ai omis. Numărul de caractere și problema cu obiectul.

E @ș@ de greu ? :smiley:

Ciudat, am rulat manual asa:

console.log(parse(10));
console.log(parse("10"));

Si imi da “true”, respectiv “false”

De ce m-ar interesa numărul de caractere?

Asta este solutia mea

<?php

function CheckIfIsNumber($number = null){
    if($number === (object)$number)
        return false;
    if ($number <= 0) 
        return false;
    if($number >= 9876543210)
        return false;    
    if ($number === (int)$number)
        return true;    
}
 echo(assert(CheckIfIsNumber(42)));
 echo(assert(CheckIfIsNumber("42")));
 echo(assert(CheckIfIsNumber(0)));
 echo(assert(CheckIfIsNumber(-1)));
 echo(assert(CheckIfIsNumber(new stdClass())));
 echo(assert(CheckIfIsNumber(111454013352)));
 echo(assert(CheckIfIsNumber(123)));
 echo(assert(CheckIfIsNumber(0111454013352)));
 echo(assert(CheckIfIsNumber("42aaa")));
 echo(assert(CheckIfIsNumber("4a2b")));
 echo(assert(CheckIfIsNumber(1.2)));
 echo(assert(CheckIfIsNumber(null))); 
 echo(CheckIfIsNumber((object)['caught' => true]));
 echo(assert(CheckIfIsNumber((object)['caught' => true])));

Sa fiti blanzi. nu am lucrat cu assert :slight_smile:

Rezultate

1
Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 14

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 15

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 16

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 17

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 18
1
Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 20

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 21

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 22

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 23

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 24

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 26

@anon80386878, respecta cerintele ?


Daca aveti idei de imbunatatire feel free !

LE: Am tratat si cazul cu object :slight_smile:

Pentru că de principiu am vrut să testez cât de bine se înțelege inițiatorul cu PHP.

În cazul ăsta, e important numărul de caractere.

Aș putea face funcția, iar în interior să mai includ încă 2 fișiere…

Oricum, am explicat și mai sus.

Funcția nu trebuie să arunce erori și ar trebui să conțină cât mai puține caractere.

Măcar de-ai opri erorile… Am spus mai sus. Am dat indicii.

Erorile sunt aruncate de assert. Evaluarea a esuat. L-am foloit pt a testa cu parametrii diferiti

Am incercast si cu resursa obiect :slight_smile:

Din moment ce faci type cast la integer si faci o comparatie, nu vad cu ce te ajuta numarul de caractere.

Cred ca economia la nr de caractere nu mai este o problema in ziua de azi :slight_smile: