NASM x86_64 - 349 283 byte

6

File MS-DOS .COM, 56 byte

Di sini konten file dalam heksadesimal:

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

Kode assembler yang cocok terlihat seperti ini:

    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
sumber
1
Menekan terus tombol mempercepat pemintal, yang dapat diperbaiki dengan menutupi interupsi selain dari interupsi timer, misalnya:mov al, 0xfe / out 0x21,al
ninjalj
Komentar untuk HLT salah, Anda mungkin bermaksud bahwa HLT bangun pada ~ 18.2 Hz (atau, lebih tepatnya, pada jam NTSC / 12/65536 Hz).
ninjalj
@ninjalj Terima kasih. Saya mengubah komentar ...
Martin Rosenau

Jawaban:

6

NASM x86_64 - 349 283 byte

Ini harus menjalankan sistem linux 64 bit

dibangun menggunakan:

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

animasi:

disimpan 65 byte - terima kasih user254948

masukkan deskripsi gambar di sini

Samuel
sumber
Saya menghitung 349 byte, kecuali ada baris / spasi tambahan
FlipTack
^ Flp. Tkc Terima kasih, ada garis dengan spasi di akhir
Samuel
@Amuel, baris 13-17 diperlukan? Tampaknya berfungsi cukup baik tanpa garis-garis itu. Sejauh yang saya tahu (Tidak terlalu bagus dalam perakitan saya khawatir) Anda mencetak Memuat ...., lalu | karakter, lalu hapus karakter itu, lalu masukkan satu lingkaran di mana Anda mengulangi pencetakan | untuk pertama kalinya.
user254948
@Samuel selain xor r8, r8 -> mov r8,0 (menyimpan 1 karakter), beberapa MOV memiliki ruang ekstra (mov r7, 1 -> mov r7,1). lebih jauh lagi instruksi cmp r8,4, jl l, xor r8, r8, dapat digantikan oleh AND r8,3 (hemat 15 karakter). Anda harus turun ke 285 byte daripada 349! (dalam kombinasi dengan garis yang disebutkan di atas)
user254948
5

R, 85 89 byte

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

Sunting: Memperbaiki jawaban agar Ttidak meluap dengan mengatur ulang penghitung jika lebih besar dari 4.

Satu-satunya aspek yang menarik tentang jawaban ini adalah penggunaan R's TRUTHYbuiltin T. Ini secara efektif merupakan set variabel yang telah ditentukan 1/TRUEyang artinya kita tidak harus menginisialisasi penghitung tetapi dapat mulai menambah T.

Billywob
sumber
Apakah Takhirnya akan meluap?
FlipTack
@ Flp.Tkc Ini tidak akan meluap tetapi diperlakukan sebagai masa lalu tanpa batas 1e+308dalam kasus NAyang dikembalikan jadi saya kira jawaban ini tidak valid (tidak memperhatikannya dalam aturan). Akan segera diperbarui
Billywob
1
Sebenarnya Anda bisa mendapatkannya 2 byte lebih pendek jika Anda tidak menggunakan built-in T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}adalah 87 byte.
plannapus
Hmm ... apakah R hanya beroperasi pada vektor? Mengapa tidak ada modulo atau operator bitwise untuk atom? itu Tvektor? Apakah T=(T+1)%%4bekerja? Ini akan menghemat 5 byte lagi.
Titus
2
... atau T=T%%4+1: bahkan 2 byte lebih pendek.
Titus
5

Haskell (GHC), 103 91 byte

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

Terima kasih @nimi karena telah menghemat 12 byte!

Angs
sumber
Tidak perlu program lengkap. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
nimi
Dua byte mungkin disimpan dengan menggunakan toleransi 10% dan mengganti 250000dan ruang sebelum dengan (4^9).
Christian Sievers
5

C (pada sistem mirip UNIX) 88 byte

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

Ini dimulai dengan karakter yang salah, tetapi saya pikir itu terlihat lebih bagus. Anda dapat dengan mudah mengubah urutan karakter dengan memodifikasi "\ - / |" tali.

LambdaBeta
sumber
Bisa di-golf lebih lanjut dengan memindahkan statemen ke for, misalnya ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
:,
Apakah Anda memerlukan flflush () di sana?
John U
Pada sebagian besar sistem Anda memang perlu fflush, banyak dari mereka buffer berdasarkan baris baru. Namun ada kemungkinan bahwa itu tidak perlu pada beberapa sistem.
LambdaBeta
Anda dapat menggunakan fprintf(stderr,...sebagai gantinya, karena itu bukan seperti garis buffered stdout. The f...stderr,mengambil delapan karakter, sedangkan fflush(0);dibutuhkan sepuluh, jadi menang bersih dua karakter.
cmaster
5

Perl, 71 63 61 byte

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

Versi sebelumnya:

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

Terima kasih kepada @primo selama 10 byte.

Denis Ibaev
sumber
2
Trik yang bagus untuk menggunakan selectbatas waktu alih-alih Time::HiRes. Anda dapat menyimpan beberapa byte dengan menggunakan ... while$|=print, dan dengan memindahkan tanda hubung dalam transliterasi ke depan dan akhir. s//\r Loading... |/juga menyimpan byte lebih dari penugasan.
primo
2
Dan juga, jika Anda menggunakan tanda kutip tunggal untuk pembatas transliterasi, tidak perlu untuk melarikan diri backslash baik: y'-\|/'\|/-'.
primo
Tampaknya Anda memiliki ruang ekstra sebelum kode Anda.
Erik the Outgolfer
1
Anda dapat menyimpan byte lain dengan menggunakan literal \r.
ninjalj
1
Gunakan y'-|\/'\/|-'/4sebagai pengganti .252 lagi.
primo