.txtファイルからフレームを表示する


14

タスク:

.txtそれぞれ\nが(明確でない場合はこの例を参照してください)で区切られたASCIIアートのフレームを含むファイルを指定すると、1秒あたり1フレームのフレームを含む動画が出力されます。

\n最終フレームの末尾に注意してください。

各フレームの寸法は次のとおりです。

  • X <80
  • Y <20

ルール

  • 次のフレームを表示する前に前のフレームをクリアする必要があるため、各フレームを端末に印刷するだけでは有効な答えではありません。
  • 新規変数に格納されているファイル名またはsys argsから、必要に応じてファイル名を取得できます。
  • New画像は無期限にループする必要があります
  • これはコードゴルフです。最小のプログラムが勝ちます。

入力

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

2
@ProgramFOX私はあなたがブラウザや使用中のファイルを開くことができますねdocument.body.innerText
user12205

3
@ProgramFOXそれは少し不公平です、ファイル処理の側面は、ほとんどの言語で多くの文字を追加します
ハリービードル

回答:


10

Mathematica、41バイト

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

ファイル名が変数に格納されることを期待しています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>です。それを設定する必要が''なるようにreadYの最後の行のように、複数の連続スペースを読み取ることができます
user12205

1
いくつかの小さな削減​​:IFS=および[ "$a" ]代わりに[ -n "$a" ]
デジタル外傷

4

ルビー、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
}

このプログラムは、ファイルを読み取り、チャンクに分割し、画面をクリアした後に各チャンクを個別に印刷します。clsWindowsでのみ動作します。のバリアントclearは57文字です。


最初の代わりに改行を使用し、を;呼び出すときに括弧を省略することで、1つまたは2つの文字を保存できますsplit
マーティンエンダー

2
これは、エディターの構成方法によって異なります。:PほとんどWindowsのみを使用し\nていますが、Sublimeはとにかく使用するように構成されています。また、ここでコードゴルフについては、Windowsを使用しているからといって、改行ごとにスコアに別のポイントを追加することはできません。;)
マーティン・エンダー

1
$*はの省略形でARGV、2文字を節約します。この場合、ARGF(または$<)を使用してさらに節約できますa=$<.read.split"\n\n"a.sizeもより短いですa.length。また、sleep返された後に引数を返すため、ループ内の最後の2つのステートメントをに結合できますi+=sleep 1
ヴェンテロ

1
実際、最後のビットを気にせずに、引数を指定しない場合は永久にループiするを使用して完全に排除できます。また、での分割は、より短い別の文字です。Array#cyclea.cycle{|i|system"cls";$><<i;sleep 1}$/+$/"\n\n"
ヴェンテロ

1
それはまた、あなたがの定義をインライン化することができますa$<.read.split($/+$/).cycle{...}(申し訳ありませんが、トリプルコメントについては、私はいつも:)コメント編集期間が終わった直後、新たな改善点を考える)
Ventero

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:4つの連続した端末制御文字の出現をすべて見つけM、それらを分割します。これにより、各フレームが得られます。
  • {... :これらのそれぞれについて...
    • ⊂⊃⍵⊂⍨~⍵∊⎕TC:端末制御文字で引数(= 1フレーム)を分割し、ベクトルのベクトルを行列に変換します(したがって、各行を個別の行に表示します。これは、⎕SM制御文字を理解しないため必要です)。
    • ⎕SM←1 1,⍨:その後、⎕SMウィンドウの左上に表示します。
    • ⎕DL 1:その後、1秒間待ちます。

ハ、ついに!それでも、関数名がとてつもなく長いので、私の答えはそれほど短くありません!:D
マーティンエンダー

1
誰かがすべての組み込み関数をUnicode文字にマッピングするMathematicaプリプロセッサを書く必要がある
Digital Trauma

2

Awk、53

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


新しい規則:

Awk、74

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

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]}1、63文字で行うことができます。
laindir

@laindir:ありがとう、これ以上良いものは思いつきません。
一時的な

1

Perl、40

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

として実行

perl -p00 frames.pl < animation.txt

(つまり、アニメーションファイルはSTDINを介して読み取られます)。3バイトp00がカウントに追加されました。の代わりに2文字短くなります。つまり、Windowsでは38clsですclear。または、ポータブルにするために:

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

または、ストレッチルールを少し(そして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]]


ファイル名が変数に格納されることを期待します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
レオPflug

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 CHRSを追加します。

ctl+C やめること


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

open(f).read()代わりにfile.read(file(f))、4バイト短くします。
nyuszika7h 14

0

Groovyの- 121の 119文字

Groovy 2.2.1へのProgramFOXの回答を移植しました。「クリアコンソール」は弱いです。

編集:再帰的クロージャーをより短く、スタックオーバーフローのない単純な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

グルーヴィー、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)
}

私のMacではコマンド「cls」が機能しません。また、要件は、映画がループすることを示唆しています。
マイケルイースター

2
@Michaelイースターは、clsWindows用の私がしよう...と考えている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#は、Uberの速記言語との準競争力を維持できます:D)

C#リンカパッド-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はファイル名でなければなりません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.