Tema de clasa 2 :D

aveti idee alte variante?

echo "Scrie toate numerele de doua cifre care au diferenta dintre cifra zecilor si cifra unitatilor egala cu 3 (tema de clasa a 2-a)";
for($i=10; $i<=99; $i++) {
	$x = chunk_split($i,1,' ');
	$y = explode(' ',$x);
	$a = $y[0] - $y[1];
	if ( $a == 3) {
		echo "<br>\r\n ({$i}) ".$y[0]." - ".$y[1].' = '.$a;	
	}
}
<?php

for ($x = 10; $x <= 99; $x++) {
    $x = (string) $x;
    $result = $x[0] - $x[1];
	
    if ($result == 3) {
	echo $x . '<br />';
    }
}

M-am gandit la ceva mult mai simplu.

Nu-i cu mult îmbunătățit, dar… e o variantă :smiley:

$numbers = range(10, 99);
array_walk($numbers, function($number) {
  $pieces =  str_split($number);
  if ($pieces[0] - $pieces[1] === 3) {
    echo $number . "\n";
  }
});

Hmmm, alternativ, s-ar putea face așa:

array_walk($numbers, function($number) {
  $minimum = 30; 
  // 30 e cel mai mic număr care îndeplinește regula
  if ($number >= $minimum && ($number - $minimum) % 11 == 0) {
  // orice modulo de 11 din multiplu de 11 + 30 dă zero, este numărul nostru
    echo $number . "\n";
  }
});
2 Likes

Exact varianta asta voiam s-o pun si eu :)) http://pastebin.com/T4k1kTiQ

1 Like

Un oneliner în js:

'3456789'.split('').map(n => console.log(n + n - 3));

6 Likes

si in alt limbaj:

defmodule Problem do
  def find_results do
    range = 10..99
    Enum.each(range, fn n -> if n >= 30 and rem(n-30,11) == 0 do IO.puts(n) end end)
  end
end

Problem.find_results

Varianta formala ar fi cu div si mod…

echo "Scrie toate numerele de doua cifre care au diferenta dintre cifra zecilor si cifra unitatilor egala cu 3 (tema de clasa a 2-a)";
for($i=14; $i<=96; $i++) {
 $cifraunitatilor = $i % 10; // i mod 10, adica luam restul de la un numar impartit cu zece obtinand cifra unitatilor
 $zecimala = floor($i / 10); // i div 10, adica impartim numarul cu 10 si rotunjim in jos, practic taiem ultima cifra  obtinand zecimala
 if(abs($zecimala - $cifraunitatilor) == 3) {
  echo $i . " "; //daca diferenta e 3 scriem i
  }
}

@andreieftimie credeam ca doar eu ma joc shortest challenge pe codefights… n + n - 3 :slight_smile:

One liner php : for($i=14; $i<=96; $i++)if(abs($i % 10 - floor($i / 10)) == 3) echo $i." ";

2 Likes

Pe bune??? Nici unul nu sunteți în stare să rezolvați o problemă de clasa a 2-a? :confused:

Dacă @iamntz a trântit o perlă, o luați toți de bună? De ce 30 e minim? Oare 14 nu satisface cerința? Nici 25?
Și de ce verificați doar o singură direcție? Atât 30 cât și 36 satisfac cerința…

Singurul care s-a apropiat de nirvana a fost @andreieftimie, cu numărul minim de iterații, dar a dat-o-n bară la logică (ca restul) și la concatenare.

let numbers = [];
for (let i = 1; i < 10; i++) {
    i > 2 && numbers.push(`${i}${i-3}`);
    i < 7 && numbers.push(`${i+3}${i}`);
}
1 Like

@Birkoff
Chiar așa? chunk_split și explode? Oare nu asta făcea str_split?
Sau, și mai bine, convertești $i în string și-l accesezi ca array?

$x = (string) $i;
$result = $x[0] - $x[1];

@PocsanJr
Dacă făceai

if (abs($result) === 3)

erai tata lor!

Si eu m-am gandit la diferenta absoluta, dar cerinta daca nu contine expresia “diferenta absoluta” atunci putem considera ca doar zecimala-unitate == 3 satisface total cerinta si mi-am modificat raspunsul, l-am repus sa fie cineva cu raspunsul ‘corect’. :smiley: + nu conteaza numarul de iteratii

Am avut aceeași discuție și cu @angelp, care s-a supărat, și-a luat jucăriile și a plecat.

Este o problemă de clasa a doua. Îți garantez că majoritatea copiilor de clasa a II-a nu știe să calculeze 1-4. De fapt, numerele negative se învață prin clasa a IV-a sau a V-a.

Așa că, soluția ta, deși corectă, este prea complexă pentru enunțul problemei. :slight_smile:

Dacă se dau a = 1 și b = 4 probabil că nu știu să calculeze a - b, dar de ce n-ar ști b - a? :slight_smile:


P.S. Rezolvarea mea nu implică numere negative.

Eu am citit-o de la stânga la dreapta. Și cred că am interpretat-o corect.
@IonutBotizan 14 ar da -3

Totuși nu e cel mai eficient și scurt mod de a rezolva problema dată.
Dat fiind că problema dată are un număr mic de reaultate aș sugera asta fiind cea mai rapidă soluție:

console.log('30\n41\n52\n63\n74\n85\n96');
3 Likes

@isti37
Enunțul nu spune că cifra zecilor este mai mare cu 3 decât cifra unităților, ci spune că diferența între cele două cifre este 3. Cum am zis mai sus, trebuie ca a - b == 3 || b - a == 3.

Serios?! :facepalm:


Soluția, scrisă ca în clasa a doua, fără giumbușlucuri și optimizări ar fi:

let numere = [];

for (let zeci = 1; zeci <= 9; zeci++) {
    for (let unitati = 0; unitati <= 9; unitati++) {
        if ((zeci > unitati && zeci - unitati == 3) || (unitati > zeci && unitati - zeci == 3)) {
            numere.push(zeci * 10 + unitati);
        }
    }
}

Aia este o interpretare și probabil n-ai fi depunctat dacă ai fi în clasa a doua, dar părerea mea e că detaliile astea fac diferența între copiii care vor fi selectați pentru olimpiade și cei care mai târziu, în liceu, se vor reprofila pe filologie.


În concluzie:
OK, fie, este o problemă de clasa a doua și copiii de clasa a doua ar avea probabil dificultăți, dar asta nu vă scuză pe voi. Sunt dezamăgit de faptul că toate rezolvările de aici au fost la fel de naive precum cele ale unui copil de clasa a doua. :disappointed:

Greșit. Enunțul spune:

OK, așa este, ai dreptate! Am înțeles eu greșit cerințele… N-are rost să continuăm dezbaterea ca niște… copii de clasa a doua. :+1:

1 Like

Si o rezolvare ca la carte in Erlang:

1> L = [0,1,2,3,4,5,6,7,8,9].
2> [X*10+Y || X <- L, Y <- L, X-Y == 3].
[30,41,52,63,74,85,96]
1 Like

“Scrie toate numerele de doua cifre care au diferenta dintre cifra zecilor si cifra unitatilor egala cu 3 (tema de clasa a 2-a)”

1-4 = -3
2-5 = -3

3 != -3 last time I checked :slight_smile:

Pe bune??? Nici unul nu sunteți în stare să interpretati o frază de clasa a 2-a? :confused:

@Floris_Stoica_Marcu in Erlang we trust! :smiley: gg

2 Likes

Ar fi fain un thread/category numai cu problemute de genul acesta; Sunt mai ales curios de implementarea lor in limbajele necunoscute mie.