แสดงเฟรมจากไฟล์. txt


14

งาน:

ให้.txtไฟล์ที่มีเฟรมของ ASCII art แต่ละอันคั่นด้วย a \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
ในภาษาที่ไม่รองรับการจัดการไฟล์ (เช่นจาวาสคริปต์) จริง ๆ มันก็โอเคที่จะใส่ข้อมูลในตัวแปรหรือไม่?
ProgramFOX

2
@ProgramFOX ฉันเดาว่าคุณสามารถเปิดไฟล์ในเบราว์เซอร์และใช้งานได้document.body.innerText
user12205

3
@ProgramFOX ทำให้มันไม่ยุติธรรมเพียงเล็กน้อยส่วนการจัดการไฟล์จะเพิ่มตัวอักษรจำนวนมากในภาษาส่วนใหญ่
Harry Beadle

คำตอบ:


10

Mathematica, 41 ไบต์

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

fคาดว่าชื่อไฟล์จะถูกเก็บไว้ในตัวแปร

นี่เป็นครั้งแรกที่กฎของ Mathematica มีความสำคัญ@และ.~.~.เป็นสิ่งที่ฉันต้องการ

Btw ข้อมูลโค้ดนี้อาจผิดพลาดอย่างมากหากส่วนขยายของไฟล์นั้นเป็นอย่างอื่น.txt(เนื่องจาก Mathematica จะพยายามเดาวิธีการนำเข้าตามนั้น) แต่โชคดีที่การสิ้นสุดไฟล์เป็นส่วนหนึ่งของข้อกำหนดการท้าทาย


6

Bash, 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" ]
บาดเจ็บดิจิตอล

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 เท่านั้น ตัวแปรที่มีclearคือ 57 ตัวอักษร


คุณสามารถบันทึกตัวอักษรหรือสองโดยใช้เส้นแบ่งแทนที่จะเป็นครั้งแรกและไม่ใส่วงเล็บเมื่อโทร; split
Martin Ender

2
ขึ้นอยู่กับว่าคุณกำหนดค่าโปรแกรมแก้ไขของคุณอย่างไร : P ฉันใช้ Windows เกือบเฉพาะ แต่ Sublime ของฉันถูกกำหนดค่าให้ใช้\nต่อไป นอกจากนี้ที่นี่ในการตีกอล์ฟไม่มีใครที่จะทำให้คุณเพิ่มคะแนนอีกคะแนนสำหรับการขึ้นบรรทัดใหม่เนื่องจากคุณใช้ Windows ;)
Martin Ender

1
$*มีการจดชวเลขARGVซึ่งจะบันทึกอักขระสองตัว ในกรณีนี้คุณสามารถประหยัดมากยิ่งขึ้นโดยใช้ARGF(หรือ$<) a=$<.read.split"\n\n"ว่า: นอกจากนี้ยังเป็นที่สั้นกว่าa.size a.lengthและเนื่องจากsleepคืนค่าอาร์กิวเมนต์หลังจากกลับมาคุณสามารถรวมสองข้อความสุดท้ายในการวนซ้ำเข้าi+=sleep 1ด้วยกัน
Ventero

1
ที่จริงแล้วไม่ต้องกังวลกับบิตสุดท้ายคุณสามารถกำจัดได้อย่างสมบูรณ์iโดยใช้Array#cycleซึ่งวนa.cycle{|i|system"cls";$><<i;sleep 1}ซ้ำไปตลอดกาลหากไม่มีการโต้แย้ง: และแยกที่เป็นตัวละครอื่นที่สั้นกว่า$/+$/ "\n\n"
Ventero

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

นี่คือฟังก์ชั่นที่ใช้ชื่อไฟล์เป็นอาร์กิวเมนต์ มันถือว่าไฟล์อยู่ใน\r\nรูปแบบWindows ( )

คำอธิบาย:

  • ⎕ML←3: ตั้งค่าระดับการย้ายข้อมูลเป็น 3 (อนุญาตให้ใช้เป็นคุณลักษณะแยกของ APL2)
  • M←80 ¯1⎕MAP⍵: อ่านไฟล์ที่กำหนดโดยอาร์กิวเมนต์ที่ถูกต้องว่าเป็นไฟล์ ASCII และเก็บเนื้อหาMไว้
  • M⊂⍨~(4/1)⍷⎕TC∊⍨M: ค้นหาการเกิดขึ้นทั้งหมดของอักขระควบคุมเทอร์มินัลสี่ตัวที่ต่อเนื่องกันและแยกออกMจากกัน สิ่งนี้ทำให้แต่ละเฟรม
  • {... : สำหรับแต่ละรายการเหล่านี้ ...
    • ⊂⊃⍵⊂⍨~⍵∊⎕TC: แยกอาร์กิวเมนต์ (= หนึ่งเฟรม) บนอักขระควบคุมเทอร์มินัลแล้วเปลี่ยน vector-of-vector เป็นเมทริกซ์ (ดังนั้นมันจะแสดงแต่ละบรรทัดบนบรรทัดแยกต่างหากนี่เป็นสิ่งจำเป็นเพราะ⎕SMไม่เข้าใจอักขระควบคุม)
    • ⎕SM←1 1,⍨: จากนั้นแสดงไว้ที่มุมบนซ้ายของ⎕SMหน้าต่าง
    • ⎕DL 1: แล้วรอหนึ่งวินาที

สุดท้ายแล้ว! และยังคงคำตอบของฉันไม่สั้นมากเพราะชื่อฟังก์ชั่นนั้นยาวมากเลย! : D
Martin Ender

1
มีคนต้องการเขียนตัวประมวลผลล่วงหน้า Mathematica ที่แมปฟังก์ชันทั้งหมดที่มีอยู่ในตัวอักขระ Unicode
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
สิ่งนี้วนซ้ำเพียงครั้งเดียว แต่สามารถย่อให้สั้นลงได้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: ขอบคุณฉันไม่สามารถเกิดอะไรขึ้นกับสิ่งที่ดีกว่า
ephemient

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

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

Python 117

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'if บนระบบที่ใช้ 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

0

Groovy - 121 119 ตัวอักษร

ส่งคำตอบของ ProgramFOXไปที่ Groovy 2.2.1 "คอนโซลที่ชัดเจน" อ่อนแอ

แก้ไข : แทนที่การปิดแบบเรียกซ้ำด้วยการเรียบง่ายขณะที่วนซ้ำซึ่งสั้นกว่าและไม่มีการล้นสแต็ก

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

Groovy, 81

นี่เป็นวิธีที่มีประโยชน์มากขึ้น:

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" ไม่ทำงานบน Mac ของฉัน นอกจากนี้ข้อกำหนดยังชี้ให้เห็นว่าภาพเคลื่อนไหวลูป
Michael Easter

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 # สามารถอยู่กึ่งแข่งขันกับ uber shorthand langs: 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.