Проект LOL'ing-Up Euler One

Прошло некоторое время с тех пор, как я в последний раз написал несколько , поэтому мне захотелось решить Project Euler # 1 .

  

Если мы перечислим все натуральные числа ниже 10, кратные 3 или 5, получим 3, 5, 6 и 9. Сумма этих кратных значений равна 23.

     

Найдите сумму всех кратных 3 или 5 ниже 1000.

Это код /​​сценарий, который я написал, чтобы решить эту проблему:

HAI 1.2
    VISIBLE "HAI, PROJEK LOLLER ONE!!"

    I HAS A LIMIT ITZ 1000
    I HAS A TOTAL ITZ 0
    I HAS A CHEEZ ITZ 3
    I HAS A BURGER ITZ 5
    I HAS A CHEEZBURGER ITZ PRODUKT OF CHEEZ AN BURGER

    HOW IZ I ADDTOTAL YR VALUE
        I HAS A RESULT ITZ SUM OF VALUE AN TOTAL
        FOUND YR RESULT
    IF U SAY SO


    IM IN YR MIND UPPIN YR NUMBER TIL BOTH SAEM NUMBER AN LIMIT

        I HAS A PICKLE ITZ FAIL

        BOTH SAEM 0 AN MOD OF NUMBER AN CHEEZBURGER
        O RLY?, YA RLY
            PICKLE R WIN
        NO WAI
            BOTH SAEM 0 AN MOD OF NUMBER AN CHEEZ
            O RLY?, YA RLY
                PICKLE R WIN
            NO WAI
                BOTH SAEM 0 AN MOD OF NUMBER AN BURGER
                O RLY?, YA RLY
                    PICKLE R WIN
                OIC
            OIC
        OIC

        BOTH SAEM PICKLE AN WIN
        O RLY?, YA RLY
            TOTAL R I IZ ADDTOTAL YR NUMBER MKAY
        OIC

    IM OUTTA YR MIND

    VISIBLE SMOOSH "TEH ANSWER IZ " AN TOTAL MKAY
    VISIBLE "DOWN WITH PROJEK LOLLER ONE!"

KTHXBYE

Этот код может быть выполнен в CodingGround и выводит этот результат:

  

HAI, PROJEK LOLLER ONE !!

(Спойлер)

  

ОТЧЕТ ОБ ОТДЕЛЕНИИ ИЗ 233168

  

ВНИЗ С ПРОЕКТОМ LOLLER!

Является - подобная логика подходит, или я упал в «легкую» ловушку? Будет ли способ свернуть все условия в один и сделать более короткий сценарий? Или этот алгоритм плохой /неэффективный?

34 голоса | спросил Mathieu Guindon 2 FebruaryEurope/MoscowbMon, 02 Feb 2015 01:18:42 +0300000000amMon, 02 Feb 2015 01:18:42 +030015 2015, 01:18:42

2 ответа


24

Тот же парень, тот же язык, такая же критика?

Позвольте мне начать (снова), критикуя выбор вашей переменной корпуса SHOUTCASE
Очень сложно сказать, что такое переменная, а что нет: (

Но ваши имена улучшились с последнего раза. Чиз и Бургр не самые лучшие, но, учитывая их содержание, произвольно устанавливаются и, соответственно, несколько бессмысленны, они действительно стоят на своих местах.

Одна вещь: твои чезбургеры не нужны.

Это пустая трата вычислительной способности проверять дивизоры самой большой, если вы вернетесь раньше. (Напомню, что rolfl имеет неплохую статистику о том, что в одном обзоре fizz-buzz я не могу найти прямо сейчас). Мы можем полностью устранить этот O RLY? YA RLY из вашего кода.

О, и пока мы на чизбургерах ... Есть одна вещь, которую мне очень не нравятся на чизбургерах ... Соленые огурцы.

Временная переменная TROOF для удаления трех тэгов YA RLY, выполняющих то же самое, полностью переборщила. Вместо PICKLES R WIN было бы достаточно добавить текущий номер в общую сумму.

Код до сих пор:

IM IN YR Mind UPPIN YR Number TIL BOTH SAEM Number AN Limit   
    BOTH SAEM 0 AN MOD OF Number AN Cheez
    O RLY?, YA RLY
          Total R I IZ AddToTotal YR Number MKAY
    NO WAI
          BOTH SAEM 0 AN MOD OF Number AN Burger
          O RLY?, YA RLY
                Total R I IZ AddToTotal YR Number MKAY
          OIC
    OIC
IM OUTTA YR Mind

Теперь, что мы получили? похоже, что это должен быть либо ElseIf, либо просто простая комбинация условий в Or.

Последний является более простым, но для справки: есть else if. Это MEBBE

Окончательный код:

HAI 1.2
    VISIBLE "HAI, PROJEK LOLLER ONE!!"

    I HAS A Limit ITZ 1000
    I HAS A Total ITZ 0
    I HAS A Cheez ITZ 3
    I HAS A Burger ITZ 5

    HOW IZ I AddToTotal YR Value
        I HAS A Result ITZ SUM OF Value AN Total
        FOUND YR Result
    IF U SAY SO


    BTW Iterates from 0 to 999
    IM IN YR Mind UPPIN YR Number TIL BOTH SAEM Number AN Limit
        EITHER OF BOTH SAEM 0 MOD OF Number AN Cheez AN BOTH SAEM 0 MOD OF Number AN Burger
        O RLY?, YA RLY
             Total R I IZ AddToTotal YR Number MKAY
        OIC
    IM OUTTA YR Mind

    VISIBLE SMOOSH "TEH ANSWER IZ " AN Total MKAY
    VISIBLE "DOWN WITH PROJEK LOLLER ONE!"

KTHXBYE
ответил Vogel612 2 FebruaryEurope/MoscowbMon, 02 Feb 2015 03:06:58 +0300000000amMon, 02 Feb 2015 03:06:58 +030015 2015, 03:06:58
13

ИМХО, вы выбрали неправильный алгоритм.

Лучше было бы взять предел ...

Целое число делит это на \ $ 3 \ $ ... \ $ (999 \ \ mathbf {div} \ 3 = 333) \ $.

Затем (это число до степени два плюс себя), деленное на \ $ 2 \ $. Затем умножает значение того, что мы изначально разделили на.

So \ $ (((333 * 333) + 333) /2) * 3 \ $.

Это \ $ 166833 \ $.

Затем сделаем то же самое для \ $ 5 \ $.

\ $ 999 \ \ mathbf {div} \ 5 = 200, (((199 * 199) + 199) /2) * 5 = 99500 \ $.

Добавьте их вместе, у нас есть \ $ 266333 \ $.

Но мы подсчитали числа, такие как \ $ 15 \ $, \ $ 30 \ $ и т. д. double!

Так сделайте то же самое для \ $ 15 \ $ и отпустите это!

\ $ 999/15 = 66, (((66 * 66) + 66) /2) * 15) = 33165 \ $.

\ $ 266333 - 33165 = 233168 \ $.


Причина этого в том, что он делает это:

Сначала мы берем кепку ... \ $ 999 \ $. На пути к \ $ 999 \ $ мы увидим числа \ $ 999 \ \ mathbf {div} \ 3 = 333 \ $, кратные 3. И каждый из них на 3 больше, чем тот, который предшествует ему. Итак, что мы тогда делаем, возьмем целую серию \ $ [1, 2, 3 ... 333] \ $ и сопоставим их противоположно так:

1 + 332 = 333
2 + 331 = 333
3 + 330 = 333

И дальше и дальше.

Это лучше всего выражается через \ $ ((x * x) /2) \ $.

Или, скорее, это фактически \ $ (x /2) \ $ (число пар) \ $ * x \ $ (значение каждой пары).

Затем мы добавляем \ $ x \ $ вручную. Это связано с тем, что \ $ 333 \ $ не нужно спаривать.

Итак, тогда мы имеем значение множества \ $ [1, 2, 3 ... 333] \ $. Но у нас были \ $ [3, 6, 9, 12 ... 999] \ $. Итак, мы делаем всю игру * 3.

Мы делаем то же самое для 5.

Но тогда мы получаем проблему с \ $ [15, 30, 45 ...] \ $ мы посчитали эти двойные!

Итак, тогда мы делаем то же самое для 15, но вычтем его из общей суммы \ $ (3 + 5) \ $.

ответил Pimgd 2 FebruaryEurope/MoscowbMon, 02 Feb 2015 19:03:18 +0300000000pmMon, 02 Feb 2015 19:03:18 +030015 2015, 19:03:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132