Afficher les cadres à partir du fichier .txt

14

La tâche:

Étant donné un .txtfichier avec des images d'art ASCII séparées chacune par une \nsortie (voir cet exemple si vous n'êtes pas clair) une image animée avec une image à 1 image par seconde.

Notez qu'il y a une fin \nsur l'image finale.

Les dimensions de chaque cadre seront:

  • X <80
  • Y <20

Les règles

  • Le cadre précédent doit être effacé avant que le suivant ne s'affiche, donc l'impression de chaque cadre sur le terminal n'est pas une réponse valide.
  • Nouveau Vous pouvez récupérer le nom du fichier comme vous le souhaitez, soit à partir de son stockage dans une variable, soit à partir d'arguments sys.
  • Nouveau Les images doivent boucler indéfiniment
  • C'est le golf de code: le plus petit programme gagne.

Exemple

Contribution

0   0
0   0
00000
0   0
0   0

00000
0
00000
0   
00000

0   0
 0 0
  0
  0
  0

Production

Exemple de sortie

Non golfé

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)
Harry Beadle
la source
5
Dans les langues qui ne prennent pas vraiment en charge la gestion des fichiers (comme JavaScript), est-il également correct de mettre l'entrée dans une variable?
ProgramFOX
2
@ProgramFOX Je suppose que vous pouvez ouvrir le fichier dans un navigateur et l'utiliserdocument.body.innerText
user12205
3
@ProgramFOX Rendez-le un peu injuste, l'aspect de la gestion des fichiers ajoute de nombreux caractères dans la plupart des langues
Harry Beadle

Réponses:

10

Mathematica, 41 octets

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

Attend que le nom de fichier soit stocké dans une variable f.

C'est la première fois que Mathematica règle les priorités @et .~.~.est exactement la façon dont j'en ai besoin.

Btw, cet extrait pourrait mal tourner si l'extension du fichier est autre chose que .txt(car Mathematica essaiera de deviner comment effectuer l'importation en fonction de cela), mais heureusement, la fin de ce fichier fait partie de la spécification du défi.

Martin Ender
la source
6

Bash, 82

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

Suppose que le nom de fichier du fichier .txt est fourni comme premier argument du script.

Notez qu'une ligne vide de fin doit être présente à la fin du fichier .txt pour que cela fonctionne.

Un merci spécial à @professorfish et @DigitalTrauma.

user12205
la source
1
n'est pas $IFSvide par défaut? aussi, utilisez for ((;;)){ ... }au lieu dewhile :;do ... done
@professorfish IFS par défaut est <space><tab> <newline>. Besoin de le régler ''pour qu'il readpuisse lire plusieurs espaces consécutifs, comme dans la dernière ligne de Y
user12205
1
Quelques petites réductions: IFS=et [ "$a" ]au lieu de[ -n "$a" ]
Digital Trauma
4

Rubis, 88 86 56 55 caractères

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

Ce programme suppose que le nom de fichier est donné comme premier argument.

Merci beaucoup à Ventero d'avoir partagé de grandes améliorations!

Non golfé:

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

Ce programme lit le fichier, le divise en morceaux et imprime chaque morceau séparément après avoir effacé l'écran. clsne fonctionne que sous Windows. Une variante de clear57 caractères.

ProgramFOX
la source
vous pouvez enregistrer un ou deux caractères en utilisant un saut de ligne au lieu du premier ;et en omettant les parenthèses lors de l'appel split.
Martin Ender
2
Cela dépend de la façon dont vous configurez votre éditeur. : P J'utilise presque exclusivement Windows, mais mon Sublime est configuré pour utiliser \nquand même. Ici aussi, sur le golf de code, personne ne vous fera ajouter un autre point à votre score pour chaque saut de ligne simplement parce que vous utilisez Windows. ;)
Martin Ender
1
$*est un raccourci pour ARGV, ce qui sauverait deux caractères. Dans ce cas, vous pouvez économiser encore plus en utilisant ARGF(ou $<) si: a=$<.read.split"\n\n". a.sizeest également plus court que a.length. Et puisque sleeprenvoie son argument après son retour, vous pouvez combiner les deux dernières instructions de votre boucle dans i+=sleep 1.
Ventero
1
En fait, Nevermind le dernier bit, vous pouvez éliminer complètement à il'aide Array#cycle, qui fait une boucle pour toujours si aucun argument est donné: a.cycle{|i|system"cls";$><<i;sleep 1}. Et fractionner à $/+$/est un autre caractère plus court que "\n\n".
Ventero
1
Cela vous permet également d'inclure la définition de a: $<.read.split($/+$/).cycle{...}(Désolé pour le triple commentaire, je pense toujours à de nouvelles améliorations juste après la fin de la période d'édition des commentaires :))
Ventero
2

Dyalog APL (64)

(Ne peut pas battre Mathematica cette fois. Il semble avoir une fonction intégrée pour tout.)

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

Il s'agit d'une fonction qui prend le nom de fichier comme argument. Il suppose que le fichier est au \r\nformat Windows ( ).

Explication:

  • ⎕ML←3: définir le niveau de migration sur 3 (permettant d'être utilisé comme fonctionnalité de partage d'APL2)
  • M←80 ¯1⎕MAP⍵: lire le fichier donné par l'argument de droite en tant que fichier ASCII et stocker le contenu dans M.
  • M⊂⍨~(4/1)⍷⎕TC∊⍨M: recherchez toutes les occurrences de quatre caractères de contrôle de terminal consécutifs et divisez- Mles. Cela donne à chaque image.
  • {... : pour chacun d'eux ...
    • ⊂⊃⍵⊂⍨~⍵∊⎕TC: divisez l'argument (= une trame) sur les caractères de contrôle du terminal, puis transformez le vecteur de vecteurs en matrice (afin qu'il affiche chaque ligne sur une ligne distincte, cela est nécessaire car ⎕SMne comprend pas les caractères de contrôle.)
    • ⎕SM←1 1,⍨: affichez-le ensuite dans le coin supérieur gauche de la ⎕SMfenêtre.
    • ⎕DL 1: puis attendez une seconde.
marinus
la source
Ha enfin! Et ma réponse n'est pas beaucoup plus courte car les noms de fonction sont tellement longs! : D
Martin Ender
1
Quelqu'un a besoin d'écrire un préprocesseur Mathematica qui mappe chaque fonction intégrée à un caractère Unicode
Digital Trauma
2

Awk, 53

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


Nouvelles règles:

Awk, 74

BEGIN{RS=z}{a[NR]=$0}END{while(!system("sleep 1;clear"))print a[i++%NR+1]}
éphémère
la source
1
Cela ne boucle qu'une seule fois, mais il peut être raccourci en BEGIN{RS=z}{system("sleep 1;clear")}1... Dans awk, ""est spécial car il RSsignifie des enregistrements multilignes. Pour prendre en charge la nouvelle règle de bouclage indéfiniment, je l'ai jusqu'à présent: BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}à 74 caractères. gawk prend en charge la modification ARGVafin que vous puissiez faire BEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1à 63 caractères.
laindir
@laindir: Merci, je ne peux rien trouver de mieux.
éphémère
1

Perl, 40

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

courir comme

perl -p00 frames.pl < animation.txt

(c'est-à-dire que le fichier d'animation est lu via STDIN). 3 octets p00ont été ajoutés pour compter. C'est 2 caractères plus court soit 38 sur Windows à cause de clsau lieu de clear. Ou, pour être portable:

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

Ou, étirer un peu les règles (puis 31 + 3 = 34 ):

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

Rebol, 74

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


Attend que le nom de fichier soit stocké dans une variable f. Voici un exemple non golfé:

f: %ascii-art.txt

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

Java, 678 caractères (au golf)

Bien sûr avec l'interface graphique, car faire des trucs dans la console est nul avec Java, surtout si vous voulez effacer l'écran ...

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();
    }
}
Leo Pflug
la source
Je viens de réaliser qu'il y avait des dimensions dans le post de l'auteur, mais je suis trop paresseux pour changer mon code maintenant. Ne gagnera pas de toute façon: P
Leo Pflug
1

Cobra - 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
Οurous
la source
1

Python 117

Suppose que le nom de fichier est stocké dans une 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')

Remarque: remplacer 'cls' par 'clear'if sur un système basé sur unix, en ajoutant 2 heures.

ctl+C quitter

Harry Beadle
la source
for i in F: s.addstr(y,0,i); ... if i=='': ...
user12205
Utilisez open(f).read()au lieu de file.read(file(f)), plus court de 4 octets.
nyuszika7h
0

Sensationnel - 121 119 caractères

Porté Réponse de ProgramFOX à Groovy 2.2.1. La "console claire" est faible.

Éditer : remplacement de la fermeture récursive par une simple boucle while, qui est plus courte et sans débordement de pile

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

Non golfé:

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 ""}
}
Michael Easter
la source
0

GNU sed, 32

1eclear
/^$/{
esleep 1;clear
d
}
Geoff Reedy
la source
0

Groovy, 81

C'est une façon plus groovy:

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

non golfé

new File(args[0]).text.split("\n\n").each{
    ["cls"].execute()
    print it
    sleep(1000)
}
khroolick
la source
La commande "cls" ne fonctionne pas sur mon Mac. En outre, les exigences suggèrent que le film tourne en boucle.
Michael Easter
2
@Michael Easter clsest pour Windows, je pense ... essayezclear
user12205
0

C # 226

Pourquoi déranger hein?

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

Non golfé :

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

Ou dans LINQPAD (pour que C # puisse rester semi-compétitif avec les langages sténographiques 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();}

Je me sens un peu sale, mais bon, c'est du code-golf.

jzm
la source
0

SmileBASIC, 74 octets

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

F doit être le nom du fichier

12Me21
la source