Ładowanie na zawsze… Styl Windows


36

Utwórz pasek ładowania w stylu Windows, postępując zgodnie z następującymi instrukcjami.

(zauważ, że różni się to od Ładowanie ... Zawsze )

Twój wynik powinien zacząć się od [.... ].

Każdy tik powinien poczekać 100 ms, a następnie przesunąć każdą kropkę o jeden znak w prawo. jeśli kropka znajduje się na dziesiątej postaci, przenieś ją do pierwszej. Zauważ, że powinieneś wyczyścić ekran przed ponownym wysłaniem. Dane wyjściowe są uporządkowane w następujący sposób:

[....      ]
[ ....     ]
[  ....    ]
[   ....   ]
[    ....  ]
[     .... ]
[      ....]
[.      ...]
[..      ..]
[...      .]

.. Potem zapętla się na zawsze.

Zasady

  • To jest , więc wygrywa najkrótsza odpowiedź. Wątpię, czy zaakceptowałbym nawet zwycięską odpowiedź
  • Podaj plik gif paska ładowania w akcji, jeśli to możliwe.

1
Czy możemy wyprowadzić, powiedzmy, dwadzieścia nowych wierszy przed każdym wyjściem, aby „wyczyścić” ekran?
Okx,

2
@Okx Tak, jeśli twój język nie ma innego sposobu na wyczyszczenie ekranu.
Matthew Roh

Ile błędu może być opóźnienie? (Np. + - 0,5 sekundy) Sugeruję błąd 250 milisekund ....
stevefestl

1
Czy mogę zasugerować, aby nie uwzględniać stałego opóźnienia w przyszłych wyzwaniach? Uważam, że pojawił się na wielu ostatnich wyzwaniach i za każdym razem, gdy piszę ten sam niemożliwy do obrony kocioł, aby system czekał n mille sekund.
xnor

2
Czy użycie \rdozwolone jest zamiast dosłownie wyczyścić ekran?
phyrfox

Odpowiedzi:


19

V, 17 16 15 bajtów

i[´.¶ ]<esc>ògó$X|p

<esc>jest 0x1b.

I zrzut heksowy:

00000000: 695b b42e b620 5d1b f267 f324 587c 70    i[... ]..g.$X|p

Wyjaśnienie

i                       " Insert
[                       " a [
´.                      " 4 .s
¶<space>                " 6 spaces
]<esc>                  " and a ]. Then return to normal mode
ò                       " Recursively do:
 gó                     "  Sleep for 100 milliseconds
 $                      "  Go to the ]
 X                      "  Delete the character to the left of the ]
 |                      "  Go to the [
 p                      "  And paste the deleted character right after the [
                        " Implicit ending ò

gif


Jak testować w Vimie?
Pavel

@ Feniks i.... <esc>qq:sl 100m<CR>$X|P@qq@qpowinien zadziałać ( <esc>jest to oczywiście klawisz Escape i <CR>przejście do linii) (po 4 kropkach jest 6 spacji)
Kritixi Lithos

3
Cieszę się, że funkcja jest przydatna.
Dobra

19

CSS / HTML, 202 190 186 + 45 = 247 235 231 bajtów

pre{position:relative}x{position:absolute;display:inline-block;width:10ch;height:1em;overflow:hidden}x>x{width:14ch;left:-10ch;animation:1s steps(10,end)infinite l}@keyframes l{to{left:0
<pre>[<x><x>....      ....</x></x>          ]

Edycja: Zapisano 12 14 bajtów dzięki @Luke.


Czy nie możesz zapisać 6 bajtów, zmieniając nazwę animacji na coś podobnego b?
Łukasz

@Luke Nie mogę uwierzyć, że zapomniałem to zrobić ...
Neil

Możesz zapisać jeszcze 2 bajty, upuszczając chna końcu; 0nie potrzebuje jednostki.
Łukasz

2
Co powiesz na przejście <x>na <span>(a także w CSS: xstaje się spani x>xstaje span>*)? To oszczędza display:inline-block;, ale kosztuje tylko 15 bajtów. Łącznie zapisano 6B.
Łukasz

1
@Luke Nie dbam o wyświetlacz, ale chcę uniknąć powtarzania position:absolute;.
Neil

12

PowerShell, 67 66 bajtów

for($s='.'*4+' '*6;$s=-join($s[,9+0..8])){cls;"[$s]";sleep -m 100}

-1 za pomocą skróconego konstruktora dzięki Beatcracker

zastępuje ciąg kopią ciągu, w którym ostatni znak jest umieszczany przed pozostałymi znakami, czyści ekran, drukuje go, a następnie śpi przez 100 ms.

zapisał wiele bajtów za pomocą konstruktora pętli zamiast zawijać logikę w łańcuch.

enter image description here


1
+1 za forlewę w pętli i ponowne przeczytanie about_Join .
beatcracker

1
PS Możesz zagrać w golfa jeszcze jednym bajtem $s='.'*4+' '*6.
beatcracker

@beatcracker dzięki za to - zaktualizowano :)
colsw

Skrypt się nie uruchamia [.... ]. Możesz to naprawić bez kary:for($s='.'*4+' '*6){cls;"[$s]";$s=-join($s[,9+0..8]);sleep -m 100}
mazzy

10

Python 3 , 99 93 85 83 + 2 ( flaga -u ) bajtów

-12 bajtów dzięki ovs
-2 bajtów dzięki totalnemu człowiekowi

import time
s=4*'.'+6*' '
while 1:print(end='\r[%s]'%s);time.sleep(.1);s=s[9]+s[:9]

Wypróbuj online!


Dlaczego masz flush=True? Dla mnie to działa bez
L3viathan

3
@ L3viathan, ponieważ mój terminal (ubuntu) nie był opróżniany. To zachowanie spłukiwania jest zależne od systemu operacyjnego = /
Rod

1
Zaoszczędź niektóre bajty za pomocąprint(end='\r[%s]'%s,flush=1)
ovs

2
Możesz całkowicie usunąć kolor, używając -uflagi wiersza poleceń. Powiązane pytanie SO
ovs

1
Możesz także zapisać niektóre bajty za pomocą s[9]+s[:9].
całkowicieludzki

10

Pakiet Windows, 201 181 bajtów

Okazuje się, że metoda oldschoolowa faktycznie oszczędza bajty!

@for %%p in ("....      " " ....     " "  ....    " "   ....   " "    ....  " "     .... " "      ...." ".      ..." "..      .." "...      .")do @echo [%%~p]&timeout 0 >nul&cls
@%0

Uwaga:

get-screenrecorder.level
- low grade

get-gpu.level
- horrible

if get-screenrecorder.level == low grade || get-gpu.level == horrible {
     say("GIF may not be accurate");
}

GIF!

Pamiętaj, że mój rejestrator GIF pominął kilka klatek, co powoduje przeskok paska ładowania :(


1
Zamiast obliczać liczbę kropek, jeśli po prostu zachowałeś zmienną z kropkami i spacjami i wykonałeś na niej manipulację łańcuchem, prawdopodobnie możesz zmniejszyć to do 100 bajtów.
Neil

Chciałbym spróbować popracować nad tym, dziękuję za twoje wskazówki :)!
stevefestl

limit czasu / t 0> nul zamiast ping 1.1 -n 1 -w 100> nul będzie w granicach 100ms +/- 250ms wymaganego czasu (powinno normalnie wynosić około 25 - 100ms), więc można tam zapisać kilka bajtów ( ss64.com/ nt / timeout.html )
Liam Daly

1
Usunięcie @echo offi zastąpienie do z do @(echo %%~p&timeout/t 0 >nul&cls)również będzie działać i powinno zapisać 11 znaków (200 bajtów na moim komputerze)
Liam Daly

8

Mathematica, 67 77 bajtów

+10 bajtów, gdy zapomniałem nawiasów kwadratowych.

Animate["["<>"....      "~StringRotateRight~n<>"]",{n,1,10,1},RefreshRate->10]

1
Naprawdę, Mathematica ma wbudowane Animate? : |
Pan Xcoder,

Tak, animuje prawie wszystko w obrębie danej zmiennej. :)
Ian Miller

Wydaje się, że nie obejmuje to prostokątnych nawiasów, które robi większość innych odpowiedzi.
Mark S.

Och, szczury, nie wyglądały wystarczająco dokładnie. Ok naprawione.
Ian Miller

8

C (gcc) , 126 125 124 123 122 121 119 118 117 114 115 bajtów

Ten używa maski bitowej, aby śledzić, gdzie są kropki.

Musiałem dodać kolejny bajt, ponieważ wcześniej wypisywałem tylko 5 spacji.

m=30;f(i){usleep(3<<15);system("clear");for(i=1;i<1920;i*=2)putchar(i^1?i&m?46:32:91);m+=m&512?m+1:m;f(puts("]"));}

Wypróbuj online!

enter image description here


48
DLACZEGO jest twoja czcionka wiersza polecenia Comic Sans MS?!?!?!
MD XF


6

JavaScript (ES6) + HTML, 104 85 83 bajtów

f=(s="....      ")=>setTimeout(f,100,s[9]+s.slice(0,9),o.value=`[${s}]`)
<input id=o
  • Zaoszczędziłem 2 bajty dzięki sugestii Johana , że używam inputzamiast zamiast pre.

Spróbuj

Wymaga zamknięcia >na inputznacznik, aby mogła funkcjonować w urywek.

(f=(s="....      ")=>setTimeout(f,100,s[9]+s.slice(0,9),o.value=`[${s}]`))()
<input id=o>


1
Czy nie powinno być 10 znaków między literami []?
Neil

Masz rację, @Neil; jest 6 miejsc - jeśli mam zamiar policzyć rzeczy na oko, to co najmniej mogę zrobić, to założyć okulary!
Kudłaty

1
Nie możesz użyć <input>zamiast, <pre>a potem valuezamiast innerText?
Johan Karlsson

Dobra rozmowa, @JohanKarlsson; co oszczędza 2 bajty.
Kudłaty

Hej! Jest to ta sama liczba bajtów: s='.... ';setInterval(f=>{o.value='[${s=s[9]+s.slice(0,9)}]'},100);<input id=omoże ktoś może to poprawić (zastąpić cudzysłów znakiem `)
Thomas W

5

Noodel , 16 15 14 13 bajtów

[CỤ'Ṁ ~ ððÐ] ʠḷẸḍt

] ʠ [Ð. × 4¤ × 6⁺ḷẸḍt

] ʠ⁶¤⁴.ȧ [ėÐḷẸḍt

Spróbuj:)


Jak to działa

]ʠ⁶¤⁴.ȧ[ėÐḷẸḍt

]ʠ⁶¤⁴.ȧ[ėÐ     # Set up for the animation.
]              # Pushes the literal string "]" onto the stack.
 ʠ             # Move the top of the stack down by one such that the "]" will remain on top.
  ⁶¤           # Pushes the string "¤" six times onto the stack where "¤" represents a space.
    ⁴.         # Pushes the string "." four times onto the stack.
      ȧ        # Take everything on the stack and create an array.
       [       # Pushes on the string literal "[".
        ė      # Take what is on the top of the stack and place it at the bottom (moves the "[" to the bottom).
         Ð     # Pushes the stack to the screen which in Noodel means by reference.

          ḷẸḍt # The main animation loop.
          ḷ    # Loop endlessly the following code.
           Ẹ   # Take the last character of the array and move it to the front.
            ḍt # Delay for a tenth of a second.
               # Implicit end of loop.

Aktualizacja

[Ð]ıʠ⁶¤⁴.ḷėḍt

Spróbuj:)

Nie wiem, dlaczego zajęło mi to trochę czasu. Tak czy inaczej, umieszcza to na 13 bajtach .

[Ð]ıʠ⁶¤⁴.ḷėḍt

[Ð]ıʠ⁶¤⁴.     # Sets up the animation.
[             # Push on the character "["
 Ð            # Push the stack as an array (which is by reference) to the screen.
  ]           # Push on the character "]"
   ı          # Jump into a new stack placing the "[" on top.
    ʠ         # Move the top of the stack down one.
     ⁶¤       # Push on six spaces.
       ⁴.     # Push on four dots.

         ḷėḍt # The main loop that does the animation.
         ḷ    # Loop the following code endlessly.
          ė   # Take the top of the stack and put it at the bottom.
           ḍt # Delay for a tenth of a second.

<div id="noodel" code="[Ð]ıʠ⁶¤⁴.ḷėḍt" input="" cols="12" rows="2"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


2
Nigdy wcześniej nie słyszałem o Noodel, ale wydaje się, że jest to właściwe narzędzie do właściwej pracy! +1
Kevin Cruijssen

1
@KevinCruijssen, ETHProductions ma dobrą listę języków do gry w golfa w kodzie :)
tkellehe

6
Właśnie kiedy pomyślałem, że cię wygram, zauważyłem, że dwa razy
grałeś w

@KritixiLithos, bałem się, że mnie pobijesz, więc spędziłem wieczność próbując dostać się do 14 bajtów . Ale teraz znów jesteś blisko !! Cholera !!
tkellehe

1
@ nitro2k01 Noodel używa własnej strony kodowej z 256 znakami , które wszystkie są zapisywane jako jeden bajt we własnym kodowaniu. Podobnie jak niektóre inne języki gry w golfa, takie jak Jelly lub 05AB1E . Jeśli zapiszesz te znaki jako domyślne kodowanie UTF-8, będą one rzeczywiście miały 2 lub 3 bajty, ale we własnym kodowaniu mają 1 bajt.
Kevin Cruijssen

4

PHP, 67 bajtów

for($s="...      .";$s=substr($s.$s,9,10);usleep(1e5))echo"\r[$s]";

bez komentarza


4

C #, 162 157 bajtów

()=>{for(string o="[....      ]";;){o=o.Insert(1,o[10]+"").Remove(11,1);System.Console.Write(o);System.Threading.Thread.Sleep(100);System.Console.Clear();}};

lub jako cały program na 177 bajtów

namespace System{class P{static void Main(){for(string o="[....      ]";;){o=o.Insert(1,o[10]+"").Remove(11,1);Console.Write(o);Threading.Thread.Sleep(100);Console.Clear();}}}}

+1 Coś do golfa: for(string o="[.... ]";;)można grać w golfa var o="[.... ]";for(;;). Lub możesz nam port mojej odpowiedzi Java 7 do golfa w sumie trochę więcej:()=>{var o=".... "for(;;){o=(o+o).Substring(9,10);System.Console.Write("["+o+"]\n");System.Threading.Thread.Sleep(100);System.Console.Clear();}};
Kevin Cruijssen

Czy interpolacja struny przestałaby istnieć? Coś w stylu$"[{o}]\n"
Marie,

1
If you replace System.Console.Write(o) with System.Console.Write(o+"\r") you can remove the System.Console.Clear();
grabthefish


4

MATL, 24 bytes

`1&Xx'['897B@YS46*93hhDT

Try it at MATL Online! Or see a gif from the offline compiler:

enter image description here

Explanation

`        % Do...while
  1&Xx   %   Pause for 0.1 s and clear screen
  '['    %   Push this character
  897B   %   Push [1 1 1 0 0 0 0 0 0 1]
  @      %   Push current iteration index, 1-based
  YS     %   Circularly shift the array by that amount
  46*    %   Multiply by 46 (code point of '.')
  93     %   Push 93 (code point of ']')
  hh     %   Concatenate horizontally twice. Numbers are interpreted as chars
         %   with the corresponding code points
  D      %   Display
  T      %   Push true. Used as loop condition. Results in an infinite loop
         % End (implicit)

Your link crashes, meaning that I cannot kill it.
Leaky Nun

1
@LeakyNun What do you mean exactly that it crashes? It works for me, and I can kill it. Sometimes there are timeout issues. If it doesn't start, try refreshing the page
Luis Mendo

4

Jelly, 28 27 bytes

ṙ©-j@⁾[]ṭ”ÆȮœS.1®ß
897ṃ⁾. Ç

Example run

How?

ṙ©-j@⁾[]ṭ”ÆȮœS.1®ß - Link 1, the infinite loop: list of characters s
ṙ                  - rotate s left by:
  -                -   -1 (e.g. "...      ." -> "....      ")
 ©                 -   copy to the register and yield
     ⁾[]           - literal ['[',']']
   j@              - join with reversed @rguments
         Ӯ        - literal '\r'
        ṭ          - tack (append the display text to the '\r')
           Ȯ       - print with no newline ending
              .1   - literal 0.1
            œS     - sleep for 0.1 seconds then yield the printed text (unused)
                ®  - recall the value from the register
                 ß - call this link (1) again with the same arity

897ṃ⁾. Ç - Main link: no arguments
897      - literal 897
    ⁾.   - literal ['.',' ']
   ṃ     - base decompression: convert 897 to base ['.',' '] = "...      ."

4

C (gcc), 202 198 196 189 96 99 88 86 79 77 75 74 73 bytes

Saved 7 8 bytes thanks to Digital Trauma.

f(i){usleep(dprintf(2,"\r[%-10.10s]","....      ...."+i%10)<<13);f(i+9);}

Or, if your system's stdout doesn't need to be flushed after every write without a newline:

C (gcc), 70 bytes

f(i){usleep(printf("\r[%-10.10s]","....      ...."+i%10)<<13);f(i+9);}

How it works

  • usleep( sleeps for the next return value in microseconds.
  • dprintf(2, prints to file descriptor 2, or stderr. This is necessary because while stdout is line-buffered (meaning output will not show until it prints a newline), stderr is character-buffered (all output is shown immediately).
  • "\r prints a carriage return (clears the current line).
  • [%-10.10s]" is the printf format specifier for a string with exact length 10 (no matter what string provided the output will always be a string with length 10), padded with spaces to the right if necessary. This will be enclosed with brackets.
  • ".... ...." is the loading bar.
  • +i%10 offsets the loading bar by the current index modulo 10. For example, if i == 3, i % 10 is equal to 3. Offsetting the loading bar by 3 makes it equal to ". ....".
  • When the offset-ed string is passed to the printf format specifier, it limits to a length of 10 if necessary and adds spaces to the end if necessary. Therefore, the loading bar will always be between [.... ] and [. ...].

i;f(){for(;;i=++i%10)usleep(7500*dprintf(2,"\r[%-10.10s]",".... ...."-i+10));} should work.
Christoph

1
Great golfing! Save 1 more byte with f(i){usleep(dprintf(2,"\r[%-10.10s]",".... ...."+i%10)<<13);f(i+9);}
Digital Trauma

@DigitalTrauma The spaces in your code didn't render properly. However, I see what you meant, and thanks for the help!
MD XF

3

Java 7, 139 124 bytes

String s="....      ";void c()throws Exception{System.out.print("["+s+"]\r");s=(s+s).substring(9,19);Thread.sleep(100);c();}
  • Mentioning of \r thanks to @Phoenix.

The carriage return \r resets the 'cursor' back to the begin of the line, which can then be overwritten. Unfortunately, online compilers nor the Eclipse IDE doesn't support this, so I've added a gif at the end of this answer to show it from Windows Command Prompt.

Try it here. (Slightly modified so you won't have to wait for the time-out before viewing the result. Also, the TIO doesn't support carriage returns, so every line is printed without overwriting the previous line.)

Explanation:

String s="....      ";            // Starting String "....      " on class level
void c()                          // Method without parameter nor return-type
 throws Exception{                // throws-clause/try-catch is mandatory for Thread.sleep
  System.out.print("["+s+"]\r");  //  Print the String between square-brackets,
                                  //  and reset the 'cursor' to the start of the line
  s=(s+s).substring(9,19);        //  Set `s` to the next String in line
  Thread.sleep(100);              //  Wait 100 ms
  c();                            //  Recursive call to same method
}                                 // End of method

Output gif:

enter image description here


You can clear the line by replacing println with print and outputting a carriage return. Might not work in your IDE's terminal, but it would work in any other sane one.
Pavel

@Phoenix By carriage return you mean \r\n? How does System.out.print(someString+"\r\n); clear the console.. It's the same as using System.out.println(someString);.. It simply goes to the next line, but doesn't remove any previous line printed.. :S
Kevin Cruijssen

4
No, I mean \r, without \n. That resets the "cursor" to the beginning of the line so printing anything will overwrite that line.
Pavel

@Phoenix Ah of course. Thanks. Modified my answer and added a gif to show the result. Too bad online compilers nor the Eclipse IDE aren't supporting this.. >.>
Kevin Cruijssen

3

Python 2, 81 78 bytes

-1 byte (noticing I missed use of %s when Rod submitted an almost identical Python 3 version at the same time!)
-2 bytes (using totallyhuman's idea - replace s[-1]+s[:-1] with s[9]+s[:9])

import time
s='.'*4+' '*6
while s:print'\r[%s]'%s,;s=s[9]+s[:9];time.sleep(.1)

Example run


How it's flushing the output? this is the reason why I'm using python3 on my answer (it would take more bytes to flush on python2)
Rod

@Rod the \r overwrites the line and the , makes it print a tuple rather than a string - I saw it a while back somewhere and have used it before too.
Jonathan Allan

1
Yes, this is what I was doing, but the output wasn't being printed in real time (had to use sys.stdout.flush())
Rod

1
Found the culprit : my ubuntu terminal :c
Rod

3

Go, 150 145 132 129 124 bytes

-5 bytes thanks to sudee.

I feel like I don't see enough Go here... But my answer is topping C so... pls halp golf?

package main
import(."fmt"
."time")
func main(){s:="....      ";for{Print("\r["+s+"]");Sleep(Duration(1e8));s=(s+s)[9:19];}}

Try it online!


1
Not familiar with Go, but I would assume you can convert 100000000 to 10^8 to save 5 bytes.
Grant Miller

@goatmeal I tried that but it's apparently bitwise negation. I also tried 10**8 which also gives an error.
totallyhuman

3
You can use scientific notation: 1e8.
sudee

1
@sudee Aha, that would be the way to use large numbers. Thanks!
totallyhuman

2
@MDXF I should've phrased that differently, I meant my answer is being out-golfed by C.
totallyhuman

3

VBA 32-bit, 159 157 143 141 134 Bytes

VBA does not have a built in function that allows for waiting for time periods less than one second so we must declare a function from kernel32.dll

32 Bit Declare Statement (41 Bytes)

Declare Sub Sleep Lib"kernel32"(ByVal M&)

64 Bit Declare Statement (49 Bytes)

Declare PtrSafe Sub Sleep Lib"kernel32"(ByVal M&)

Additionally, we must include a DoEvents flag to avoid the infinite loop from making Excel appear as non-responsive. The final function is then a subroutine which takes no input and outputs to the VBE immediate window.

Immediate Window function, 93 Bytes

Anonymous VBE immediate window function that takes no input and outputs to the range A1 on the ActiveSheet

s="...      ....      .":Do:DoEvents:Sleep 100:[A1]="["&Mid(s,10-i,10)&"]":i=(i+1)Mod 10:Loop

Old Version, 109 Bytes

Immediate window function that takes no input and outputs to the VBE immediate window.

s="...      ....      .":i=0:Do:DoEvents:Sleep 100:Debug.?"["&Mid(s,10-i,10)&"]":i=(i+1) Mod 10:Loop

Ungolfted and formatted

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal M&)
Sub a()
    Dim i As Integer, s As String
    s = "...      ....      ."
    i = 0
    Do
        Debug.Print [REPT(CHAR(10),99]; "["; Mid(s, 10 - i, 10); "]"
        DoEvents
        Sleep 100
        i = (i + 1) Mod 10
    Loop
End Sub

-2 Bytes for removing whitespace

-30 Bytes for counting correctly

-14 Bytes for converting to immediate window function

Output

The gif below uses the full subroutine version because I was too lazy to rerecord this with the immediate window function.

VBA loading Gif


What's that a at the top of the output?
MD XF

@MDXF that is the call to run subroutine a as is listed above; this is functionally equivalant to the more verbose call a().
Taylor Scott

Ah, my bad. Just looking for bad submissions. Your's isn't, then, so +1
MD XF

2

05AB1E, 23 bytes

'.4×ð6×J[D…[ÿ],Á¶т×,т.W

Try it online!

Explanation

'.4×ð6×J                  # push the string "....      "
        [                 # forever do:
         D                # duplicate
          …[ÿ],           # interpolate the copy between brackets and print
               Á          # rotate the remaining copy right
                ¶т×,      # print 100 newlines
                    т.W   # wait 100ms

2

Batch, 99 98 bytes

Saved 1 byte thanks to SteveFest!

(I could remove \r from the code, but in the spirit of batch golfing, I won't.)

@SET s=....      
:g
@CLS
@ECHO [%s%]
@SET s=%s:~-1%%s:~,-1%
@ping 0 -n 1 -w 100>nul
@GOTO g

Recorded with LICEcap

There are four spaces after the first line.

The main logic is modifying the string. %s:~-1% is the last character of %s% and %s:~0,-1% is all but the last character of %s%. Thus, we are moving the last character to the front of the string, which rotates the string.


Aw... I've been looking for this...
stevefestl

1
Golf 1 byte: the 0 in the variable substring can be removed
stevefestl

You use cmder. Nice job.
MD XF

1
@SteveFest Huh, TIL. Thanks!
Conor O'Brien

1
@MDXF It's the only reason I'm still sane :P
Conor O'Brien

2

Ruby, 57 56 bytes

s=?.*4+' '*6;loop{$><<"[%s]\r"%s=s[-1]+s.chop;sleep 0.1}

Heavily influenced by other answers here.

Saved a byte thanks to @manatwork. Also apparently I have trouble counting characters -- I use ST3 and apparently it will include newlines in the count of characters in the line if you're not attentive.


How does it work? Does this assume that the input is stored in s?
Rɪᴋᴇʀ

@Riker He defines s at the beginning of the program as 4 .s and a few spaces
Conor O'Brien

s[0..8]s.chop
manatwork

2

Perl, 69 bytes

-3 bytes thanks to @Dom Hastings.

$_="....".$"x6;{print"\ec[$_]
";select$a,$a,!s/(.*)(.)/$2$1/,.1;redo}

That select undef,undef,undef,.1 is the shortest way to sleep less than 1 second in Perl, and it takes a lot of bytes...


Slightly longer (79 bytes), there is:

@F=((".")x4,($")x6);{print"\ec[",@F,"]\n";@F=@F[9,0..8];select$a,$a,$a,.1;redo}

Evening, managed to get this down a little more 69 (or 68 with a literal ESC): gist.github.com/dom111/e3ff41c8bc835b81cbf55a9827d69992 I feel like the tried to use !print but you need parens so it ends up the same length :/
Dom Hastings

@DomHastings Nice, thanks! You still know how to golf :D
Dada

2

Bash, 93 90 96 bytes

s="...      ....      ."
for((;;)){ for i in {0..9};do printf "\r[${s:10-i:10}]";sleep .1;done;}

view here

couldn't get nested { } in for syntax


I intended to post a quite similar solution, but is pointless now. But may give some inspiration to improve your: pastebin.com/Ld6rryNX
manatwork

much better! i'm not stealing from you, i knew i had to work out this one...
marcosm

edited, printf padding can't help in shortening s. wraping the string as @DigitalTrauma looks better.
marcosm

1

Groovy, 72 bytes

s="*"*4+" "*6
for(;;){print("["+s+"]"+"\n"*20);s=s[9]+s[0..8];sleep 100}

Explaination

s="*"*4+" "*6 //creates the string "****      "
for(;;){ //classic infinite loop
    print("["+s+"]"+"\n"*20) //prints the string with [ at the beginning and ] at the end. After that some newlines
    s=s[9]+s[0..8] //appends the final char of the string to beginning, creating a cycling illusion
    sleep 100 //100 ms delay
}

Didn't know a proper way to clear the console in Groovy/Java. If someone has a way of doing it, please tell me
staticmethod

1
You can use \r to return the cursor to the start of the line. It appears that at least several answers are doing this. From there, you could delete the *20, saving 3 bytes.
phyrfox

1

Haskell (Windows), 159 bytes

import System.Process
import Control.Concurrent
main=mapM id[do system"cls";putStrLn('[':["....      "!!mod(i-n)10|i<-[0..9]]++"]");threadDelay(10^5)|n<-[0..]]

Explanation

mapM id             sequentially perform each IO action in the following list
[                   start a list comprehension where each element is...
  do                  an IO operation where
    system "cls";       we clear the screen by calling the windows builtin "cls"
    putStrLn(           then display the string...
      '[':                with '[' appended to
      [                   a list comprehension where each character is...
        "....      "!!       the character in literal string "....      " at the index
        mod(i-n)10          (i - n) % 10
      |i<-[0..9]]         where i goes from 0 to 9
      ++"]"             and that ends with ']'
    );
    threadDelay(10^5)   then sleep for 100,000 microseconds (100 ms)
|n<-[0..]]          where n starts at 0 and increments without bound

Haskell's purity made generating the cycling dot pattern somewhat complex. I ended up creating a nested list comprehension that generated an infinite list of strings in the order they should be output, then went back added the appropriate IO operations.


1

Ruby, 61 bytes

If the spec were for the dots to scroll left instead of right, it would save 1 byte because rotate! with no arguments shifts the array once to the left.

s=[?.]*4+[' ']*6
loop{print ?[,*s,"]\r";s.rotate!9;sleep 0.1}

1

GNU sed (with exec extension), 64

Score includes +1 for -r flag.

s/^/[....      ]/
:
esleep .1
s/[^. ]*(.+)(.)].*/\c[c[\2\1]/p
b

1

c, 100

char *s="....      ....     ";main(i){for(i=0;;i=(i+9)%10)dprintf(2,"[%.10s]\r",s+i),usleep(3<<15);}

Why print to stderr using dprintf and not just use printf?
MD XF

@MDXF Because by default stderr is character buffered, whereas stdout is line buffered. Since I don't want to print any \n, then with printf() I'd have to explicitly fflush(stdout) as well as #include <stdio.h>
Digital Trauma

Good point, but actually, you wouldn't have to #include <stdio.h> to flush STDOUT. fflush(0) flushes all buffers.
MD XF

1
Save three bytes by renaming main to f, that counts.
MD XF
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.