Carregando… Para sempre


106

Seu desafio é criar uma tela de carregamento infinita, com a seguinte aparência:

insira a descrição da imagem aqui


Ou, para ser mais específico:

  • Não aceite nenhuma entrada.
  • Saída Loading..., com um espaço à direita, mas sem nova linha à direita.
  • Ciclo infinitamente através dos caracteres |, /, -e \: a cada 0,25 segundos, substituir o último com o seguinte na sequência. Você pode substituir apenas o último caractere ou excluir e reescrever a linha inteira, desde que Loading...permaneça inalterada.

Regras

  • O texto de saída deve parecer exatamente como especificado. Novas linhas / espaços à direita são aceitáveis.
  • Você não deve esperar 0,25 segundos antes de mostrar inicialmente a saída - o primeiro quadro deve ser impresso assim que o programa for executado.
  • Seu programa deve ser capaz de executar indefinidamente. Por exemplo, se você usar um contador para quadros, o contador nunca deverá causar um erro excedendo o máximo no seu idioma.
  • Embora o período de espera entre cada "quadro" deva ser de 0,25 segundos, obviamente isso nunca será exato - uma margem de erro de 10% ou mais é permitida.
  • Você pode enviar uma função, mas ela deve ser impressa em stdout.
  • Você pode enviar uma resposta em um ambiente que não seja do console (mas ainda com base em texto), desde que seja capaz de produzir a animação de carregamento.
  • Isso é , então a solução mais curta (em bytes) vence. Aplicam-se lacunas de código-golfe padrão.
  • Se possível, forneça um gif da sua tela de carregamento em ação.

Exemplo

Aqui está o código C ++ que eu usei para criar o exemplo (não-destruído):

#include <iostream>
#include <string>
#include <thread>

using namespace std;

int main() {
    string cycle = "|/-\\";
    int i = 0;

    cout << "Loading... ";

    while (true) {
        // Print current character
        cout << cycle[i];

        // Sleep for 0.25 seconds
        this_thread::sleep_for(chrono::milliseconds(250));

        // Delete last character, then increase counter.
        cout << "\b";
        i = ++i % 4;
    }
}

Que ganhe o melhor jogador de golfe!


3
Os envios podem esperar 0,25 segundos antes de exibir a saída inicialmente?
ETHproductions

2
Não, mas obrigado por mencionar isso, eu vou adicioná-lo aos @ETHproductions regras
FlipTack

Uma nova linha à direita (após o símbolo de animação) é aceitável?
Copper

Claro :) @Copper
FlipTack

1
@TheBitByte significa que, teoricamente, nada dentro do seu programa causará erros - como um contador transbordando ou atingindo a profundidade máxima de recursão.
FlipTack

Respostas:


76

HTML / CSS, 183 180 163 161 160 160 147 143 bytes

a{display:inline-flex;overflow:hidden;width:1ch}c{animation:c 1s steps(4)infinite}@keyframes c{to{margin:0-4ch
<pre>Loading... <a><c>|/-\</pre>

Editar: salvou 3 bytes graças a @betseg. Economizou 17 bytes graças a @manatwork. Guardou 1 byte graças a @Daniel. Guardou 13 bytes graças a @Ismael Miguel. Guardado 4 bytes graças a @Fez Vrasta.


4
De acordo com a meta, CSS + HTML é bom para responder perguntas. Além disso, eu permiti isso na descrição do desafio. Portanto, esta resposta é perfeitamente :) válida
FlipTack

5
HTML + CSS é TC, então não vejo por que ele pode não ser competitivo
TuxCrafting

1
@ TùxCräftîñg O CSS definitivamente não está completo, pois você pode resolver o problema de interrupção (se não houver animação infinita, ele será interrompido). Eu acho que o mesmo se aplica ao HTML (se você não incluir JS).
Artyer

4
@Artyer stackoverflow.com/a/5239256/3273184 é algo que vale a pena considerar.
Mama Fun rolo

4
@MamaFunRoll Um comentário nesse post menciona que isso realmente não prova que é TC porque não pode ser repetido sem a intervenção do usuário. No entanto, ele pode resolver esse desafio em particular, então não vejo nenhum problema com esta resposta.
ETHproductions

57

Vim, 43 , 41 bytes

qqSLoading... |<esc>:sl250m
r/@:r-@:r\@:@qq@q

Dois bytes salvos graças ao @Udioica!

Aqui está uma animação (um pouco desatualizada) acontecendo em tempo real!

insira a descrição da imagem aqui

E aqui está uma explicação:

qq                              " Start recording into register 'q'
  SLoading... |<esc>            " Replace all of the text in the buffer with 'Loading... |'
                    :sl250m     " Sleep for 250 ms
r/                              " Replace the bar with a slash
  @:                            " Re-run the last ex command (sleeping)
    r-                          " Replace the slash with a dash
      @:                        " Re-run the last ex command (sleeping)
        r\                      " Replace the dash with a backslash
          @:                    " Re-run the last ex command (sleeping)
            @q                  " Run macro 'q' (the one we're recording)
              q                 " Stop recording
               @q               " Call macro 'q', which will run forever because it's recursive

1
apenas curiosidades: viola "Seu programa deve ser executado indefinidamente"? pode eventualmente atingir um estouro de pilha? :)
Dan Oak

4
@dahnoak Bem, obviamente eu não posso testá-lo infinitamente, mas ele não aloca memória extra, então não vejo motivo para que ele não funcione indefinidamente.
DJMcMayhem

1
Se você alternar ipara Se movê-lo dentro da macro, você pode pular r|.
Udioica 28/11/16

2
@dahnoak Não há razão para que o mecanismo vi não note a recursão da cauda. E algumas implementações de recursão o fariam naturalmente (imagine se houver um vetor de comandos a serem executados e um local de execução atual. Em seguida @q, insira no local atual o conteúdo do script de registro q. Nenhuma pilha é necessária e não memória alocada a menos que existam comandos a serem executados depois de @q dentro q).
Yakk

Quase toda vez que você postar uma resposta a um desafio, eu aprendo algo novo (neste caso, @:e :sl), por isso obrigado e mantê-los a :)
Christian Rondeau

37

HTML + JS (ES6), 20 + 51 50 = 70 bytes

setInterval(_=>a.innerHTML='|/-\\'[i=-~i%4],i=250)
Loading... <a id=a>-

-1 byte (Zachary T)

Confira minha resposta HTML / CSS de 132 bytes também.


Pode transbordar i?
Zachary

Sim, acabaria. Corrigido isso!
darrylyeo

1
Você poderia substituir i++,i%=4com i=-~i%4um byte?
Zachary

2
@Xufox A <pre>única garantia de que uma fonte monoespaçada fosse usada para que as chunidades funcionassem. As regras não mencionam nada sobre a família de fontes usada. ;)
darrylyeo 30/11

1
Se não me engano, o primeiro caractere impresso por JS será o último da string; então você deve iniciar com em -vez de /. Ou inicie com |e faça um loop '-\\|/'. Incremento agradável embora.
Titus

21

Lote do Windows, 121 114 84 80 79 78 bytes

Apenas jogando isso fora por diversão.

for %%b in (/ - \ ^|)do (cls
@echo Loading... %%b
ping 1.1 -n 1 -w 250>nul)
%0

Como não consegui atribuir pipe ( |) à matriz, tive que adicioná-lo manualmente com outra atribuição.O atraso está concluído PING, o que pode não ser preciso .

Resultado:

insira a descrição da imagem aqui

Editar:

  • Obrigado a Roman Gräf por economizar 7 bytes!
  • Agradecimentos a Neil por salvar 30 bytes! Também modifiquei um pouco mais para salvar bytes nas novas linhas.
  • Obrigado ao phyrfox por salvar 4 bytes!
  • Obrigado a YourDeathIsComing por salvar 2 bytes!

3
Você pode remover @echo offe colocar um @na frente de todos os comandos setouecho
Roman Gräf

1
Você não precisa da matriz, in (/ - \ ^|)funciona. Além disso,% 0 é uma maneira mais curta de fazer loop do que goto.
30516 Neil

2
Você deve poder usar o endereço IP "1.1" (-4 bytes), porque a maioria das plataformas o expandirá automaticamente para 1.0.0.1 para você.
Phyrfox 29/11/16

1
Você pode economizar 1 byte removendo o espaço na frente de >nul.
YourDeathIsComing

1
Eu quis dizer o espaço antes dele, não depois dele.
YourDeathIsComing

20

Nó, 72 70 bytes

f=i=>console.log('\x1BcLoading... '+'|/-\\'[setTimeout(f,250,i=-~i%4),i])

Substitua \x1Bpelo caractere de escape literal para obter a contagem correta de bytes. Ligue f()para iniciar a animação. Veja como fica no emulador de terminal ConEmu no meu computador:

insira a descrição da imagem aqui


Tente usar \033c(substitua \033por sua representação de caractere real). Não parece tão bom, mas economiza alguns bytes.
Mama Fun Roll

Não vai itransbordar?
Zachary

12
@ZacharyT Ele vai aos 71 milhões de anos, mas eu posso consertar isso, se necessário
ETHproductions

3
"Seu programa deve poder ser executado indefinidamente. Por exemplo, se você usar um contador para quadros, o contador nunca deverá causar um erro excedendo o máximo no seu idioma.", Sim, é necessário.
Zachary

3
@Florent Mas então não seria executado no Nó ;-)
ETHproductions

14

Kotlin, 67 66 bytes

while(1>0)"|/-\\".map{print("\rLoading... $it");Thread.sleep(250)}

insira a descrição da imagem aqui

Bastante auto-explicativo, usando \rpara limpar a linha e aproveitando a incrível interpolação de cordas de Kotlin.

EDIT: Salvo 1 byte graças a @ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu, alterando while(true)parawhile(1>0)


1
Você pode salvar um byte usando em while(1>0)vez de while(true)(-1) e provavelmente deve incluir a sintaxe da função real em sua resposta ( fun a(){<code>}, +9). Se você quer ser um pouco mais barato, pode usar a função store como uma variável ( val a={<code>}, +8).
F. George

2
@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu O modo 'programa completo' não é aceitável? Isso pode ser executado como um script Kotlin .ktssem definições de classe ou função. Além disso, ótima ligação com while(1>0)!
Tyler MacDonell

3
Mas e se, um dia, 0 se tornar maior que 1 ???? : P
FlipTack 28/11

Ótima idéia de usar o script Kotlin. @ Flp.Tkc Seu comentário me lembrou isso: codegolf.stackexchange.com/a/101131/62024 . Ainda tremendo que isso seja possível.
F. George

@TylerMacDonell Realmente? Eu não sabia que você poderia executar o kotlin diretamente como um script. Obrigado pela informação.
TheNumberOne

14

Vim, 35 bytes

iLoading... \-/|<Esc>qqdb:sl250m<CR>p@qq@q

A versão chata. Aqui está uma solução não conforme que é melhor:

Vim (1 segundo de suspensão), 27 bytes

idbgsp@@<C-U>Loading... \-/|<Esc>@.

Usar gsnão apenas é muito mais curto, mas você não precisa pressionar Enter. Isso significa que a macro se encaixa na linha e eu posso salvar bytes alternando para @.. (Como nada depois da chamada recursiva pode ser executado, eu posso digitar o que quiser.)


Obrigado por esta resposta! Eu aprendi gs, @.e o @@interior @.ainda faz minha cabeça doer!
Christian Rondeau

14

Pitão, 31 bytes

Wm,p+"\rLoading... "d.d.25"|/-\

Intérprete aqui .

Carregando GIF

Explicação

Wm,p+"\rLoading... "d.d.25"|/-\
    +"\rLoading... "d              Concatenate the string "\rLoading... " and the variable d
   p                               Print the result without a newline
                     .d.25         Sleep for 0.25 seconds
  ,                                Form a two-element list with the results of the two statements above. This is only needed to execute both statements in a single lambda function.
 m                        "|/-\    Map the above statement over the characters in the string "|/-\", setting the variable d to the character for each iteration
W                                  While the result of the map statement is true, do nothing

13

Powershell (v4), 57 56 54 53 58 57 bytes

De volta ao Bytecount eu comecei com!

for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}

A CLI no PowerShell falha levemente em alguns computadores, por isso não parece perfeita, mas é a melhor possível.

Moveu $ a ++ para o loop for para salvar um byte, (não ;)

Em seguida, mova-o para o indexador de matriz, para outro salvamento de 2 bytes, graças a Roman por apontar isso.

Também salvou mais 1 byte ( ;) movendo a parte Limpar tela ( cls) para o loop for.

Edição e corrigir apontado por TimmyD para o aspecto infinito da questão, apenas cinco Bytes necessário, mudou $a++%4para ($a=++$a%4)que ele nunca vai acima de 3.

Salve outro byte deixando o loop for totalmente em branco, graças a 'qualquer coisa' por indicar que isso é realmente possível no Powershell versão 4!

Novo gif atualizado para a versão (final?) Desta resposta.

Carregando Gif

for(;;cls){"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}

for(;;cls){"Loading... "+"|/-\"[$a++%4];sleep -m 250}

for(;;){"Loading... "+"|/-\"[$a++%4];sleep -m 250;cls}

for(;;$a++){"Loading... "+"|/-\"[$a%4];sleep -m 250;cls}

for(;;){$a++;"Loading... "+"|/-\"[$a%4];sleep -m 250;cls}


2
for(;;){"Loading... "+"|/-\"[$a++%4];sleep -m 250;cls}(mover o $a++para o último uso de $a)
Roman Gräf

sempre esquecendo algo - obrigado por isso!
colsw

2
Não sou muito adepto do Powershell, mas quando vi a entrada do Windows Batch, pensei "O Powershell poderia superar isso?". E aqui está ele!
Jakub Jankowski 29/11

1
Pelo menos no ps v4, você deve conseguir outro byte, mantendo a condição for totalmente vazia:for(){cls;"Loading... "+"|/-\"[($a=++$a%4)];sleep -m 250}
seja qual for o

1
De nada. Ele realmente parece funcionar para Versão 2+, era muito preguiçoso para verificar antes;)
qualquer que seja

11

Pitão - 36 35 bytes

#+"\033cLoading... "@"\|/-"~hZ.d.25

Não funciona online, obviamente.


Você tem um gif disso em ação? Além disso, existe algum contador que possa estourar?
FlipTack 28/11

@ Flp.Tkc o único contador é Zum número inteiro python, que não transborda. Eu estava tentando fazer um gif, mas não consegui fazê-lo funcionar. Se você sabe como criar um, pode executá-lo com o interpretador pyth
Maltysen 29/11/16

4
Se o número inteiro não exceder, provavelmente aumentará até encher toda a memória, o que causaria uma falha pelo menos após 10 anos na maioria dos sistemas de 32 bits. Claro, a morte térmica do universo vai acontecer primeiro, mas ainda assim ...
jjrv

11

Matlab, 78 75 bytes

a='\|/-';while 1;clc;disp(['Loading... ',a(1)]);a=a([2:4,1]);pause(1/4);end

insira a descrição da imagem aqui


11

HTML / CSS, 23 + 109 = 132 bytes

Melhorado com a resposta de Neil .

pre{display:flex}a{overflow:hidden;animation:a 1s steps(4)infinite;width:1ch}@keyframes a{to{text-indent:-4ch
<pre>Loading... <a>|/-\


9

Mathematica, 74 67 Bytes

ListAnimate["Loading... "<>#&/@{"|","/","-","\\"},AnimationRate->4]

Gritante 7 bytes de desconto graças a @dahnoak


ListAnimate["Loading... "<>#&/@Characters@"|/-\\",AnimationRate->4]
Dan Oak

1
@dahnoak felicidades! Não sabia que o ListAnimate era uma coisa. É uma pena que o <>Flat não seja Listable, caso contrário, mais 4 bytes poderão ser removidos!
A Simmons

Apenas por diversão:Dynamic["Loading... "<>{"|","/","-","\\"}[[1+Round[4Now@"Second"]~Mod~4]],UpdateInterval->.25]
shrx

9

C #, 170 133 Bytes

void X(){Console.Write("Loading...  ");for(;;){foreach(var c in "|/-\\"){Console.Write("\b"+c);System.Threading.Thread.Sleep(250);}}}

Muito obrigado a Roman Gräf e raznagul, que me salvaram 37 bytes. (Especialmente raznagul, que apontou, que minha solução original era inválida de qualquer maneira. Eu meio que perdi alguma coisa lá, mas ela está corrigida agora e deve atender aos requisitos :)

bastante semelhante à resposta C # existente de Pete Arden, mas com algumas melhorias

por exemplo "for (;;)" em vez de "while (true)", char em vez de string

Eu teria comentado minhas sugestões sobre a resposta dele, mas na verdade não tenho reputação suficiente para fazer isso.

Ungolfed:

static void X()
{
    Console.Write("Loading...  ");
    for (;;)
    {
        foreach (var c in "|/-\\")
        {
            Console.Write("\b" + c);
            System.Threading.Thread.Sleep(250);
        }
    }
}

2
Por que não remover o primeiro Console.Write("\b");e mudar o segundo para Console.Write("\b"+a);?
Roman Gräf 28/11

A definição de uma ação é desnecessária e demorada, usando um loop como foreach(var a in"|/-\\")e adicione o código que você possui atualmente na ação, pois o corpo economizará ~ 20 bytes.
raznagul

Além disso, a tarefa é criar exatamente a saída necessária. O que atualmente não é o caso.
raznagul

Deve ser o caso agora, eu esqueci '|' e o espaço à direita após "Carregando ...".
Snowfire 28/11

Na sua versão não-gasta (como ela não corresponde à versão em golfe), você pode remover a primeira Console.Write()e usar apenas uma em Console.Write($"Loading... {c}\r")vez da segunda.
milk

9

Adiante, 72, 73 bytes

EDIT :

  • Adicionada a versão Gforth-only, 69 bytes (Obrigado @ninjalj!)
  • Adicionado espaço em branco ausente após "Carregando ..." (Thx @Roman Gräf!), +1 byte
  • Atualizado para corresponder às regras com mais precisão (na mesma contagem de bytes)

Golfe

: L '| '/ '- '\ begin .\" \rLoading... " 3 roll dup emit 250 ms again ; L

Versão Gforth

A versão GNU Forth-only pode ser reduzida para 69 bytes assim:

'| '/ '- '\ [begin] .\" \rLoading... " 3 roll dup emit 250 ms [again]

Screencast

insira a descrição da imagem aqui

Experimente online!


1
Como você está usando o gforth, se você não se importa com a portabilidade para outros Forth's, pode usar [begin]e [again]fora de uma definição de palavra.
Ninjalj

9

Python 2, 81 79 78 77 bytes

import time
i=1
while 1:print'\rLoading...','\|/-'[i%4],;i+=1;time.sleep(.25)

Uma solução bastante simples que dorme usando time.

Uso \r(Um retorno de carro) para voltar ao início da linha e, em seguida, imprimo a mensagem substituindo a linha.

Começo com i=1para evitar o duplo escape do \(é em '\|/-'vez de '|/-\\').

No passado, eu costumava -~iquerer i + 1evitar parênteses. (Obrigado a @ Flp.Tkc por esses -2 bytes!) (Foi i=(i+1)%4contra i=-~i%4)

Agora, estou deixando o contador subir para sempre, já que tecnicamente o Python intnão pode transbordar. Obrigado a @Zachary T por apontar isso e salvar um byte!
Ele só para em uma máquina porque ela fica sem memória, mas isso leva 9,7 gerações, com 4 GB de memória para aquela int.

Graças ao @Kade, pelo -1 byte em que as print a,bimpressões ae o bespaço são separados, para que eu não precise do meu próprio espaço.

Aqui está um gif dele trabalhando no Windows:

Carregando

Também testei em uma VM Linux. Não pude testá-lo em um Mac.


1
Se bem me lembro, você pode usar i=-~i%4para salvar os bytes para os parênteses :)
FlipTack

2
Não será possível substituir [i],;i=-~i%4por [i%4],;i+=1salvar um byte, pois ele não excede o máximo do Python, apenas a memória máxima?
Zacharý 27/11

9
Eu deveria downvote-lo para logar como Administrator...
Neil

5
@ Neil Para ser totalmente sincero, basta colocar o arquivo Python no Administrator e executá-lo a partir daí, porque os outros nomes de contas são nomes reais (PC pessoal).
Artyer

2
Eu permitir que a sugestão de @ZacharyT como inteiros tecnicamente Python pode ser infinitamente grande, desde que o computador tem memória para mantê-los
FlipTack

7

MATL , 36 bytes

1 byte removido usando a idéia de @ flawr de mudar circularmente a string

'\-/|'`Xx1YS'Loading... 'y1)hD.25Y.T

Aqui está uma gravação gif do compilador offline:

insira a descrição da imagem aqui

Ou tente no MATL Online! Se não for executado inicialmente, atualize a página e pressione "Executar" novamente.

Como funciona

'\-/|'           % Push this string
`                % Do...while
  Xx             %   Clear screen
  1YS            %   Circularly shift thr string 1 step to the right
  'Loading... '  %   Push this string
  y              %   Duplicate the string of shifting symbols
  1)             %   Get the first character
  hD             %   Concatenate the two strings and display
  .25Y.          %   Pause for 0.25 seconds
  T              %   Push "true". This is used as loop condition, to it
                 %   generates an infinite loop
                 % End loop implicitly

Ei Luis. bem feito com MATL como sempre. Aqui está uma pequena variação da lista circular. e exibição. Você acha que poderia traduzir isso em uma solução ainda mais curta:a='\|/-';k=1; fprintf('Loading... -') while 1 k=mod(k,4)+1; fprintf('\b\b%c\n',a(k)); pause(.25); end
Hoki

@ Hoki Obrigado pela ideia. Na verdade, inicialmente eu tinha um contador de módulo 4 crescente, mas demorou um pouco mais (então ganhei um byte devido ao requisito de nenhuma pausa inicial). Além disso, acho que a tela nítida e a exibição normal são mais curtas do que fprintfcom os backspaces
Luis Mendo

7

Dyalog APL, 50 bytes

Isso funciona apenas na versão do Windows; caso contrário, a ⎕SMjanela não será exibida, a menos que ⎕SRseja chamado.

{⎕SM←1 1,⍨⊂⊃⍵⌽'Loading... '∘,¨'|/-\'⋄∇4|⍵+⌈⎕DL÷4}1

Explicação:

  • {... }1: execute a função começando com⍵=1
  • Loading... '∘,¨'|/-\': gerar as quatro saídas possíveis
  • ⊂⊃⍵⌽: Gire a lista para colocar o décimo elemento primeiro, pegue o primeiro elemento e coloque-o
  • ⎕SM←1 1,⍨: coloque a corda no canto superior esquerdo da ⎕SMjanela.
  • ⎕DL÷4: aguarde 1/4 de segundo
  • 4|⍵+⌈: arredonde o valor resultante (segundos gastos em espera, portanto, esse é sempre 1), adicione-o (aumente-o) e use o mod-4 (para evitar que ele transborde).
  • : execute a função novamente com o novo .

Animação


De alguma forma eu sabia que alguém iria apresentar uma resposta para esse desafio para Dyalog (/ APL) :)
YoYoYonnY

7

C #, 187 bytes

Golfe:

void L(){Console.Write("Loading...");Action<string>l=(a)=>{Console.SetCursorPosition(11,0);System.Threading.Thread.Sleep(250);Console.Write(a);};while(true){l("|");l("/");l("-");l("\\");}

Ungolfed:

public void L()
{
  Console.Write("Loading...");
  Action<string> l = (a) =>
  {
    Console.SetCursorPosition(11, 0);
    System.Threading.Thread.Sleep(250);
    Console.Write(a);
  };
  while (true)
  {
    l("|");
    l("/");
    l("-");
    l("\\");
  }
}

Ainda esperando o carregamento ...

insira a descrição da imagem aqui


Ainda esperando para exibir "\" ...
manatwork 28/11

@manatwork Oh merda, cópia preguiçosa e colagem. Vou consertá-lo quando voltar à minha mesa em breve :)
Pete Arden

Lamento ver a sua solução ficar mais longa devido ao meu comentário. Você não pode usar em 1>0vez detrue voltar para 186?
manatwork

@ErikGolfer não tem idéia do C #, mas com base no fato de a linguagem ser uma cópia do Java e aparentemente confirmada por Não é possível converter int bool , achei que não iria funcionar. (BTW, se isso funciona, talvez usando a primeira chamada de l()como condição também funcionaria?)
manatwork

2
@manatwork Bem, parece que o C # é inviável.
Erik the Outgolfer 28/11

7

Snap !, 8 blocos

8 blocos de Snap!

Este foi um dos primeiros algoritmos que eu já descobri em uma Apple] [e


1
Mostre-nos o seu Applesoft BASIC :)
roblogic

1
Eu ficaria feliz em fazer isso no Hypercard.
wyldstallyns

6

reticular, não-competitivo, 40 bytes

:i=@C"Loading... "o"|/-\\".iHo14%w.i1+4,

insira a descrição da imagem aqui

Eu esqueci de cometer um monte de coisas, inclusive w. Ah bem.

Explicação

:i=@C"Loading... "o"|/-\\".iHo14%w.i1+4,
:i=                                       set `i` to the TOS
   @C                                     clear the screen
     "Loading... "o                       output that string
                   "|/-\\"                push that string
                          .i              get `i`
                            H             get the `i`th character of that string
                             o            and output it
                              14%         push 0.25 (1/4)
                                 w        wait that long
                                  .i      get `i`
                                    1+    increment
                                      4,  mod 4
                                          this wraps around the beginning of the program,
                                          setting i to the said value

6

Bash, 98 69 bytes

while s='\|/-';do
printf "\rLoading... ${s:i=++i%4:1}"
sleep .25
done

Obrigado a muitas pessoas pelos muitos bytes jogados fora!


Além disso, você não tem que escapar a barra invertida se você usar aspas simples e os argumentos para echo -e -npodem ser combinados paraecho -en
Evan Chen

Você pode salvar 2 linhas e 13 bytes substituindo a linha de eco em:echo -en "\rLoading... ${s:i=(i+1)%4:1}"
Ipor Sircer 28/11

echo -enprintf; faça a atribuição para a whilecondição.
manatwork

usar printf como manatwork disse, simplificar o substring, e colocá-lo diretamente na whilecondição: while printf "\rLoading... ${s:i++%4:1}";do. 67 bytes
Dominik R

Isso não vai funcionar Dominik R, acabaria transbordando.
Zachary

6

Perl 6 , 72 61 bytes

Supply.interval(1/4).tap: {print "\rLoading... ",<| / - \ >[$/++];$/%=4}
loop {print "\rLoading... ",<| / - \ >[$/++];$/%=4;sleep 1/4}

6

> <> , 55 + 4 = 59 bytes

"...gnidaoL"v
l?!voc1. ^:<>
<v<>'\|/-'>^v
^<^<<<8{<<^o<

Deve ser executado passando -t .01como argumento adicional para o intérprete, que é o +4 na contagem de bytes.

O que isso faz é colocar os quatro caracteres a serem impressos na pilha, imprimir o de cima sem removê-lo e mudar a pilha por uma posição. Em seguida, ele imprime \b(backspace, caractere x08) e reinicia o loop.

O tempo é alcançado pelo argumento passado ao intérprete, o que força a aguardar 0,01 segundo antes de executar cada instrução. Existem 23 instruções entre uma saída e a próxima (a maioria simplesmente move o ponteiro da instrução para a próxima célula); portanto, isso irá esperar 0,23 segundos mais o tempo necessário para executar as instruções, o que se encaixa sem problemas nos 0,25s solicitados. com 10% de erro.

Você pode tentar online , mas esse intérprete não reconhece o caractere de backspace, portanto a saída será um pouco estranha lá.


Normalmente, sinalizadores como -nsão pontuados como 1 byte, então acho que você pode pontuar o argumento como t, .01que é de 4 bytes. Uso agradável da regra dos 10% btw :)
FlipTack

@ Flp.Tkc Obrigado! Eu não tinha certeza de como contar bytes para o argumento, eu gosto desta forma :)
Leo

@ Leo - Existe uma razão para o uso de 0,01 e não um tick maior com menos instruções? Eu adicionei minha versão que usa um loop de 8 instruções e a contagem de ticks de 0,03; # "... gnidaoL" l?! vob0. "\ | / -": o} 8o51. > #
Teal pelican

@Tealpelican Há uma razão, mas não é muito boa: as regras afirmam que "você não deve esperar 0,25 segundos antes de mostrar inicialmente a saída - o primeiro quadro deve ser impresso assim que o programa for executado". não quero prolongar o tempo, por outro lado, isso é código de golfe, então eu não queria torná-lo muito curto. No final, decidi por um loop de 25 instruções com 0,01s cada para atingir o tempo exato de 0,25s solicitado; quando o implementei, percebi que faltava espaço suficiente para o loop completo, então tive que recorrer ao uso da regra dos 10%.
Leo

Eu devo ter interpretado mal as regras. Essa é uma boa razão para o momento :)
Teal pelicano

6

Arquivo .com do MS-DOS, 56 bytes

Aqui o conteúdo do arquivo em 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

O código do assembler correspondente é assim:

    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... ",'$'

1
Manter uma tecla pressionada acelera o botão rotativo, que pode ser corrigido mascarando outras interrupções além da interrupção do temporizador, por exemplo:mov al, 0xfe / out 0x21,al
ninjalj 29/11

O comentário para HLT está errado, você provavelmente quis dizer que HLT acorda a ~ 18,2 Hz (ou, mais precisamente, no relógio NTSC / 12/65536 Hz).
Ninjalj

@ninjalj Obrigado. Mudei o comentário ...
Martin Rosenau

6

NASM x86_64 - 349 283 bytes

Isso deve ser executado em sistemas Linux de 64 bits

construído 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

animação:

salvou 65 bytes - obrigado user254948

insira a descrição da imagem aqui


Conto 349 bytes, a menos que haja uma nova linha / espaço à direita
FlipTack

^ Flp. Tkc Obrigado, havia uma linha com um espaço no final
Samuel

@ Samuel são necessárias as linhas 13-17? Parece funcionar muito bem sem essas linhas. Tanto quanto posso dizer (receio que não seja tão bom em montagem), você imprime o Loading ...., depois o | caractere, remova esse caractere e insira um loop em que você repete a impressão do | pela primeira vez.
precisa saber é o seguinte

@Samuel além de xor r8, r8 -> mov r8,0 (salva 1 caractere), alguns MOVs têm um espaço extra (mov r7, 1 -> mov r7,1). além disso, as instruções cmp r8,4, jl l, xor r8, r8, podem ser substituídas por AND r8,3 (salvando 15 caracteres). Você deve ter 285 bytes e não 349! (em combinação com as linhas mencionadas acima)
user254948 1/16/16

5

R, 85 89 bytes

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

Editar: Corrigida a resposta de forma que Tnão transbordasse, redefinindo o contador se maior que 4.

O único aspecto interessante sobre essa resposta é o uso do R TRUTHYembutido T. É efetivamente um conjunto de variáveis ​​predefinido, o 1/TRUEque significa que não precisamos inicializar o contador, mas podemos começar a incrementar T.


Acabaria Ttransbordando?
FlipTack

@ Flp.Tkc Não transbordaria, mas seria tratado como passado infinito, 1e+308caso em que NAé retornado, então acho que essa resposta é inválida (não a note nas regras). Será atualizado em breve
Billywob 28/11

1
Na verdade, você pode obter 2 bytes mais curtos se não usar o built-in T: i=1;repeat{cat("\rLoading...",c("\\","|","/","-")[i]);Sys.sleep(.25);i=`if`(i>3,1,i+1)}é 87 bytes.
plannapus

Hmm ... o R opera apenas em vetores? Por que não existem módulos ou operadores bit a bit para átomos? éT um vetor? Funciona T=(T+1)%%4? Isso salvaria outros 5 bytes.
Titus

2
... ou T=T%%4+1 : até 2 bytes mais curtos.
Titus

5

Haskell (GHC), 103 91 bytes

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

Obrigado @nimi por salvar 12 bytes!


Não há necessidade de um programa completo. mapM((threadDelay 250000>>).putStr)$("\rLoading... "++).pure<$>cycle"|/-\\".
N28 /

Dois bytes podem ser salvos usando a tolerância de 10% e a substituição 250000e o espaço antes dele (4^9).
Christian Sievers

5

C (em sistemas UNIX) 88 bytes

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

Começa com o personagem errado, mas acho que parece melhor. Você pode alterar facilmente a ordem dos caracteres modificando o "\ - / |" corda.


Pode ser jogado ainda mais com a mudança de instruções para for, por exemplo ain(_){for(;printf("\rLoading... %c","\\-/|"[_%4]);usleep(250000))_++,fflush(0);}main(_){for(;printf("\rLoading... %c","\\-/|"[_++%4]);usleep(250000))fflush(0);}
:,

Você precisa do fflush () lá?
John U

Na maioria dos sistemas, você precisa do flush, muitos deles com buffer baseado em novas linhas. No entanto, é possível que isso não seja necessário em alguns sistemas.
LambdaBeta 2/16/16

Você pode usar em fprintf(stderr,...vez disso, uma vez que isso não é buffer de linha como stdout. O jogo f...stderr,leva oito caracteres, enquanto o jogo fflush(0);leva dez, por isso é uma vitória líquida de dois personagens.
#

5

Perl, 71 63 61 bytes

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

Versão anterior:

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

Thanx para @primo por 10 bytes.


2
Bom truque para usar o selecttempo limite em vez de Time::HiRes. Você pode salvar alguns bytes usando ... while$|=printe movendo os hífens na transliteração para a frente e o final. s//\r Loading... |/também salva um byte sobre a atribuição.
Primo28

2
E também, se você usar aspas simples para o delimitador de transliteração, não há necessidade de escapar a barra invertida ou: y'-\|/'\|/-'.
Primo 28/11

Parece que você tem um espaço extra antes do seu código.
Erik o Outgolfer

1
Você pode salvar outro byte usando um literal \r.
Ninjalj 28/11

1
Use y'-|\/'\/|-'/4no lugar de .25por mais 2.
Primo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.