第一个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


评论

只有在这里我们才认真对待LOLCODE ...

最好的LOLCODE

@RubberDuck PPCG也是。 :P

@Riker * CGCC现在

#1 楼

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
}


基本上,您所做的内容有些奇怪。

让我们清理一下。好吧,我们不需要双重休息。 Fibo1 == NumFibo2 == Num以确定它是否是斐波那契数)。删除不需要的检查。

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
}


并转换回LOLCODE。 !

缩进

我还是不喜欢缩进。一条if语句需要三行?
将它们组合起来:

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
    }
}


但是基本上我们又有了大括号样式的参数;

LOLCODE内部工作方式

我将自己弄糊涂了几次。

例如,您进行了一次BOTH SAEM Fibo2 AN BIGGR OF Num AN Fibo2检查,但这就是规范所说的内容:那么,您要使用的版本是什么呢?

好,如果我们将它分成两个语句...

你需要。它基本上检查“ Fibo2和Num中的较小者”是否是“ Fibo2”。

#2 楼

关注点分离
我喜欢提取ProovFibo ...,但是我发现它做的太多了:我本来希望有一个返回布尔值的函数(Troof),但没有执行其他操作。该信息全部用于自身,并负责还输出结果。
可读性/命名
您正在声明一个Num变量,并且ProovFibo过程使用一个Num参数...命名为Nums-当然,命名循环(AFAIK)非常依赖LOLCODE,而且很难,但是我更希望看到它命名为Sequence或其他名称。将参数名称复数只是感觉不对,而global-scope参数的名称与local-scope参数相同会使它有些混乱。

不是UPPIN YR {variable}的LOLCODE循环是本质上是一个while循环...但是您应该只循环到某个MaxNum,对吗? ...但是从未使用过MaxNum
前两个条件(Num vs. Fibo1和vs. Fibo2)似乎可以合并为一个条件。从未验证-用户输入LOL会发生什么?还是-200?该脚本愉快地将输入转换为数字-您完全将其留给语言实现来确定会发生什么……这不是很漂亮:程序仅因转换错误而崩溃。

评论


\ $ \ begingroup \ $
该参数必须绝对称为MebbeFibo或类似名称
\ $ \ endgroup \ $
– Ben Voigt
2015年2月2日在3:30



\ $ \ begingroup \ $
糟糕,当我将MaxNum限制为小于50的值并手动检查时,该值是从后退的。永远不会使用该值。
\ $ \ endgroup \ $
–user34073
2015年2月2日,下午4:30