Laden ... für immer


106

Ihre Herausforderung besteht darin, einen unendlichen Ladebildschirm zu erstellen, der so aussieht:

Bildbeschreibung hier eingeben


Oder um genauer zu sein:

  • Nehmen Sie keine Eingabe.
  • Ausgabe Loading...mit nachgestelltem Leerzeichen, jedoch ohne nachgestellte Zeile.
  • Stufenlos zyklisch durch die Zeichen |, /, -und \: alle 0,25 Sekunden überschreiben die letzte mit der nächsten in der Sequenz. Sie können nur das letzte Zeichen überschreiben oder die gesamte Zeile löschen und neu schreiben, solange Loading...nichts geändert wird.

Regeln

  • Der Ausgabetext muss genau wie angegeben aussehen. Nachgestellte Zeilenumbrüche / Leerzeichen sind zulässig.
  • Sie sollten nicht 0,25 Sekunden warten, bevor Sie die Ausgabe zum ersten Mal anzeigen - das erste Bild sollte gedruckt werden, sobald das Programm ausgeführt wird.
  • Ihr Programm sollte auf unbestimmte Zeit ausgeführt werden können. Wenn Sie beispielsweise einen Zähler für Frames verwenden, sollte der Zähler niemals einen Fehler verursachen, indem er das Maximum in Ihrer Sprache überschreitet.
  • Obwohl die Wartezeit zwischen jedem "Frame" 0,25 Sekunden betragen sollte, wird dies offensichtlich niemals exakt sein - eine Fehlerspanne von etwa 10% ist zulässig.
  • Sie können eine Funktion übermitteln, diese muss jedoch an gesendet werden stdout.
  • Sie können eine Antwort in einer Nicht-Konsolenumgebung (aber immer noch textbasiert) senden, sofern die Ladeanimation erstellt werden kann.
  • Das ist , also gewinnt die kürzeste Lösung (in Bytes). Es gelten Standard-Code-Golf-Regelungslücken.
  • Geben Sie nach Möglichkeit ein GIF Ihres Ladebildschirms in Aktion an.

Beispiel

Hier ist der C ++ - Code, mit dem ich das Beispiel erstellt habe (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;
    }
}

Möge der beste Golfer gewinnen!


3
Können Einsendungen 0,25 Sekunden warten, bevor sie zum ersten Mal ausgegeben werden?
ETHproductions

2
Nein, aber danke für die Erwähnung, ich werde es zu den Regeln hinzufügen @ETHproductions
FlipTack

Ist ein abschließender Zeilenumbruch (nach dem animierenden Symbol) zulässig?
Kupfer

Natürlich :) @Copper
FlipTack

1
@TheBitByte bedeutet, dass theoretisch nichts in Ihrem Programm zu Fehlern führt - wie ein Zählerüberlauf oder das Erreichen der maximalen Rekursionstiefe.
FlipTack

Antworten:


76

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

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>

Bearbeiten: 3 Bytes dank @betseg gespeichert. 17 Bytes dank @manatwork eingespart. 1 Byte dank @Daniel gespeichert. 13 Bytes dank @Ismael Miguel gespeichert. 4 Bytes dank @Fez Vrasta gespeichert.


4
Laut Meta eignet sich CSS + HTML gut für die Beantwortung von Fragen. Außerdem habe ich dies in der Challenge-Beschreibung zugelassen. Also diese Antwort ist
absolut

5
HTML + CSS ist TC, deshalb verstehe ich nicht, warum es nicht konkurrierend sein könnte
TuxCrafting

1
@ TùxCräftîñg CSS ist definitiv nicht vollständig, da Sie das Problem des Anhaltens darin lösen können (Wenn es keine unendliche Animation gibt, hält es an). Ich denke, dasselbe gilt für HTML (wenn Sie nicht JS enthalten).
Artyer

4
@Artyer stackoverflow.com/a/5239256/3273184 ist eine Überlegung wert.
Mama Fun Roll

4
@MamaFunRoll In einem Kommentar zu diesem Beitrag wird erwähnt, dass dies den TC nicht wirklich beweist, da er ohne Benutzereingriff keine Schleife ausführen kann. Es kann jedoch diese besondere Herausforderung lösen, sodass ich mit dieser Antwort kein Problem sehe.
ETHproductions

57

Vim, 43 , 41 Bytes

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

Zwei Bytes gespart dank @Udioica!

Hier ist eine (etwas veraltete) Animation davon in Echtzeit!

Bildbeschreibung hier eingeben

Und hier ist eine Erklärung:

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
Nur Kuriositäten: Verstößt es gegen "Ihr Programm sollte auf unbestimmte Zeit ausgeführt werden können"? Kann es irgendwann zu einem Stapelüberlauf kommen? :)
Dan Oak

4
@dahnoak Nun, natürlich kann ich es nicht unendlich testen, aber es reserviert keinen zusätzlichen Speicher, so dass ich keinen Grund sehe, warum es nicht auf unbestimmte Zeit funktionieren würde.
DJMcMayhem

1
Wenn Sie izu Sdem Makro wechseln und es innerhalb des Makros verschieben, können Sie es überspringen r|.
udioica

2
@dahnoak Es gibt keinen Grund, warum die vi-Engine die Schwanzrekursion nicht bemerken konnte. Und einige Implementierungen der Rekursion würden dies natürlich tun (stellen Sie sich vor, es gäbe einen Vektor von auszuführenden Befehlen und einen aktuellen Ausführungsort). Dann @qwürden Sie den Inhalt des Registerskripts am aktuellen Ort einfügen q. Kein Stapel erforderlich und nein Speicher zugewiesen, es sei denn, es gibt Befehle, die nach @q innen ausgeführt werden müssen q.)
Yakk

Fast jedes Mal, wenn Sie eine Antwort auf eine Herausforderung posten, lerne ich etwas Neues (in diesem Fall @:und :sl), also danke und
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)

Schauen Sie sich auch meine 132-Byte-HTML / CSS-Antwort an.


Könnte dieser Überlauf i?
Zacharý

Ja, irgendwann würde es. Das wurde behoben!
Darrylyeo

1
Können Sie ersetzen i++,i%=4mit i=-~i%4für ein Byte?
Zacharý

2
@Xufox Das <pre>einzige, was sichergestellt ist, ist, dass eine monospaced Schriftart verwendet wird, damit chEinheiten funktionieren. Die Regeln erwähnen nichts über die verwendete Schriftfamilie. ;)
darrylyeo

1
Wenn ich mich nicht irre, ist das erste von JS gedruckte Zeichen das letzte in der Zeichenfolge. also solltest du mit initialisieren -anstatt mit /. Oder mit initialisieren |und durchschleifen '-\\|/'. Nettes Inkrement.
Titus

21

Windows Batch, 121 114 84 80 79 78 Bytes

Einfach aus Spaß rausschmeißen.

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

Ich konnte |dem Array kein pipe ( ) zuweisen , daher musste ich es manuell mit einer anderen Zuweisung hinzufügen.Die Verzögerung wird mit ausgeführt PING, was möglicherweise nicht genau ist .

Ausgabe:

Bildbeschreibung hier eingeben

Bearbeiten:

  • Vielen Dank an Roman Gräf für das Speichern von 7 Bytes!
  • Vielen Dank an Neil für das Speichern von 30 Bytes! Ich habe es auch ein bisschen mehr entstellt, um Bytes in den Zeilenumbrüchen zu sparen.
  • Danke an phyrfox für das Speichern von 4 Bytes!
  • Danke an YourDeathIsComing für das Sparen von 2 Bytes!

3
Sie können entfernen @echo offein und setzen @vor jeder setoder echoKommando
Roman Gräf

1
Sie brauchen das Array nicht, in (/ - \ ^|)funktioniert. Außerdem ist% 0 ein kürzerer Weg zum Schleifen als goto.
Neil

2
Sie sollten in der Lage sein, die IP-Adresse "1.1" (-4 Byte) zu verwenden, da die meisten Plattformen diese automatisch auf 1.0.0.1 erweitern.
Phyrfox

1
Sie können 1 Byte sparen, indem Sie das Leerzeichen vor entfernen >nul.
YourDeathIsComing

1
Ich meinte den Raum davor, nicht danach.
YourDeathIsComing

20

Knoten, 72-70 Bytes

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

Ersetzen Sie \x1Bdurch das Escape-Zeichen, um die richtige Byteanzahl zu erhalten. Rufen Sie f()an, um die Animation zu starten. So sieht es im ConEmu-Terminalemulator auf meinem Computer aus:

Bildbeschreibung hier eingeben


Versuchen Sie es mit \033c(durch \033die tatsächliche Zeichendarstellung ersetzen ). Es sieht nicht so gut aus, spart aber einige Bytes.
Mama Fun Roll

Wird nicht iüberlaufen?
Zacharý

12
@ ZacharyT Es wird nach 71 Millionen Jahren sein, aber ich kann das nötigenfalls beheben
ETHproductions

3
"Ihr Programm sollte auf unbestimmte Zeit ausgeführt werden können. Wenn Sie beispielsweise einen Zähler für Frames verwenden, sollte der Zähler niemals einen Fehler verursachen, indem er das Maximum in Ihrer Sprache überschreitet.", Ja, das ist erforderlich.
Zacharý

3
@Florent Aber dann würde es nicht auf Node laufen
;-)

14

Kotlin, 67 66 Bytes

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

Bildbeschreibung hier eingeben

Ziemlich selbsterklärend, \rum die Linie zu löschen und Kotlins fantastische String-Interpolation zu nutzen.

BEARBEITEN: 1 Byte dank @ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu durch Ändern while(true)von gespeichertwhile(1>0)


1
Sie könnten ein Byte sparen, indem Sie while(1>0)anstelle von while(true)(-1) & verwenden, und sollten wahrscheinlich die tatsächliche Funktionssyntax in Ihre Antwort aufnehmen ( fun a(){<code>}, +9). Wenn Sie ein bisschen schummeln wollen, können Sie eine Funktion als Variable speichern ( val a={<code>}, +8).
F. George

2
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu Ist der Modus 'Volles Programm' nicht akzeptabel? Dies kann als Kotlin-Skript .ktsohne Klassen- oder Funktionsdefinitionen ausgeführt werden. Auch ein toller Anruf mit while(1>0)!
Tyler MacDonell

3
Aber was ist, wenn eines Tages 0 größer als 1 wird? : P
FlipTack

Tolle Idee, ein Kotlin-Skript zu verwenden. @ Flp.Tkc Ihr Kommentar hat mich daran erinnert: codegolf.stackexchange.com/a/101131/62024 . Es schaudert immer noch, dass dies möglich ist.
F. George

@ TylerMacDonell Wirklich? Ich wusste nicht, dass Sie Kotlin direkt als Skript ausführen können. Danke für die Information.
TheNumberOne

14

Vim, 35 Bytes

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

Die langweilige Version. Hier ist eine nicht konforme Lösung, die besser ist:

Vim (1 Sekunde Schlaf), 27 Bytes

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

Die Verwendung von ist gsnicht nur viel kürzer, sondern Sie müssen auch nicht die Eingabetaste drücken. Das bedeutet, dass das Makro in die Zeile passt und ich durch Umschalten auf Bytes sparen kann @.. (Da nach dem rekursiven Aufruf nichts mehr ausgeführt werden kann, kann ich eingeben, was ich will.)


Danke für diese Antwort! Ich habe gelernt gs, @.und das @@Innere @.macht immer noch meinen Kopf weh!
Christian Rondeau

14

Pyth, 31 Bytes

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

Dolmetscher hier .

Laden von GIF

Erläuterung

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 Bytes

Zurück beim Bytecount, mit dem ich angefangen habe!

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

Die CLI in Powershell wird auf einigen Computern leicht fehlerhaft sein, sodass sie nicht perfekt aussieht, aber so gut, wie ich es mir vorstellen kann.

$ A ++ in die for-Schleife verschoben, um ein Byte zu speichern (nein ;)

Verschob es dann in den Array-Indexer, um weitere 2 Byte zu sparen, danke an Roman, der darauf hingewiesen hat.

Sie können auch 1 weiteres Byte ( ;) speichern, indem Sie den Teil Clear screen ( cls) in die for-Schleife verschieben.

Problem und Fehlerbehebung, auf die TimmyD für den unendlichen Aspekt der Frage hingewiesen hat, nur +5 Bytes erforderlich, geändert $a++%4in, ($a=++$a%4)sodass es niemals über 3 hinausgeht .

Sie haben ein weiteres Byte gespeichert, indem Sie die for-Schleife leer gelassen haben, dank 'whatever', um darauf hinzuweisen, dass dies in Powershell Version 4 tatsächlich möglich ist!

Neues aktualisiertes GIF für die (endgültige?) Version dieser Antwort.

Lade 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}(verschieben Sie die $a++zur letzten Verwendung von $a)
Roman Gräf

immer etwas vergessen - danke dafür!
Colsw

2
Ich bin nicht sehr geschickt in Powershell, aber als ich den Windows Batch-Eintrag sah, dachte ich "Könnte Powershell das schlagen?". Und hier ist es!
Jakub Jankowski

1
Zumindest auf ps v4 sollten Sie in der Lage sein, ein weiteres Byte zu spielen, indem Sie die for-Bedingung vollständig leer lassen:for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}
Was auch immer

1
Bitte. Es scheint tatsächlich für Version 2+ zu funktionieren, war einfach zu faul, um es vorher zu überprüfen;)
egal

11

Pyth - 36 35 Bytes

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

Funktioniert natürlich nicht online.


Hast du ein GIF davon in Aktion? Gibt es auch einen Zähler, der überlaufen könnte?
FlipTack

@ Flp.Tkc Der einzige Zähler ist Zeine Python-Ganzzahl, die nicht überläuft. Ich habe versucht, ein GIF zu machen, konnte es aber nicht zum Laufen bringen. Wenn Sie wissen, wie man einen erstellt, können Sie ihn mit dem Pyth-Interpreter unter github.com/isaacg1/pyth
Maltysen 29.11.16

4
Wenn die Ganzzahl nicht überläuft, wächst sie wahrscheinlich, bis der gesamte Speicher voll ist, was dazu führen würde, dass sie auf den meisten 32-Bit-Systemen mindestens nach 10½ Jahren ausfällt. Sicher, der Hitzetod des Universums wird zuerst eintreten, aber immer noch ...
1.

11

Matlab, 78 75 Bytes

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

Bildbeschreibung hier eingeben



9

Mathematica, 74 67 Bytes

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

Satte 7 Bytes weniger dank @dahnoak


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

1
@dahnoak Prost! Mir war nicht klar, dass ListAnimate eine Sache ist. Es ist eine Schande, dass <>Flat nicht auflistbar ist, sonst könnten 4 weitere Bytes abgeschabt werden!
Ein Simmons

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

9

C #, 170 133 Bytes

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

Ein großes Dankeschön an Roman Gräf und raznagul, die mir 37 Bytes gerettet haben. (Besonders raznagul, der darauf hinwies, dass meine ursprüngliche Lösung sowieso ungültig war. Ich habe dort etwas verpasst, aber es ist jetzt behoben und sollte die Anforderungen erfüllen :)

ziemlich ähnlich zu Pete Ardens bestehender C # -Antwort, aber mit einigen Verbesserungen

zB "for (;;)" anstelle von "while (true)", char anstelle von string

Ich hätte meine Vorschläge zu seiner Antwort kommentiert, aber ich habe nicht genug Ruf, um das zu tun.

Ungolfed:

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

2
Warum nicht die erste entfernen Console.Write("\b");und die zweite in ändern Console.Write("\b"+a);?
Roman Gräf

Das Definieren einer Aktion ist nicht erforderlich. Wenn Sie zu lange eine Schleife verwenden foreach(var a in"|/-\\")und den Code hinzufügen, den Sie derzeit in der Aktion haben, da der Text Ihnen ~ 20 Bytes spart.
Raznagul

Außerdem besteht die Aufgabe darin, die erforderliche Ausgabe exakt zu erstellen. Welches ist derzeit nicht der Fall.
Raznagul

Es sollte jetzt so sein, ich habe '|' und das nachfolgende Leerzeichen nach "Loading ...".
Schneefeuer

In Ihrer ungolfed-Version (da sie nicht zur golfed-Version passt) können Sie die erste entfernen Console.Write()und nur eine Console.Write($"Loading... {c}\r")anstelle der zweiten verwenden.
Milch

9

Forth, 7273 Bytes

EDIT :

  • Hinzugefügt die Gforth-only-Version, 69 Bytes (Danke @ninjalj!)
  • Fehlendes Leerzeichen nach "Loading ..." hinzugefügt (Thx @Roman Gräf!), +1 Byte
  • Aktualisiert, um den Regeln genauer zu entsprechen (in derselben Byteanzahl)

Golf gespielt

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

Gforth-Version

Die GNU Forth-only-Version kann wie folgt auf 69 Bytes reduziert werden:

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

Screencast

Bildbeschreibung hier eingeben

Probieren Sie es online!


1
Da Sie gforth verwenden, wenn Sie nicht über die Portabilität auf andere Forth ist es egal, können Sie [begin]und [again]eine Wortdefinition außerhalb.
Ninjalj

9

Python 2, 81 79 78 77 Bytes

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

Eine ganz einfache Lösung, mit der man schläft time.

Ich benutze \r(Wagenrücklauf), um zum Zeilenanfang zurückzukehren und dann die Nachricht auszudrucken, die die Zeile überschreibt.

Ich beginne mit i=1Doppel zu vermeiden Flucht der \(Es ist '\|/-'statt '|/-\\').

Früher hatte ich -~igemeint i + 1, Klammern zu vermeiden. (Danke an @ Flp.Tkc für diese -2 Bytes!) (Es war i=(i+1)%4vs. i=-~i%4)

Jetzt lasse ich nur den Zähler für immer steigen, da Pythons technisch intnicht überlaufen können. Vielen Dank an @Zachary T für den Hinweis und das Speichern eines Bytes!
Es wird nur auf einem Computer angehalten, weil auf dem Computer nicht mehr genügend Arbeitsspeicher vorhanden ist. Für diesen Computer sind jedoch 9,7 Generationen mit 4 GB Arbeitsspeicher erforderlich int.

Dank an @Kade für das -1-Byte, bei dem print a,bDrucke aund bSpeicherplatz getrennt sind, sodass ich keinen eigenen Speicherplatz benötige.

Hier ist ein GIF davon, das unter Windows funktioniert:

Wird geladen

Ich habe es auch auf einer Linux-VM getestet. Ich konnte es nicht auf einem Mac testen.


1
Wenn ich mich richtig erinnere, können Sie verwenden i=-~i%4, um die Bytes für die Parens zu speichern :)
FlipTack

2
Ersetzt man nicht [i],;i=-~i%4mit [i%4],;i+=1save a byte, da das Maximum für Python nicht überschritten wird, nur der maximale Arbeitsspeicher?
Zacharý

9
Ich sollte Sie dafür abstimmen, dass Sie sich als Administrator...
Neil

5
@Neil Um ganz ehrlich zu sein, habe ich die Python-Datei einfach in Administrator abgelegt und von dort ausgeführt, da die anderen Kontonamen echte Namen sind (Personal PC).
Artyer

2
Ich würde @ZacharyTs Vorschlag erlauben, da technisch gesehen Python-Ganzzahlen unendlich groß sein können, solange der Computer Speicher für sie hat
FlipTack

7

MATL , 36 Bytes

1 Byte entfernt mit der Idee von @ flawr , den String zirkulär zu verschieben

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

Hier ist eine GIF-Aufnahme vom Offline-Compiler:

Bildbeschreibung hier eingeben

Oder probieren Sie es bei MATL Online! Wenn es anfänglich nicht ausgeführt wird, aktualisieren Sie die Seite und klicken Sie erneut auf "Ausführen".

Wie es funktioniert

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

Hey Luis. gut gemacht mit MATL wie immer. Hier ist eine kleine Variation der Zirkelliste. und anzeigen. Glauben Sie, Sie könnten das in einer noch kürzeren Lösung übersetzen:a='\|/-';k=1; fprintf('Loading... -') while 1 k=mod(k,4)+1; fprintf('\b\b%c\n',a(k)); pause(.25); end
Hoki

@Hoki Danke für die Idee. Eigentlich hatte ich anfangs ein zunehmendes Counter Modulo 4, aber es war etwas länger (ich habe dann ein Byte gewonnen, weil keine anfängliche Pause erforderlich war). Außerdem denke ich, klarer Bildschirm und normale Anzeige ist kürzer als fprintfmit Leerzeichen
Luis Mendo

7

Dyalog APL, 50 Bytes

Dies funktioniert nur in der Windows-Version, da das ⎕SMFenster sonst nur angezeigt wird, wenn ⎕SRes aufgerufen wird.

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

Erläuterung:

  • {... }1: führe die Funktion beginnend mit aus⍵=1
  • Loading... '∘,¨'|/-\': Die vier möglichen Ausgaben erzeugen
  • ⊂⊃⍵⌽: Drehen Sie die Liste, um das ⍵te Element an die erste Stelle zu setzen, nehmen Sie das erste Element und schließen Sie es ein
  • ⎕SM←1 1,⍨: Lege den String in die obere linke Ecke des ⎕SMFensters.
  • ⎕DL÷4: warte 1/4 Sekunde
  • 4|⍵+⌈: Runden Sie den resultierenden Wert auf (Sekunden Wartezeit, also immer 1), addieren Sie ihn zu (inkrementieren Sie ihn) und nehmen Sie den Mod-4 (um zu verhindern, dass er irgendwann überläuft).
  • : Führen Sie die Funktion erneut mit dem neuen aus .

Animation


Irgendwie wusste ich, dass jemand eine Antwort für diese Herausforderung für Dyalog (/ APL) einreichen würde :)
YoYoYonnY

7

C #, 187 Bytes

Golf gespielt:

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

Ungolfed:

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

Ich warte immer noch darauf, dass es geladen wird ...

Bildbeschreibung hier eingeben


Ich

@manatwork Oh Mist, faul kopieren und einfügen. Wird behoben, wenn ich in Kürze wieder an meinem Schreibtisch bin :)
Pete Arden

Es tut mir leid, dass Ihre Lösung aufgrund meines Kommentars länger wird. Kannst du es nicht benutzen 1>0anstatt truees auf 186 zurückzubringen?
Manatwork

@ErikGolfer エ エ リ ッ ク ゴ ル フ, keine Ahnung von C #, aber basierend auf der Tatsache, dass die Sprache eine Kopie von Java ist und anscheinend von Can't cast int to bool bestätigt wurde , dachte ich, das würde nicht funktionieren. (Übrigens, wenn das funktioniert, könnte es auch funktionieren, den ersten Aufruf von l()as condition zu verwenden?)
manatwork

2
@manatwork Nun, es scheint, C # ist nicht golffähig.
Erik der Outgolfer

7

Fang !, 8 Blöcke

8 Blöcke von Snap!

Dies war einer der allerersten Algorithmen, die ich jemals auf einem Apple ausprobiert habe] [e


1
Zeigen Sie uns Ihre Applesoft BASIC :)
Roblogic

1
Ich würde diese gerne in Hypercard machen.
Wyldstallyns

6

netzförmig, nicht konkurrierend, 40 Bytes

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

Bildbeschreibung hier eingeben

Ich habe vergessen, eine Reihe von Dingen zu begehen, einschließlich w. Naja.

Erläuterung

: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 bis 69 Bytes

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

Vielen Dank an viele Leute für die vielen Bytes!


Sie müssen sich auch nicht dem Backslash entziehen, wenn Sie einfache Anführungszeichen verwenden und die Argumente fürecho -e -necho -en
Evan Chen

Sie können 2 Zeilen und 13 Byte speichern, indem Sie die echo -en "\rLoading... ${s:i=(i+1)%4:1}"
Echozeile wie folgt

echo -enprintf; Machen Sie die Zuordnung zu s der whileBedingung.
Manatwork

benutze printf wie gesagt, vereinfache den Teilstring und lege ihn direkt in den while Zustand: while printf "\rLoading... ${s:i++%4:1}";do. 67 Bytes
Dominik R

Das klappt nicht Dominik R, es würde irgendwann überlaufen.
Zacharý

6

Perl 6 , 72 61 Bytes

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

6

> <> , 55 + 4 = 59 Bytes

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

Muss -t .01als zusätzliches Argument an den Interpreter übergeben werden, das ist die +4 in der Byteanzahl.

Dies setzt die vier zu druckenden Zeichen auf den Stapel, druckt das oberste, ohne es zu entfernen, und verschiebt den Stapel um eine Position. Dann wird gedruckt \b(Rücktaste, Zeichen x08) und die Schleife neu gestartet.

Das Timing wird durch das an den Interpreter übergebene Argument erreicht, das eine Wartezeit von 0,01 Sekunden vor der Ausführung der einzelnen Befehle erzwingt. Es gibt 23 Anweisungen zwischen einer Ausgabe und der nächsten (die meisten von ihnen bewegen einfach den Anweisungszeiger zur nächsten Zelle), so dass dies 0,23 Sekunden plus der für die Ausführung der Anweisungen erforderlichen Zeit wartet, die problemlos in die angeforderten 0,25 Sekunden passt mit 10% Fehler.

Sie könnten es online versuchen , aber dieser Interpreter erkennt das Backspace-Zeichen nicht, so dass die Ausgabe dort etwas seltsam sein wird.


Normalerweise mag Flags -nals 1 Byte hat, so dass ich denke , das Argument punkten kann wie t, .01die 4 Byte. Gute Verwendung der 10% -Regel übrigens :)
FlipTack

@ Flp.Tkc Danke! Ich war mir nicht sicher, wie ich die Bytes für das Argument zählen sollte, das gefällt mir :)
Leo

@Leo - Gibt es einen Grund für die Verwendung von 0,01 und nicht ein größeres Häkchen mit weniger Anweisungen? Ich habe meine Version hinzugefügt, die eine Schleife mit 8 Anweisungen und eine Tickanzahl von 0,03 verwendet. # "... gnidaoL" l?! vob0. "\ | / -": o} 8o51. > #
Teal

@Tealpelican Es gibt einen Grund, aber es ist kein sehr guter Grund: Die Regeln besagen, dass "Sie nicht 0,25 Sekunden warten sollten, bevor die Ausgabe anfänglich angezeigt wird - der erste Frame sollte gedruckt werden, sobald das Programm ausgeführt wird." Ich möchte den Timer nicht zu lang machen, während dies andererseits Codegolf ist, also wollte ich ihn nicht zu kurz machen. Am Ende entschied ich mich für eine 25 Instruktionsschleife, die jeweils 0,01 Sekunden benötigt, um das genaue Timing von 0,25 Sekunden zu erreichen. Als ich es implementierte, stellte ich jedoch fest, dass ich nicht genug Platz für die vollständige Schleife hatte, sodass ich auf die 10% -Regel zurückgreifen musste.
Leo

Ich muss die Regeln falsch verstanden haben. Das ist ein guter Grund für das Timing :)
Teal

6

MS-DOS-COM-Datei, 56 Byte

Hier der Dateiinhalt in hexadezimaler Schreibweise:

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

Der übereinstimmende Assembler-Code sieht folgendermaßen aus:

    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
Eine Taste gedrückt halten beschleunigt die Spinner, die durch Maskierung andere unterbricht fixiert werden kann als der Timer - Interrupt, zB:mov al, 0xfe / out 0x21,al
ninjalj

Der Kommentar für HLT ist falsch, Sie meinten wahrscheinlich, dass HLT mit ~ 18,2 Hz aufwacht (genauer gesagt mit NTSC-Takt / 12/65536 Hz).
Ninjalj

@ ninjalj Danke. Ich habe den Kommentar geändert ...
Martin Rosenau

6

NASM x86_64 - 349 283 Byte

Dies sollte 64-Bit-Linux-Systeme ausgeführt werden

gebaut mit:

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

Animation:

65 Bytes gespart - danke user254948

Bildbeschreibung hier eingeben


Ich zähle 349 Bytes, es sei denn, es gibt einen abschließenden Zeilenumbruch / Leerzeichen
FlipTack

^ Flp. Tkc Danke, es gab eine Zeile mit einem Leerzeichen am Ende
Samuel

@Samuel werden die Zeilen 13-17 benötigt? Ohne diese Zeilen scheint es ziemlich gut zu funktionieren. Soweit ich das beurteilen kann (leider nicht so toll in der Montage) druckt ihr das Loading ...., dann das | Zeichen, dann entfernen Sie dieses Zeichen, und geben Sie eine Schleife ein, in der Sie den Druckvorgang wiederholen zum ersten Mal.
user254948

@Samuel zusätzlich xor r8, r8 -> mov r8,0 (spart 1 Zeichen), einige MOVs haben ein zusätzliches Leerzeichen (mov r7, 1 -> mov r7,1). Außerdem können die Anweisungen cmp r8,4, jll, xor r8, r8 durch AND r8,3 ersetzt werden (15 Zeichen werden gespeichert). Sie sollten dann statt 349 auf 285 Bytes reduziert sein! (in Kombination mit den oben erwähnten Zeilen)
user254948

5

R 85 89 Bytes

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

Bearbeiten: Die Antwort wurde so Tkorrigiert, dass sie nicht überläuft, wenn der Zähler zurückgesetzt wird 4.

Der einzig interessante Aspekt bei dieser Antwort ist die Verwendung von TRUTHYRs eingebautem Code T. Es ist praktisch ein vordefinierter Variablensatz, 1/TRUEdh wir müssen den Zähler nicht initialisieren, sondern können mit dem Inkrementieren beginnen T.


Würde Tirgendwann überlaufen?
FlipTack

@ Flp.Tkc Es würde nicht überlaufen, sondern als unendliche Vergangenheit behandelt werden. 1e+308In diesem Fall NAwird es zurückgegeben. Ich denke, diese Antwort ist dann ungültig (habe es in den Regeln nicht bemerkt). Wird bald aktualisiert
Billywob

1
Tatsächlich können Sie es 2 Bytes kürzer bekommen, wenn Sie das eingebaute nicht verwenden T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}ist 87 Bytes.
Plannapus

Hmm ... funktioniert R nur mit Vektoren? Warum gibt es keine Modulo- oder Bitoperatoren für Atome? ist Tein Vektor? Hat T=(T+1)%%4zu arbeiten? Es würden weitere 5 Bytes eingespart.
Titus

2
... oder T=T%%4+1: noch 2 Bytes kürzer.
Titus

5

Haskell (GHC), 103-91 Bytes

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

Vielen Dank an @nimi für das Speichern von 12 Bytes!


Kein komplettes Programm erforderlich. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
nimi

Zwei Bytes können durch Verwendung der Toleranz 10% und durch Ersetzen 250000und des Leerzeichens davor mit gespart werden (4^9).
Christian Sievers

5

C (auf UNIX-ähnlichen Systemen) 88 Byte

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

Es beginnt mit dem falschen Charakter, aber ich denke, es sieht schöner aus. Sie können die Zeichenreihenfolge ganz einfach ändern, indem Sie "\ - / |" Zeichenfolge.


Könnte durch Verschieben von Anweisungen in forz. B .: ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}weiter golfen werden, könnte dann unter der Annahme eines Umlaufs für einen Ganzzahlüberlauf weiter golfen werden:main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
ninjalj

Haben Sie benötigen die fflush () da drin?
John U

Auf den meisten Systemen benötigen Sie den Befehl fflush, von denen viele auf Zeilenumbrüchen basieren. Es ist jedoch möglich, dass dies auf einigen Systemen nicht erforderlich ist.
LambdaBeta

Du könntest fprintf(stderr,...stattdessen verwenden, da das nicht zeilengepuffert ist wie stdout. Der f...stderr,dauert acht Zeichen, während der fflush(0);dauert zehn, so ist es ein Nettogewinn von zwei Zeichen.
cmaster

5

Perl, 71 63 61 Bytes

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

Vorherige Version:

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

Vielen Dank an @primo für 10 Bytes.


2
Nizza Trick, um die selectAuszeit zu verwenden, anstatt Time::HiRes. Sie können einige Bytes einsparen ... while$|=print, indem Sie die Bindestriche in der Transliteration nach vorne und nach hinten verschieben. s//\r Loading... |/Speichert auch ein Byte über Zuweisung.
Primo

2
Und auch, wenn Sie einfache Anführungszeichen für die Umschrift Trennzeichen verwenden, gibt es keine Notwendigkeit , den umgekehrten Schrägstrich zu entkommen entweder: y'-\|/'\|/-'.
Primo

Es scheint, dass Sie vor Ihrem Code ein zusätzliches Leerzeichen haben.
Erik der Outgolfer

1
Sie können ein weiteres Byte mit einem Literal speichern \r.
Ninjalj

1
Verwenden Sie y'-|\/'\/|-'/4anstelle von .25für 2 weitere.
Primo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.