NASM x86_64 - 349283 bytes

6

Archivo .COM de MS-DOS, 56 bytes

Aquí el contenido del archivo en hexadecimal:

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

El código del ensamblador correspondiente se ve así:

    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
fuente
1
Mantener presionada una tecla acelera la rueda giratoria, que se puede solucionar enmascarando interrupciones que no sean la interrupción del temporizador, por ejemplo:mov al, 0xfe / out 0x21,al
ninjalj
El comentario para HLT es incorrecto, probablemente quisiste decir que HLT se despierta a ~ 18,2 Hz (o, más precisamente, en el reloj NTSC / 12/65536 Hz).
ninjalj
@ninjalj Gracias. Cambié el comentario ...
Martin Rosenau

Respuestas:

6

NASM x86_64 - 349283 bytes

Esto debería ejecutarse en sistemas Linux de 64 bits

construido usando:

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

animación:

ahorró 65 bytes - gracias user254948

ingrese la descripción de la imagen aquí

Samuel
fuente
Cuento
^ Flp. Gracias por confirmar, había una línea con un espacio al final
Samuel
@Samuel, ¿son necesarias las líneas 13-17? Parece funcionar bastante bien sin esas líneas. Por lo que puedo decir (no es tan bueno en el montaje, me temo) imprime el Cargando ..., luego el | carácter, luego elimine ese carácter, luego ingrese un bucle donde repita la impresión del | por primera vez.
user254948
@Samuel además xor r8, r8 -> mov r8,0 (ahorra 1 personaje), algunos MOV tienen un espacio extra (mov r7, 1 -> mov r7,1). Además, las instrucciones cmp r8,4, jl l, xor r8, r8, se pueden reemplazar por AND r8,3 (ahorrando 15 caracteres). ¡Deberías reducir a 285 bytes en lugar de 349! (en combinación con las líneas mencionadas anteriormente)
user254948
5

R, 85 89 bytes

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

Editar: se corrigió la respuesta de modo que Tno se desborde restableciendo el contador si es mayor que 4.

El único aspecto interesante de esta respuesta es el uso de R's TRUTHYincorporado T. Es efectivamente un conjunto de variables predefinido, lo 1/TRUEque significa que no tenemos que inicializar el contador, pero podemos comenzar a incrementarlo T.

Billywob
fuente
Sería Teventualmente desbordar?
FlipTack
@ Flp.Tkc No se desbordaría, pero se trataría como un pasado infinito, 1e+308en cuyo caso NAse devuelve, así que supongo que esta respuesta no es válida en ese momento (no lo noté en las reglas). Se actualizará pronto
Billywob
1
En realidad, puede obtener 2 bytes más cortos si no utiliza el incorporado T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}es 87 bytes.
plannapus
Hmm ... ¿R solo opera en vectores? ¿Por qué no hay módulos o operadores bit a bit para los átomos? es Tun vector? Funciona T=(T+1)%%4? Ahorraría otros 5 bytes.
Titus
2
... o T=T%%4+1: incluso 2 bytes más cortos.
Titus
5

Haskell (GHC), 103 91 bytes

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

¡Gracias @nimi por guardar 12 bytes!

Angs
fuente
No es necesario un programa completo. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
nimi
Se pueden guardar dos bytes utilizando el 10% de tolerancia y el reemplazo 250000y el espacio anterior (4^9).
Christian Sievers
5

C (en sistemas tipo UNIX) 88 bytes

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

Comienza con el personaje equivocado, pero creo que se ve mejor. Puede cambiar fácilmente el orden de los caracteres modificando "\ - / |" cuerda.

LambdaBeta
fuente
Podría jugar más golf moviendo las declaraciones a for, por ejemplo ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}, luego podría jugar golf más aún asumiendo un envoltorio para el desbordamiento de enteros:main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
ninjalj
¿ Necesitas el fflush () allí?
John U
En la mayoría de los sistemas, necesita el fflush, muchos de ellos almacenados en búfer basados ​​en nuevas líneas. Sin embargo, es posible que no sea necesario en algunos sistemas.
LambdaBeta
En su fprintf(stderr,...lugar, podría usarlo , ya que esa no es una línea de búfer como stdout. La f...stderr,toma de ocho caracteres, mientras que la fflush(0);toma de diez, así que es una ganancia neta de dos caracteres.
cmaster
5

Perl, 71 63 61 bytes

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

Versión previa:

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

Gracias a @primo por 10 bytes.

Denis Ibaev
fuente
2
Buen truco para usar el selecttiempo de espera en lugar de Time::HiRes. Puede guardar algunos bytes utilizando ... while$|=printy moviendo los guiones en la transliteración al frente y al final. s//\r Loading... |/También guarda un byte sobre la asignación.
primo
2
Y también, si utiliza comillas simples para el delimitador de transliteración, no hay necesidad de escapar de la barra invertida o bien: y'-\|/'\|/-'.
primo
Parece que tienes un espacio extra antes de tu código.
Erik the Outgolfer
1
Puede guardar otro byte utilizando un literal \r.
ninjalj
1
Use y'-|\/'\/|-'/4en lugar de .25por 2 más.
primo