NASM x86_64 - 349 283 bajtów

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... ",'$'
Martin Rosenau
źródło
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,

Odpowiedzi:

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

Samuel
źródło
Zliczam
^ 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.

Billywob
źródło
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!

Angs
źródło
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.

LambdaBeta
źródło
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.

Denis Ibaev
źródło
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