Tampilkan Bingkai dari file .txt

14

Tugas:

Diberikan .txtfile dengan bingkai ASCII seni masing-masing dipisahkan oleh \n(lihat contoh ini jika Anda tidak jelas) menghasilkan gambar bergerak dengan bingkai dengan 1 bingkai per detik.

Perhatikan bahwa ada jejak \ndi bingkai terakhir.

Setiap dimensi frame akan:

  • X <80
  • Y <20

Aturan

  • Frame Sebelumnya harus dihapus sebelum yang berikutnya ditampilkan, jadi hanya mencetak setiap frame ke terminal bukan jawaban yang valid.
  • Baru Anda dapat mengambil nama file seperti yang Anda inginkan, baik dari itu disimpan dalam variabel atau dari sys args.
  • Baru Gambar harus diulang tanpa batas
  • Ini adalah kode golf: program terkecil menang.

Contoh

Memasukkan

0   0
0   0
00000
0   0
0   0

00000
0
00000
0   
00000

0   0
 0 0
  0
  0
  0

Keluaran

Contoh Output

Tidak bermain golf

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)
Harry Beadle
sumber
5
Dalam bahasa yang tidak benar-benar mendukung penanganan file (seperti JavaScript), apakah juga boleh memasukkan input ke dalam variabel?
ProgramFOX
2
@ProgramFOX Saya kira Anda dapat membuka file di browser dan menggunakandocument.body.innerText
user12205
3
@ProgramFOX Jadikan sedikit tidak adil, aspek penanganan file menambahkan banyak karakter di sebagian besar bahasa
Harry Beadle

Jawaban:

10

Mathematica, 41 byte

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

Berharap nama file disimpan dalam variabel f.

Ini adalah yang pertama kali diutamakan aturan Matematika untuk @dan.~.~. persis seperti yang saya butuhkan.

Btw, cuplikan ini bisa jadi sangat salah jika ekstensi file adalah hal lain selain .txt(karena Mathematica akan mencoba menebak cara melakukan impor berdasarkan itu), tetapi untungnya akhiran file itu adalah bagian dari spesifikasi tantangan.

Martin Ender
sumber
6

Bash, 82

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

Mengasumsikan nama file dari file .txt disediakan sebagai argumen pertama ke skrip.

Perhatikan bahwa baris kosong yang tertinggal harus ada di akhir file .txt agar ini berfungsi.

Terima kasih khusus kepada @professorfish dan @DigitalTrauma.

pengguna12205
sumber
1
tidak $IFSkosong secara default? juga, gunakan for ((;;)){ ... }sebagai gantiwhile :;do ... done
@professorfish IFS secara default adalah <spasi><tab> <newline>. Perlu diatur ''agar readdapat membaca beberapa spasi berurutan, seperti pada baris terakhir Y
user12205
1
Beberapa pengurangan kecil: IFS=dan [ "$a" ]bukannya[ -n "$a" ]
Digital Trauma
4

Ruby, 88 86 56 55 karakter

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

Program ini mengasumsikan nama file diberikan sebagai argumen pertama.

Terima kasih banyak kepada Ventero karena berbagi peningkatan hebat!

Tidak 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
}

Program ini membaca file, membaginya menjadi potongan-potongan, dan mencetak setiap potongan secara terpisah setelah membersihkan layar. clshanya berfungsi di Windows. Varian dengan clearadalah 57 karakter.

ProgramFOX
sumber
Anda dapat menyimpan satu atau dua karakter, dengan menggunakan pemisah baris alih-alih yang pertama ;dan menghilangkan tanda kurung saat memanggil split.
Martin Ender
2
Itu tergantung pada bagaimana Anda mengkonfigurasi editor Anda. : P Saya menggunakan hampir secara eksklusif Windows, tetapi Sublime saya dikonfigurasi untuk \ntetap digunakan . Juga di sini di kode golf tidak ada yang akan membuat Anda menambahkan poin lain ke skor Anda untuk setiap jeda baris hanya karena Anda menggunakan Windows. ;)
Martin Ender
1
$*adalah singkatan ARGV, yang akan menyimpan dua karakter. Dalam hal ini, Anda dapat menyimpan lebih banyak dengan menggunakan ARGF(atau $<) meskipun: a=$<.read.split"\n\n". a.sizejuga lebih pendek dari a.length. Dan karena sleepmengembalikan argumennya setelah kembali, Anda dapat menggabungkan dua pernyataan terakhir ke dalam loop Anda i+=sleep 1.
Ventero
1
Sebenarnya, nevermind bit terakhir, Anda dapat sepenuhnya menghilangkan idengan menggunakan Array#cycle, yang loop selamanya jika tidak ada argumen yang diberikan: a.cycle{|i|system"cls";$><<i;sleep 1}. Dan membelah $/+$/adalah karakter lain yang lebih pendek dari "\n\n".
Ventero
1
Itu juga memungkinkan Anda untuk memasukkan definisi a: $<.read.split($/+$/).cycle{...}(Maaf tentang komentar rangkap tiga, saya selalu memikirkan peningkatan baru setelah periode edit komentar selesai :))
Ventero
2

Dyalog APL (64)

(Tidak dapat mengalahkan Mathematica kali ini. Tampaknya memiliki built-in untuk semuanya.)

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

Ini adalah fungsi yang menggunakan nama file sebagai argumennya. Diasumsikan file ada di Windows (\r\n format ).

Penjelasan:

  • ⎕ML←3: setel level migrasi ke 3 (memungkinkan untuk digunakan sebagai fitur split APL2)
  • M←80 ¯1⎕MAP⍵: baca file yang diberikan oleh argumen yang tepat sebagai file ASCII, dan simpan konten dalam M.
  • M⊂⍨~(4/1)⍷⎕TC∊⍨M: temukan semua kemunculan empat karakter kontrol terminal berturut-turut, dan bagi M-bagi. Ini memberi setiap frame.
  • {... : untuk masing-masing ...
    • ⊂⊃⍵⊂⍨~⍵∊⎕TC: pisahkan argumen (= satu frame) pada karakter kontrol terminal, dan kemudian ubah vektor-vektor menjadi sebuah matriks (sehingga akan menampilkan setiap baris pada baris yang terpisah, ini diperlukan karena ⎕SM tidak memahami karakter kontrol.)
    • ⎕SM←1 1,⍨: lalu tampilkan di kiri atas menu ⎕SM jendela.
    • ⎕DL 1: dan kemudian tunggu satu detik.
marinus
sumber
Ha, akhirnya! Dan tetap saja jawaban saya tidak jauh lebih pendek karena nama fungsinya sangat panjang! : D
Martin Ender
1
Seseorang perlu menulis preprosesor Mathematica yang memetakan setiap fungsi bawaan ke karakter Unicode
Digital Trauma
2

Awk, 53

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


Aturan baru:

Awk, 74

BEGIN{RS=z}{a[NR]=$0}END{while(!system("sleep 1;clear"))print a[i++%NR+1]}
singkat
sumber
1
Ini hanya loop sekali, tetapi dapat disingkat menjadi BEGIN{RS=z}{system("sleep 1;clear")}1... Dalam awk, ""khusus sebagai RScatatan multiline yang berarti. Untuk mendukung aturan baru pengulangan tanpa batas, saya memiliki ini sejauh ini: BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}di 74 karakter. gawk mendukung perubahan ARGVsehingga Anda dapat melakukannya BEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1di 63 karakter.
laindir
@laindir: Terima kasih, saya tidak bisa menemukan yang lebih baik.
ephemient
1

Perl, 40

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

jalankan sebagai

perl -p00 frames.pl < animation.txt

(yaitu file animasi dibaca melalui STDIN). 3 byte untuk p00ditambahkan ke hitungan. Ini 2 karakter lebih pendek yaitu 38 pada Windows karena clsbukan clear. Atau, untuk menjadi portabel:

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

Atau, meregangkan aturan sedikit (dan kemudian 31 + 3 = 34 ):

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

Rebol, 74

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


Berharap nama file disimpan dalam variabel f. Di bawah ini adalah contoh yang tidak dipisahkan:

f: %ascii-art.txt

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

Jawa, 678 karakter (saat golf)

Tentu saja dengan GUI, karena melakukan hal-hal di konsol sucks dengan Java, terutama jika Anda ingin menghapus layar ...

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();
    }
}
Leo Pflug
sumber
Baru menyadari ada dimensi dalam pos penulis, tetapi saya terlalu malas untuk mengubah kode saya sekarang. Lagipula tidak akan menang: 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
Suram
sumber
1

Python 117

Mengasumsikan nama file disimpan dalam variabel 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')

Catatan: ganti 'cls'dengan 'clear'if pada sistem berbasis unix, tambahkan 2 chrs.

ctl+C berhenti

Harry Beadle
sumber
for i in F: s.addstr(y,0,i); ... if i=='': ...
user12205
Gunakan open(f).read()alih-alih file.read(file(f)), lebih pendek 4 byte.
nyuszika7h
0

Groovy - 121 119 karakter

Jawaban PortFO ProgramFOX untuk Groovy 2.2.1. "Konsol yang jelas" lemah.

sunting : diganti penutupan rekursif dengan loop sementara sederhana, yang lebih pendek dan tidak ada stack overflow

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 ""}}

Tidak Disatukan:

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 ""}
}
Michael Easter
sumber
0

GNU sed, 32

1eclear
/^$/{
esleep 1;clear
d
}
Geoff Reedy
sumber
0

Groovy, 81

Ini adalah cara yang lebih asyik:

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)
}
khroolick
sumber
Perintah "cls" tidak berfungsi di Mac saya. Juga, persyaratan menyarankan agar film bergerak.
Michael Easter
2
@Michael Easter clsuntuk Windows saya rasa ... cobaclear
user12205
0

C # 226

Kenapa repot-repot ya?

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);}}}}

Tidak golf :

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);
            }
        }
    }
}

Atau di LINQPAD (jadi C # dapat tetap semi-kompetitif dengan langs singkatan uber: 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();}

Saya merasa agak kotor, tapi hei, ini kode-golf.

jzm
sumber
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 harus berupa nama file

12Me21
sumber