NASM x86_64 - 349 283 Byte

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... ",'$'
Martin Rosenau
quelle
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

Antworten:

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

Samuel
quelle
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.

Billywob
quelle
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!

Angs
quelle
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.

LambdaBeta
quelle
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.

Denis Ibaev
quelle
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