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


(Andrei F.) #61

iti dai seama ca nu l-am scris asa :)) l-am scris normal si l-am modificat just to prove a point


(Serghei Amelian) #62

123 e clar ce-i cu el, dar trebuie sa defineşti ce se întâmpă cu 0123 şi “0123”. Ce trebuie să returneze în cazul lor?


(Cosmin Popescu) #63

Ultimul ps este o prostie
Nu afecteaza cu nimic cate caractere am scris. Ba mai mult functia mea este relativ scurta.

Esti constient ca fisierul ocupa poate mult sub 1 kb


(Cosmin Popescu) #64

offtopic
Site ul unde ai pus codul este smecher. Iti zice metrice ale codului + chestii mai low level(op codes )


(Ionuț Staicu) #65
function p(n='') {return !!n&&n>0&&n<=9876543210&&n%1==0}

În mai puțin de 57 chars nu am reușit să-l scot :smiley:


#66

Parametrul 0123 ajunge în funcție 123, și fiind un număr natural înseamnă că este valid.

Parametrul “0123” ajunge în funcție exact așa cum e și nefiind un număr natural rezultă că este invalid.

@Cosmin_Popescu

Atunci când ajungi să creezi script-uri complexe, este un bad practice să umpli fișierul de cod doar ca să verifici 3 lulele, 3 surcele. Nu ai cum să spui că e o prostie cerința mea, crede-mă.

Uită-te la Ionuț, a minificat funcția că aproape că nu mai returnează nimic :laughing:

@iamntz

Confirm. Nu mai returnează nimic. Ai tras de caractere atât de mult că dă numai erori.


(Serghei Amelian) #67

Well, in acest caz codul nu va mai fi atat de scurt, type casting-ul nu mai este suficient, trebuie testat primul caracter sa nu fie zero.


#68

@serghei

Și cum ai de gând să faci asta ? :laughing:


(Serghei Amelian) #69

Simplu, $nr[0] != “0” :slight_smile:


#70

Bun,

Aștept funcția.


(Serghei Amelian) #71

De data asta trebuie testat si null-ul. Legat de “2.0” apare din nou problema de reprezentare. 2.0 este diferit de “2.0”, trebuie actualizate “specificatiile” :slight_smile:

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

#72

2.0 nu este un număr natural. Și nici “2.0” nu este un număr natural…


(Andrei F.) #73

pentru “12a” si “x100” functia ta returneaza true


(Alex) #74

$nr = 0 o sa-ti dea false la prima verificare
‘b’ == (int)'b’o sa fie true.


(Alex) #75

hai sa-ncerc si eu.

function is_natural( $number = null ) {
	return ( $number !== null )
	       && $number != (object) $number
	       && $number != (array) $number
	       && (string) $number == (string) ( $number + 0 )
	       && (float) $number == (int) $number
	       && $number[0] != 0
	       && (int) $number >= 0 && (int) $number < 9876543211;

}

ps, nu, nu ma chinui sa scot spatiile si formatarea.


(Cosmin Popescu) #76

It works ! :slight_smile:

O chestie tare
echo(assert(CheckIfIsNumber(0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999))); da acest rezultat

assert(): assert(CheckIfIsNumber(1)) failed in C:\Users\cosmi\untitled2\Number.php on line 38

Am testat si cazul cu un nr foarte mare si cel de mai sus :smiley:

Update
Am pus codul si aici

function f($n=null){if($n===(object)$n)return false;if($n<=0)return false;if($n>=9876543210)return false;if($n===(int)$n)return true;} - 134 de caractere. Asa ramane. Ocupa 134 de bytes


De cati matematicieni este nevoie sa schimbi un bec ?
@alescx link gresit, :blush:


(Alex) #77

0 is_supranatural.


(Serghei Amelian) #78
function is_natural($n = "")
{
	return $n !== "" && $n !== (object)$n && $n !== (array)$n && (string)$n === (string)(int)$n && $n >= 0 && $n < 9876543212;
}
""                             = should be false, was false => PASSED
" "                            = should be false, was false => PASSED
null                           = should be false, was false => PASSED
(object)null                   = should be false, was false => PASSED
(object)['caught' => true]     = should be false, was false => PASSED
new stdClass                   = should be false, was false => PASSED
array()                        = should be false, was false => PASSED
array('caught' => true)        = should be false, was false => PASSED
0                              = should be true , was true  => PASSED
"0"                            = should be true , was true  => PASSED
123                            = should be true , was true  => PASSED
1e3                            = should be true , was true  => PASSED
"1e3"                          = should be false, was false => PASSED
0xff                           = should be true , was true  => PASSED
"0xff"                         = should be false, was false => PASSED
"123"                          = should be true , was true  => PASSED
0123                           = should be true , was true  => PASSED
"0123"                         = should be false, was false => PASSED
" 123"                         = should be false, was false => PASSED
" 0123"                        = should be false, was false => PASSED
-1                             = should be false, was false => PASSED
"-1"                           = should be false, was false => PASSED
9876543211                     = should be true , was true  => PASSED
9876543212                     = should be false, was false => PASSED
1.1111111111111E+35            = should be false, was false => PASSED
2.0                            = should be false, was true  => NOT PASSED
"2.0"                          = should be false, was false => PASSED
"12a"                          = should be false, was false => PASSED
"x100"                         = should be false, was false => PASSED

(Alex) #79

mhm. si ce se intampla cand verifici CheckIfIsNumber(‘b’)?


#80
is_natural('2.0')

Returnează true; Oricum, e gălăgie mare în funcția aia…