Đang tải mãi mãi


106

Thử thách của bạn là tạo ra một màn hình tải vô hạn, trông như thế này:

nhập mô tả hình ảnh ở đây


Hoặc, để cụ thể hơn:

  • Không có đầu vào.
  • Đầu ra Loading..., với một không gian dấu, nhưng không có dòng mới.
  • Chu kỳ vô hạn thông qua các ký tự |, /, -\: mỗi 0,25 giây, ghi đè lên người cuối cùng với sự tiếp theo trong chuỗi. Bạn có thể ghi đè chỉ ký tự cuối cùng, hoặc xóa và viết lại toàn bộ dòng, miễn Loading...là không thay đổi.

Quy tắc

  • Văn bản đầu ra phải trông chính xác như được chỉ định. Trailing newlines / space được chấp nhận.
  • Bạn không nên đợi 0,25 giây trước khi hiển thị đầu ra - khung đầu tiên sẽ được in ngay khi chương trình được chạy.
  • Chương trình của bạn sẽ có thể chạy vô thời hạn. Ví dụ: nếu bạn sử dụng bộ đếm cho khung, bộ đếm sẽ không bao giờ gây ra lỗi bằng cách vượt quá mức tối đa trong ngôn ngữ của bạn.
  • Mặc dù thời gian chờ giữa mỗi "khung" phải là 0,25 giây, rõ ràng điều này sẽ không bao giờ chính xác - tỷ lệ lỗi 10% hoặc hơn được cho phép.
  • Bạn có thể gửi một chức năng, nhưng nó phải in ra stdout.
  • Bạn có thể gửi câu trả lời trong môi trường không có bàn điều khiển (nhưng vẫn dựa trên văn bản), miễn là nó có khả năng tạo ra hình ảnh động tải.
  • Đây là , vì vậy giải pháp ngắn nhất (tính bằng byte) sẽ thắng. Tiêu chuẩn mã lỗ golf áp dụng.
  • Nếu có thể, vui lòng cung cấp gif của màn hình tải của bạn trong thực tế.

Thí dụ

Đây là mã C ++ mà tôi đã sử dụng để tạo ví dụ (ungolfed):

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

Có thể người chơi golf tốt nhất giành chiến thắng!


3
Có thể gửi 0,25 giây trước khi ban đầu hiển thị đầu ra?
Sản phẩm ETH

2
Không, nhưng cảm ơn vì đã đề cập đến điều đó, tôi sẽ thêm nó vào quy tắc @ETHproductions
FlipTack

Một dòng mới (sau biểu tượng hoạt hình) có được chấp nhận không?
Đồng

Tất nhiên :) @Copper
FlipTack

1
@TheBitByte có nghĩa là về mặt lý thuyết, không có gì trong chương trình của bạn gây ra lỗi - chẳng hạn như bộ đếm tràn hoặc đạt độ sâu đệ quy tối đa.
FlipTack

Câu trả lời:


76

HTML / CSS, 183 180 163 161 160 147 143 byte

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>

Chỉnh sửa: Đã lưu 3 byte nhờ @betseg. Đã lưu 17 byte nhờ @manatwork. Đã lưu 1 byte nhờ @Daniel. Đã lưu 13 byte nhờ @Ismael Miguel. Đã lưu 4 byte nhờ @Fez Vrasta.


4
Theo meta, CSS + HTML là tốt để trả lời các câu hỏi. Hơn nữa, tôi cho phép điều này trong mô tả thách thức. Vì vậy, câu trả lời này là hoàn toàn hợp lệ :)
FlipTack

5
HTML + CSS là TC, vì vậy tôi không hiểu tại sao nó có thể không cạnh tranh
TuxCrafting

1
@ TùxCräftîñg CSS chắc chắn không hoàn chỉnh vì bạn có thể giải quyết vấn đề tạm dừng trong đó (Nếu không có hoạt hình vô hạn, nó sẽ tạm dừng). Tôi nghĩ điều tương tự cũng áp dụng cho HTML (Nếu bạn không bao gồm JS).
Artyer

4
@Artyer stackoverflow.com/a/5239256/3273184 là một cái gì đó đáng xem xét.
Mama Fun Roll

4
@MamaFunRoll Một bình luận trên bài đăng đó đề cập rằng điều đó không thực sự chứng minh TC vì nó không thể lặp mà không có sự can thiệp của người dùng. Tuy nhiên, nó có thể giải quyết thách thức đặc biệt này, vì vậy tôi không thấy bất kỳ vấn đề nào với câu trả lời này.
Sản phẩm ETH

57

Vim, 43 , 41 byte

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

Hai byte được lưu nhờ @Udioica!

Đây là một hình ảnh động (hơi lỗi thời) của nó xảy ra trong thời gian thực!

nhập mô tả hình ảnh ở đây

Và đây là một lời giải thích:

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
chỉ tò mò: nó có vi phạm "Chương trình của bạn sẽ có thể chạy vô thời hạn" không? cuối cùng nó có thể đạt đến một ngăn xếp tràn? :)
Dan Oak

4
@dahnoak Chà, rõ ràng là tôi không thể kiểm tra nó một cách vô tận, nhưng nó không phân bổ thêm bất kỳ bộ nhớ nào, vì vậy tôi không thể thấy bất kỳ lý do nào nó sẽ không hoạt động vô thời hạn.
DJMcMayhem

1
Nếu bạn chuyển isang Svà di chuyển nó trong macro, bạn có thể bỏ qua r|.
udioica

2
@dahnoak Không có lý do tại sao động cơ vi không thể nhận thấy đệ quy đuôi. Và một số triển khai đệ quy sẽ làm như vậy một cách tự nhiên (hãy tưởng tượng nếu có một vectơ lệnh được thực thi và vị trí thực thi hiện tại. Sau đó, @qsẽ chèn vào vị trí hiện tại của nội dung của tập lệnh đăng ký q. Không cần ngăn xếp, và không bộ nhớ được phân bổ trừ khi có các lệnh để chạy sau @q bên trong q.)
Yakk

Hầu như mỗi khi bạn đăng câu trả lời cho một thử thách, tôi đều học được một điều mới (trong trường hợp này @::sl), vì vậy cảm ơn và tiếp tục gửi chúng :)
Christian Rondeau

37

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

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

-1 byte (Zachary T)

Kiểm tra câu trả lời HTML / CSS 132 byte của tôi là tốt.


Có thể tràn đó i?
Zacharý

Vâng, cuối cùng nó sẽ. Đã sửa lỗi đó!
darrylyeo

1
Bạn có thể thay thế i++,i%=4với i=-~i%4một byte?
Zacharý

2
@Xufox <pre>Chỉ đảm bảo một phông chữ đơn cách được sử dụng để chcác đơn vị hoạt động. Các quy tắc không đề cập bất cứ điều gì về họ phông chữ được sử dụng. ;)
darrylyeo

1
Nếu tôi không nhầm, ký tự đầu tiên được in bởi JS sẽ là ký tự cuối cùng trong chuỗi; vì vậy bạn nên init với -thay vì /. Hoặc init với |và lặp qua '-\\|/'. Mặc dù gia tăng tốt đẹp.
Tít

21

Batch Windows, 121 114 84 80 79 78 byte

Chỉ cần ném nó ra cho vui.

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

Tôi không thể gán pipe ( |) vào mảng, vì vậy tôi phải tự thêm nó bằng một nhiệm vụ khác.Việc trì hoãn được thực hiện với PING, điều này có thể không chính xác .

Đầu ra:

nhập mô tả hình ảnh ở đây

Biên tập:

  • Cảm ơn Roman Gräf vì đã tiết kiệm 7 byte!
  • Cảm ơn Neil vì đã tiết kiệm 30 byte! Tôi cũng đã đọc thêm một chút để lưu byte trên dòng mới.
  • Cảm ơn phyrfox đã lưu 4 byte!
  • Cảm ơn YourDeathIsComing đã lưu 2 byte!

3
Bạn có thể xóa @echo offvà đặt @trước một lệnh sethoặcecho
Roman Gräf

1
Bạn không cần mảng, in (/ - \ ^|)hoạt động. Ngoài ra,% 0 là một cách ngắn hơn để lặp hơn goto.
Neil

2
Bạn sẽ có thể sử dụng địa chỉ IP "1.1" (-4 byte), vì hầu hết các nền tảng sẽ tự động mở rộng thành 1.0.0.1 cho bạn.
phyrfox

1
Bạn có thể tiết kiệm 1 byte bằng cách xóa khoảng trống phía trước >nul.
YourDeathIsComing

1
Tôi có nghĩa là không gian trước nó, không phải sau nó.
YourDeathIsComing

20

Nút, 72 70 byte

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

Thay thế \x1Bbằng ký tự thoát theo nghĩa đen để có được số byte chính xác. Gọi f()để bắt đầu hoạt hình. Đây là giao diện của trình giả lập thiết bị đầu cuối ConEmu trên máy tính của tôi:

nhập mô tả hình ảnh ở đây


Hãy thử sử dụng \033c(thay thế \033bằng đại diện char thực tế của nó). Nó trông không tốt, nhưng nó giúp bạn tiết kiệm một số byte.
Mama Fun Roll

Sẽ không itràn?
Zacharý

12
@ZacharyT Nó sẽ sau 71 triệu năm, nhưng tôi có thể khắc phục điều đó nếu cần
ETHproductions

3
"Chương trình của bạn sẽ có thể chạy vô thời hạn. Ví dụ: nếu bạn sử dụng bộ đếm cho khung, bộ đếm sẽ không bao giờ gây ra lỗi bằng cách vượt quá mức tối đa trong ngôn ngữ của bạn.", Vâng, điều đó là cần thiết.
Zacharý

3
@Florent Nhưng sau đó nó sẽ không chạy trên Node ;-)
ETHproductions

14

Kotlin, 67 66 byte

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

nhập mô tả hình ảnh ở đây

Khá tự giải thích, sử dụng \rđể xóa dòng và tận dụng phép nội suy chuỗi tuyệt vời của Kotlin.

EDIT: Đã lưu 1 byte nhờ @ mEQ5aNLrK3lqs3kfSa5HbvsTwe0nIu bằng cách thay đổi while(true)thànhwhile(1>0)


1
Bạn có thể lưu một byte bằng cách sử dụng while(1>0)thay vì while(true)(-1) và có lẽ nên bao gồm cú pháp hàm thực tế trong câu trả lời của bạn ( fun a(){<code>}, +9). Nếu bạn muốn có một chút gian lận, bạn có thể sử dụng lưu trữ một hàm như một biến ( val a={<code>}, +8).
F. George

2
@ mEQ5aNLrK3lqs3kfSa5HbvsTwe0nIu Chế độ 'chương trình đầy đủ' không được chấp nhận? Điều này có thể được chạy như một tập lệnh Kotlin .ktsmà không có định nghĩa lớp hoặc hàm. Ngoài ra, cuộc gọi tuyệt vời với while(1>0)!
Tyler MacDonell

3
Nhưng nếu một ngày, 0 trở nên lớn hơn 1 ???? : P
FlipTack

Ý tưởng tuyệt vời của việc sử dụng tập lệnh Kotlin. @ Flp.Tkc Nhận xét của bạn nhắc nhở tôi về điều này: codegolf.stackexchange.com/a/101131/62024 . Vẫn còn rùng mình rằng điều này là có thể.
F. George

@TylerMacDonell Thật sao? Tôi không biết bạn có thể chạy kotlin trực tiếp như một kịch bản. Cảm ơn bạn về thông tin.
TheNumberOne

14

Vim, 35 byte

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

Phiên bản nhàm chán. Đây là một giải pháp không tuân thủ tốt hơn:

Vim (ngủ 1 giây), 27 byte

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

Việc sử dụng gskhông chỉ ngắn hơn nhiều mà còn không phải nhấn Enter. Điều đó có nghĩa là macro phù hợp với dòng và tôi có thể lưu byte bằng cách chuyển sang @.. (Vì không có gì sau khi cuộc gọi đệ quy có thể chạy, tôi có thể nhập bất cứ thứ gì tôi muốn.)


Cảm ơn câu trả lời này! Tôi đã học được gs, @.@@bên trong @.vẫn khiến đầu tôi đau!
Christian Rondeau

14

Bình thường, 31 byte

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

Phiên dịch tại đây .

Đang tải GIF

Giải trình

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 byte

Trở lại với Bytecount tôi bắt đầu với!

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

CLI trong powershell sẽ xuất hiện một chút trên một số máy tính, vì vậy nó trông không hoàn hảo, nhưng nó tốt như tôi có thể có được.

Đã chuyển $ a ++ vào vòng lặp for để lưu một byte, (không ; )

Sau đó chuyển nó vào bộ chỉ mục mảng, để lưu thêm 2 byte, nhờ Roman đã chỉ ra điều đó.

Đồng thời lưu thêm 1 byte ( ;) bằng cách di chuyển màn hình Clear (cls ) vào vòng lặp for ..

Vấn đề và cách khắc phục được TimmyD chỉ ra cho khía cạnh vô hạn của câu hỏi, chỉ cần +5 byte, được đổi $a++%4thành($a=++$a%4) vì vậy nó sẽ không bao giờ đi trên 3.

Đã lưu một byte khác bằng cách để trống vòng lặp hoàn toàn, nhờ vào 'bất cứ điều gì' để chỉ ra rằng điều này thực sự có thể có trong Powershell Phiên bản 4!

Gif cập nhật mới cho phiên bản (cuối cùng?) Của câu trả lời này.

Đang tải 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}(chuyển $a++sang cách sử dụng cuối cùng $a)
Roman Gräf

luôn quên một cái gì đó - cảm ơn vì điều đó!
colsw

2
Tôi không rành về Powershell, nhưng khi tôi thấy mục Windows Batch, tôi đã nghĩ "Powershell có thể đánh bại điều này không?". Và đây rồi!
Jakub Jankowski

1
Ít nhất trên ps v4, bạn sẽ có thể chơi một byte khác bằng cách giữ cho điều kiện hoàn toàn trống:for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}
bất cứ điều gì

1
Không có gì. Nó thực sự có vẻ hoạt động cho Phiên bản 2+, quá lười để kiểm tra trước đó;)
bất cứ điều gì

11

Pyth - 36 35 byte

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

Không làm việc trực tuyến, rõ ràng.


Bạn có một gif của điều này trong hành động? Ngoài ra, có bất kỳ truy cập có thể tràn?
FlipTack

@ Flp.Tkc bộ đếm duy nhất là Zsố nguyên python, không tràn. Tôi đã cố gắng làm một gif nhưng không thể làm cho nó hoạt động. Nếu bạn biết cách tạo một cái, bạn có thể chạy nó với trình thông dịch thứ ba tại github.com/isaacg1/pyth
Maltysen

4
Nếu số nguyên không tràn, thì có lẽ nó sẽ tăng lên cho đến khi lấp đầy tất cả bộ nhớ, điều này sẽ khiến nó bị hỏng ít nhất sau 10 năm rưỡi trên hầu hết các hệ thống 32 bit. Chắc chắn, cái chết nhiệt của vũ trụ sẽ xảy ra đầu tiên, nhưng vẫn ...
jjrv

11

Matlab, 78 75 byte

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

nhập mô tả hình ảnh ở đây



9

Toán học, 74 67 byte

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

Giảm 7 byte nhờ @dahnoak


ListAnimate["Loading... "<>#&/@Characters@"|/-\\",AnimationRate->4]
Dan Oak

1
@dahnoak chúc mừng! Tôi đã không nhận ra ListAnimate là một thứ. Thật đáng tiếc <>là Flat không thể nghe được nếu không thì 4 byte nữa có thể bị xóa!
Một Simmons

Chỉ để cho vui:Dynamic["Loading... "<>{"|","/","-","\\"}[[1+Round[4Now@"Second"]~Mod~4]],UpdateInterval->.25]
shrx

9

C #, 170 133 byte

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

Xin chân thành cảm ơn Roman Gräf và raznagul, người đã cứu tôi 37 byte. (Đặc biệt là raznagul, người chỉ ra rằng giải pháp ban đầu của tôi dù sao cũng không hợp lệ. Tôi đã bỏ lỡ điều gì đó ở đó, nhưng giờ nó đã được sửa và đáp ứng yêu cầu :)

khá giống với câu trả lời C # hiện có của Pete Arden nhưng với một số cải tiến

ví dụ: "for (;;)" thay vì "while (true)", char thay vì chuỗi

Tôi đã nhận xét đề xuất của tôi về câu trả lời của anh ấy nhưng tôi thực sự không có đủ danh tiếng để làm điều đó.

Ung dung:

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

2
Tại sao không loại bỏ cái đầu tiên Console.Write("\b");và thay đổi cái thứ hai thành Console.Write("\b"+a);?
Roman Gräf

Xác định một hành động là không cần thiết và sử dụng một vòng lặp như foreach(var a in"|/-\\")và thêm mã bạn hiện có trong hành động vì cơ thể sẽ giúp bạn tiết kiệm ~ 20 byte.
raznagul

Ngoài ra, nhiệm vụ là tạo ra đầu ra cần thiết chính xác. Mà hiện tại không phải là trường hợp.
raznagul

Bây giờ, tôi đã quên '|' và dấu cách sau "Đang tải ...".
Trận tuyết rơi

Trong phiên bản không được chỉnh sửa của bạn (vì nó không phù hợp với phiên bản được đánh gôn), bạn có thể xóa phiên bản đầu tiên Console.Write()và chỉ sử dụng một Console.Write($"Loading... {c}\r")thay vì phiên bản thứ hai.
sữa

9

Viết tắt 72, 73 byte

CHỈNH SỬA :

  • Đã thêm phiên bản chỉ dành cho Gforth, 69 byte (Cảm ơn @ninjalj!)
  • Đã thêm khoảng trắng bị thiếu sau khi "Đang tải ..." (Thx @Roman Gräf!), +1 byte
  • Được cập nhật để khớp với các quy tắc chính xác hơn (trong cùng một số byte)

Chơi gôn

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

Phiên bản Gforth

Phiên bản chỉ dành cho GNU Forth có thể được đưa xuống 69 byte như thế này:

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

Screencast

nhập mô tả hình ảnh ở đây

Hãy thử trực tuyến!


1
Vì bạn đang sử dụng gforth, nếu bạn không quan tâm đến tính di động đối với các Forth khác, bạn có thể sử dụng [begin][again]bên ngoài một định nghĩa từ.
ninjalj

9

Python 2, 81 79 78 77 byte

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

Khá là một giải pháp đơn giản mà ngủ sử dụng time.

Tôi sử dụng \r(Trả về xe ngựa) để quay lại điểm bắt đầu của dòng và sau đó in thông báo ghi đè lên dòng.

Tôi bắt đầu với i=1để tránh hai lần thoát khỏi \(Nó '\|/-'thay vì '|/-\\').

Trong quá khứ, tôi đã từng -~icó nghĩa là i + 1để tránh dấu ngoặc đơn. (Cảm ơn @ Flp.Tkc về -2 byte này!) (Đó lài=(i+1)%4 so với i=-~i%4)

Bây giờ, tôi chỉ để cho bộ đếm tăng mãi mãi, vì về mặt kỹ thuật Python intkhông thể tràn. Cảm ơn @Zachary T đã chỉ ra và tiết kiệm một byte!
Nó chỉ dừng lại trên một máy vì máy hết bộ nhớ, nhưng phải mất 9,7 thế hệ với 4GB bộ nhớ cho máy đó int.

Cảm ơn @Kade cho byte -1 nơi print a,bin abkhông gian tách biệt, vì vậy tôi không cần không gian riêng của mình.

Đây là một gif của nó hoạt động trên Windows:

Đang tải

Tôi cũng đã thử nó trên máy ảo Linux. Tôi không thể kiểm tra nó trên máy Mac.


1
Nếu tôi nhớ chính xác, bạn có thể sử dụng i=-~i%4để lưu byte cho parens :)
FlipTack

2
Sẽ không thay thế [i],;i=-~i%4bằng việc [i%4],;i+=1lưu một byte vì nó không vượt quá mức tối đa cho Python, chỉ có bộ nhớ tối đa?
Zacharý

9
Tôi nên đánh giá thấp bạn vì đã đăng nhập như Administrator...
Neil

5
@Neil Thành thật mà nói, tôi chỉ cần đặt tệp Python vào Quản trị viên và chạy nó từ đó vì các tên tài khoản khác là tên thật (PC cá nhân).
Artyer

2
Tôi muốn cho phép đề nghị @ZacharyT 's như về mặt kỹ thuật Python số nguyên có thể vô cùng lớn, miễn là các máy tính có bộ nhớ để giữ họ
FlipTack

7

TOÁN , 36 byte

Xóa 1 byte bằng cách sử dụng ý tưởng của @ flawr về việc dịch chuyển chuỗi

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

Đây là bản ghi gif từ trình biên dịch ngoại tuyến:

nhập mô tả hình ảnh ở đây

Hoặc thử nó tại MATL Online!Nếu ban đầu nó không chạy, hãy làm mới trang và nhấn "Chạy" lại.

Làm thế nào nó hoạt động

'\-/|'           % 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

Này Luis. cũng được thực hiện với MATL như mọi khi. Đây là một biến thể nhỏ của danh sách tròn. và hiển thị. Bạn có nghĩ rằng bạn có thể dịch nó trong một giải pháp thậm chí còn ngắn hơn:a='\|/-';k=1; fprintf('Loading... -') while 1 k=mod(k,4)+1; fprintf('\b\b%c\n',a(k)); pause(.25); end
Hoki

@Hoki Cảm ơn ý kiến. Trên thực tế ban đầu tôi có bộ đếm modulo 4 tăng dần, nhưng nó dài hơn một chút (sau đó tôi đã đạt được một byte vì yêu cầu không có tạm dừng ban đầu). Ngoài ra, tôi nghĩ màn hình rõ ràng và màn hình bình thường ngắn hơn so fprintfvới không gian phía sau
Luis Mendo

7

APL Dyalog, 50 byte

Điều này chỉ hoạt động trong phiên bản Windows, vì nếu không ⎕SMcửa sổ sẽ không hiển thị trừ khi ⎕SRđược gọi.

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

Giải trình:

  • {... }1: Chạy chức năng bắt đầu bằng⍵=1
  • Loading... '∘,¨'|/-\': tạo ra bốn kết quả đầu ra có thể
  • ⊂⊃⍵⌽: Xoay danh sách để đặt phần tử thứ nhất lên trước, lấy phần tử đầu tiên và đặt nó vào phần tử
  • ⎕SM←1 1,⍨: đặt chuỗi ở góc trên bên trái của ⎕SMcửa sổ.
  • ⎕DL÷4: đợi 1/4 giây
  • 4|⍵+⌈: làm tròn giá trị kết quả (giây chờ đợi, vì vậy giá trị này luôn là 1), thêm nó vào (tăng nó) và lấy mod-4 (để ngăn không cho nó tràn ra).
  • : chạy lại chức năng với cái mới .

Hoạt hình


Bằng cách nào đó tôi biết ai đó sẽ gửi câu trả lời cho thử thách này cho Dyalog (/ APL) :)
YoYoYonnY

7

C #, 187 byte

Chơi gôn

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("\\");}

Ung dung:

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("\\");
  }
}

Vẫn đang chờ nó tải ...

nhập mô tả hình ảnh ở đây


Vẫn đang chờ đợi cho nó để hiển thị “\” ...
manatwork

@manatwork Ôi tào lao, lười sao chép và dán. Sẽ sửa nó khi tôi quay lại bàn làm việc của mình trong thời gian ngắn :)
Pete Arden

Xin lỗi để xem giải pháp của bạn lâu hơn do nhận xét của tôi. Bạn không thể sử dụng 1>0thay vì trueđể đưa nó trở lại 186?
manatwork

@ErikGolfer リ ッ ク ゴ ル フ ァ, không biết gì về C #, nhưng dựa trên thực tế ngôn ngữ là bản sao của Java và rõ ràng được xác nhận bởi Không thể chuyển int thành bool , tôi nghĩ rằng nó sẽ không hoạt động. (BTW, nếu điều đó hoạt động, có thể sử dụng cuộc gọi đầu tiên l()là điều kiện cũng sẽ hoạt động?)
manatwork

2
@manatwork Chà, có vẻ như C # là không thể đọc được.
Erik the Outgolfer

7

Chụp!, 8 khối

8 khối Snap!

Đây là một trong những thuật toán đầu tiên tôi từng đánh đố trên Apple] [e


1
Cho chúng tôi xem CƠ
SỞ

1
Tôi sẵn sàng làm những điều này trong Hypercard.
wyldstallyns

6

dạng lưới, không biên dịch, 40 byte

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

nhập mô tả hình ảnh ở đây

Tôi quên để cam kết một loạt các điều, bao gồm cả w. Ồ tốt

Giải trình

: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 byte

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

Cảm ơn nhiều người vì đã chơi nhiều byte!


Ngoài ra, bạn không phải thoát dấu gạch chéo ngược nếu bạn sử dụng dấu ngoặc đơn và các đối số echo -e -ncó thể được kết hợp thànhecho -en
Evan Chen

Bạn có thể lưu 2 dòng và 13 byte bằng cách thay thế dòng echo thành:echo -en "\rLoading... ${s:i=(i+1)%4:1}"
Ipor Sircer

echo -enprintf; làm bài tập cho s whileđiều kiện.
manatwork

sử dụng printf như manatwork đã nói, đơn giản hóa chuỗi con và đặt nó trực tiếp trong whileđiều kiện : while printf "\rLoading... ${s:i++%4:1}";do. 67 byte
Dominik R

Điều đó sẽ không hoạt động Dominik R, nó sẽ tràn ra.
Zacharý

6

Perl 6 , 72 61 byte

Supply.interval(1/4).tap: {print "\rLoading... ",<| / - \ >[$/++];$/%=4}
loop {print "\rLoading... ",<| / - \ >[$/++];$/%=4;sleep 1/4}

6

> <> , 55 + 4 = 59 byte

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

Phải chạy qua -t .01 làm đối số bổ sung cho trình thông dịch, đó là +4 trong số byte.

Điều này làm là đặt bốn ký tự sẽ được in trên ngăn xếp, in cái trên cùng mà không loại bỏ nó và dịch chuyển ngăn xếp theo một vị trí. Sau đó, nó in\b (backspace, ký tự x08) và khởi động lại vòng lặp.

Thời gian đạt được bằng đối số được truyền cho trình thông dịch, buộc phải chờ 0,01 giây trước khi thực hiện mỗi lệnh. Có 23 hướng dẫn giữa đầu ra và đầu ra tiếp theo (hầu hết chúng chỉ đơn giản là di chuyển con trỏ lệnh sang ô tiếp theo), vì vậy, điều này sẽ đợi 0,23 giây cộng với thời gian cần thiết để thực hiện các hướng dẫn, phù hợp mà không gặp vấn đề gì trong 0,25 giây được yêu cầu với 10% lỗi.

Bạn có thể thử trực tuyến , nhưng trình thông dịch đó không nhận ra ký tự backspace, vì vậy đầu ra sẽ hơi lạ ở đó.


Thông thường cờ thích -nđược ghi như 1 byte, vì vậy tôi nghĩ bạn có thể ghi bàn luận như t, .01đó là 4 byte. Sử dụng tốt quy tắc 10% btw :)
FlipTack

@ Flp.Tkc Cảm ơn bạn! Tôi không chắc về cách đếm byte cho đối số, tôi thích cách này :)
Leo

@Leo - Có lý do để sử dụng 0,01 và không phải là một đánh dấu lớn hơn với ít hướng dẫn hơn? Tôi đã thêm phiên bản của mình sử dụng vòng lặp gồm 8 hướng dẫn và số lần đánh dấu là 0,03; # "... gnidaoL" l ?! Vob0. "\ | / -": o} 8o51. > #
Teal pelican

@Tealpelican Có một lý do, nhưng nó không phải là một lý do hay: quy tắc nói rằng "Bạn không nên đợi 0,25 giây trước khi hiển thị đầu ra - khung đầu tiên nên được in ngay khi chương trình được chạy.", Vì vậy tôi đã không Tôi không muốn làm cho bộ đếm thời gian quá dài, trong khi mặt khác đây là mã golf, vì vậy tôi không muốn làm cho nó quá ngắn. Cuối cùng, tôi quyết định cho một vòng lệnh 25 lấy mỗi 0,01 giây để đạt được thời gian chính xác là 0,25 giây được yêu cầu; Tuy nhiên, khi tôi thực hiện nó, tôi nhận ra rằng tôi thiếu không gian đủ cho vòng lặp đầy đủ, vì vậy tôi phải sử dụng quy tắc 10%.
Leo

Tôi phải đọc sai các quy tắc. Đó là một lý do hoàn toàn tốt cho thời gian :)
Teal pelican

6

Tệp MS-DOS .COM, 56 byte

Ở đây nội dung tệp ở dạng thập lục phân:

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

Mã trình biên dịch mã phù hợp trông như thế này:

    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
Giữ một phím được nhấn sẽ tăng tốc cho công cụ quay vòng, có thể được sửa bằng cách che các ngắt khác với ngắt hẹn giờ, ví dụ:mov al, 0xfe / out 0x21,al
ninjalj

Nhận xét cho HLT là sai, có lẽ bạn có nghĩa là HLT thức dậy ở ~ 18,2 Hz (hay chính xác hơn là ở đồng hồ NTSC / 12/65536 Hz).
ninjalj

@ninjalj Cảm ơn. Tôi đã thay đổi nhận xét ...
Martin Rosenau

6

NASM x86_64 - 349 283 byte

Điều này nên được chạy hệ thống linux 64 bit

được xây dựng bằng cách sử dụng:

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

hoạt hình:

đã lưu 65 byte - cảm ơn người dùng254948

nhập mô tả hình ảnh ở đây


Tôi đếm 349 byte, trừ khi có dòng mới / dấu cách
FlipTack

^ Flp. Tkc Cảm ơn, có một dòng có khoảng trống ở cuối
Samuel

@Samuel là dòng 13-17 cần thiết? Nó dường như hoạt động khá tốt mà không có những dòng đó. Theo như tôi có thể nói (Không phải là tuyệt vời trong lắp ráp tôi sợ) bạn in Đang tải ...., sau đó là | ký tự, sau đó xóa ký tự đó, sau đó nhập một vòng lặp trong đó bạn lặp lại in | lần đầu tiên
dùng254948

@Samuel ngoài xor r8, r8 -> Mov r8,0 (lưu 1 ký tự), một số MOV có thêm khoảng trắng (Mov r7, 1 -> Mov r7,1). hơn nữa các hướng dẫn cmp r8,4, jl l, xor r8, r8, có thể được thay thế bằng AND r8,3 (lưu 15 ký tự). Bạn nên giảm xuống 285 byte sau đó thay vì 349! (kết hợp với các dòng được đề cập ở trên)
user254948

5

R, 85 89 byte

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

Chỉnh sửa: Đã sửa câu trả lời sao cho Tkhông bị tràn bằng cách đặt lại bộ đếm nếu lớn hơn 4.

Khía cạnh thú vị chỉ về câu trả lời này là việc sử dụng R của TRUTHYBUILTIN T. Đây thực sự là một biến được xác định trước 1/TRUEcó nghĩa là chúng ta không phải khởi tạo bộ đếm nhưng có thể bắt đầu tăng T.


Sẽ Tdần dần tràn?
FlipTack

@ Flp.Tkc Nó sẽ không tràn nhưng được coi là quá khứ 1e+308trong trường hợp NAđược trả lại vì vậy tôi đoán câu trả lời này là không hợp lệ (không chú ý đến nó trong các quy tắc). Sẽ cập nhật sớm
Billywob

1
Trên thực tế, bạn có thể nhận được nó ngắn hơn 2 byte nếu bạn không sử dụng tích hợp T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}là 87 byte.
plannapus

Hmm ... R chỉ hoạt động trên các vectơ? Tại sao không có toán tử modulo hoặc bitwise cho các nguyên tử? là Tmột vectơ? Có T=(T+1)%%4hoạt động không? Nó sẽ tiết kiệm thêm 5 byte.
Tít

2
... hoặc T=T%%4+1: thậm chí ngắn hơn 2 byte.
Tít

5

Haskell (GHC), 103 91 byte

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

Cảm ơn @nimi đã lưu 12 byte!


Không cần một chương trình đầy đủ. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
nimi

Hai byte có thể được lưu bằng cách sử dụng dung sai 10% và thay thế 250000và khoảng trắng trước nó (4^9).
Christian Sievers

5

C (trên các hệ thống giống UNIX) 88 byte

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

Nó bắt đầu với ký tự sai, nhưng tôi nghĩ nó trông đẹp hơn. Bạn có thể dễ dàng thay đổi thứ tự ký tự bằng cách sửa đổi "\ - / |" chuỗi.


Có thể được đánh gôn hơn nữa bằng cách di chuyển các câu lệnh vào for, ví dụ : ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}, sau đó có thể được đánh gôn thêm với giả định cho phép tràn số nguyên:main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
ninjalj

Bạn có cần fflush () trong đó không?
John U

Trên hầu hết các hệ thống bạn cần fflush, nhiều trong số chúng đệm dựa trên dòng mới. Tuy nhiên, có thể nó không cần thiết trên một số hệ thống.
LambdaBeta

Bạn có thể sử dụng fprintf(stderr,...thay thế, vì đó không phải là bộ đệm như thế stdout. Có f...stderr,tám nhân vật, trong khi fflush(0);mất mười nhân vật, vì vậy đó là chiến thắng ròng của hai nhân vật.
cmaster

5

Perl, 71 63 61 byte

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

Phiên bản trước:

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

Thanx đến @primo trong 10 byte.


2
Thủ thuật hay để sử dụng selectthời gian chờ hơn là Time::HiRes. Bạn có thể lưu một vài byte bằng cách sử dụng ... while$|=printvà bằng cách di chuyển các dấu gạch nối trong phiên âm sang phía trước và cuối. s//\r Loading... |/cũng tiết kiệm một byte trên bài tập.
Primo

2
Và ngoài ra, nếu bạn sử dụng dấu ngoặc đơn cho dấu phân cách chuyển ngữ, thì cũng không cần phải thoát dấu gạch chéo ngược : y'-\|/'\|/-'.
Primo

Có vẻ như bạn có thêm một không gian trước mã của bạn.
Erik the Outgolfer

1
Bạn có thể lưu một byte khác bằng cách sử dụng một chữ \r.
ninjalj

1
Sử dụng y'-|\/'\/|-'/4thay thế .25cho 2 hơn.
primo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.