Após minha entrada no Hello World Ofuscado, pensei que seria divertido compartilhar o código subjacente. Mas por que apenas mostrar o código, vamos torná-lo também um golfe!
Desafio
Escreva um script que role uma corda pelo terminal, da direita para a esquerda, estabelecendo-se no lado esquerdo.
Entrada
Leva uma string como argumento.
Resultado
Imprime a marca de rolagem em STDOUT. Largura máxima de ~ 50 caracteres. Começa com 0 ou 1 caractere sendo exibido. Algum espaço entre as letras durante a rolagem. Pára quando resolvido (sem espaço extra entre caracteres de palavras). Rolagem lenta, mas não muito lenta (<1s por iteração).
Exemplo
Executando script com arg 'Hello World'
H
mais tarde
H e l l o W o
mais tarde
H e l l o W o r l d
mais tarde
Hell o W o r l d
finalmente
Hello World
Para um exemplo em execução, tente meu código no desafio "Hello World". Eventualmente eu vou postar o meu. Atualmente, são 202 caracteres em Perl. Agora que existem alguns concorrentes, postei o meu nas respostas.
Vencedora
Não quero que as restrições sejam absolutas, por isso as deixei um pouco vagas. O roteiro mais curto que segue o espírito do meu original vencerá.
Notas
Este jogo assume um xterm
ambiente. Caso outro ambiente seja útil, apenas ambientes semelhantes serão comparados e um vencedor separado poderá ser declarado para cada um.
Adendo (25 de abril de 2012)
Para resolver alguns problemas, estou tomando uma decisão. Sua contagem de caracteres deve incluir o código necessário para:
- Flush STDOUT (olhando para você, Ruby)
- Implementar
sleep
com atraso de tempo <1s (olhando para você, Perl)
Isso pode ser feito quando a linha de comando alterna para um intérprete, mas esses caracteres contam no total (sem o espaço em branco).
xterm
,vt102
...?Respostas:
python 2 - 146 caracteres
edit: transformou uma função em vez de entrada através de stdin. o primeiro argumento é a sequência e o segundo argumento é o comprimento que você deseja que seja. então a invocação seria
f('Hello World', 50)
. Eu também fiz muito mais suave; quando cada personagem 'pousou' houve uma pausa estranhavelho, 158 caracteres:
fonte
f("Hello World, 40)
funcionou para mim.Ruby,
939189 caracteresO texto a ser exibido deve ser fornecido como argumento de linha de comando, por exemplo
para o exemplo mostrado acima. Infelizmente não posso mostrar a animação aqui, então você deve experimentar o código por conta própria.
Versão anterior:
fonte
STDOUT.sync=true;
para que ele autoflushes. O Perl equiv é$|++
. São 17 caracteres adicionais, mas ainda bem abaixo do meu. Bem, eu não posso ter Ruby batendo Perl! Vou ter que trabalhar. Agradável.ruby1.8 "Hello World"
, recebo, não exatamente para minha surpresa, um erro dizendo:ruby1.8: No such file or directory -- Hello World (LoadError)
ruby foo.rb args
;-)C,
948380173 caracteresEDIT: Adicionado muito código, implementa toda a funcionalidade solicitada agora. A constante
1e8
pode ser ajustada para controlar a velocidade. Na minha máquina, é bastante rápido.Alguns personagens certamente podem ser salvos aqui.
l
pode ser estático (salva a inicialização),c
pode se tornar um ponteiro (substituindob+c
).Versão antiga (80 caracteres), com funcionalidade parcial:
Salva alguns caracteres substituindo
char**t
porint*t
. Funciona bem em 32 bits (int**t
suportaria 64 bits).fonte
K&R C -
431416 caracteresRespeita o padrão a um alto grau. Usa ncurses, portanto deve ser amplamente independente do terminal. Há uma leve gagueira quando o texto atinge o lado devido a alguns truques executados para preservar o espaço em branco pretendido na string.
A string a ser usada deve ser passada como o primeiro argumento na linha de comando (e deve ser escapada se contiver espaços, mais ainda se contiver a
!
como minha string de teste (Hello, World!
)).De uma forma mais legível e comentada:
fonte
if
por operadores. Por exemplo -if((s-q)%2)s--;else usleep(1e5);
->s-q&1?s--:usleep(1e5);
(ous-=s-q&1||usleep(1e5);
)' '
s por equivalentes numéricos.x==32
porx-32
(inverte o significado, então inverta o if-else) ou porx<33
(assumindo que 0..31 nunca foi usado). Inicialize com os valores que você tem (for(curs_set(c=0);...
).*(s+1)
->s[1]
. Remova os aparelhos desnecessários (substituir;
por,
ajudará).Perl 5.13.2, 96
Roubando muito da resposta de @ Kevin Reid , especialmente o
/r
truque disponível nos Perls mais recentes.Perl, 115
Como a resposta de @ Joel Berger , isso ficaria muito mais curto se eu pudesse usar
sleep 1
e ser lento, ou passar-MTime::HiRes=sleep
na linha de comando para ativarsleep.1
. Caso contrário, a única maneira incorporada de dormir poucoselect'','','',.1
é a bastante longa.Perl, 128Perl, 133fonte
x
e a forma de blocomap
economizará algumas.Javascript
180218 caracteresVersão de produção:
Versão Ungolfed:
Aqui está uma demonstração do jsFiddle
Nota: se você tentar reproduzi-lo, verifique se o código está abaixo do corpo
fonte
Perl 5.13.2, 115 caracteres
/r
.Créditos:
$"
como uma fonte de" "
tomada de resposta de ephemient , redução de 1 personagem.fonte
r
bandeira, melhor além da língua desdestate
festança 234
Uso:
ungolfed:
fonte
R, 319 caracteres
Seguindo a filosofia do exemplo do @Blazer (d é o atraso em segundos):
Uso:
fonte
Perl :
144133Para obter o sono <1s, você precisa executar o seguinte:
Como não vou me declarar vencedor, não discutirei sobre o que conta lá ou não (mas realmente não posso fazer com que Ruby ganhe isso ;-))
fonte
s/' '/$"/g
es/shift/pop/
push
declaração. Eu ainda não tinha postado ainda.Q, 145
Não atende exatamente aos requisitos porque a linha final remove todos os espaços que estavam na cadeia de entrada original.
São necessários dois argumentos: string de entrada e velocidade de rolagem
fonte
PowerShell, 135
Não sou muito golfista e provavelmente uma abordagem horrível, mas estou doente e não consigo pensar ...
fonte
J (116)
Toma a string de entrada na linha de comando, ou seja
jconsole marquee.ijs 'Hello, world!'
Se não precisar limpar a tela, ou seja, faça a seguinte saída:
é permitido, seriam 12 caracteres mais curtos.
Explicação:
s.=>2{ARGV
: obtém a string na linha de comandok.=50,3#~<:#s
: a quantidade inicial de espaço em branco adicionada antes de cada caractere, 50 antes do primeiro e 3 antes de todos os outros. (fornece uma matriz, '50 3 3 3 ... ')([-=&0@/:@\:@~:&0)
: dado um array, diminui o primeiro item diferente de zero no array^:(i.>:+/k)
: esta função aplicada N vezes, em que N é 0 até a soma da quantidade de espaço em branco adicionado. (dá uma matriz:50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0)
."1
: execute a seguinte função em cada linha da matriz;@:(([,~#&' '@])@.>)
: adicione a quantidade especificada de espaços antes de cada caractere na sequência(50&{.)
: pega os primeiros 50 caracteres da sequência([[i.@]&2e7)
: uma função que gera a lista de 0 a 2 * 10 ^ 7 e a joga fora. Isso leva cerca de um terço de segundo na minha máquina, isso causa o atraso.((50#LF)&,)
: adicione 50 novas linhas antes da sequência, para limpar a telaecho
: gera a strings (...)
: fornece a string como argumento esquerdo para a funçãofonte
APL (70)
Pega a entrada do teclado, a saída está na
⎕SM
janela (que seria o terminal se você tivesse um APL baseado em texto, eu acho). O tamanho da janela é detectado automaticamente, se você realmente quiser 50, mude1↓⎕SD
para50
.Explicação:
1↓⎕SD,1↓3⍴⍨⍴D←⍞
: leia a string e armazeneD
. Gere um vetor descrevendo quanto espaço em branco será adicionado antes de cada caractere, que é a largura da tela antes do primeiro caractere (1↓⎕SD
) e 3 antes dos outros (1↓3⍴⍨⍴D
).⎕DL÷8
: aguarde 1/8 de segundoP←⍵-{⍵×~×⍺}\×⍵
: no vetor no argumento certo, subtraia 1 do item diferente de zero à esquerda e armazene o novo vetor em P.,/D{⍺,⍨⍵⍴⍕⍬}¨P
: para cada caractere em D, prefixe a quantidade de espaço em branco fornecida em P.⎕SM∘←1,⍨1,⍨
: exibido na tela, na coluna mais à esquerda da linha superior0∨.≠P:∇P
: se houver um elemento diferente de zero em P, repita com P.fonte
PowerShell , 129 bytes
Experimente online!
Este script não remove espaços dos argumentos em contraste com o script de Joey .
TIO
não exibe a saída corretamente. Com o console do Powershell, você obtém a marca de rolagem.fonte
05AB1E , 42 bytes
Experimente online (sem dormir). NOTA: Não tenho o 05AB1E instalado localmente, por isso não tenho 100% de certeza se o
\r
truque funciona (em teoria, ele deve funcionar). No TIO, eles\r
são interpretados como novas linhas. Além disso, o TIO usa a versão herdada, porque.e
está desativado na nova versão do TIO (o programa é o mesmo na versão herdada e na nova versão do 05AB1E).Explicação:
Veja esta dica 05AB1E meu (seção Como usar o dicionário? ) Para entender por que
“…¢('\r')“
é"print('\r')"
.fonte
Python, 139 bytes
Tem que ligar
f('Hello World', 50)
para começar.fonte