Introdução
Lembra dos anos 80? Quero dizer, sabe, há 30 anos atrás? Sem telefones celulares, sem internet, sem caixas eletrônicos, roupas fluorescentes (o que era isso ?!) e marquise de rolagem ! Não não não! Não os online, mas os reais, com luzes LED.
Como estou com um humor nostálgico, gostaria que você criasse uma marca de rolagem.
Desafio
Crie um programa onde você pode inserir uma sequência de uma linha. Seu programa precisa criar uma marca de rolagem com 80 caracteres de largura, repetindo o texto, se necessário.
Regras
- O usuário deve poder inserir uma sequência no seu programa como entrada. A sequência pode ser um parâmetro de linha de comando ou uma sequência inserida durante a execução do programa.
- Seu programa deve imprimir continuamente uma sequência de exatamente 80 caracteres (visíveis).
- A string deve ser atualizada a cada 0,1 segundo (mais ou menos; não vou cronometrar), deslocando os caracteres a cada iteração uma posição para a esquerda.
- A string "gira". No final da sequência fornecida pelo usuário, outra instância da sequência deve aparecer.
- Seu programa deve imprimir sua saída em uma linha, sem feeds de linha (use um '\ r' em vez de um '\ n')
- Seu programa deve executar ad infinitum , até que um usuário seja interrompido.
- Este é um codegolf, então o código mais curto em bytes vence.
- Há um bônus de 10% (arredondado para cima para o próximo inteiro) para impressão no vermelho em um fundo preto.
- Aplicam-se brechas padrão.
Implementação de referência no Python 2.7
Este programa não é um jogo de golfe, mas fornece uma implementação de referência (e, portanto, um limite superior para o tamanho).
import time,sys
s=raw_input()*99
while 1:
for i in range(80):
print s[i:i+80]+'\r',
sys.stdout.flush()
time.sleep(0.1)
1 2 3 4 5 6 7 8 9 10 11 ... 300
cortes após cerca de 56.Respostas:
CJam, 31 bytes
Aguarda exatamente 100 ms.
Isso funcionará apenas com o intérprete oficial do Java , uma vez que o intérprete online mostra apenas a saída após a saída do programa.
O texto em vermelho sobre fundo preto é possível em 40 (ou 39) bytes, com uma pontuação de 36:
Como funciona
fonte
;
a explicação está desalinhada #PowerShell,
118 113 112 108 102 101 9996 - 10% = 86Código
Com a ressalva de que agora começa o primeiro loop com o segundo caractere; As regras não dizem que deve começar pela frente da corda, e a primeira é incluída no geral, então tudo bem para mim. Vou consegui-lo de 100 caracteres de alguma forma - edit: obrigado @ConnorLSW pelas edições para obtê-lo abaixo de 100.
Instruções
Resultado
Notas
Uma versão mais legível com os nomes e parâmetros das variáveis preenchidos um pouco:
-F R
são únicos o suficiente para definir um Red ForegroundColor, por exemplo.-B 0
define para colorir o valor Enum 0, que é interpretado como Preto.Letreiro alternativo, mais "correto":
O código de referência não lida bem com seqüências de caracteres com mais de 80 caracteres, ignorando qualquer coisa na mensagem além de 160 caracteres e redefine a cada 99 * len (string) caracteres. por exemplo, se a largura do sinal tiver 5 caracteres, isso será feito:
Esta versão indexa o tamanho do texto em vez da largura do sinal e, portanto, percorre toda a cadeia. 106 - 10% = 95 caracteres.
Alternativa: assine quais ciclos como o .gif na pergunta, 118-10% = 106
Porque parece melhor.
fonte
Bla
para0
-Write-Host
interpretará números em cores.while(1)
afor()
salvar alguns bytes :)for()
, você pode salvar mais um byte, alterando$s=(Read-Host)*180;for(){
parafor($s=(Read-Host)*180){
Matlab, 76 bytes
O que eu acho legal aqui é que você pode ter vetores como índices de matriz. Isso retorna um vetor das entradas correspondentes da matriz, o que facilita muito acrescentar a sequência especificada independentemente do comprimento.
Resultado:
fonte
clc
. Você esqueceu de acrescentar's'
eminput
a=input('','s')
'
seqüências delimitadas como entrada. Muitos idiomas precisam de um delimitador de string ou eles interpretariam um argumento de linha de comando na forma de uma frase (palavras separadas por espaços) como múltiplos argumentos de qualquer maneira.QBasic,
116113 bytes - 10% =105102Aqui está uma versão formatada com alguns comentários:
Algumas notas:
PRINT
oFOR
loop posterior é necessário.CLS
deve redefinir o cursor para o canto superior esquerdo de cada vez. Mas no QB64, pelo menos, se eu não colocar o extraPRINT
, a marca de seleção acaba na segunda linha, em vez da primeira. Se alguém tiver o QBasic configurado no DosBox ou algo assim, eu estaria interessado em saber se a mesma coisa acontece lá ou se é um bug do QB64.TIMER
(número de segundos desde meia-noite) para o atraso. Se o código estiver em execução à meia-noite, a marca de seleção ficará presa porqueTIMER
será redefinida0
e sempre será menor que at
partir de então.fonte
PRINT
mas comCLS
--afterCLS
, não importa o que foi impresso antes, a próximaPRINT
instrução deve sair em 1,1; mas, em vez disso, me deparei com uma situação em que a saída era de 2,1.Perl,
9998 bytes (-10% = 89)Recebe sua entrada do parâmetro de linha de comando.
fonte
pb , ⌈ (216 + 3) * 0,9⌉ = 198
+3 bytes para sinalizador de intérprete
d=1
Uma pontuação bastante horrível, mas, considerando o quão difícil é fazer algo nesse idioma, pode ser pior. A proporção desta resposta de (bytes usados para obter texto em vermelho) para (bônus por ter texto em vermelho) é realmente boa, toda a saída fica vermelha com apenas
c
o início!O tempo entre cada marca varia de acordo com o comprimento da sequência de entrada, mas é de cerca de 0,1 segundos.
A propósito, a saída deste programa parece lixo total porque o intérprete é muito ruim. A cada milissegundo, ele limpa o terminal e redesenha tudo, tornando-o realmente instável.
Com comentários:
fonte
Perl - 120 bytes (-10% = 108)
fonte
Matlab, ⌈188 * .9⌉ = 170
Isso funciona na versão Matlab R2014b ou superior. O resultado é mostrado em uma janela de figura.
No exemplo a seguir , o texto é digitado em negrito para melhor visualização (não feito no código acima porque custa alguns bytes). Observe também que a velocidade da animação GIF não corresponde à pausa de 0,1 s necessária, mas o tempo está correto na figura real mostrada ao executar o programa.
fonte
SpecBAS, 130 bytes (-10% = 117)
Multiplica a sequência original para formar 80 ou mais caracteres e a corta exatamente para 80.
TEXT
é um comando no SpecBAS que funciona da mesma maneira quePRINT
(neste exemplo), mas salva um caractere.O
SCALE
comando adiciona alguns caracteres extras ao código, mas faz com que pareça mais sofisticado.O programa continua até você pressionar Esc.
fonte
Perl, 63 (70 caracteres - 10% para bônus)
Não é uma solução muito diferente das outras, mas eu perdi meu tempo fazendo isso, então pensei em publicá-la também!
Confia em um terminal compatível com Unix para códigos ANSI e na chamada para coreutils '
sleep
. Os dois\x..
caracteres acima são, na verdade, um literal de feed de linha e de escape, de acordo com este dump hexadecimal:fonte
Ruby,
797675 bytesAinda não sou um especialista em rubi, possivelmente posso jogar golfe.
Com vermelho e preto com a mesma pontuação:
fonte
Perl, 84 bytes (- 10% = 76)
Isso requer um argumento de linha de comando, que é o texto na marca de seleção.
Explicação:
$_
\b
) e um espaço (). Isso remove o último caractere da impressão anterior. Em seguida, imprima o retorno do carro e a cor.
$p
$p = ($p+1) % length of text
fonte
bash, 121 bytes
fonte
Python 3, 96 bytes
Isso funcionará apenas em terminais que suportam seqüências de escape ANSI. Se você estiver no Windows, tente o ansicon .
Viva a
flush
palavra - chave no Python 3, para que não tenhamos que fazer umasys.stdout.flush()
chamada cara .fonte
C,
293269 bytes(Novas linhas adicionadas para facilitar a leitura)
Isso recebe a entrada da entrada padrão finalizada pelo EOF; portanto, é melhor inserir uma string, uma nova linha e o EOF (por exemplo, Ctrl ^ D).
Ungolfed:
fonte
SmileBASIC BIG, 79 bytes
Eu tinha uma boa solução gráfica quase pronta quando percebi que precisava rolar 1 caractere inteiro de cada vez.
fonte
Geléia ,
201918 bytes80
por⁹
(= 256), pois ele deve ser multiplicado por pelo menos 80Çß
(deÇ1¿
).Com alguns truques da resposta de @Dennis 'aqui . A geléia é mais recente que o desafio, mas não é exatamente feita para isso. Sugestões sobre como melhorar são bem-vindas! Se seu console estiver em utf-8, execute
export LC_ALL=en_US
ou similar antes de tentar.Exemplo
Explicação
fonte
LOVE2D Lua, 197-10% = 178 bytes
Requer que a entrada esteja em um arquivo chamado 'tt' na raiz, portanto, 3 bytes extras foram adicionados à pontuação.
Uma funcionalidade realmente básica, apenas em um loop for de 80 iterações, acrescenta o caractere no índice de i mais o tempo atual em segundos modulado pelo comprimento da string atual, fornecendo uma string repetida de 80 caracteres da entrada, que muda para a esquerda com o passar do tempo.
Eu usei LOVE2D para rir.
fonte
Sinclair ZX81 / Timex TS1000 / 1500 BASIC,
110 bytes182 bytes (para a listagem)Ele funciona imprimindo os primeiros
3280 caracteres da stringA$
na posição 0,0 da tela na linha dois e, em seguida, manipulando a string da posição 2 até o final da picada na linha 3 (o Sinclair ZX81 BASIC indexa as strings de 1 e não zero ), portanto, adicionando o primeiro caractere ao final e devolvendo-o àA$
variável; então há um loop incondicional de volta à linha 2.fonte
Comodoro 64, 434 bytes
Como isso exige 80 caracteres para mostrar, e o C64, por padrão, tem apenas 40 caracteres, então 40 caracteres do scrolly são impressos na linha superior da área da tela, enquanto os outros 40 são impressos próximo à parte inferior.
Para esclarecer o que os
{HOME}
outros símbolos traduzem como PETSCII, eis uma captura de tela do meu emulador:Farei uma versão completa quando eu instalar o CBM PRG Studio (ou quando não estiver almoçando no trabalho).
fonte
Ruby,
7977 caracteresfonte
PHP, 136 bytes
php -f marquee.php hello\ world
para marcar a string "hello world".hello worlddddddddddddddddddddddddddddddddddddddd
, mas ela passará apenas por 80 caracteres - espero que isso ainda conte.Foi um longo dia, provavelmente há algo que eu posso fazer para melhorá-lo
fonte
PHP, 85 bytes
recebe entrada do primeiro argumento da linha de comando; corra com
-nr
.Inicia a rolagem com o segundo caractere. Adicione um byte para iniciar o primeiro caractere:
Substitua
=++$i%
por%=
e;;
por;;$i++,
.fonte