Ładowanie… na zawsze


106

Twoim zadaniem jest stworzenie nieskończonego ekranu ładowania, który wygląda następująco:

wprowadź opis zdjęcia tutaj


Lub bardziej szczegółowo:

  • Nie wkładaj żadnych danych.
  • Wyjście Loading...z końcową spacją, ale bez końcowej linii nowej linii.
  • Nieskończenie przechodzić zwęgla |, /, -i \: co 0.25 sekundy, zastąpienie ostatni z następnym w kolejności. Możesz zastąpić tylko ostatni znak lub usunąć i przepisać całą linię, o ile długo Loading...pozostanie niezmieniona.

Zasady

  • Tekst wyjściowy musi wyglądać dokładnie tak, jak określono. Znaki końcowe / spacje są dopuszczalne.
  • Należy nie czekaj 0,25 sekund przed początkowo przedstawiający wyjście - pierwsza klatka powinna być wydrukowane tak szybko, jak program zostanie uruchomiony.
  • Twój program powinien być w stanie działać w nieskończoność.Na przykład, jeśli używasz licznika dla ramek, licznik nigdy nie powinien powodować błędu, przekraczając maksimum w twoim języku.
  • Chociaż okres oczekiwania między każdą „ramką” powinien wynosić 0,25 sekundy, oczywiście nigdy nie będzie to dokładne - dopuszczalny margines błędu wynoszący około 10%.
  • Możesz przesłać funkcję, ale musi ona zostać wydrukowana na stdout.
  • Możesz przesłać odpowiedź w środowisku innym niż konsola (ale nadal oparte na tekście), o ile jest w stanie wygenerować animację ładowania.
  • To jest , więc wygrywa najkrótsze rozwiązanie (w bajtach). Obowiązują standardowe luki w kodzie golfowym.
  • Jeśli to możliwe, podaj gif ekranu ładowania w akcji.

Przykład

Oto kod C ++, którego użyłem do stworzenia przykładu (nie golf):

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

Niech zwycięży najlepszy golfista!


3
Czy zgłoszenia mogą czekać 0,25 sekundy przed początkowym wyświetleniem wyniku?
ETHprodukcje

2
Nie, ale dziękuję za wzmiankę o tym, dodam go do zasad @ETHproductions
FlipTack

Czy końcowy znak nowej linii (po symbolu animacji) jest akceptowalny?
Miedzi

Oczywiście :) @Copper
FlipTack

1
@TheBitByte oznacza, że ​​teoretycznie nic w twoim programie nie spowoduje błędu - na przykład przepełnienie licznika lub osiągnięcie maksymalnej głębokości rekurencji.
FlipTack,

Odpowiedzi:


76

HTML / CSS, 183 180 163 161 160 147 143 bajtów

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>

Edycja: Zapisano 3 bajty dzięki @betseg. Zaoszczędź 17 bajtów dzięki @manatwork. Zapisano 1 bajt dzięki @Daniel. Zaoszczędź 13 bajtów dzięki @Ismael Miguel. Zaoszczędź 4 bajty dzięki @Fez Vrasta.


4
Według meta CSS + HTML jest odpowiedni do odpowiadania na pytania. Ponadto pozwoliłem na to w opisie wyzwania. Więc ta odpowiedź jest całkowicie poprawna :)
FlipTack

5
HTML + CSS to TC, więc nie rozumiem, dlaczego może nie być konkurencyjny
TuxCrafting

1
@ TùxCräftîñg CSS zdecydowanie nie jest ukończony, ponieważ można w nim rozwiązać problem zatrzymania (jeśli nie ma nieskończonej animacji, zatrzymuje się). Myślę, że to samo dotyczy HTML (jeśli nie dołączasz JS).
Artyer

4
@Artyer stackoverflow.com/a/5239256/3273184 to coś, co warto rozważyć.
Mama Fun Roll

4
@MamaFunRoll Komentarz do tego postu wspomina, że ​​to tak naprawdę nie dowodzi, że jest TC, ponieważ nie może zapętlać się bez interwencji użytkownika. Jednak może rozwiązać to szczególne wyzwanie, więc nie widzę żadnego problemu z tą odpowiedzią.
ETHprodukcje

57

Vim, 43 , 41 bajtów

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

Dwa bajty zapisane dzięki @Udioica!

Oto (nieco nieaktualna) animacja tego, co dzieje się w czasie rzeczywistym!

enter image description here

A oto wyjaśnienie:

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
tylko ciekawostki: czy to narusza „Twój program powinien być w stanie działać w nieskończoność”? czy w końcu może dojść do przepełnienia stosu? :)
Dan Oak

4
@dahnoak Cóż, oczywiście nie mogę go przetestować w nieskończoność, ale nie przydziela żadnej dodatkowej pamięci, więc nie widzę żadnego powodu, by nie działał w nieskończoność.
DJMcMayhem

1
Jeśli przełączysz isię Si przeniesiesz go do makra, możesz pominąć r|.
udioica

2
@dahnoak Nie ma powodu, dla którego silnik vi nie zauważył rekurencji ogona. A niektóre implementacje rekurencji zrobiłyby to naturalnie (wyobraź sobie, że istnieje wektor poleceń do wykonania i bieżąca lokalizacja wykonania. Następnie @qwstawiłaby w bieżącej lokalizacji zawartość skryptu rejestru q. Stos nie jest potrzebny i nie pamięć przydzielona chyba że istnieją komendy do uruchomienia po @q terminie q).
Yakk

Prawie za każdym razem, gdy publikujesz odpowiedź na wyzwanie, uczę się czegoś nowego (w tym przypadku @:i :sl), więc dziękuję i nie przestawaj :)
Christian Rondeau

37

HTML + JS (ES6), 20 + 51 50 = 70 bajtów

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

-1 bajt (Zachary T)

Sprawdź również moją 132-bajtową odpowiedź HTML / CSS .


Czy to przepełnienie i?
Zacharý

Tak, w końcu by to zrobiło. Naprawiono to!
darrylyeo

1
Mogłyby zastąpić i++,i%=4z i=-~i%4do bajt?
Zacharý

2
@Xufox <pre>Jedyne, co zapewniło użycie czcionki o stałej szerokości, aby chjednostki działały. Reguły nie wspominają nic o użytej rodzinie czcionek. ;)
darrylyeo

1
Jeśli się nie mylę, pierwszy znak wydrukowany przez JS będzie ostatnim w ciągu; więc powinieneś zainicjować za pomocą -zamiast /. Lub inicjuj za pomocą |i zapętlaj '-\\|/'. Niezły przyrost.
Tytus

21

Windows Batch, 121 114 84 80 79 78 bajtów

Wyrzucam to dla zabawy.

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

Nie mogłem przypisać potoku (| ) do tablicy, więc musiałem ręcznie dodać ją z innym przypisaniem.Opóźnienie jest zakończone PING, co może nie być dokładne .

Wynik:

enter image description here

Edytować:

  • Dzięki Roman Gräf za oszczędność 7 bajtów!
  • Dzięki Neil za oszczędność 30 bajtów! Zmodyfikowałem to również trochę, aby zaoszczędzić bajty na nowych liniach.
  • Dzięki phyrfox za oszczędność 4 bajtów!
  • Dzięki YourDeathIsComing za zapisanie 2 bajtów!

3
Możesz usunąć @echo offi postawić @przed każdym setlub echokomendą
Roman Gräf

1
Nie potrzebujesz tablicy, in (/ - \ ^|)działa. Ponadto% 0 jest krótszym sposobem zapętlenia niż goto.
Neil

2
Powinieneś być w stanie użyć adresu IP „1.1” (-4 bajty), ponieważ większość platform automatycznie go rozszerzy do 1.0.0.1.
phyrfox

1
Możesz zapisać 1 bajt, usuwając spację przed >nul.
YourDeathIsComing

1
Miałem na myśli przestrzeń przed nią, a nie po niej.
YourDeathIsComing

20

Węzeł, 72 70 bajtów

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

Zamień \x1Bna dosłowny znak zmiany znaczenia, aby uzyskać prawidłową liczbę bajtów. Zadzwoń, f()aby rozpocząć animację. Oto jak to wygląda w emulatorze terminali ConEmu na moim komputerze:

enter image description here


Spróbuj użyć \033c(zamień na \033jego rzeczywistą reprezentację znaków). Nie wygląda tak dobrze, ale oszczędza ci trochę bajtów.
Mama Fun Roll

Nie iprzepełnisz się?
Zacharý

12
@ZacharyT Będzie to po 71 milionach lat, ale mogę to naprawić, jeśli to konieczne
ETHproductions

3
„Twój program powinien być w stanie działać w nieskończoność. Na przykład, jeśli używasz licznika klatek, licznik nigdy nie powinien powodować błędu, przekraczając maksimum w twoim języku.”, Tak, jest to konieczne.
Zacharý

3
@Florent Ale wtedy nie działałoby na Węźle ;-)
ETHproductions

14

Kotlin, 67 66 bajtów

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

enter image description here

Dość oczywiste, używając \rdo wyczyszczenia linii i wykorzystując niesamowitą interpolację strun Kotlina.

EDYCJA: Zapisano 1 bajt dzięki @ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu poprzez zmianę while(true)nawhile(1>0)


1
Możesz zapisać jeden bajt, używając while(1>0)zamiast while(true)(-1) i prawdopodobnie powinien zawierać rzeczywistą składnię funkcji w odpowiedzi ( fun a(){<code>}, +9). Jeśli chcesz być trochę oszukiwany, możesz użyć funkcji store jako zmiennej ( val a={<code>}, +8).
F. George

2
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Czy tryb „pełnego programu” jest niedopuszczalny? Można to uruchomić jako skrypt Kotlina .ktsbez definicji klas lub funkcji. Świetne połączenie z while(1>0)!
Tyler MacDonell,

3
Ale co, jeśli pewnego dnia 0 stanie się większe niż 1 ???? : P
FlipTack

Świetny pomysł na użycie skryptu Kotlin. @ Flp.Tkc Twój komentarz przypomniał mi o tym: codegolf.stackexchange.com/a/101131/62024 . Nadal drżę, że to możliwe.
F. George

@TylerMacDonell Naprawdę? Nie wiedziałem, że możesz uruchomić kotlina bezpośrednio jako skrypt. Dzięki za informację.
TheNumberOne

14

Vim, 35 bajtów

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

Nudna wersja. Oto niezgodne rozwiązanie, które jest lepsze:

Vim (1 sekunda uśpienia), 27 bajtów

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

Korzystanie gsnie tylko jest znacznie krótsze, ale nie musisz naciskać Enter. Oznacza to, że makro pasuje do linii, a ja mogę zapisać bajty, przełączając się na @.. (Ponieważ nic po wywołaniu rekurencyjnym nigdy się nie uruchomi, mogę pisać, co chcę.)


Dzięki za tę odpowiedź! Nauczyłem się gs, @.a @@wnętrze @.wciąż mnie boli!
Christian Rondeau,

14

Pyth, 31 bajtów

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

Tłumacz ustny tutaj .

Loading GIF

Wyjaśnienie

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 bajtów

Wracając do Bytecount, od którego zacząłem!

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

Interfejs CLI w programie PowerShell nieco się zepsuje na niektórych komputerach, więc nie wygląda idealnie, ale jest tak dobry, jak to tylko możliwe.

Przeniesiono $ a ++ do pętli for, aby zapisać jeden bajt, (nie ;)

Następnie przeniosłem go do indeksu macierzy, aby zapisać kolejne 2 bajty, dzięki Romanowi za wskazanie tego.

Zapisano także jeszcze 1 bajt ( ;), przenosząc część Wyczyść ekran ( cls) w pętlę for.

Wskazany przez TimmyD problem i poprawka do nieskończonego aspektu pytania, wymagane tylko +5 Bajtów, zmienione $a++%4na ($a=++$a%4)tak, aby nigdy nie przekroczyło 3.

Zaoszczędzono kolejny bajt, pozostawiając pętlę for całkowicie pustą, dzięki „cokolwiek” za wskazanie, że jest to rzeczywiście możliwe w Powershell Version 4!

Nowa zaktualizowana gif dla (ostatecznej?) Wersji tej odpowiedzi.

Loading 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}(przejdź $a++do ostatniego użycia $a)
Roman Gräf

zawsze o czymś zapominam - dzięki za to!
colsw

2
Nie jestem zbyt biegły w Powershell, ale kiedy zobaczyłem wpis Windows Batch, pomyślałem: „Czy Powershell może to pokonać?”. I oto jest!
Jakub Jankowski

1
Przynajmniej na ps v4 powinieneś być w stanie zagrać w kolejny bajt, utrzymując warunek całkowicie pusty:for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}
cokolwiek

1
Nie ma za co. Wygląda na to, że działa dla wersji 2+, był zbyt leniwy, aby to sprawdzić wcześniej;)
cokolwiek

11

Pyth - 36 35 bajtów

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

Oczywiście nie działa online.


Czy masz tego gif w akcji? Czy jest też jakiś licznik, który mógłby się przepełnić?
FlipTack

@ Flp.Tkc jedynym licznikiem jest Zliczba całkowita python, która się nie przepełnia. Próbowałem zrobić gif, ale nie mogłem go uruchomić. Jeśli wiesz, jak go stworzyć, możesz go uruchomić za pomocą interpretera pyth
Maltysen

4
Jeśli liczba całkowita się nie przepełni, prawdopodobnie będzie rosła aż do zapełnienia całej pamięci, co spowodowałoby jej awarię co najmniej po 10 i pół roku w większości systemów 32-bitowych. Jasne, śmierć cieplna wszechświata nastąpi pierwsza, ale nadal ...
jjrv

11

Matlab, 78 75 bajtów

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

enter image description here



9

Mathematica, 74 67 bajtów

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

Ogromne 7 bajtów off dzięki @dahnoak


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

1
@dahnoak na zdrowie! Nie zdawałem sobie sprawy, że ListAnimate to rzecz. Szkoda, że <>Flat nie jest wymienny, w przeciwnym razie można zgolić jeszcze 4 bajty!
A Simmons,

Dla zabawy:Dynamic["Loading... "<>{"|","/","-","\\"}[[1+Round[4Now@"Second"]~Mod~4]],UpdateInterval->.25]
shrx

9

C #, 170 133 bajtów

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

Ogromne podziękowania dla Romana Gräfa i Raznagula, którzy uratowali mi 37 bajtów. (Zwłaszcza raznagul, który zauważył, że moje oryginalne rozwiązanie i tak było nieważne. Trochę mi tam coś brakowało, ale teraz jest naprawione i powinno spełniać wymagania :)

dość podobny do istniejącej odpowiedzi C # Pete Arden, ale z pewnymi ulepszeniami

np. „for (;;)” zamiast „while (true)”, char zamiast string

Skomentowałbym moje sugestie dotyczące jego odpowiedzi, ale tak naprawdę nie mam wystarczającej reputacji, aby to zrobić.

Nie golfowany:

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

2
Dlaczego nie usuniesz pierwszego Console.Write("\b");i nie zmienisz drugiego na Console.Write("\b"+a);?
Roman Gräf

Zdefiniowanie akcji jest niepotrzebne i zbyt długo używa się pętli podobnej foreach(var a in"|/-\\")do dodawania kodu, który aktualnie masz w akcji, ponieważ ciało zaoszczędzi Ci ~ 20 bajtów.
raznagul

Ponadto zadaniem jest dokładne utworzenie wymaganego wyniku. Co obecnie nie jest prawdą.
raznagul

Tak powinno być teraz, zapomniałem „|” i końcowe spacje po „Ładowanie ...”.
Snowfire

W wersji bez golfa (ponieważ nie pasuje do wersji z golfem) możesz usunąć pierwszą Console.Write()i użyć tylko jednej Console.Write($"Loading... {c}\r")zamiast drugiej.
mleko

9

Naprzód, 72, 73 bajty

EDYCJA :

  • Dodano wersję tylko Gforth, 69 bajtów (Thanks @ninjalj!)
  • Dodano brakujące białe znaki po „Ładowanie ...” (Thx @ Roman Gräf!), +1 bajt
  • Zaktualizowano w celu dokładniejszego dopasowania reguł (w tej samej liczbie bajtów)

Grał w golfa

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

Wersja Gforth

Wersję tylko dla GNU Forth można sprowadzić do 69 bajtów w następujący sposób:

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

Screencast

enter image description here

Wypróbuj online!


1
Ponieważ używasz gforth, jeśli nie zależy ci na przenośności do innych Forthów, możesz użyć definicji słowa [begin]i [again]poza nią.
ninjalj

9

Python 2, 81 79 78 77 bajtów

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

Całkiem proste rozwiązanie, które śpi przy użyciu time.

Używam \r(powrót karetki), aby wrócić do początku linii, a następnie wydrukować wiadomość zastępującą linię.

Zaczynam od i=1unikania podwójnego ucieczki \(To jest '\|/-'zamiast '|/-\\').

W przeszłości miałem -~ina myśli i + 1unikanie nawiasów. (Dzięki @ Flp.Tkc za te -2 bajty!) (Było i=(i+1)%4vs.i=-~i%4 )

Teraz pozwalam licznikowi rosnąć na zawsze, ponieważ technicznie rzecz biorąc, Python intnie może się przepełnić. Dzięki @Zachary T za wskazanie tego i zapisanie bajtu!
Zatrzymuje się tylko na komputerze, ponieważ zabrakło mu pamięci, ale zajmuje to 9,7 generacji z 4 GB pamięci dla tego int.

Dzięki @Kade za bajt -1, w którym print a,bwydruki ai bprzestrzeń były oddzielone, więc nie potrzebuję własnego miejsca.

Oto gif pracy w systemie Windows:

Loading

Przetestowałem to również na maszynie wirtualnej z systemem Linux. Nie mogłem przetestować tego na komputerze Mac.


1
Jeśli dobrze pamiętam, możesz użyć, i=-~i%4aby zapisać bajty dla parens :)
FlipTack

2
Nie zastępując [i],;i=-~i%4przy [i%4],;i+=1zapisać bajt, ponieważ nie przekracza max dla Pythona, tylko maksymalną pamięć?
Zacharý

9
Chciałbym podziękować za zalogowanie się jako Administrator...
Neil,

5
@Neil Szczerze mówiąc, po prostu umieściłem plik Python w Administratorze i uruchomiłem go stamtąd, ponieważ inne nazwy kont są prawdziwymi nazwami (PC).
Artyer

2
Pozwoliłbym na sugestię @ZacharyT, ponieważ technicznie liczby całkowite w Pythonie mogą być nieskończenie duże, o ile komputer ma pamięć do ich przechowywania
FlipTack

7

MATL , 36 bajtów

Usunięto 1 bajt przy użyciu idei @ flawr polegającej na okrągłym przesuwaniu łańcucha

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

Oto nagranie gif z kompilatora offline:

enter image description here

Lub spróbuj w MATL Online!Jeśli początkowo nie uruchomi się, odśwież stronę i ponownie naciśnij „Uruchom”.

Jak to działa

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

Cześć Luis. dobrze zrobione z MATL jak zawsze. Oto niewielka odmiana okrągłej listy. i wyświetlać. Czy uważasz, że możesz to przetłumaczyć w jeszcze krótszym rozwiązaniu:a='\|/-';k=1; fprintf('Loading... -') while 1 k=mod(k,4)+1; fprintf('\b\b%c\n',a(k)); pause(.25); end
Hoki,

@Hoki Dzięki za pomysł. Właściwie początkowo miałem rosnący licznik modulo 4, ale to było trochę dłużej (potem zyskałem bajt z powodu braku początkowej pauzy). Myślę też, że wyraźny ekran i normalne wyświetlanie jest krótsze niż w fprintfprzypadku backspace
Luis Mendo,

7

Dyalog APL, 50 bajtów

Działa to tylko w wersji Windows, ponieważ w przeciwnym razie ⎕SMokno nie będzie wyświetlane, chyba że ⎕SRzostanie wywołane.

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

Wyjaśnienie:

  • {... }1: uruchom funkcję zaczynając od⍵=1
  • Loading... '∘,¨'|/-\': wygeneruj cztery możliwe wyniki
  • ⊂⊃⍵⌽: Obróć listę, aby umieścić ⍵ty element na pierwszym miejscu, weź pierwszy element i zamknij go
  • ⎕SM←1 1,⍨: umieść ciąg w lewym górnym rogu ⎕SMokna.
  • ⎕DL÷4: poczekaj 1/4 sekundy
  • 4|⍵+⌈: zaokrąglij w górę uzyskaną wartość (sekundy spędzone na oczekiwaniu, więc zawsze jest to 1), dodaj ją do (zwiększając ją) i weź mod-4 (aby zapobiec jego ostatecznemu przepełnieniu).
  • : uruchom funkcję ponownie z nowym .

Animation


Jakoś wiedziałem, że ktoś prześle odpowiedź na to wyzwanie dla Dyalog (/ APL) :)
YoYoYonnY

7

C #, 187 bajtów

Gra w golfa:

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

Nie golfowany:

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

Wciąż czekam na załadowanie ...

enter image description here


Nadal czekam, aż wyświetli się „\”…
manatwork

@manatwork O cholera, leniwa kopia i wklejanie. Naprawię to, gdy wkrótce wrócę do mojego biurka :)
Pete Arden

Przykro mi, że moje rozwiązanie wydłuża się z powodu mojego komentarza. Nie możesz użyć 1>0zamiast trueprzywrócić go do 186?
manatwork

@ErikGolfer エ リ ッ ク ゴ ル フ ァ ー no, nie mam pojęcia o C #, ale biorąc pod uwagę fakt, że język jest kopią Java i najwyraźniej potwierdzony przez Can't cast int to bool , pomyślałem, że to nie zadziała. (BTW, jeśli to l()zadziała , może użycie pierwszego połączenia jako warunku również zadziałałoby?)
manatwork

2
@manatwork Cóż, wydaje się, że C # jest niezdolny do gry w golfa.
Erik the Outgolfer,

7

Snap !, 8 bloków

8 blocks of Snap!

To był jeden z pierwszych algorytmów, które kiedykolwiek zastanawiałem się na Apple] [np


1
Pokaż nam swój Applesoft BASIC :)
roblogic,

1
Z chęcią bym to zrobił w Hypercard.
wyldstallyns,

6

siatkowy, niekonkurencyjny, 40 bajtów

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

enter image description here

Zapomniałem popełnić wiele rzeczy, w tym w. No cóż.

Wyjaśnienie

: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 bajtów

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

Dziękujemy wielu ludziom za wiele bajtów!


Ponadto nie musisz uciekać przed odwrotnym ukośnikiem, jeśli używasz pojedynczych cudzysłowów, a argumenty za echo -e -nmożna łączyć zecho -en
Evan Chen

Możesz zapisać 2 linie i 13 bajtów, zastępując linię echa do:echo -en "\rLoading... ${s:i=(i+1)%4:1}"
Ipor Sircer

echo -enprintf; wykonać przypisanie do whilewarunku.
manatwork

używać printf jak manatwork powiedział uprościć podciąg, i umieścić go bezpośrednio w whilestanie: while printf "\rLoading... ${s:i++%4:1}";do. 67 bajtów
Dominik R

To nie zadziała, Dominik R., w końcu się przepełni.
Zacharý

6

Perl 6 , 72 61 bajtów

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

6

> <> , 55 + 4 = 59 bajtów

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

Musi biec -t .01 jako dodatkowy argument do interpretera, to jest +4 w liczbie bajtów.

Powoduje to umieszczenie czterech znaków do wydrukowania na stosie, wydrukowanie górnego bez wyjmowania go i przesunięcie stosu o jedną pozycję. Następnie drukuje\b (backspace, znak x08) i restartuje pętlę.

Czas jest osiągany przez argument przekazywany do interpretera, który zmusza do odczekania 0,01 sekundy przed wykonaniem każdej instrukcji. Pomiędzy wyjściem a następnym jest 23 instrukcji (większość z nich po prostu przenosi wskaźnik instrukcji do następnej komórki), więc będzie to czekało 0,23 sekundy plus czas potrzebny na wykonanie instrukcji, co bez problemu mieści się w wymaganych 0,25 s z 10% błędem.

Mógłbyś spróbować online , ale ten interpreter nie rozpoznaje znaku backspace, więc wynik będzie nieco dziwny.


Zazwyczaj podobne flagi -nsą oceniane jako 1 bajt, więc myślę, że możesz zdobyć argument jako t, .01czyli 4 bajty. Fajne zastosowanie reguły 10% btw :)
FlipTack

@ Flp.Tkc Dziękujemy! Nie byłem pewien, jak liczyć bajty na argument, podoba mi się ten sposób :)
Leo

@Leo - Czy istnieje powód, aby używać 0,01, a nie większego tiksa z mniejszą liczbą instrukcji? Dodałem moją wersję, która wykorzystuje pętlę 8 instrukcji i liczbę tyknięć 0,03; # "... gnidaoL" l?! vob0. „\ | / -”: o} 8o51. > #
Pelikan

@Tealpelican Istnieje powód, ale nie jest to bardzo dobry: zasady stwierdzają, że „Nie należy czekać 0,25 sekundy przed początkowym wyświetleniem wyniku - pierwsza ramka powinna zostać wydrukowana zaraz po uruchomieniu programu.”, Więc nie nie chcę, aby czas był zbyt długi, podczas gdy z drugiej strony jest to golf golfowy, więc nie chciałem, aby był zbyt krótki. Ostatecznie zdecydowałem się na pętlę 25 instrukcji, z których każda zajmuje 0,01 s, aby osiągnąć dokładny żądany czas 0,25 s; kiedy go zaimplementowałem, zdałem sobie sprawę, że brakuje mi miejsca na pełną pętlę, więc musiałem skorzystać z reguły 10%.
Leo

Musiałem źle odczytać zasady. To jest absolutnie dobry powód do pomiaru czasu :)
Teal pelikan

6

Plik MS-DOS .COM, 56 bajtów

Tutaj zawartość pliku w systemie szesnastkowym:

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

Pasujący kod asemblera wygląda następująco:

    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
Przytrzymanie wciśniętego klawisza przyspiesza działanie tarczy, którą można naprawić przez maskowanie przerwań innych niż przerwanie timera, np .:mov al, 0xfe / out 0x21,al
ninjalj

Komentarz do HLT jest błędny, prawdopodobnie miałeś na myśli, że HLT budzi się przy ~ 18,2 Hz (a dokładniej przy zegarze NTSC / 12/65536 Hz).
ninjalj

@ninjalj Thanks. Zmieniłem komentarz ...
Martin Rosenau,

6

NASM x86_64 - 349 283 bajtów

Powinien to być 64-bitowy system Linux

zbudowany przy użyciu:

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

animacja:

zapisano 65 bajtów - dzięki użytkownik254948

enter image description here



^ Flp. Tkc Dzięki, na końcu była linia ze spacją
Samuel

@Samuel czy potrzebne są linie 13-17? Bez tych linii wydaje się działać całkiem dobrze. O ile mogę powiedzieć (Obawiam się, że nie jest tak świetne w montażu) wydrukowałeś Ładowanie ..., a następnie | znak, następnie usuń ten znak, a następnie wprowadź pętlę, w której powtarzasz drukowanie | po raz pierwszy.
user254948,

@Samuel dodatkowo xor r8, r8 -> mov r8,0 (zapisuje 1 znak), niektóre MOV mają dodatkową spację (mov r7, 1 -> mov r7,1). ponadto instrukcje cmp r8,4, jl l, xor r8, r8 można zastąpić AND r8,3 (zapisując 15 znaków). Powinieneś mieć wtedy do 285 bajtów zamiast 349! (w połączeniu z liniami wymienionymi powyżej)
użytkownik254948,

5

R, 85 89 bajtów

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

Edycja: Naprawiono odpowiedź, która Tnie przepełnia się, resetując licznik, jeśli jest większy niż4 .

Jedynym interesującym aspektem o tej odpowiedzi jest wykorzystanie R za TRUTHYwbudowanego polecenia T. Jest to właściwie predefiniowany zestaw zmiennych, 1/TRUEco oznacza, że ​​nie musimy inicjować licznika, ale możemy zacząć zwiększać T.


Czy w Tkońcu się przepełni?
FlipTack,

@ Flp.Tkc Nie przepełni się, ale zostanie potraktowane jako przeszłość nieskończoności, 1e+308w którym NAto przypadku jest zwracana, więc chyba ta odpowiedź jest nieprawidłowa (nie zauważyłem jej w regułach). Wkrótce się zaktualizuje
Billywob,

1
W rzeczywistości możesz uzyskać go o 2 bajty krócej, jeśli nie używasz wbudowanego T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}ma 87 bajtów.
plannapus

Hmm ... czy R działa tylko na wektory? Dlaczego nie ma operatorów modulo lub bitowych dla atomów? jest Twektorem? Czy T=(T+1)%%4działa Oszczędzałoby to kolejne 5 bajtów.
Tytus

2
... lub T=T%%4+1: nawet 2 bajty krótsze.
Tytus,

5

Haskell (GHC), 103 91 bajtów

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

Dzięki @nimi za uratowanie 12 bajtów!


Nie potrzeba pełnego programu. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
nimi

Dwa bajty można zaoszczędzić dzięki zastosowaniu 10% tolerancji i zamianie 250000oraz spacji przed nią (4^9).
Christian Sievers

5

C (w systemach typu UNIX) 88 bajtów

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

Zaczyna się od niewłaściwej postaci, ale myślę, że wygląda ładniej. Możesz łatwo zmienić kolejność znaków, modyfikując „\ - / |” strunowy.


Można by dalej grać w golfa, przenosząc wyrażenia na for, np .: ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}, a następnie można grać w golfa dalej, zakładając obejście dla przepełnienia liczb całkowitych:main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
ninjalj

Czy potrzebujesz tam fflush ()?
John U

W większości systemów potrzebujesz flflush, wiele z nich buforuje w oparciu o znaki nowej linii. Możliwe jednak, że w niektórych systemach nie jest to konieczne.
LambdaBeta,

Możesz użyć fprintf(stderr,...zamiast tego, ponieważ nie jest to buforowane tak jak wiersz stdout. f...stderr,Trwa osiem znaków, podczas gdy fflush(0);trwa dziesięć, więc jest to wygrana netto z dwóch znaków.
cmaster

5

Perl, 71 63 61 bajtów

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

Poprzednia wersja:

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

Dzięki za @primo za 10 bajtów.


2
Fajny sposób na wykorzystanie selectlimitu czasu zamiast Time::HiRes. Możesz zapisać kilka bajtów, używając ... while$|=printi przesuwając łączniki w transliteracji na początek i na koniec. s//\r Loading... |/zapisuje również bajt nad przypisaniem.
primo

2
A także, jeśli używasz apostrofów dla ogranicznika transliteracji, nie ma potrzeby, aby uciec backslash albo: y'-\|/'\|/-'.
primo

Wygląda na to, że masz więcej miejsca przed kodem.
Erik the Outgolfer

1
Możesz zapisać kolejny bajt, używając literału \r.
ninjalj

1
Użyj y'-|\/'\/|-'/4zamiast .252 więcej.
primo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.