За последние 24 часа нас посетили 30962 программиста и 1821 робот. Сейчас ищут 983 программиста ...

Задачи для входа на Junior

Тема в разделе "PHP для новичков", создана пользователем Hfibl, 11 май 2018.

  1. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    Здравствуйте!
    Заранее сильно извиняюсь за всё. :oops: Помогите пожалуйста начинающему программисту. Есть две задачи :
    1) Нужно написать функцию, которая на вход получает положительное число и возвращает число, которое показывает, какое количество раз нужно умножить цифры числа, перед тем как вы получите число, которое содержит единственную цифру (0..9). Тестовые данные: task2(39) === 3 //3 * 9 = 27 (шаг 1) , 2 * 7 = 14 (шаг 2), 1 * 4 = 4 (шаг 3)task2(777) === 4 // 7 * 7 * 7 = 343 (1 шаг), 3 * 4 * 3 = 36 (2 шаг), 3 * 6 = 18 (3 шаг), 1 * 8 = 8 (4 шаг)task2(5) === 0 // потому что 5 и число из одной цифры.

    2) Написать функцию, которая на вход получает строку, которая содержит числа (пример: "56 65 74 100 99 68 86 180 90"). Необходимо отсортировать, используя "вес" каждого числа. "Вес" будет считаться как сумма всех цифр числа (вес 56 = 5 + 6 ) ) . Если вес у чисел одинаковый (например 180 (вес 9) и 90 (вес 9)), то их необходимо сравнить как строки. Результатом должна возвращаться строка, которая состоит из отсортированных чисел.Тестовые данные: "103 123 4444 99 2000" => "2000 103 123 4444 99""2000 10003 1234000 44444444 9999 11 11 22 123" => "11 11 2000 10003 22 123 1234000 44444444 9999". PS: Все числа в последовательности целые и положительные.

    P.S. Всего задач три, решать начал позавчера, одну решил, а эти две по ходу решения запутался
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    покаж че нарешал
     
  3. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    да ничего особенного, фигня там полная
     
  4. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    PHP:
    1. <?php
    2.    $a = "183";
    3.    $sum = 1;
    4.        for($i=0;$i<strlen($a);$i++)
    5.              {
    6.                  //$sum = $sum * $a[$i];
    7.                  if(strlen($sum)>1)
    8.                  {
    9.                      $sum = $sum * $a[$i];
    10.                      echo $sum . '<br />';
    11.                  }
    12.              }
     
  5. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    первый пойдет?

    PHP:
    1. <?php
    2.  
    3. function calculation($number){
    4.  
    5.     $fileTmp = 'tmp';
    6.  
    7.     file_put_contents($fileTmp, '', FILE_APPEND);
    8.  
    9.     $arrNumb = str_split($number);
    10.  
    11.         if (count($arrNumb) == 1) {
    12.  
    13.             $arrResult = file($fileTmp, FILE_IGNORE_NEW_LINES);
    14.  
    15.             unlink($fileTmp);
    16.  
    17.             return count($arrResult);
    18.  
    19.         }
    20.  
    21.             $result = 1;
    22.  
    23.                 foreach ($arrNumb as $value) {
    24.  
    25.                     $result *= $value;
    26.  
    27.                 }
    28.  
    29.                 //echo $result."<br>";
    30.  
    31.                 file_put_contents($fileTmp, $result."\n", FILE_APPEND);
    32.  
    33.         return calculation($result);
    34.    
    35.  
    36. }
    37.  
    38. echo calculation(39);
    39. echo "<BR>";
    40. echo calculation(777);
    41. echo "<BR>";
    42. echo calculation(5);
    43. echo "<BR>";
    44.  
    45.  
    46. ?>
    Хотя предполагаю, что решение должно быть куда проще. Но т.к. в условии ничего кроме результата не оговорено, результат есть. А значит и решение достойно жизни :)


    Hfibl Новичок С нами с: 23 сен 2015
    Ты ждал 2,5 года что-бы задать свой вопрос?
     
    #5 AlexandrS, 11 май 2018
    Последнее редактирование: 11 май 2018
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @AlexandrS, нафига там файлы? Не учи плохому. Элементарная математика же. Там 14 строчек и два цикла. И никаких файлов! Я хочу, чтоб ТС ещё помучился, а потом покажу, если никто не опередит :)

    @Hfibl, ты же мужик, давай, напрягись. Первая задача - элементарная.
     
  7. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Так гляди целым форумом на джуна вытащим:)
     
  8. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. function a($num){
    2.     while($num > 9){
    3.         $nums = str_split($num);
    4.         $num = array_reduce($nums, function($a,$b){return $a*$b;}, 1);
    5.     }
    6.     return $num;
    7. }
    8. function b($str){
    9.     $sorter = [];
    10.     foreach(explode(" ",$str) as $item){
    11.         $sorter[] = [$item,array_sum(str_split($item))];
    12.     }
    13.     usort($sorter, function($a,$b){
    14.         if($a[1] > $b[1])
    15.             return 1;
    16.         if($a[1] < $b[1])
    17.             return -1;
    18.  
    19.         return $a[0] <=> $b[0];
    20.     });
    21.     $result = [];
    22.     foreach($sorter as $item){
    23.         $result[] = $item[0];
    24.     }
    25.     return implode(" ",$result);
    26. }
     
    AlexandrS нравится это.
  9. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. function b($str){
    2.     $sorter = [];
    3.     foreach(explode(" ",$str) as $item){
    4.         $sorter[] = [$item,array_sum(str_split($item))];
    5.     }
    6.     usort($sorter, function($a,$b){
    7.         if($a[1] > $b[1])
    8.             return 1;
    9.         if($a[1] < $b[1])
    10.             return -1;
    11.  
    12.         return $a[0] <=> $b[0];
    13.     });
    14.     return array_reduce($sorter, function($a, $b){return $a.($a ? " " : "").$b[0];},"");
    15. }
     
  10. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Функция должна вернуть количество шагов, а не результат умножений.
    Там нужно добавить $count=0 и $count++.
     
    AlexandrS нравится это.
  11. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    Благодарю Вас за помощь, а про 2015 год расскажу как-нибудь - это длинная история
    --- Добавлено ---
    Благодарю за поддержку, буду стараться
    --- Добавлено ---
    Благодарю Вас за помощь!
     
  12. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    Благодарю за поддержку
     
  13. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Для благодарности, под каждым постом внизу, есть кнопка с большим пальцем ;)

    Вот без файлов:

    PHP:
    1. <?php
    2.  
    3. function calculation($number){
    4.  
    5.     if (is_array($number)) {
    6.  
    7.         $n =  $number[0];
    8.         $step = $number[1];
    9.  
    10.         $arrNum = str_split($n);
    11.  
    12.  
    13.         if (count($arrNum) != 1) {
    14.  
    15.             $step++;
    16.  
    17.             $newData = 1;
    18.  
    19.                 foreach ($arrNum as $value) {
    20.  
    21.                     $newData *= $value;
    22.  
    23.                 }
    24.  
    25.             $result = [$newData, $step];
    26.    
    27.             return calculation($result);
    28.  
    29.         }else{
    30.             return $step;
    31.         }
    32.  
    33.  
    34.     }else{
    35.  
    36.         return calculation([$number, 0]);
    37.  
    38.     }
    39.  
    40. }
    41.  
    42. echo calculation(39);
    43. echo "<BR>";
    44. echo calculation(777);
    45. echo "<BR>";
    46. echo calculation(5);
    47. echo "<BR>";
    48.  
    49.  
    50. ?>
    Это тоже самое, только оптимизировано:

    PHP:
    1. function calculation($number){
    2.     if (is_array($number)) {
    3.         $arrNum = str_split($number[0]);
    4.         $newData = 1;
    5.         if (count($arrNum) != $newData) {
    6.             $number[1]++;
    7.                 foreach ($arrNum as $value) {
    8.                     $newData *= $value;
    9.                 }
    10.             return calculation([$newData, $number[1]]);
    11.         }
    12.             return $number[1];
    13.     }
    14.     return calculation([$number, 0]);
    15. }
    Только к сожалению 15 строчек :) Ждем от mkramer 14 строчек и два цикла.

    Ждем решения от вас! ;)
     
    #13 AlexandrS, 12 май 2018
    Последнее редактирование: 12 май 2018
  14. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    А это самый короткий вариант основанный на:


    Короткое решение:

    PHP:
    1. <?php
    2.  
    3. function calculation($num){
    4.     $step = 0;
    5.     while($num > 9){
    6.         $nums = str_split($num);
    7.         $num = array_reduce($nums, function($a,$b){return $a*$b;}, 1);
    8.         $step++;
    9.     }
    10.     return $step;
    11. }
    12.  
    13.  
    14. echo calculation(39);
    15. echo "<BR>";
    16. echo calculation(777);
    17. echo "<BR>";
    18. echo calculation(5);
    19. echo "<BR>";
    20.  
    21. ?>
    Я не знал о функции array_reduce()
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    @AlexandrS, рекурсия - тоже треш конечно. Последний - норм, хотя я о array_reduce не вспомнил. Моё ночное творчество, раз уж все и так решение опубликовали:
    PHP:
    1. <?php
    2. function numOfMul($n) {
    3.     $c = 0;
    4.     while (strlen($n) > 1) {
    5.         $a = (string) $n;
    6.         $n = 1;
    7.         for ($i = 0; $i < strlen($a); $i++) {
    8.             $n *= $a[$i];
    9.         }
    10.         $c++;
    11.     }
    12.     return $c;
    13. }
    14. echo numOfMul(777);
    15. ?>
     
    AlexandrS нравится это.
  16. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Осталось теперь ТСу показать все варианты и сказать, что можно и так и сяк :) Типа выбирайте что вас устраивает. :D
     
  17. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    разбираюсь я, сАААмый первый вариант подходит, но приёмщик-работадатель не поверит мне, вот сижу и изучаю функции, учу наизусть код, мне сегодня не скучно
    --- Добавлено ---
    Благодарю Вас за внимание :):):)
     
  18. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    @Emilien
    PHP:
    1. function a($num, $cnt = 1){
    2.     while($num > 9 && $cnt++)
    3.         $num = array_reduce(str_split($num), function($a,$b){return $a*$b;}, 1);
    4.     return $cnt-1;
    5. }
    OK ?
    @mkramer много строк.
     
    Emilien и AlexandrS нравится это.
  19. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Посмотрев на возможные варианты кода по выполнению одной и той же задачи, как бы возникает мысль, что если сесть за переработку любого кода который был мной написан, можно сделать вывод, что примерно на треть его можно сократить :)
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    именно так
     
  21. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    классно, коротко и ясно ещё раз благодарю
    --- Добавлено ---
    Здравствуйте уважаемый! Взял Ваш вариант в оборот - я хотябы могу объяснить , что там и куда. До остальных вариантов нужно расти
     
  22. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    почему бы не сделать это сейчас?
     
  23. Hfibl

    Hfibl Активный пользователь

    С нами с:
    23 сен 2015
    Сообщения:
    16
    Симпатии:
    0
    в данный момент я этим и занимаюсь - изучаю функции представленные в исходниках данного топа
    --- Добавлено ---
    к тому же у меня есть вторая задача, которая тоже для меня важна
     
  24. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.599
    Симпатии:
    1.764
    Что можешь объяснить - хорошо. Что пришлось ждать чужого для такой элементарной задачи - плохо. Поэтому найди в нете ещё подобных задач, и сделай их сам, иначе это без толку всё.

    Вот тут много простых задач: http://www.itmathrepetitor.ru/zadachi-po-php/, вот тут: http://php720.com/tasks (только будь мужиком, не подсматривай ответы), можно и ещё найти чего-нибудь. Потому что, когда ты начнёшь работать, ты не сможешь с каждой проблемкой на форум бегать и ждать по два дня ответов
     
    AlexandrS нравится это.