显示.txt文件中的帧


14

任务:

给定一个.txt文件,其中每个文件都有ASCII艺术图案,每个文件之间用分隔\n(如果不清楚,请参见本示例),以每秒1帧的帧输出运动图像。

请注意,\n最后一帧上有尾随。

每个框架尺寸为:

  • X <80
  • Y <20

规则

  • 在显示下一帧之前,必须清除上一帧,因此仅将每帧打印到终端上都不是有效的答案。
  • 新建可以从文件名或sys args中获取所需的文件名。
  • 图像必须无限循环
  • 这就是代码高尔夫:最小的程序胜出。

输入值

0   0
0   0
00000
0   0
0   0

00000
0
00000
0   
00000

0   0
 0 0
  0
  0
  0

输出量

示例输出

未打高尔夫球

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
在不真正支持文件处理的语言(例如JavaScript)中,将输入放入变量中还可以吗?
ProgramFOX 2014年

2
@ProgramFOX我想您可以在浏览器中打开文件并使用document.body.innerText
user12205

3
@ProgramFOX有点不公平,文件处理方面在大多数语言中添加了许多字符
Harry Beadle 2014年

Answers:


10

Mathematica,41个字节

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

期望将文件名存储在variable中f

这是Mathematica的第一个优先规则,@.~.~.这正是我需要它们的方式。

顺便说一句,如果文件扩展名不是该文件扩展名的话,此代码片段可能会出现严重错误.txt(因为Mathematica将尝试基于此猜测如何进行导入),但是幸运的是,文件结尾是挑战规范的一部分。


6

巴什82

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

假定提供.txt文件的文件名作为脚本的第一个参数。

请注意,.txt文件的末尾必须包含一个空行,以使其起作用。

特别感谢@professorfish和@DigitalTrauma。


1
$IFS默认不是空白吗?此外,请使用for ((;;)){ ... }代替while :;do ... done

@professorfish IFS默认为<space> <tab> <newline>。需要将其设置为''使read可以读取多个连续的空格,如Y的最后一行
user12205

1
进行了几项小幅削减:IFS=[ "$a" ]不是[ -n "$a" ]
数字创伤2014年

4

Ruby,88岁 86 56 55个字符

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

该程序假定文件名是第一个参数。

非常感谢Ventero分享了很多改进!

未打高尔夫球:

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

该程序读取文件,将其拆分为块,然后在清除屏幕后分别打印每个块。cls仅适用于Windows。带有clear57个字符的变体。


您可以保存一个或两个字符,方法是使用换行符代替第一个,;并在调用时省略括号split
马丁·恩德

2
这取决于您如何配置编辑器。:P我几乎只使用Windows,但是我的Sublime配置为始终使用\n。同样,在代码高尔夫上,没有人会因为您使用Windows而使您为每个换行符在得分中添加另一个点。;)
马丁·恩德

1
$*是的简写ARGV,它将保存两个字符。在这种情况下,您可以通过使用更节约ARGF(或$<)虽然:a=$<.read.split"\n\n"a.size还比短a.length。由于sleep返回后会返回其参数,因此您可以将循环中的最后两个语句合并为i+=sleep 1
Ventero 2014年

1
实际上,请紧记最后一点,您可以i使用来完全消除Array#cycle,如果没有给出任何参数,它将永远循环a.cycle{|i|system"cls";$><<i;sleep 1}。并且在处分割的$/+$/字符比还要短"\n\n"
Ventero 2014年

1
这也使您可以内联以下定义a:($<.read.split($/+$/).cycle{...}
三条

2

Dyalog APL(64)

(这一次无法击败Mathematica。它似乎内置了所有功能。)

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

这是一个以文件名作为参数的函数。假定文件为Windows(\r\n)格式。

说明:

  • ⎕ML←3:将迁移级别设置为3(允许用作APL2的拆分功能)
  • M←80 ¯1⎕MAP⍵:将右参数指定的文件读取为ASCII文件,并将内容存储在中M
  • M⊂⍨~(4/1)⍷⎕TC∊⍨M:找到所有出现的四个连续的终端控制字符,并M在这些字符上进行分割。这给出了每一帧。
  • {... :对于每一个...
    • ⊂⊃⍵⊂⍨~⍵∊⎕TC:在终端控制字符上分割参数(=一帧),然后将向量转换成矩阵(因此它将每行显示在单独的行上,这是必需的,因为⎕SM它不了解控制字符。)
    • ⎕SM←1 1,⍨:然后将其显示在 ⎕SM窗口的。
    • ⎕DL 1:然后等待一秒钟。

哈,终于!而且我的回答还不短很多,因为函数名太长了!:D
马丁·恩德2014年

1
有人需要编写Mathematica预处理程序,以将每个内置函数映射到Unicode字符
Digital Trauma

2

Awk,53岁

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


新规则:

74岁

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

1
这只会循环一次,但是可以缩短为BEGIN{RS=z}{system("sleep 1;clear")}1...在awk中,""它的特殊RS含义是多行记录。为了支持无限循环的新规则,到目前为止,我有BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}74个字符。gawk支持更改,ARGV因此您可以输入BEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}163个字符。
laindir

@laindir:谢谢,我无法提出更好的建议。
短暂事件

1

Perl,40岁

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

运行为

perl -p00 frames.pl < animation.txt

(即动画文件通过STDIN读取)。3个字节用于p00计数。这是更短的2个字符,即38的Windows,因为cls代替clear。或者,为了便于携带:

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

或者,稍微扩展规则(然后31 + 3 = 34):

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

1

雷伯尔,74

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


期望文件名存储在变量中f。下面是一个简单的例子:

f: %ascii-art.txt

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

1

Java,678个字符(打高尔夫球时)

当然使用GUI,因为在控制台中执行操作很烂Java,特别是如果您想清除屏幕...

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

刚意识到作者的帖子中有一些尺寸,但是我懒得现在更改我的代码。无论如何都不会赢:P
Leo Pflug 2014年

1

眼镜蛇-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

假设文件名存储在variable中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')

注意:替换'cls''clear'在基于UNIX的系统上,如果要,请增加2个频道。

ctl+C 退出


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

使用open(f).read()代替file.read(file(f)),缩短4个字节。
nyuszika7h 2014年

0

Groovy- 121119个字符

ProgramFOX的答案移植到Groovy 2.2.1。“清除控制台”很弱。

编辑:用简单的while循环替换了递归闭包,它更短并且没有堆栈溢出

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

取消高尔夫:

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岁

这是一种更普通的方法:

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

不打高尔夫球

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

命令“ cls”在我的Mac上不起作用。此外,这些要求还建议电影循环播放。
迈克尔·复活节

2
@Michael Easter cls适用于Windows,我想...试试clear
user12205

0

C#226

为什么要打扰?

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

未打高尔夫球

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

或在LINQPAD中(因此C#可以与超级速记语言: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();}

我有点脏,但是,这是代码高尔夫球。


0

SmileBASIC,74个字节

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

F应该是文件名

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.