.Txt dosyasındaki kareleri görüntüle


14

Görev:

.txtASCII sanatının kareleri olan ve her biri bir \n(belirsizseniz bu örneğe bakın) içeren bir dosya verildiğinde , saniyede 1 kare kare içeren bir hareketli görüntü çıktısı alın.

\nSon karede bir iz olduğunu unutmayın .

Her çerçeve boyutu aşağıdaki gibi olacaktır:

  • X ', 80
  • Y, <20

Kurallar

  • Bir sonraki gösterilmeden önce Önceki çerçevenin temizlenmesi gerekir, bu nedenle her çerçevenin terminale yazdırılması geçerli bir yanıt değildir.
  • Yeni Dosya adını istediğiniz değişkente veya sys argümanlarından saklayarak istediğiniz gibi alabilirsiniz.
  • Yeni Resimler süresiz olarak dönmelidir
  • Bu kod golf: en küçük program kazanır.

Misal

Giriş

0   0
0   0
00000
0   0
0   0

00000
0
00000
0   
00000

0   0
 0 0
  0
  0
  0

Çıktı

Örnek Çıktı

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
Dosya işlemeyi gerçekten desteklemeyen dillerde (JavaScript gibi), girdiyi bir değişkene koymak da uygun mu?
ProgramFOX

2
@ProgramFOX Sanırım dosyayı bir tarayıcıda açabilir ve kullanabilirsinizdocument.body.innerText
user12205

3
@ProgramFOX Biraz haksız yapın, dosya işleme özelliği çoğu dilde birçok karakter ekler
Harry Beadle

Yanıtlar:


10

Mathematica, 41 bayt

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

Değişken içinde saklanacak dosya adının bulunmasını bekler f.

Bu Mathematica'nın önceliğini ilk kez yönetiyor @ve .~.~.tam olarak onlara ihtiyacım olan yol.

Btw, dosya uzantısı başka bir şeyse bu snippet korkunç bir şekilde yanlış gidebilir .txt(çünkü Mathematica buna dayalı olarak içe aktarmayı nasıl yapacağını tahmin etmeye çalışacaktır), ancak neyse ki bu dosya sonu meydan okuma belirtiminin bir parçasıdır.


6

Baş, 82

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

.Txt dosyasının dosya adının komut dosyasına ilk argüman olarak verildiğini varsayar.

Bunun çalışması için .txt dosyasının sonunda boş bir satır olması gerektiğini unutmayın.

@Professorfish ve @DigitalTrauma'ya özel teşekkürler.


1
$IFSvarsayılan olarak boş değil mi? ayrıca, for ((;;)){ ... }yerine kullanınwhile :;do ... done

@professorfish IFS varsayılan olarak <space><tab> <newline> şeklindedir. Y'nin son satırında olduğu gibi birden fazla ardışık alanı okuyabilmesi için ''bunu ayarlamanız gerekirread
user12205 18:14

1
Birkaç küçük indirim: IFS=ve [ "$a" ]yerine[ -n "$a" ]
Dijital Travma

4

Ruby, 88 86 56 55 karakterler

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

Bu program, dosya adının ilk argüman olarak verildiğini varsayar.

Ventero'ya büyük gelişmeleri paylaştığı için çok teşekkürler!

Un-golfed:

$<.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
}

Bu program dosyayı okur, parçalara böler ve ekranı temizledikten sonra her bir parçayı ayrı ayrı yazdırır. clssadece Windows üzerinde çalışır. İle bir varyant clear57 karakterdir.


ilki yerine bir satır sonu kullanarak ;ve arama yaparken parantezleri çıkararak bir veya iki karakter kaydedebilirsiniz split.
Martin Ender

2
Bu, düzenleyicinizi nasıl yapılandırdığınıza bağlıdır. : P Neredeyse sadece Windows kullanıyorum, ancak Sublime'ım \nyine de kullanmak üzere yapılandırıldı . Ayrıca burada kod golf üzerinde kimse sadece Windows kullandığınız için her satır sonu için puanınıza başka bir puan eklemek yapacaktır. ;)
Martin Ender

1
$*kısayoludur ARGV, ki bu iki karakteri kurtaracaktır. Bu durumda, kullanarak daha fazla tasarruf edebilir ARGF(ya da $<) gerçi: a=$<.read.split"\n\n". a.sizede daha kısadır a.length. Ve sleepdöndükten sonra argümanını döndürdüğünden, döngünüzdeki son iki ifadeyi birleştirebilirsiniz i+=sleep 1.
Ventero

1
Aslında boşver son bit, tamamen ortadan kaldırabilir ikullanarak Array#cyclehiçbir argüman verilirse sonsuza döngüler, hangi: a.cycle{|i|system"cls";$><<i;sleep 1}. Ve bölmek, $/+$/bundan daha kısa bir karakterdir "\n\n".
Ventero

1
Bu ayrıca tanımını satır içi yapmanıza izin verir a: $<.read.split($/+$/).cycle{...}(Üçlü yorum için özür dilerim, her zaman yorum düzenleme süresinin bitiminden hemen sonra yeni iyileştirmeler düşünüyorum :))
Ventero

2

Dyalog APL (64)

(Bu sefer Mathematica'yı yenemezsin. Her şey için yerleşik bir şey var gibi görünüyor.)

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

Bu, dosya adını argüman olarak alan bir işlevdir. Dosyanın Windows ( \r\n) biçiminde olduğunu varsayar .

Açıklama:

  • ⎕ML←3: taşıma düzeyini 3 olarak ayarlayın ( APL2'nin bölme özelliği olarak kullanılmasına izin )
  • M←80 ¯1⎕MAP⍵: doğru argüman tarafından ASCII dosyası olarak verilen dosyayı okur ve içindekileri depolar M.
  • M⊂⍨~(4/1)⍷⎕TC∊⍨M: arka arkaya dört terminal kontrol karakterinin tüm tekrarlamalarını bulun ve Mbunlara bölün . Bu her kareyi verir.
  • {... : bunların her biri için ...
    • ⊂⊃⍵⊂⍨~⍵∊⎕TC: bağımsız değişkeni (= bir kare) terminal kontrol karakterleri üzerinde bölün ve sonra vektör vektörlerini bir matrise dönüştürün (böylece her satırı ayrı bir satırda gösterecektir, bu ⎕SMkontrol karakterlerini anlamadığı için gereklidir .)
    • ⎕SM←1 1,⍨: ardından ⎕SMpencerenin sol üst köşesinde görüntüleyin .
    • ⎕DL 1: ve sonra bir saniye bekleyin.

Ha, sonunda! Ve yine de cevabım çok daha kısa değil çünkü fonksiyon isimleri çok uzun! : D
Martin Ender

1
Birisi, her yerleşik işlevi bir Unicode karakterine eşleyen bir Mathematica ön
Digital Trauma

2

Awk, 53

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


Yeni kurallar:

Awk, 74

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

1
Bu sadece bir kez ilmekler, ama kısaltılabilir BEGIN{RS=z}{system("sleep 1;clear")}1... awk olarak, ""çok RSsatırlı kayıtlar anlamında özeldir . Süresiz döngü için yeni kuralı desteklemek için şu ana kadar var: BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}74 karakterde. gawk , 63 karakterde ARGVyapabilmeniz BEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1için değiştirmeyi destekler .
laindir

@laindir: Teşekkürler, daha iyi bir şey bulamam.
ephemient

1

Perl, 40

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

olarak çalıştırmak

perl -p00 frames.pl < animation.txt

(yani animasyon dosyası STDIN aracılığıyla okunur). Saymak için 3 bayt p00eklendi. Windows yerine 2 karakter daha kısadır yani 38cls yerine Windows clear. Veya taşınabilir olmak için:

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

Veya, germe kuralları biraz (ve sonra 31 + 3 = 34 ):

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

1

Asi, 74

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


Dosya adının değişkente saklanmasını bekler f. Aşağıda ungolfed örneği verilmiştir:

f: %ascii-art.txt

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

1

Java, 678 karakter (golf olduğunda)

Tabii ki GUI ile, konsolda bir şeyler yapmak Java ile berbat olduğundan, özellikle ekranı temizlemek istiyorsanız ...

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

Sadece yazarın gönderisinde boyutlar olduğunu fark ettim, ancak şimdi kodumu değiştirmek için çok tembelim. Yine de kazanamaz: P
Leo Pflug

1

Kobra - 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

Piton 117

Dosya adının değişkente saklandığını varsayar 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')

Not: yerine 'cls'ile 'clear', bir Unix tabanlı sistemde ise 2 chrs ekledi.

ctl+C bırakmak


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

4 bayt daha kısa open(f).read()yerine kullanın file.read(file(f)).
nyuszika7h

0

Gelenekselleşmiş - 121 119 karakter

Taşınan ProgramFOX'un Groovy 2.2.1'e cevabı . "Net konsol" zayıf.

düzenleme : özyinelemeli kapama, daha kısa ve yığın taşması olmayan basit while döngüsü ile değiştirildi

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

Harika, 81

Bu daha güzel bir yol:

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

"Cls" komutu Mac bilgisayarımda çalışmıyor. Ayrıca, gereksinimler hareketli görüntünün döngüye girdiğini gösterir.
Michael Easter

2
@Michael Easter clssanırım Windows için ... deneyinclear
user12205

0

C # 226

Neden rahatsız ettiniz?

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

Golf hariç :

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

Veya LINQPAD'de (böylece C # uber stenografi şeritleriyle yarı rekabetçi kalabilir: 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();}

Biraz kirli hissediyorum, ama hey, bu kod golf.


0

SmileBASIC, 74 bayt

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

F dosya adı olmalı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.