自从我上次写一些lolcode以来已经有一段时间了,所以我觉得像处理Euler项目#1。我们得到3、5、6和9。这些倍数的总和是23。

找到1000以下的3或5的所有倍数之和。


这是我编写的解决此问题的代码/脚本:

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 !!! />




用PROJEK LOLLER击倒!在“简易”陷阱中?是否有办法将所有条件合而为一并编写较短的脚本?还是这种算法不好/效率低?

#1 楼

相同的人,相同的语言,相同的批评?您的名字自上次以来就变得更好了。Cheez和Burgr并不是最好的,但是考虑到它们的内容是任意设置的,因此在一定程度上毫无根据。他们确实站稳了脚。
有一件事:不需要您的Cheezburgers。
如果您提早返回,首先检查最大除数会浪费计算能力(我记得rolfl在一次我无法找到的嘶嘶声评论中对此有一些不错的统计。)我们可以完全从您的代码中删除该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。
后者比较容易,但仅供参考:还有一个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


评论


\ $ \ begingroup \ $
对此表示严重同意。所有语言关键字都是SHOUTCASE,变量不应该是。
\ $ \ endgroup \ $
–RubberDuck
2015年2月2日在16:26

\ $ \ begingroup \ $
这方面就像SQL。
\ $ \ endgroup \ $
– Pimgd
2015年2月2日在16:27

\ $ \ begingroup \ $
我个人不同意,lolcats通常都在SHOUTCASE中。当然,小写变量的可读性更好,但这不是lolcode的重点。
\ $ \ endgroup \ $
–尼克·乌德尔(Nick Udell)
15年6月16日在12:00

\ $ \ begingroup \ $
对于生产源代码,可以。对于深奥的编程语言,不可以。重点是实验性的,有趣的或与深奥的语言有所不同,并不一定意味着它应该可读。毕竟,空白的可读性基本上为零。
\ $ \ endgroup \ $
–尼克·乌德尔(Nick Udell)
15年6月16日在12:44

\ $ \ begingroup \ $
该答案是“ 2015年最佳代码评论”(Losts of Laughs)类别的获得者。恭喜你!
\ $ \ endgroup \ $
– 200_success
16年1月16日,0:49

#2 楼

恕我直言,您选择了错误的算法。

最好采用极限...

整数除以\ $ 3 \ $ ... \ $(999 \ \ mathbf {div} \ 3 = 333)\ $。

然后(该数字为2加上自身的幂)除以\ $ 2 \ $。然后乘以我们最初将其除以的值。

所以\ $((((333 * 333)+ 333)/ 2)* 3 \ $。

那就是\ $ 166833 \ $。

接下来,对\ $ 5 \ $做同样的事情。

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

将它们加在一起,我们得到\ $ 266333 \ $。

但是我们计算了\ $ 15 \ $,\ $ 30 \ $等加倍!

对\ $ 15 \ $做同样的事情,然后取走!

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

\ $ 266333-33165 = 233168 \ $。


之所以起作用,是因为它做到了:在通往\ $ 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.做同样的事情。 。] \ $我们算出了两倍!