Visualizza i frame dal file .txt


14

L'obiettivo:

Dato un .txtfile con frame di arte ASCII separati ciascuno da un \noutput (vedere questo esempio se non si è chiari), viene emesso un filmato con frame con 1 frame al secondo.

Si noti che c'è un finale \nsul fotogramma finale.

Le dimensioni di ogni frame saranno:

  • X <80
  • Y <20

Le regole

  • Il frame precedente deve essere cancellato prima che venga visualizzato il successivo, quindi la sola stampa di ciascun frame sul terminale non è una risposta valida.
  • Nuovo Puoi prendere il nome del file come preferisci, sia da esso archiviato in una variabile che da sys args.
  • Nuovo Le immagini devono essere ripetute in modo indefinito
  • Questo è il codice golf: vince il programma più piccolo.

Esempio

Ingresso

0   0
0   0
00000
0   0
0   0

00000
0
00000
0   
00000

0   0
 0 0
  0
  0
  0

Produzione

Esempio di output

Un-golfed

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)

5
In lingue che non supportano realmente la gestione dei file (come JavaScript), è anche corretto inserire l'input in una variabile?
ProgramFOX,

2
@ProgramFOX Immagino che tu possa aprire il file in un browser e utilizzarlodocument.body.innerText
user12205

3
@ProgramFOX Rendilo un po 'ingiusto, l'aspetto della gestione dei file aggiunge molti caratteri nella maggior parte delle lingue
Harry Beadle,

Risposte:


10

Mathematica, 41 byte

Import@f~StringSplit~"\n\n"~ListAnimate~1

Si aspetta che il nome del file sia archiviato in una variabile f.

Questa è la prima volta che le regole di precedenza di Mathematica sono @e .~.~.sono esattamente il modo in cui ne ho bisogno.

A proposito, questo frammento potrebbe andare terribilmente storto se l'estensione del file è diversa da .txt(perché Mathematica proverà a indovinare come eseguire l'importazione in base a quello), ma per fortuna che la fine del file fa parte della specifica della sfida.


6

Bash, 82

IFS=
clear
for((;;)){
while read a;do
[ "$a" ]&&echo $a||(sleep 1;clear)
done<$1
}

Presuppone che il nome del file .txt sia fornito come primo argomento dello script.

Si noti che una riga vuota finale deve essere presente alla fine del file .txt affinché funzioni.

Un ringraziamento speciale a @professorfish e @DigitalTrauma.


1
non è $IFSvuoto per impostazione predefinita? inoltre, utilizzare for ((;;)){ ... }invece diwhile :;do ... done

@professorfish IFS per impostazione predefinita è <spazio> <tab> <nuova>. È necessario impostarlo in ''modo che readpossa leggere più spazi consecutivi, come nell'ultima riga di Y
user12205

1
Un paio di piccole riduzioni: IFS=e [ "$a" ]invece di[ -n "$a" ]
Digital Trauma,

4

Rubino, 88 86 56 55 caratteri

$<.read.split($/*2).cycle{|i|system'cls';$><<i;sleep 1}

Questo programma presuppone che il nome del file sia indicato come primo argomento.

Grazie mille a Ventero per aver condiviso grandi miglioramenti!

Un-giocato a golf:

$<.read.split($/*2).cycle{ |i|   # read file, split by two newlines, and loop
    system 'cls'   # clear screen
    $><<i   # print the current array item
    sleep 1   # sleep one second
}

Questo programma legge il file, lo divide in blocchi e stampa ogni blocco separatamente dopo aver cancellato lo schermo. clsfunziona solo su Windows. Una variante con clearè di 57 caratteri.


è possibile salvare uno o due caratteri, usando un'interruzione di riga anziché la prima ;e omettendo le parentesi quando si chiama split.
Martin Ender,

2
Dipende da come configuri il tuo editor. : P Sto usando quasi esclusivamente Windows, ma il mio Sublime è configurato per l'uso \ncomunque. Anche qui su code golf nessuno ti farà aggiungere un altro punto al tuo punteggio per ogni interruzione di riga solo perché stai usando Windows. ;)
Martin Ender,

1
$*è una scorciatoia per ARGV, che salverebbe due personaggi. In questo caso, è possibile risparmiare ancora di più utilizzando ARGF(o $<) però: a=$<.read.split"\n\n". a.sizeè anche più breve di a.length. E poiché sleeprestituisce il suo argomento dopo il ritorno, puoi combinare le ultime due istruzioni nel tuo ciclo in i+=sleep 1.
Ventero,

1
In realtà, non importa l'ultimo bit, è possibile eliminare completamente iutilizzando Array#cycle, quale loop per sempre se non viene dato alcun argomento: a.cycle{|i|system"cls";$><<i;sleep 1}. E dividere in $/+$/è un altro personaggio più corto di "\n\n".
Ventero,

1
Ciò consente anche di incorporare la definizione di a: $<.read.split($/+$/).cycle{...}(Mi dispiace per il triplo commento, penso sempre a nuovi miglioramenti subito dopo il periodo di modifica del commento :))
Ventero

2

Dyalog APL (64)

(Questa volta non posso battere Mathematica. Sembra che sia integrato per tutto.)

{⎕ML←3⋄{⎕SM←1 1,⍨⊂⊃⍵⊂⍨~⍵∊⎕TC⋄⎕DL 1}¨M⊂⍨~(4/1)⍷⎕TC∊⍨M←80 ¯1⎕MAP⍵}

Questa è una funzione che prende il nome file come argomento. Presuppone che il file sia in \r\nformato Windows ( ).

Spiegazione:

  • ⎕ML←3: imposta il livello di migrazione su 3 (consentendo di essere utilizzato come funzionalità di suddivisione di APL2)
  • M←80 ¯1⎕MAP⍵: leggi il file fornito dall'argomento corretto come file ASCII e archivia il contenuto in M.
  • M⊂⍨~(4/1)⍷⎕TC∊⍨M: trova tutte le occorrenze di quattro caratteri consecutivi di controllo terminale e dividi Mquelli. Questo dà ad ogni frame.
  • {... : per ognuno di questi ...
    • ⊂⊃⍵⊂⍨~⍵∊⎕TC: dividi l'argomento (= un fotogramma) sui caratteri di controllo del terminale, quindi trasforma il vettore dei vettori in una matrice (quindi visualizzerà ogni riga su una riga separata, ciò è necessario perché ⎕SMnon comprende i caratteri di controllo).
    • ⎕SM←1 1,⍨: quindi visualizzalo nella parte superiore sinistra della ⎕SMfinestra.
    • ⎕DL 1: e quindi attendere un secondo.

Ah, finalmente! Eppure la mia risposta non è molto più breve perché i nomi delle funzioni sono così dannatamente lunghi! : D
Martin Ender,

1
Qualcuno deve scrivere un preprocessore Mathematica che associ ogni funzione integrata a un personaggio Unicode
Digital Trauma

2

Awk, 53

BEGIN{RS=RS RS}{system("clear")}1;{system("sleep 1")}


Nuove regole:

Awk, 74

BEGIN{RS=z}{a[NR]=$0}END{while(!system("sleep 1;clear"))print a[i++%NR+1]}

1
Questo si ripete solo una volta, ma può essere abbreviato in BEGIN{RS=z}{system("sleep 1;clear")}1... In awk, ""è speciale come RSsignificato dei record multilinea. Per supportare la nuova regola del loop indefinitamente, ho questo finora: BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}a 74 caratteri. gawk supporta il cambio in ARGVmodo che tu possa fare BEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1con 63 caratteri.
Laindir,

@laindir: Grazie, non riesco a trovare niente di meglio.
effimero

1

Perl, 40

seek ARGV,0,!eof;sleep 1;system clear

correre come

perl -p00 frames.pl < animation.txt

(ovvero il file di animazione viene letto tramite STDIN). Sono p00stati aggiunti 3 byte per il conteggio. È più breve di 2 caratteri, ovvero 38 su Windows, clsinvece di clear. Oppure, per essere portatile:

seek ARGV,0,!eof;sleep 1;system$^O=~/Win/?cls:clear

Oppure, allungando un po 'le regole (e quindi 31 + 3 = 34 ):

seek ARGV,sleep(1)&`reset`,!eof

1

Rebol, 74

forever[foreach s split to-string read f"^/^/"[call"clear"print s wait 1]]


Si aspetta che il nome file sia archiviato in una variabile f. Di seguito è riportato un esempio non golfato:

f: %ascii-art.txt

forever [
    foreach s split to-string read f "^/^/" [
        call "clear"
        print s
        wait 1
    ]
]

1

Java, 678 caratteri (se giocato a golf)

Ovviamente con la GUI, dal momento che fare cose in console fa schifo con Java, specialmente se vuoi cancellare lo schermo ...

import java.awt.Font;
import java.io.File;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;

public class G extends JFrame
{
    static JTextArea b = new JTextArea();

    G()
    {
        setSize(170, 370);

        add(b);
        b.setFont(new Font(Font.MONOSPACED, 0, 50));
    }

    public static void main(final String[] args)
    {   
        new G().setVisible(true);
        new SwingWorker()
        {
            protected Void doInBackground()
            {
                for(;;)
                {
                    try(Scanner s = new Scanner(new File(args[0])))
                    {
                        String l = null;
                        while(s.hasNextLine())
                        {                           
                            if(l == null  || (l = s.nextLine()).isEmpty())
                            {
                                Thread.sleep(1000);
                                b.setText(l == null ? (l = s.nextLine()) + '\n' : null);
                            }
                            else
                                b.setText(b.getText() + l + '\n');
                        }
                    }
                    catch(Exception i){}
                }
            }
        }.execute();
    }
}

Ho appena realizzato che c'erano delle dimensioni nel post dell'autore, ma sono troppo pigro per cambiare il mio codice ora. Non vincerà comunque: P
Leo Pflug,

1

Cobra - 163

class P
    def main
        while 1
            for i in File.readAllLines("t.txt")
                print i
                if i=="",.x
            .x
    def x
        Threading.Thread.sleep(1000)
        Console.clear

1

Python 117

Presuppone che il nome del file sia memorizzato in una variabile f.

import time,os
while 1:
 for i in file.read(file(f)).split('\n'):
  print i
  if i=='':time.sleep(1);os.system('cls')

Nota: sostituire 'cls'con 'clear'if su un sistema basato su unix, aggiungendo 2 chrs.

ctl+C abbandonare


for i in F: s.addstr(y,0,i); ... if i=='': ...
user12205,

Utilizzare open(f).read()invece di file.read(file(f)), più corto di 4 byte.
nyuszika7h,

0

Groovy - 121 119 caratteri

Risposta di ProgramFOX trasferita a Groovy 2.2.1. La "console chiara" è debole.

modifica : sostituisce la chiusura ricorsiva con un semplice ciclo while, che è più corto e senza overflow dello stack

a=new File(args[0]).text.split "\n\n";i=0;p={println it};while(1){p a[i++%a.size()];Thread.sleep(1000);80.times{p ""}}

Ungolfed:

a = new File(args[0]).text.split "\n\n"
i = 0

p = { println it }

while(1) {
    p a[i++%a.size()]
    Thread.sleep(1000)
    80.times{p ""}
}


0

Groovy, 81

Questo è un modo più groovy:

new File(args[0]).text.split("\n\n").each{["cls"].execute();print it;sleep(1000)}

ungolfed

new File(args[0]).text.split("\n\n").each{
    ["cls"].execute()
    print it
    sleep(1000)
}

Il comando "cls" non funziona sul mio Mac. Inoltre, i requisiti suggeriscono che il filmato si chiuda.
Michael Easter,

2
@Michael Easter clsè per Windows penso ... provaclear
user12205,

0

C # 226

Perché preoccuparsi eh?

namespace System{class P{static void Main(){for(;;)foreach(var x in Text.RegularExpressions.Regex.Split(new IO.StreamReader("f.txt").ReadToEnd(),"\n\r\n")){Console.Clear();Console.WriteLine(x);Threading.Thread.Sleep(1000);}}}}

Non golfato :

namespace System
{
    class P
    {
        static void Main()
        {
            for(;;)
            foreach (var x in Text.RegularExpressions.Regex.Split(new IO.StreamReader("f.txt").ReadToEnd(), "\n\r\n"))
            {
                Console.Clear();
                Console.WriteLine(x); 
                Threading.Thread.Sleep(1000);
            }
        }
    }
}

O in LINQPAD (in modo che C # possa rimanere semi-competitivo con le ultime lingue abbreviate: D)

C # LINQPAD - 134

for(;;)foreach(var x in Regex.Split(new StreamReader("f.txt").ReadToEnd(),"\n\r\n")){x.Dump();Thread.Sleep(1000);Util.ClearResults();}

Mi sento un po 'sporco, ma hey, questo è il golf di codice.


0

SmileBASIC, 74 byte

F=LOAD(F)@L
IF" "*!CSRX>F[I]THEN WAIT 60CLS
?F[I];
I=(I+1)MOD LEN(F)GOTO@L

F dovrebbe essere il nome del file

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.