.txt 파일의 프레임 표시


14

작업:

주어진 .txtASCII 아트 프레임 파일로 분리 각각 \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

산출

Example Output

언 골프

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 약간 불공평 한 파일 처리 측면은 대부분의 언어로 많은 문자를 추가합니다
Harry Beadle

답변:


10

수학, 41 바이트

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

파일 이름이 variable에 저장 될 것으로 예상합니다 f.

이것은 Mathematica의 우선 순위 규칙이 처음 @이며 .~.~.내가 필요한 방식입니다.

Btw,이 스 니펫은 파일 확장자가 .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>입니다. Y의 마지막 행과 같이 연속 된 여러 공백을 읽을 수 ''있도록 설정해야합니다.read
user12205

1
몇 가지 작은 감소 : IFS=그리고 [ "$a" ]대신[ -n "$a" ]
Digital Trauma

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 자입니다.


;호출 할 때 첫 번째 대신 줄 바꿈을 사용 하고 괄호를 생략 하여 문자를 저장할 수 있습니다 split.
Martin Ender

2
편집기 구성 방법에 따라 다릅니다. : P 거의 전적으로 Windows를 사용하고 있지만 Sublime은 \n어쨌든 사용하도록 구성되어 있습니다 . 또한 코드 골프에서는 Windows를 사용하고 있기 때문에 각 줄 바꿈마다 점수에 다른 포인트를 추가하지 않습니다. ;)
Martin Ender 2014 년

1
$*의 약자로 ARGV, 두 문자를 저장합니다. 이 경우에는 ARGF(또는 $<) 를 사용하여 더 많은 비용을 절약 할 수 있습니다 a=$<.read.split"\n\n". a.size보다 짧습니다 a.length. 그리고 sleep반환 후 인수를 반환 하므로 루프의 마지막 두 문을로 결합 할 수 있습니다 i+=sleep 1.
Ventero

1
실제로 마지막 비트를 신경 쓰지 마십시오 . 인수를 지정하지 않으면 영원히 반복 i되는을 사용하여 완전히 제거 할 수 있습니다 . 에서 나누는 것이보다 짧은 다른 문자 입니다. Array#cyclea.cycle{|i|system"cls";$><<i;sleep 1}$/+$/"\n\n"
Ventero

1
그것은 또한 당신이 정의를 인라인 할 수 있습니다 a: $<.read.split($/+$/).cycle{...}(트리플 코멘트에 대해 죄송합니다, 나는 항상 주석 편집 기간이 끝난 직후 새로운 개선 사항을 생각합니다 :))
Ventero

2

디아 로그 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: 터미널 제어 문자에서 인수 (= 한 프레임)를 분할 한 다음 벡터 벡터를 행렬로 변환합니다 (따라서 각 행을 별도의 행에 표시 ⎕SM합니다. 제어 문자를 이해하지 못하기 때문에 필요 합니다).
    • ⎕SM←1 1,⍨: ⎕SM창 왼쪽 위에 표시합니다 .
    • ⎕DL 1다음 1 초 동안 기다립니다.

하, 드디어! 그리고 함수 이름이 너무 길기 때문에 여전히 내 대답은 훨씬 짧지 않습니다! : D
Martin Ender

1
모든 내장 함수를 유니 코드 문자로 매핑하는 Mathematica 프리 프로세서를 작성해야합니다.
Digital Trauma

2

어, 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는 63자를 변경할 수 ARGV있도록 변경을 지원합니다 BEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1.
laindir

@laindir : 감사합니다. 더 좋은 것을 만들 수 없습니다.
ephemient 16:19에

1

펄, 40

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

로 실행

perl -p00 frames.pl < animation.txt

(즉, STDIN을 통해 애니메이션 파일을 읽습니다). 계산에 3 바이트 p00가 추가되었습니다. Windows 대신 2 자 (즉 , Windows에서 38 자)보다 짧습니다 . 또는 휴대가 가능합니다.clsclear

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


파일 이름이 variable에 저장 될 것으로 예상합니다 f. 아래는 골프화되지 않은 예입니다.

f: %ascii-art.txt

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

1

자바, 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

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

파이썬 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')

참고 : 유닉스 기반 시스템의 경우 2 개의 chr을 추가 'cls'하여 'clear'if로 바꾸십시오 .

ctl+C 종료합니다


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

open(f).read()대신 file.read(file(f))4 바이트 더 짧은을 사용하십시오 .
nyuszika7 시간

0

그루비 - 121 개 119 문자

포팅 프로그램 Foov의 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

그루비, 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에서 작동하지 않습니다. 또한 요구 사항에 따라 동영상이 반복됩니다.
Michael Easter

2
@ 마이클 부활절 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 #은 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();}

조금 더럽게 느껴지지만 이것은 코드 골프입니다.


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.