正在载入…永远


106

您的挑战是制作一个无限的加载屏幕,如下所示:

在此处输入图片说明


或者,更具体地说:

  • 不输入任何内容。
  • 输出Loading...,带有尾随空格,但没有尾随换行符。
  • 通过字符无限循环|/-\:每0.25秒,覆盖最后一个与序列中的下一个。您可以只覆盖最后一个字符,或者删除并重写整行,只要Loading...保持不变即可。

规则

  • 输出文本必须与指定的外观完全相同。尾随换行符/空格是可以接受的。
  • 应该最初显示输出之前等待0.25秒-第一帧应当被尽快程序运行打印。
  • 您的程序应该可以无限期地运行。例如,如果您将计数器用于帧,则计数器绝不能超过您所用语言的最大值而不会导致错误。
  • 尽管每个“帧”之间的等待时间应该为0.25秒,但显然这永远都不是精确的-允许10%左右的误差范围。
  • 您可以提交功能,但必须将其打印到stdout
  • 您可以在非控制台(但仍基于文本)的环境中提交答案,只要它能够生成加载动画即可。
  • 这是,因此最短的解决方案(以字节为单位)获胜。适用标准代码高尔夫球漏洞。
  • 如有可能,请提供您正在使用的加载屏幕的gif。

这是我用来创建示例(unolfed)的C ++代码:

#include <iostream>
#include <string>
#include <thread>

using namespace std;

int main() {
    string cycle = "|/-\\";
    int i = 0;

    cout << "Loading... ";

    while (true) {
        // Print current character
        cout << cycle[i];

        // Sleep for 0.25 seconds
        this_thread::sleep_for(chrono::milliseconds(250));

        // Delete last character, then increase counter.
        cout << "\b";
        i = ++i % 4;
    }
}

愿最好的高尔夫球手获胜!


3
提交可以在最初显示输出之前等待0.25秒吗?
ETHproductions 2016年

2
不,但是感谢您提及,我将其添加到规则@ETHproductions
FlipTack

尾随换行符(动画符号后)是否可以接受?

当然:) @Copper
FlipTack

1
@TheBitByte表示,从理论上讲,程序内部没有任何东西会导致它出错-例如计数器溢出或达到最大递归深度。
FlipTack

Answers:


76

HTML / CSS,183 180 163 161 160个 147 143字节

a{display:inline-flex;overflow:hidden;width:1ch}c{animation:c 1s steps(4)infinite}@keyframes c{to{margin:0-4ch
<pre>Loading... <a><c>|/-\</pre>

编辑:由于@betseg,节省了3个字节。@manatwork节省了17个字节。感谢@Daniel,节省了1个字节。@Ismael Miguel节省了13个字节。@Fez Vrasta节省了4个字节。


4
根据meta的说法,CSS + HTML非常适合回答问题。此外,我在挑战说明中允许这样做。因此,此答案完全正确:)
FlipTack

5
HTML + CSS是TC,所以我不明白为什么它可能不具有竞争性
TuxCrafting,2016年

1
@TùxCräftîñgCSS绝对不完善,因为您可以解决其中的暂停问题(如果没有无限的动画,它将暂停)。我认为HTML同样适用(如果您不包括JS)。
Artyer

4
@Artyer stackoverflow.com/a/5239256/3273184是值得考虑的东西。
Mama Fun

4
@MamaFunRoll在该帖子上的评论提到这并不能真正证明它是TC,因为在没有用户干预的情况下它无法循环播放。但是,它可以解决这一特殊挑战,因此我认为此答案没有任何问题。
ETHproductions 2016年

57

Vim,43,41字节

qqSLoading... |<esc>:sl250m
r/@:r-@:r\@:@qq@q

感谢@Udioica,节省了两个字节!

这是它的实时动画(有点过时)!

在此处输入图片说明

这里是一个解释:

qq                              " Start recording into register 'q'
  SLoading... |<esc>            " Replace all of the text in the buffer with 'Loading... |'
                    :sl250m     " Sleep for 250 ms
r/                              " Replace the bar with a slash
  @:                            " Re-run the last ex command (sleeping)
    r-                          " Replace the slash with a dash
      @:                        " Re-run the last ex command (sleeping)
        r\                      " Replace the dash with a backslash
          @:                    " Re-run the last ex command (sleeping)
            @q                  " Run macro 'q' (the one we're recording)
              q                 " Stop recording
               @q               " Call macro 'q', which will run forever because it's recursive

1
只是古玩:它违反了“您的程序应该可以无限期运行”的规定吗?最终能否达到堆栈溢出?:)
Dan Oak

4
@dahnoak好吧,显然我无法无限地对其进行测试,但是它不会分配任何额外的内存,因此我看不到有任何理由无法无限期地工作。
DJMcMayhem

1
如果切换iS宏并将其移动到宏中,则可以跳过r|
udioica '16

2
@dahnoak vi引擎没有理由不注意到尾部递归。递归的某些实现自然会这样做(想象一下,如果有一个要执行的命令向量和一个当前执行位置,然后@q将当前位置插入寄存器脚本的内容q。不需要堆栈,也不需要内存分配,除非有运行命令 @qq)。
Yakk

几乎每次您发布挑战答案时,我都会学到新的东西(在本例中是@::sl),所以,谢谢并让他们继续前进:)
Christian Rondeau

37

HTML + JS(ES6),20 + 51 50 = 70字节

setInterval(_=>a.innerHTML='|/-\\'[i=-~i%4],i=250)
Loading... <a id=a>-

-1字节(Zachary T)

还要查看我的132字节HTML / CSS答案


可能溢出i吗?
扎卡里

是的,最终会的。解决了!
darrylyeo '16

1
你可以取代i++,i%=4i=-~i%4一个字节?
扎卡里

2
@Xufox <pre>唯一确保使用的是等宽字体,这样ch单位才能工作。规则没有提及所使用的字体系列。;)
darrylyeo's

1
如果我没有记错的话,那么JS打印的第一个字符将是字符串中的最后一个字符。因此,您应该使用-而不是进行初始化/。或用初始化|并循环遍历'-\\|/'。不错的增量。
泰特斯(Titus)

21

Windows Batch, 121 114 84 80 79 78字节

只是为了娱乐而扔掉它。

for %%b in (/ - \ ^|)do (cls
@echo Loading... %%b
ping 1.1 -n 1 -w 250>nul)
%0

我无法将管道(|)分配到数组中,因此必须使用其他分配手动添加它。延迟已完成PING可能不准确

输出:

在此处输入图片说明

编辑:

  • 感谢RomanGräf节省了7个字节!
  • 感谢尼尔节省了30个字节!我还修改了一点以节省换行符上的字节。
  • 感谢phyrfox节省了4个字节!
  • 感谢YourDeathIsComing节省了2个字节!

3
您可以删除每个命令或命令的前面,@echo off并将其@放在前面setecho
RomanGräf16年

1
您不需要数组,in (/ - \ ^|)可以正常工作。此外,%0是比循环更短的方法goto
尼尔

2
您应该能够使用IP地址“ 1.1”(-4字节),因为大多数平台都会为您自动将其扩展为1.0.0.1。
phyrfox

1
您可以通过删除前面的空格来节省1个字节>nul
YourDeathIsComing

1
我的意思是它前面的空间,而不是后面的空间。
YourDeathIsComing

20

节点,72 70字节

f=i=>console.log('\x1BcLoading... '+'|/-\\'[setTimeout(f,250,i=-~i%4),i])

替换\x1B为原义转义字符以获取正确的字节数。调用f()以开始动画。这是我计算机上的ConEmu终端模拟器中的外观:

在此处输入图片说明


尝试使用\033c\033用其实际的char表示形式代替)。它看起来不太好,但是可以为您节省一些字节。
Mama Fun Roll

不会i溢出吗?
扎卡里

12
@ZacharyT这将在7100万年之后,但是我可以在必要的情况下解决
ETHproductions 2016年

3
“您的程序应该可以无限期地运行。例如,如果您将计数器用于帧,则计数器不应超过您所用语言的最大值而不会导致错误。”
扎卡里

3
@Florent但它不会在Node上运行;-)
ETHproductions'December 1'16

14

Kotlin,67 66字节

while(1>0)"|/-\\".map{print("\rLoading... $it");Thread.sleep(250)}

在此处输入图片说明

完全可以自我解释,\r用于清理线条并利用Kotlin出色的字符串插值功能。

编辑:通过更改while(true)为@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu,节省了1个字节while(1>0)


1
您可以使用while(1>0)而不是while(true)(-1)节省一个字节,并且可能在答案中包含实际的函数语法(fun a(){<code>},+9)。如果您想作弊,可以使用将函数存储为变量(val a={<code>},+8)。
F. George

2
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu是否接受“完整程序”模式?可以将其作为Kotlin脚本运行,.kts而无需定义类或函数。此外,与while(1>0)
泰勒·麦克唐纳

3
但是,如果有一天0大于1怎么办?:P
FlipTack

使用Kotlin脚本的好主意。@ Flp.Tkc您的评论使我想起了:codegolf.stackexchange.com/a/101131/62024。仍然对此感到震惊。
F. George

@TylerMacDonell真的吗?我不知道您可以直接将kotlin作为脚本运行。谢谢(你的)信息。
TheNumberOne

14

Vim,35个字节

iLoading... \-/|<Esc>qqdb:sl250m<CR>p@qq@q

无聊的版本。这是一个更好的非遵从解决方案:

Vim(1秒睡眠),27字节

idbgsp@@<C-U>Loading... \-/|<Esc>@.

使用gs不仅会缩短很多时间,而且您不必按Enter键。这意味着该宏可以直接插入,并且可以通过切换到来保存字节@.。(由于递归调用之后什么也无法运行,因此我可以键入任何想要的内容。)


感谢您的回答!我了解到gs@.@@@.还是让我的脑袋疼!
克里斯蒂安·隆多

14

Pyth,31个字节

Wm,p+"\rLoading... "d.d.25"|/-\

口译在这里

载入GIF

说明

Wm,p+"\rLoading... "d.d.25"|/-\
    +"\rLoading... "d              Concatenate the string "\rLoading... " and the variable d
   p                               Print the result without a newline
                     .d.25         Sleep for 0.25 seconds
  ,                                Form a two-element list with the results of the two statements above. This is only needed to execute both statements in a single lambda function.
 m                        "|/-\    Map the above statement over the characters in the string "|/-\", setting the variable d to the character for each iteration
W                                  While the result of the map statement is true, do nothing

13

Powershell(v4),57 56 54 53 58 57字节

回到我开始的字节数!

for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}

在某些计算机上,powershell中的CLI可能会出现一点故障,因此它看起来并不完美,但我可以尽其所能。

将$ a ++移至for循环以保存一个字节,(否;

然后将其移到数组索引器中,以节省另外2个字节,这要感谢Roman指出了这一点。

;通过将“清除屏幕”(cls)部分移到for循环中,还节省了1个字节()。

TimmyD针对问题的无限方面指出的问题和解决方案,只需将+5字节更改$a++%4为,($a=++$a%4)因此它将永远不会超过3。

感谢'whatever'指出在Powershell版本4中这实际上是可能的,从而使for循环完全空白,从而节省了另一个字节!

此答案(最终版本)的新更新的gif 。

载入Gif

for(;;cls){"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}

for(;;cls){"Loading... "+"|/-\"[$a++%4];sleep -m 250}

for(;;){"Loading... "+"|/-\"[$a++%4];sleep -m 250;cls}

for(;;$a++){"Loading... "+"|/-\"[$a%4];sleep -m 250;cls}

for(;;){$a++;"Loading... "+"|/-\"[$a%4];sleep -m 250;cls}


2
for(;;){"Loading... "+"|/-\"[$a++%4];sleep -m 250;cls}(将移至的$a++最后使用$a
RomanGräf16年

总是忘记一些东西-谢谢!
colsw

2
我对Powershell不太熟练,但是当我看到Windows Batch条目时,我以为“ Powershell可以胜过吗?”。在这里!
Jakub Jankowski

1
至少在ps v4上,您应该可以通过将for条件完全为空来打另外一个字节:for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}
不论

1
别客气。它实际上似乎适用于版本2 +,只是太懒了而无法检查;)
不管什么

11

Pyth- 36 35字节

#+"\033cLoading... "@"\|/-"~hZ.d.25

很明显,该功能无法在线使用。


您有这样的效果吗?另外,是否有任何计数器可能溢出?
FlipTack

@ Flp.Tkc唯一的计数器是Z一个Python整数,不会溢出。我试图制作一个gif,但无法正常工作。如果您知道制作方法,则可以使用pyth解释器在github.com/isaacg1/pyth上
57

4
如果整数没有溢出,那么它可能会一直增长直到填满所有内存,这将使其在大多数32位系统上至少在10年后失效。当然,宇宙的热死会首先发生,但仍然会...
jjrv

11

Matlab,78 75字节

a='\|/-';while 1;clc;disp(['Loading... ',a(1)]);a=a([2:4,1]);pause(1/4);end

在此处输入图片说明


11

HTML / CSS,23 + 109 = 132字节

改善了尼尔的回答

pre{display:flex}a{overflow:hidden;animation:a 1s steps(4)infinite;width:1ch}@keyframes a{to{text-indent:-4ch
<pre>Loading... <a>|/-\


9

Mathematica,74 67字节

ListAnimate["Loading... "<>#&/@{"|","/","-","\\"},AnimationRate->4]

多亏了@dahnoak,可节省多达7个字节


ListAnimate["Loading... "<>#&/@Characters@"|/-\\",AnimationRate->4]
丹·奥克

1
@dahnoak干杯!我没有意识到ListAnimate是一回事。很可惜,<>它不是Flat,不是Listable,否则可能会减少4个字节!
西蒙斯(Simmons),2016年

只是为了好玩:Dynamic["Loading... "<>{"|","/","-","\\"}[[1+Round[4Now@"Second"]~Mod~4]],UpdateInterval->.25]
shrx

9

C#,170个 133字节

void X(){Console.Write("Loading...  ");for(;;){foreach(var c in "|/-\\"){Console.Write("\b"+c);System.Threading.Thread.Sleep(250);}}}

非常感谢RomanGräf和raznagul,他们为我节省了37个字节。(尤其是raznagul,他指出,我的原始解决方案无论如何都是无效的。我有点错过了那里的内容,但现在已修复,应该可以满足要求:)

与Pete Arden现有的C#答案非常相似,但有一些改进

例如,“ for(;;)”代替“ while(true)”,用char代替字符串

我会对他的回答发表意见,但实际上我没有足够的声誉来做到这一点。

取消高尔夫:

static void X()
{
    Console.Write("Loading...  ");
    for (;;)
    {
        foreach (var c in "|/-\\")
        {
            Console.Write("\b" + c);
            System.Threading.Thread.Sleep(250);
        }
    }
}

2
为什么不删除第一个Console.Write("\b");并将第二个更改为Console.Write("\b"+a);
罗曼·格拉夫(RomanGräf),

定义一个动作是不必要的,并且长时间使用循环(例如)foreach(var a in"|/-\\")并添加您当前在该动作中拥有的代码,因为主体可以节省约20个字节。
raznagul

另外,任务是准确地创建所需的输出。目前情况并非如此。
raznagul

现在应该是这样,我忘记了“ |” 以及“正在加载...”之后的尾随空格。
Snowfire '16

在您的非高尔夫版本中(因为它与高尔夫版本不匹配),您可以删除第Console.Write()一个,Console.Write($"Loading... {c}\r")而仅使用一个而不是第二个。
牛奶

9

向前, 72,73字节

编辑

  • 添加了仅Gforth版本的69字节(感谢@ninjalj!)
  • 在“正在加载...”(Thx @RomanGräf!)之后添加了缺失的空格,+ 1字节
  • 更新以更精确地匹配规则(在相同字节数中)

打高尔夫球

: L '| '/ '- '\ begin .\" \rLoading... " 3 roll dup emit 250 ms again ; L

Gforth版本

GNU仅Forth版本可以减少到69个字节,如下所示:

'| '/ '- '\ [begin] .\" \rLoading... " 3 roll dup emit 250 ms [again]

截屏

在此处输入图片说明

在线尝试!


1
由于您使用gforth,如果你不关心移植到其它Forth的,你可以用[begin][again]一个词定义之外。
ninjalj

9

Python 2,81 79 78 77字节

import time
i=1
while 1:print'\rLoading...','\|/-'[i%4],;i+=1;time.sleep(.25)

相当简单的解决方案,它使用休眠time

我使用\r(回车)返回到行的开头,然后打印覆盖行的消息。

我首先i=1要避免两次转义\'\|/-'而不是'|/-\\')。

在过去,我曾使用过-~i的意思i + 1,以避免括号。(感谢@ Flp.Tkc提供了这-2个字节!)(以前是i=(i+1)%4vs。i=-~i%4

现在,我只是让计数器永远增加,因为从技术上讲Python int不会溢出。感谢@Zachary T指出这一点并节省了一个字节!
它仅在计算机上停止,因为计算机内存不足,但这需要9.7代,而该计算机需要4GB的内存int

感谢@Kade提供的-1个字节,其中print a,b打印ab空格是分开的,因此我不需要自己的空格。

这是在Windows上运行的gif图像:

载入中

我也在Linux VM上进行了测试。我无法在Mac上进行测试。


1
如果我没记错的话,您可以i=-~i%4用来保存括号中的字节:)
FlipTack

2
不会用保存一个字节代替[i],;i=-~i%4[i%4],;i+=1因为它没有超过Python的最大值,只有最大内存吗?
扎卡里

9
我应该拒绝您以Administrator... 身份登录
Neil

5
@Neil坦白说,我只是将Python文件放在Administrator中,然后从那里运行它,因为其他帐户名是真实姓名(个人PC)。
Artyer

2
我允许@ZacharyT的建议,因为从技术上讲,Python整数可以无限大,只要计算机具有容纳它们的内存即可
FlipTack

7

MATL,36字节

使用@flawr循环移动字符串的想法删除了1个字节

'\-/|'`Xx1YS'Loading... 'y1)hD.25Y.T

这是离线编译器的gif记录:

在此处输入图片说明

或在MATL Online上尝试如果最初没有运行,请刷新页面,然后再次按“运行”。

这个怎么运作

'\-/|'           % Push this string
`                % Do...while
  Xx             %   Clear screen
  1YS            %   Circularly shift thr string 1 step to the right
  'Loading... '  %   Push this string
  y              %   Duplicate the string of shifting symbols
  1)             %   Get the first character
  hD             %   Concatenate the two strings and display
  .25Y.          %   Pause for 0.25 seconds
  T              %   Push "true". This is used as loop condition, to it
                 %   generates an infinite loop
                 % End loop implicitly

嘿路易斯。一如既往地使用MATL做得很好。这是通报清单的略微变化。和显示。您认为您可以将其转化为更短的解决方案吗?a='\|/-';k=1; fprintf('Loading... -') while 1 k=mod(k,4)+1; fprintf('\b\b%c\n',a(k)); pause(.25); end
Hoki 2016年

@Hoki感谢您的想法。实际上,我最初具有一个递增的模4计数器,但它稍长一些(由于不需要初始暂停,所以我获得了一个字节)。另外,我认为清晰的屏幕和正常的显示比fprintf使用退格键更短
Luis Mendo

7

Dyalog APL,50个字节

这仅在Windows版本中有效,否则⎕SM除非⎕SR调用该窗口,否则不会显示该窗口。

{⎕SM←1 1,⍨⊂⊃⍵⌽'Loading... '∘,¨'|/-\'⋄∇4|⍵+⌈⎕DL÷4}1

说明:

  • {... }1:以下列开头运行函数⍵=1
  • Loading... '∘,¨'|/-\':生成四个可能的输出
  • ⊂⊃⍵⌽:旋转列表以将第element个元素放在第一位,采用第一个元素并将其括起来
  • ⎕SM←1 1,⍨:将字符串放在⎕SM窗口的左上角。
  • ⎕DL÷4:等待1/4秒
  • 4|⍵+⌈:将结果值四舍五入(等待所花费的秒数,因此始终为1),将其添加到(递增),然后采用mod-4(以防止最终溢出)。
  • :使用new再次运行该功能

动画


我以某种方式知道有人会为Dyalog(/ APL)提出这一挑战的答案:)
YoYoYonnY

7

C#,187字节

打高尔夫球:

void L(){Console.Write("Loading...");Action<string>l=(a)=>{Console.SetCursorPosition(11,0);System.Threading.Thread.Sleep(250);Console.Write(a);};while(true){l("|");l("/");l("-");l("\\");}

取消高尔夫:

public void L()
{
  Console.Write("Loading...");
  Action<string> l = (a) =>
  {
    Console.SetCursorPosition(11, 0);
    System.Threading.Thread.Sleep(250);
    Console.Write(a);
  };
  while (true)
  {
    l("|");
    l("/");
    l("-");
    l("\\");
  }
}

仍在等待加载...

在此处输入图片说明


仍在等待显示“ \”…
manatwork'Nov

@manatwork哦,废话,懒惰的复制和粘贴。当我很快回到办公桌时,它将解决此问题:)
Pete Arden

抱歉,由于我的评论,您的解决方案越来越长。您不能使用1>0而不是true使它回到186吗?
manatwork '16

@ErikGolferエリックゴルファー,不知道C#,但基于该语言是Java的副本,并且显然已被Cant无法将int转换为bool的事实,我认为这是行不通的。(顺便说一句,如果那行得通,也许使用l()as 的第一个条件也行得通吗?)
manatwork 16-11-28

2
@manatwork好吧,看来C#太难了。
暴民埃里克

7

Snap!,8个方块

快拍8个方块!

这是我曾经在Apple上迷惑过的最早的算法之一。


1
向我们展示您的Applesoft BASIC :)
roblogic

1
我很乐意在Hypercard中进行这些操作。
wyldstallyns

6

网状,无竞争性,40字节

:i=@C"Loading... "o"|/-\\".iHo14%w.i1+4,

在此处输入图片说明

我忘了做很多事情,包括w。那好吧。

说明

:i=@C"Loading... "o"|/-\\".iHo14%w.i1+4,
:i=                                       set `i` to the TOS
   @C                                     clear the screen
     "Loading... "o                       output that string
                   "|/-\\"                push that string
                          .i              get `i`
                            H             get the `i`th character of that string
                             o            and output it
                              14%         push 0.25 (1/4)
                                 w        wait that long
                                  .i      get `i`
                                    1+    increment
                                      4,  mod 4
                                          this wraps around the beginning of the program,
                                          setting i to the said value

6

Bash,98 69字节

while s='\|/-';do
printf "\rLoading... ${s:i=++i%4:1}"
sleep .25
done

感谢许多人打了很多球!


同样,如果您使用单引号,则不必逃脱反斜杠,并且echo -e -n可以将参数组合为echo -en
Evan Chen

通过将回显行替换为以下内容,可以节省2行和13个字节:echo -en "\rLoading... ${s:i=(i+1)%4:1}"
Ipor Sircer,2016年

echo -enprintf; 给while条件赋值。
manatwork

用printf像manatwork说,简化子,并把它直接在while条件:while printf "\rLoading... ${s:i++%4:1}";do。67字节
Dominik R

Dominik R无法正常工作,最终会溢出。
扎卡里


6

> <>,55 + 4 = 59字节

"...gnidaoL"v
l?!voc1. ^:<>
<v<>'\|/-'>^v
^<^<<<8{<<^o<

必须运行-t .01作为附加参数传递给解释器,即字节数中的+4。

这样做是将要打印的四个字符放在堆栈上,在不删除顶部的情况下打印最上面的一个字符,并将堆栈移动一个位置。然后打印\b(退格,字符x08)并重新开始循环。

通过传递给解释器的参数来实现计时,该参数强制执行每个指令之前等待0.01秒。输出与下一条指令之间有23条指令(大多数指令只是将指令指针移至下一个单元格),因此这将等待0.23秒以及执行指令所需的时间,这完全可以满足所请求的0.25s误差为10%。

您可以在线尝试使用它,但是该解释器无法识别退格字符,因此在那里的输出会有些奇怪。


通常,标记喜欢-n被评定为1个字节,所以我觉得你可以得分的说法是t.01这是4个字节。很好地使用10%规则btw :)
FlipTack

@ Flp.Tkc谢谢!我不确定如何计算参数的字节数,我喜欢这种方式:)
Leo

@Leo-是否有使用0.01而不是使用较少指令的较大刻度的原因?我添加了我的版本,该版本使用了8条指令的循环,滴答计数为0.03;#“ ... gnidaoL” l?!vob0。“ \ | /-”:o} 8o51。>#
蓝绿色鹈鹕

@Tealpelican这是有原因的,但这不是一个很好的理由:规则指出:“在开始显示输出之前,您不应该等待0.25秒-在程序运行时应立即打印第一帧。”我不想让计时器太长,而另一方面,这就是代码高尔夫,所以我不想让它太短。最后,我决定使用25条指令循环,每条指令循环耗时0.01s,以达到所要求的0.25s的准确时序。但是,当我实现它时,我意识到我没有足够的空间来进行完整循环,因此我不得不诉诸使用10%规则。
狮子座

我一定对规则有误读。这是选择时间的一个很好的理由:)
蓝绿色鹈鹕

6

MS-DOS .COM文件,56字节

这里的文件内容为十六进制:

b4 09 ba 2c 01 cd 21 b2 2f e8 11 00 b2 2d e8 0c
00 b2 5c e8 07 00 b2 7c e8 02 00 eb ea b4 02 cd
21 b2 08 cd 21 b9 05 00 f4 e2 fd c3 4c 6f 61 64
69 6e 67 2e 2e 2e 20 24

匹配的汇编代码如下所示:

    mov ah, 9      ; Print "Loading... "
    mov dx, text
    int 21h
theloop:
    mov dl, '/'    ; Call "chrout" for "/", "-", "\" and "|"
    call chrout
    mov dl, '-'
    call chrout
    mov dl, '\'
    call chrout
    mov dl, '|'
    call chrout
    jmp theloop    ; Endless loop

chrout:            ; Sub-Function "chrout"
    mov ah, 2      ; Output the character
    int 21h
    mov dl, 8      ; Output backspace
    int 21h
    mov cx,5       ; Call "HLT" 5 times
timeloop:
    hlt            ; Normally HLT will wait ~55 milliseconds
                   ; (Assuming no keyboard key is pressed)
    loop timeloop
    ret            ; End of the function

text:
    ASCII "Loading... ",'$'

1
按住按键可以加速微调器,可以通过屏蔽除定时器中断以外的其他中断来解决此问题,例如:mov al, 0xfe / out 0x21,al
ninjalj,2016年

对于HLT的注释是错误的,您可能意味着HLT以〜18.2 Hz(或更确切地说,以NTSC时钟/ 12/65536 Hz)唤醒。
ninjalj 2016年

@ninjalj谢谢。我更改了评论...
Martin Rosenau

6

NASM x86_64的- 349个 283字节

这应该在64位linux系统上运行

使用:

nasm loading_golfed.asm -felf64 && ld loading_golfed.o

%use altreg
global _start
section .data
o:db"Loading...  "
s:db"|/-\\"
b:db`\bx`
q:dq 0,250000000
_start:mov r0,1
mov r7,1
mov r6,o
mov r2,12
syscall
mov r2,2
l:mov r7,1
mov al,[s+r8]
mov [b+1],al
mov r0,1
mov r6,b
syscall
mov r0,35
lea r7,[q]
mov r6,0
syscall
inc r8
and r8,3
jmp l

动画:

保存了65个字节-感谢user254948

在此处输入图片说明


我计数349个字节,除非有尾随的换行符/空格
FlipTack

^ Flp。TKC谢谢你,有一个与在后面加上一个空格线
塞缪尔

@Samuel是否需要13-17行?没有这些行,它似乎可以正常工作。据我所知(恐怕装配不佳),您先打印正在加载...。字符,然后删除该字符,然后进入循环,重复打印|。首次。
user254948 '16

@Samuel除了xor r8,r8-> mov r8,0(保存1个字符)外,某些MOV还具有多余的空间(mov r7,1-> mov r7,1)。另外,可以用AND r8,3(保存15个字符)代替cmp r8,4,jl l,xor r8,r8指令。您应该减少到285个字节,而不是349个字节!(结合上述行)
user254948 '16

5

R,85 89字节

repeat{if(T>4)T=1;cat("\fLoading...",c("|","/","-","\\")[T],sep="");T=T+1;Sys.sleep(.25)}

编辑:修正了答案,使得T如果大于,则不会通过重置计数器来溢出4

关于此答案的唯一有趣的方面是R的TRUTHY内建函数的使用T。它实际上是一个预定义的变量集,1/TRUE这意味着我们不必初始化计数器,而可以开始递增T


T最终溢出?
FlipTack

@ Flp.Tkc它不会溢出,但是会被视为返回过去的无穷大1e+308NA因此我猜这个答案是无效的(规则中没有注意到)。即将更新
Billywob

1
实际上,如果不使用内置的话,您可以将其缩短2个字节Ti=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}是87个字节。
plannapus

嗯... R仅对向量起作用吗?为什么原子没有模运算符或按位运算符?是T向量吗?有T=(T+1)%%4工作吗?它将另外节省5个字节。
泰特斯

2
...或T=T%%4+1:甚至短2个字节。
泰特斯

5

Haskell(GHC),103 91字节

import GHC.Conc
mapM((>>threadDelay 250000).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\"

感谢@nimi节省了12个字节!


不需要完整的程序。mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\"
nimi

通过使用10%公差并用替换250000之前的空格,可以节省两个字节(4^9)
Christian Sievers,2016年

5

C(在类似UNIX的系统上)88字节

main(_){for(;;){_%=4;printf("\rLoading... %c","\\-/|"[_++]);fflush(0);usleep(250000);}}

它以错误的字符开头,但我认为它看起来更好。您可以通过修改“ \-/ |”轻松更改字符顺序 串。


可以通过将语句移至来进一步打高尔夫球for,例如:ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);},然后可以在假定整数溢出绕回的情况下进一步main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
打高尔夫球

您是否需要 fflush()?
约翰·U

在大多数系统上,您确实需要fflush,其中许多基于换行符进行缓冲。但是,在某些系统上可能没有必要。
LambdaBeta

您可以fprintf(stderr,...改用,因为那样的行缓冲不是stdout。将f...stderr,采取八个字符,而fflush(0);需要十,所以这是两个字符的净赢。
cmaster

5

Perl,71 63 61字节

s//\rLoading... |/;select$\,$\,$\,y'-|\/'\/|-'/4while$|=print

先前版本:

$_="\rLoading... |";{$|=print;y#|/\-\\#/\-\\|#;select$\,$\,$\,.25;redo}

感谢@primo 10个字节。


2
使用select超时而不是的好技巧Time::HiRes。您可以使用... while$|=print并通过将音译中的连字符移动到开头和结尾来节省一些字节。s//\r Loading... |/还节省了一个字节分配。
primo

2
而且,如果您将单引号用作音译定界符,则也无需转义反斜杠:y'-\|/'\|/-'
primo

看来您的代码之前还有多余的空间。
暴民埃里克

1
您可以使用文字来保存另一个字节\r
ninjalj

1
y'-|\/'\/|-'/4代替使用.252个。
primo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.