NASM x86_64 - 349 283 octets

6

Fichier .COM MS-DOS, 56 octets

Voici le contenu du fichier en hexadécimal:

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

Le code assembleur correspondant ressemble à ceci:

    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
la source
1
Maintenir la touche enfoncée accélère la mov al, 0xfe / out 0x21,al
rotation du disque
Le commentaire pour HLT est erroné, vous vouliez probablement dire que HLT se réveille à environ 18,2 Hz (ou, plus précisément, à l'horloge NTSC / 12/65536 Hz).
Ninjalj
@ninjalj Merci. J'ai changé le commentaire ...
Martin Rosenau

Réponses:

6

NASM x86_64 - 349 283 octets

Cela devrait être exécuté systèmes linux 64 bits

construit en utilisant:

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:

enregistré 65 octets - merci utilisateur254948

entrez la description de l'image ici

Samuel
la source
Je compte 349 octets, sauf s'il y a un
retour à la
^ Flp. Merci, il y avait une ligne avec un espace à la fin
Samuel
@Samuel les lignes 13-17 sont-elles nécessaires? Cela semble fonctionner assez bien sans ces lignes. Autant que je sache (je crains fort pour l'assemblage), vous imprimez le chargement ..., puis le | caractère, puis supprimez ce caractère, puis entrez une boucle dans laquelle vous répétez l’impression | pour la première fois.
user254948
@Samuel en plus xor r8, r8 -> mov r8,0 (enregistre 1 caractère), certains MOV ont un espace supplémentaire (mov r7, 1 -> mov r7,1). De plus, les instructions cmp r8,4, jl l, xor r8, r8 peuvent être remplacées par AND r8,3 (enregistrement de 15 caractères). Vous devriez avoir 285 octets au lieu de 349! (en combinaison avec les lignes mentionnées ci-dessus)
user254948
5

R, 85 89 octets

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

Edit: Correction de la réponse telle que Tne débordera pas en réinitialisant le compteur si supérieur à 4.

Le seul aspect intéressant de cette réponse est l'utilisation de R de TRUTHYla builtin T. Il s’agit en fait d’une variable prédéfinie, 1/TRUEce qui signifie que nous n’avons pas à initialiser le compteur, mais que nous pouvons commencer à incrémenter T.

Billywob
la source
Serait Téventuellement déborder?
FlipTack
@ Flp.Tkc Il ne déborderait pas mais serait traité comme un infini passé, 1e+308auquel cas le cas NAest renvoyé, donc je suppose que cette réponse est invalide à ce moment-là (je ne l'ai pas remarqué dans les règles).
Mettra à
1
En fait, vous pouvez obtenir 2 octets plus courts si vous n'utilisez pas le paramètre intégré T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}87 octets.
Plannapus
Hmm ... R ne fonctionne-t-il que sur des vecteurs? Pourquoi n’existe-t-il pas d’opérateurs modulo ou binaires pour les atomes? est Tun vecteur? Ça T=(T+1)%%4marche? Cela économiserait 5 octets supplémentaires.
Titus
2
... ou T=T%%4+1: même 2 octets plus court.
Titus
5

Haskell (GHC), 103 91 octets

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

Merci @nimi d'avoir économisé 12 octets!

Angs
la source
Pas besoin d'un programme complet. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
nimi
Vous pouvez enregistrer deux octets en utilisant la tolérance de 10% et en les remplaçant 250000avec l’espace précédent (4^9).
Christian Sievers
5

C (sur les systèmes de type UNIX) 88 octets

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

Cela commence avec le mauvais personnage, mais je pense que ça a l'air plus joli. Vous pouvez facilement changer l'ordre des caractères en modifiant le "\ - / |" chaîne.

LambdaBeta
la source
Pourrait être joué plus loin en déplaçant les déclarations dans for, par exemple ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
:,
Avez-vous besoin de la fonction fflush ()?
John U
Sur la plupart des systèmes, vous avez besoin de la commande fflush, la plupart d’entre eux étant tamponnés en fonction des nouvelles lignes. Cependant, il est possible que cela ne soit pas nécessaire sur certains systèmes.
LambdaBeta
Vous pouvez utiliser à la fprintf(stderr,...place, puisque ce n'est pas une ligne tamponnée comme stdout. Le f...stderr,prend huit caractères, tandis que le fflush(0);prend dix, donc c'est un gain net de deux caractères.
cmaster
5

Perl, 71 63 61 octets

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

La version précédente:

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

Merci à @primo pour 10 octets.

Denis Ibaev
la source
2
Belle astuce pour utiliser le selectdélai d'attente plutôt que Time::HiRes. Vous pouvez économiser quelques octets en utilisant ... while$|=printet en déplaçant les traits d'union de la translittération vers l'avant et vers la fin. s//\r Loading... |/enregistre également un octet sur l’affectation.
primo
2
Et aussi, si vous utilisez des guillemets simples pour le delimiter translittération, il n'y a pas besoin d'échapper à la barre oblique inverse soit: y'-\|/'\|/-'.
Primo
Il semble que vous ayez un espace supplémentaire avant votre code.
Erik l'Outgolfer
1
Vous pouvez enregistrer un autre octet en utilisant un littéral \r.
Ninjalj
1
Utilisez y'-|\/'\/|-'/4à la place de .25pour 2 autres.
Primo