За последние 24 часа нас посетили 22703 программиста и 1265 роботов. Сейчас ищут 778 программистов ...

[задачка] Анаграммы

Тема в разделе "Прочие вопросы по PHP", создана пользователем artoodetoo, 21 дек 2020.

Метки:
  1. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Очередная задачка для наработки скиллов.

    Написать функцию подсчета количества цифровых анаграмм. На входе функции массив целых положительных чисел, на выходе число.

    Цифровой анаграммой будем считать такую пару чисел (x, y), где все цифры из x присуствуют в y и наоборот. Порядок цифр неважен. А вот повторы важны. 72 и 27 это пара, а 72 и 227 нет. Про незначащие нули в начале числа думать не надо.

    Так, например, в массиве
    Код (Text):
    1.  
    2. $a = [
    3.   0 => 25,
    4.   1 => 35,
    5.   2 => 872,
    6.   3 => 228,
    7.   4 => 53,
    8.   5 => 278,
    9.   6 => 872
    10. ];
    есть 4 анаграммы:
    (a[1], a[4]), (a[2], a[5]), (a[2], a[6]), (a[5], a[6])

    ещё пара примеров для самопроверки:
    [30, 72, 3, 227] → 0
    [1, 1, 1, 1, 1] → 10


    Надо оптимизировать функцию так, чтобы она могла работать с тысячами элементов за пару секунд.
    Файл из 10 тыс элементов во вложении.

    Update: давайте смотреть время выполнения на https://sandbox.onlinephpfunctions.com/ и PHP 7.4.13
     

    Вложения:

    • test-1000.zip
      Размер файла:
      30,9 КБ
      Просмотров:
      12
    #1 artoodetoo, 21 дек 2020
    Последнее редактирование: 22 дек 2020
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    Позвольте пару уточнений?
    1. Считать ли анограммой то же самое число? в условии не задано что x!=y
    2. Судя по примеру с [1, 1, 1, 1, 1] все-же само с собой - считается
    3. Но тогда неверный подсчет для самого первого примера $a.... там число анаграмм = 6 должно быть
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    1. нет. равное ему — да (ai, aj), но не то же самое (ai, ai).
    2. нет. попробуй с ручкой и бумажкой решить, прям номера позиций вписывай в пары, станет понятней. (a0, a1), (a0, a2),...
    3. нет. в описании нет противоречий. оно есть в твоем ошибочном предположении 1-2
    --- Добавлено ---
    можно только дополнить: если есть пара (ai, aj), то НЕ надо считать её дважды — как (ai, aj) и (aj, ai) ! считаем её как одну пару. скажем пусть будет i < j
     
    #3 artoodetoo, 21 дек 2020
    Последнее редактирование: 21 дек 2020
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    Для приведенного файла - 29116 ответ?
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    да. а время не замерял?
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    доли секунд .. .щас замерю

     
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    супер! пока не спойлери решение, дадим пару дней всем желающим попробовать.
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    угу, а какой-то практический смысл имеет задача, ну - куда применить ее можно?
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    время то скажи )
    это с сайта сертификации. смысл в проверке умений.
    --- Добавлено ---
    если щелкаешь такие задачи, то и тест на собесе пройдёшь.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    в том же сообщении ж вставил как цитату... посмотри
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    это фантастика. я прям в нетерпении увидеть код.
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Time: 0.0088839530944824
    29116
    --- Добавлено ---
    Но это в онлайн сэндбоксе. Локально мб будет быстрее, но лень ребутиться на линь. Ну и сложность 2n получается. Мб, если посидеть, можно сделать и n.
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    10 тыс вроде
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    спс, поправил
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Да, локально тоже ~0.0055s получается
     
  16. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Код (Text):
    1. |                 Load file |   0.000166 |
    2. |               Json decode |   0.002175 |
    3. |                Logic done |   0.009832 |
    4. int(29116)
    :(
     
  17. amberson

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

    С нами с:
    23 июл 2020
    Сообщения:
    62
    Симпатии:
    14
    время 0.0041060447692871
    всего 29116

    запуск из консоли:
    время 0.0039710998535156
    всего 29116
     
    #17 amberson, 21 дек 2020
    Последнее редактирование: 21 дек 2020
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Тоже самое. Думаю, как выжать немного на спичках))
     
  19. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    29116
    Текущая версия PHP: 5.3.29
    Время выполнения скрипта: 0.087004899978638 sec.
     
  20. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Дабы не смущать, https://sandbox.onlinephpfunctions.com/ выполнил так (php 7.4.13)
    29116
    0.0083651542663574

    Да, годнота наконец
     
  21. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    737
    Адрес:
    Татарстан
    это несерьезно...))) минимум 7ка
     
  22. amberson

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

    С нами с:
    23 июл 2020
    Сообщения:
    62
    Симпатии:
    14
    изменив алгоритм удалось выиграть еще пару песчинок

    время 0.0037391185760498
    всего 29116
     
  23. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Это на phponline ? Локальные замеры на своей тачке не интересны, мы все тут можем взять продовые серваки и выполнить за 0.0001 сек
     
  24. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    В конечном счёте надо прогнать все варианты на одной машине, конечно, чтобы было сравнимо.
    https://sandbox.onlinephpfunctions.com/ хороший вариант

    Давайте до утра 23 декабря подождем и будем показывать код.
    --- Добавлено ---
    Замерять надо время выполнения функции, никакие дополнительные шаги роли не играют. Временем исполнения echo можно пренебречь :D

    PHP:
    1. $time = microtime(true);
    2. echo anagrams($a)."\n";
    3. printf("%.9f\n", microtime(true) - $time);
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну...оч смешной "оптимизацией" сбил время в сендбоксе до 0.0072 в среднем. Но, сдается мне, там ужиматься уже физически некуда. Быстрее только вынесение в расширение на сях, имхо. В любом случае, рубеж в "пару секунд" очень далеко за горизонтом.

    Код на 90% такой же как у Миши. И, скорее всего, у всех +- тот же самый принцип, судя по времени исполнения.
     
    #25 Fell-x27, 22 дек 2020
    Последнее редактирование: 22 дек 2020