Yэs!
  • Email
  • Facebook
  • Google
  • Linkedin
  • Twitter
  • Rss
  • Главная
  • Работа
  • Портфолио
  • Личное
  • Контакты

Взлом мозга

Posted on 23.01.2012 by Andrey Ovcharov in Работа 13 Comments

Для программистов.

Набрел тут на задачки по программированию на сайте Interviewstreet, и уже два часа зависаю над одной из самых простых, за которую дают всего 25 очков.

Все просто. Счастливым числом назовем такое, у которого сумма цифр и сумма квадратов цифр будут простыми. Нужно посчитать количество счастливых цифр в некоем диапазоне. Решение пишется на коленке ну, скажем, минут за 20.

Запускаем… Программа падает на втором тесте из девяти — превышен лимит времени выполнения.

Смотрим условие. Тесты могут быть весьма объемистыми — до 10000 диапазонов в одном тесте и числа до 1018, нужна оптимизация. И сижу я уже почти два часа, пытаясь сделать эту элементарную, в общем-то, задачу.

Ок, максимальное число, которое будем проверять, простое оно или нет — 1458, можно по таблице. Сумму цифр и сумму квадратов цифр можно менять нехитрым инкрементальным алгоритмом. Но дальше-то оптимизировать уже совсем некуда! Числа в диапазоне все равно нужно перебирать циклом, как ни крутись…

Up: Сделал у себя нагрузочный тест. Первоначальный вариант выполняется 51 секунду, теперешний — 4.5 секунды.

13 comments on “Взлом мозга”

  1. shaggy:
    23.01.2012 в 08:45

    а почему превышен лимит-то? тут же простая переборка с двумя условиями и двумя инками!?

    Ответить
    • Andrey Ovcharov:
      23.01.2012 в 09:37

      Самому жутко интересно.

      Ответить
      • shaggy:
        23.01.2012 в 09:47

        может ты список чисел хранишь, а не только их количество?

        Ответить
        • Andrey Ovcharov:
          23.01.2012 в 09:51

          Нет, конечно

          Ответить
        • shaggy:
          23.01.2012 в 09:52

          может код покажешь? там три строки должно быть же.

          Ответить
          • Andrey Ovcharov:
            23.01.2012 в 09:56

            		// run test
            		for(c = b - 1; c >= a; c--)
            		{
            			k = &d[0];
            			while(true)
            			{			
            				(*k)--;
            				if(*k >= 0)
            				{
            					// 
            					sd--; // sum of digits is decremented by one
            					sq -= tsq[*k]; // sum of squares is decremented by magic value						
            					// do not decrement other digits
            					break;
            				}
            				else 
            				{
            					// decrement next digit
            					*k = 9;
            					k++;
            					//
            					sd += 9; // sum of digits is incremented by 9
            					sq += 81; // sum of squares is incremented by 81
            				}
            			}
            		
            			if(prime_grid[sd] && prime_grid[sq]) 
            				cnt++;
            		}
            

            Массив d — это число по разрядам

            Ответить
            • shaggy:
              23.01.2012 в 13:02

              честно говоря не могу определить что за си-образный язык, поэтому tsq[*k] не понял, видимо поэтому не очень понятно причём тут разряды, и зачем под них массив.

              Ответить
              • shaggy:
                23.01.2012 в 14:14

                если я правильно всё расшифровал — ты надеешься, что он прям вот так вот массивами и будет проверять, а затем массивы будет сравнивать.

                Я уже сто лет не порграммил серьёзно, поэтому судить не буду критично, но не легче ли линейным перебором сделать, чтобы — сейчас числодробилки работают быстрее, поэтому возможно, что сделать наглядно деление массива будет быстрее, чем командой . ну так — имхо.

                Ответить
                • Andrey Ovcharov:
                  23.01.2012 в 14:46

                  Это С++.

                  Линейный перебор работает дольше, я проверял.

                  Ответить
                  • shaggy:
                    23.01.2012 в 14:52

                    давно не брал я в руки шашек/шку!

                    ну хоть не подвисает. ;)

                    Ответить
  2. Leonid Sopov:
    27.01.2012 в 23:34

    я думаю тут надо не перебором, а как минимум предсказывать размер чанки (у тебя цикл за базывым действием заткнётся).

    Я прошёлся по задачам и там есть несколько странное «K Difference» на 50 очков, там задача на 15 строк без оптимизации с первого раза отработала все тесты :)

    Спасибо за подборку, надо будет взять себе для кандидатов

    Ответить
    • Andrey Ovcharov:
      28.01.2012 в 10:10

      Да, я уже дошёл до этой мысли вручную расписав первую сотню :) Полное решение пока руки не дошли оформить.

      Подборка и правда, хорошая.

      Ответить
    • Andrey Ovcharov:
      13.02.2012 в 22:48

      Я не безнадежно тупой :) K-Difference я сделал с третьей попытки

      Ответить

Leave a Reply Cancel reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

photo of Andrey Ovcharov

+Andrey Ovcharov

andrew@ovcharov.me

Twitter

  • I'm at Почта 115533 (город Москва) http://t.co/PMqSvWdY
  • Имена четырёх всадников Апокалипсиса: Альфонс, Янычар, Гоша и Гнида.
  • О, стоило только подумать, что давно обновлений для мака не было, как оно тут как тут.

Поиск

Похожие записи

Нет связанных сообщений

Категории

  • Без категории (748)
  • Личное (90)
    • DIY (10)
    • Поездки (9)
  • Портфолио (1)
  • Работа (61)
    • Веб-разработка (1)
    • ЖСК и ЖКХ (26)
    • Решения (5)

Последние записи

  • Gordes
  • Mongolwool.com
  • Странная ошибка
  • Часы, продолжение
  • Часы, продолжение

Ссылки

  • Site Today - вебсайты быстро
  • Spectraweb - разработка сайтов
  • Маджонг

Контакты

  • andrew@ovcharov.me
  • spectraweb
    • Twitter
    • Facebook
    • Google
    • Linkedin

(c) 2012 Yэs!