Я HAZ FIBO, RLY

Первая программа LOLCODE, запустите здесь . Эта программа вводит номер Фибоначчи от пользователя, затем определяет и печатает, находится ли число в серии Фибоначчи. Как вы думаете?

HAI 1.2

    HOW IZ I GetNum

        VISIBLE "Entr yr numbr: "

        I HAS A WatzNum
        GIMMEH WatzNum

        FOUND YR WatzNum

    IF U SAY SO

    HOW IZ I ProovFibo YR Num

        I HAS A Fibo1 ITZ 1
        I HAS A Fibo2 ITZ 2

        IM IN YR Nums

            BOTH SAEM Num AN Fibo1, O RLY?
                YA RLY
                    VISIBLE "YEAH, FIBONACCI NUM!"
                    GTFO
                NO WAI
            OIC

            BOTH SAEM Num AN Fibo2, O RLY?
                YA RLY
                    VISIBLE "YEAH, FIBONACCI NUM!"
                    GTFO
                NO WAI
            OIC

            BOTH SAEM Fibo2 AN BIGGR OF Num AN Fibo2
            O RLY?
                YA RLY
                    DIFFRINT Num AN Fibo1, O RLY?
                        YA RLY
                            DIFFRINT Num AN Fibo2, O RLY?
                                YA RLY
                                    VISIBLE "BOO, IZ NO FIBONACCI NUM!"
                                    GTFO
                                NO WAI
                            OIC
                            GTFO
                        NO WAI
                    OIC
                NO WAI
            OIC

            Fibo1 R SUM OF Fibo1 AN Fibo2
            Fibo2 R SUM OF Fibo1 AN Fibo2

        IM OUTTA YR Nums

    IF U SAY SO

    I HAS A Num
    I HAS A MaxNum ITZ 50
    Num R I IZ GetNum MKAY
    Num IS NOW A NUMBR

    I IZ ProovFibo YR Num MKAY

KTHXBYE
61 голос | спросил Hosch250 2 FebruaryEurope/MoscowbMon, 02 Feb 2015 02:38:26 +0300000000amMon, 02 Feb 2015 02:38:26 +030015 2015, 02:38:26

2 ответа


45
BOTH SAEM Fibo2 AN BIGGR OF Num AN Fibo2
O RLY?
    YA RLY
        DIFFRINT Num AN Fibo1, O RLY?
            YA RLY
                DIFFRINT Num AN Fibo2, O RLY?
                    YA RLY
                        VISIBLE "BOO, IZ NO FIBONACCI NUM!"
                        GTFO
                    NO WAI
                OIC
                GTFO
            NO WAI
        OIC
    NO WAI
OIC

равен этому псевдокоду

if (Fibo2 >= max(Num, Fibo2))
{
    then
        if (Num != Fibo1) {
            then
                if (Num != Fibo2) {
                    then
                        print "BOO, IZ NO FIBONACCI NUM!"
                        break
                    else
                }
                break
            else
        }
    else
}

В принципе, то, что вы сделали, имеет некоторые странные биты.

Давайте очистим его.

if (Fibo2 >= max(Num, Fibo2))//weird check, replace with Fibo2 > Num instead
{
    then
        if (Num != Fibo1) {
            then
                if (Num != Fibo2) {
                    then
                        print "BOO, IZ NO FIBONACCI NUM!"
                        break
                    else//remove useless else
                }
                break
            else//remove useless else
        }
    else//remove useless else
}
if (Fibo2 > Num) {
then
    if (Num != Fibo1) { 
    then
        if (Num != Fibo2) { 
        then
            print "BOO, IZ NO FIBONACCI NUM!"
            break
        }
        break
    }
}

Да. Ну, нам не нужен двойной перерыв.

if (Fibo2 > Num) {
then
    if (Num != Fibo1) { 
    then
        if (Num != Fibo2) { 
        then
            print "BOO, IZ NO FIBONACCI NUM!"
        }
        break
    }
}

Ну, ни один из этих двух не может быть правдой из-за того, как работает ваш алгоритм (вы делаете чек на Fibo1 == Num и Fibo2 == Num) определить, является ли это число фибоначчи). Удалите ненужные проверки.

if (Fibo2 > Num) {
then
    print "BOO, IZ NO FIBONACCI NUM!"
    break
}

И переведите обратно в LOLCODE.

DIFFRINT Fibo2 AN SMALLR OF Fibo2 AN Num
O RLY?
YA RLY
    VISIBLE "BOO, IZ NO FIBONACCI NUM!"
    GTFO
OIC

Ну, это упрощенные вещи!

Отступ

Мне все еще не нравится отступ. Три строки для одного оператора if? Давайте объединим их:

DIFFRINT Fibo2 AN SMALLR OF Fibo2 AN Num
O RLY?, YA RLY
    VISIBLE "BOO, IZ NO FIBONACCI NUM!"
    GTFO
OIC

Это минимум, который я бы сделал. Еще короче будет:

DIFFRINT Fibo2 AN SMALLR OF Fibo2 AN Num, O RLY?, YA RLY
    VISIBLE "BOO, IZ NO FIBONACCI NUM!"
    GTFO
OIC

Но тогда у нас снова есть аргумент в стиле привязки; Поместите их на новую строку или на следующую?

Внутренние работы LOLCODE

Я путался себе пару раз во время написания этого ответа.

Например, у вас была проверка BOTH SAEM Fibo2 AN BIGGR OF Num AN Fibo2, но это то, о чем говорит спецификация:

BOTH SAEM <x> AN BIGGR OF <x> AN <y>   BTW x >= y
BOTH SAEM <x> AN SMALLR OF <x> AN <y>  BTW x <= y
DIFFRINT <x> AN SMALLR OF <x> AN <y>   BTW x > y
DIFFRINT <x> AN BIGGR OF <x> AN <y>    BTW x < y

И у вас есть BOTH SAEM <x> AN BIGGR OF <y> AN <x>. Итак, что будет делать ваша версия?

Хорошо, если мы разделим его на два утверждения ...

BIGGR OF <x> AN <y>   BTW Math.max(x, y)
SMALLR OF <x> AN <y>  BTW Math.min(x, y)
I HAZ A RESULT ITZ BIGGR OF <x> AN <y>  BTW RESULT = Math.max(x, y)
BOTH SAEM <x> AN RESULT  BTW x = Math.max(x, y)

Очевидно, что DIFFRINT Fibo2 AN SMALLR OF Fibo2 AN Num - это то, что вам нужно. Он в основном проверяет, «меньше ли Fibo2 и Num» «Fibo2».

ответил Pimgd 2 FebruaryEurope/MoscowbMon, 02 Feb 2015 11:35:00 +0300000000amMon, 02 Feb 2015 11:35:00 +030015 2015, 11:35:00
25

Разделение проблем

Мне нравится, что вы извлекли ProovFibo ... но я нахожу, что он делает слишком много вещей: я бы ожидал функцию, которая возвращает логическое значение (Troof)) и ничего не делает .., но ваша процедура сохраняет эту информацию для себя и берет на себя ответственность также за вывод результата.

читаемость /именование

Вы объявляете переменную Num, а процедура ProovFibo принимает параметр Num ... и цикл называется Nums - Конечно, циклы именования (AFAIK) очень специфичны для LOLCODE и трудно , но я бы предпочел увидеть его с именем Sequence или что-то еще; множественное имя аргумента просто кажется неправильным, а имя аргумента глобальной области - это то же самое, что и параметр локальной области видимости, что немного запутывает.

В то время как

Цикл LOLCODE, который не является UPPIN YR {variable}, по существу, представляет собой цикл while ... но вы должны только переходить к определенному MaxNum, правильно? ... но MaxNum никогда не используется!

Похоже, что первые два условия (Num vs. Fibo1 и vs. Fibo2) могут быть объединены в один.

Проверка ввода

Пользовательский ввод никогда не проверяется - что происходит, когда пользователь вводит LOL? Или -200? Сценарий счастливо вводит ввод в число - вы полностью уходите от него до языковой реализации, чтобы определить, что происходит ... и это некрасиво: программа просто вылетает с ошибкой приведения.

ответил Mathieu Guindon 2 FebruaryEurope/MoscowbMon, 02 Feb 2015 04:47:14 +0300000000amMon, 02 Feb 2015 04:47:14 +030015 2015, 04:47:14

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

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

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