A tarefa:
Dado um .txt
arquivo com quadros de arte ASCII, cada um separado por um \n
(veja este exemplo, se você não estiver claro) emite um filme com quadro com 1 quadro por segundo.
Observe que há um rastro \n
no quadro final.
As dimensões de cada quadro serão:
- X <80
- Y <20
As regras
- O quadro anterior deve ser limpo antes que o próximo seja exibido, portanto, apenas imprimir cada quadro no terminal não é uma resposta válida.
- Novo Você pode pegar o nome do arquivo como quiser, seja armazenado em uma variável ou em sys args.
- Novo As imagens devem fazer um loop indefinidamente
- Este é o código de golfe: o menor programa vence.
Exemplo
Entrada
0 0
0 0
00000
0 0
0 0
00000
0
00000
0
00000
0 0
0 0
0
0
0
Resultado
Sem golfe
import curses, time
stdscr = curses.initscr()
Frames = file.read(file('Frames.txt')).split('\n')
while True:
y = 0
for i in range(len(Frames)):
stdscr.addstr(y,0,Frames[i])
stdscr.refresh()
y += 1
if Frames[i] == '':
y = 0
stdscr.clear()
time.sleep(1)
document.body.innerText
Respostas:
Mathematica, 41 bytes
Espera que o nome do arquivo a ser armazenado na variável
f
.Esta é a primeira vez que a precedência do Mathematica rege
@
e.~.~.
é exatamente do jeito que eu preciso deles.Aliás, esse trecho pode dar terrivelmente errado se a extensão do arquivo for diferente de
.txt
(porque o Mathematica tentará adivinhar como fazer a importação com base nisso), mas felizmente esse final do arquivo faz parte da especificação do desafio.fonte
Bash, 82
Supõe que o nome do arquivo .txt seja fornecido como o primeiro argumento para o script.
Observe que uma linha vazia à direita deve estar presente no final do arquivo .txt para que isso funcione.
Agradecimentos especiais a @professorfish e @DigitalTrauma.
fonte
$IFS
branco por padrão? também, use emfor ((;;)){ ... }
vez dewhile :;do ... done
''
queread
possa ler vários espaços consecutivos, como na última linha de YIFS=
e em[ "$a" ]
vez de[ -n "$a" ]
Ruby,
88865655 caracteresEste programa assume que o nome do arquivo é fornecido como o primeiro argumento.
Muito obrigado a Ventero por compartilhar grandes melhorias!
Sem golfe:
Este programa lê o arquivo, divide-o em partes e imprime cada parte separadamente após limpar a tela.
cls
só funciona no Windows. Uma variante comclear
57 caracteres.fonte
;
e omitindo os parênteses ao chamarsplit
.\n
qualquer maneira. Também aqui no código golf, ninguém fará você adicionar outro ponto à sua pontuação para cada quebra de linha apenas porque você está usando o Windows. ;)$*
é uma abreviação deARGV
, o que salvaria dois caracteres. Neste caso, você pode economizar ainda mais usandoARGF
(ou$<
) que:a=$<.read.split"\n\n"
.a.size
também é menor quea.length
. E comosleep
retorna seu argumento após retornar, você pode combinar as duas últimas instruções em seu loop emi+=sleep 1
.i
usandoArray#cycle
, que loops para sempre se nenhum argumento é dado:a.cycle{|i|system"cls";$><<i;sleep 1}
. E dividir em$/+$/
é outro caractere menor que"\n\n"
.a
:$<.read.split($/+$/).cycle{...}
(Desculpe pelo comentário triplo, sempre penso em novas melhorias logo após o término do período de edição dos comentários :)) #Dyalog APL (64)
(Não é possível vencer o Mathematica desta vez. Parece ter um built-in para tudo.)
Essa é uma função que usa o nome do arquivo como argumento. Ele assume que o arquivo está no
\r\n
formato Windows ( ).Explicação:
⎕ML←3
: defina o nível de migração como 3 (permitindo⊂
ser usado como recurso de divisão do APL2)M←80 ¯1⎕MAP⍵
: leia o arquivo fornecido pelo argumento correto como um arquivo ASCII e armazene o conteúdo emM
.M⊂⍨~(4/1)⍷⎕TC∊⍨M
: encontre todas as ocorrências de quatro caracteres consecutivos de controle de terminal e dividaM
-os. Isso fornece cada quadro.{
...}¨
: para cada um desses ...⊂⊃⍵⊂⍨~⍵∊⎕TC
: divida o argumento (= um quadro) nos caracteres de controle do terminal e transforme o vetor de vetores em uma matriz (para exibir cada linha em uma linha separada, isso é necessário porque⎕SM
não entende os caracteres de controle).⎕SM←1 1,⍨
: depois, exiba-o no canto superior esquerdo da⎕SM
janela.⎕DL 1
: e aguarde um segundo.fonte
Awk, 53Novas regras:
Awk, 74
fonte
BEGIN{RS=z}{system("sleep 1;clear")}1
... No awk,""
é especial porRS
significar registros de várias linhas. Para apoiar a nova regra de loop indefinidamente, eu tenho isso até agora:BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}
com 74 caracteres. O gawk suporta alterações,ARGV
para que você possa fazerBEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1
com 63 caracteres.Perl, 40
correr como
(ou seja, o arquivo de animação é lido através do STDIN). 3 bytes para
p00
foram adicionados à contagem. São 2 caracteres mais curtos, ou seja, 38 no Windows, emcls
vez declear
. Ou, para ser portátil:Ou, esticando um pouco as regras (e depois 31 + 3 = 34 ):
fonte
Rebol, 74
Espera que o nome do arquivo a ser armazenado na variável
f
. Abaixo está um exemplo não destruído:fonte
Java, 678 caracteres (quando jogado)
Claro que com a GUI, já que fazer coisas no console é péssimo com Java, especialmente se você deseja limpar a tela ...
fonte
Cobra - 163
fonte
Python 117
Assume o nome do arquivo é armazenado na variável
f
.Nota: substitua
'cls'
por'clear'
if em um sistema baseado em unix, adicionando 2 chrs.ctl+C
para sairfonte
for i in F: s.addstr(y,0,i); ... if i=='': ...
open(f).read()
vez defile.read(file(f))
, menor em 4 bytes.Groovy -
121119 caracteresResposta do ProgramFOX portado para o Groovy 2.2.1. O "console limpo" é fraco.
edit : fechamento recursivo substituído por loop while simples, que é mais curto e sem estouro de pilha
Ungolfed:
fonte
GNU sed, 32
fonte
Groovy, 81
Esta é uma maneira mais divertida:
destroçado
fonte
cls
é para Windows, eu acho ... tente #clear
C # 226
Por que incomodar hein?
Sem golfe :
Ou no LINQPAD (para que o C # possa permanecer semi-competitivo com os uber shorthand langs: D)
C # LINQPAD - 134
Eu me sinto um pouco suja, mas ei, isso é código-golfe.
fonte
SmileBASIC, 74 bytes
F deve ser o nome do arquivo
fonte