Die Aufgabe:
Bei einer .txt
Datei mit ASCII-Bildern, die jeweils durch ein \n
(siehe dieses Beispiel, wenn Sie nicht sicher sind) getrennt sind, wird ein Video mit einem Bild mit 1 Bild pro Sekunde ausgegeben.
Beachten Sie, dass \n
der letzte Frame einen Trailing aufweist.
Die Abmessungen der einzelnen Rahmen betragen:
- X <80
- Y <20
Die Regeln
- Das vorherige Bild muss gelöscht werden, bevor das nächste angezeigt wird. Daher ist es keine gültige Antwort, jedes Bild auf das Terminal zu drucken.
- Neu Sie können den gewünschten Dateinamen entweder aus einer Variablen oder von sys args abrufen.
- Neu Die Bilder müssen auf unbestimmte Zeit wiederholt werden
- Das ist Codegolf: Das kleinste Programm gewinnt.
Beispiel
Eingang
0 0
0 0
00000
0 0
0 0
00000
0
00000
0
00000
0 0
0 0
0
0
0
Ausgabe
Nicht golfen
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)
document.body.innerText
Antworten:
Mathematica, 41 Bytes
Erwartet, dass der Dateiname in einer Variablen gespeichert wird
f
.Dies ist das erste Mal, dass Mathematica Vorrangregeln für sie erstellt
@
und.~.~.
genau so verwendet, wie ich sie benötige.Übrigens könnte dieses Snippet furchtbar schief gehen, wenn die Dateierweiterung etwas anderes ist als
.txt
(da Mathematica versuchen wird, zu erraten, wie der Import darauf basiert), aber zum Glück ist diese Dateiendung Teil der Herausforderungsspezifikation.quelle
Bash, 82
Angenommen, der Dateiname der TXT-Datei wird als erstes Argument für das Skript angegeben.
Beachten Sie, dass am Ende der TXT-Datei eine nachgestellte Leerzeile vorhanden sein muss, damit dies funktioniert.
Besonderer Dank geht an @professorfish und @DigitalTrauma.
quelle
$IFS
standardmäßig leer? Verwenden Siefor ((;;)){ ... }
stattdessen auchwhile :;do ... done
''
so dassread
mehrere aufeinander folgende Leerzeichen lesen kann, wie in der letzten Zeile der YIFS=
und[ "$a" ]
stattdessen[ -n "$a" ]
Ruby,
88865655 ZeichenDieses Programm geht davon aus, dass der Dateiname als erstes Argument angegeben wird.
Vielen Dank an Ventero für die tollen Verbesserungen!
Nicht golfen:
Dieses Programm liest die Datei, teilt sie in Blöcke auf und druckt jeden Block nach dem Löschen des Bildschirms separat aus.
cls
Funktioniert nur unter Windows. Eine Variante mitclear
ist 57 Zeichen.quelle
;
und beim Aufruf die Klammern weglassensplit
.\n
trotzdem verwendet wird. Auch hier beim Code-Golf bringt Sie niemand dazu, für jeden Zeilenumbruch einen weiteren Punkt zu Ihrem Ergebnis hinzuzufügen, nur weil Sie Windows verwenden. ;)$*
ist eine Abkürzung fürARGV
, die zwei Zeichen speichern würde. In diesem Fall können Sie sogar noch mehr sparen , indem SieARGF
(oder$<
) , obwohl:a=$<.read.split"\n\n"
.a.size
ist auch kürzer alsa.length
. Und dasleep
das Argument nach der Rückkehr zurückgegeben wird, können Sie die letzten beiden Anweisungen in Ihrer Schleife zu kombiniereni+=sleep 1
.i
indem SieArray#cycle
, was immer eine Schleife , wenn kein Argument angegeben wird:a.cycle{|i|system"cls";$><<i;sleep 1}
. Und das Aufteilen auf$/+$/
ist ein anderes Zeichen, das kürzer ist als"\n\n"
.a
:$<.read.split($/+$/).cycle{...}
(Entschuldigung für den dreifachen Kommentar, ich denke immer an neue Verbesserungen direkt nach dem Ende der Kommentarbearbeitungsperiode :))Dyalog APL (64)
(Dieses Mal ist Mathematica nicht zu schlagen. Es scheint für alles etwas eingebaut zu haben.)
Dies ist eine Funktion, die den Dateinamen als Argument verwendet. Es wird davon ausgegangen, dass die Datei im Windows (
\r\n
) -Format vorliegt.Erläuterung:
⎕ML←3
: Migrationsstufe auf 3 setzen (zulassen⊂
kann als Split-Funktion von APL2 verwendet werden)M←80 ¯1⎕MAP⍵
: Lies die vom richtigen Argument angegebene Datei als ASCII-Datei und speichere den Inhalt inM
.M⊂⍨~(4/1)⍷⎕TC∊⍨M
: Finde alle Vorkommen von vier aufeinanderfolgenden Terminal-Steuerzeichen und teile sie aufM
auf. Dies gibt jedem Rahmen.{
...}¨
: für jede dieser ...⊂⊃⍵⊂⍨~⍵∊⎕TC
: Teilen Sie das Argument (= ein Frame) in Terminal-Steuerzeichen und wandeln Sie den Vektor der Vektoren in eine Matrix um (damit jede Zeile in einer separaten Zeile angezeigt wird, ist dies erforderlich, weil⎕SM
Steuerzeichen nicht verstanden werden.)⎕SM←1 1,⍨
: dann oben links in der⎕SM
Fenster .⎕DL 1
: und dann eine Sekunde warten.quelle
Awk, 53Neue Regeln:
Awk, 74
quelle
BEGIN{RS=z}{system("sleep 1;clear")}1
... gekürzt werden. In awk""
ist dies speziell , wenn es sich umRS
mehrzeilige Datensätze handelt. Um die neue Regel des Endlosschleifens zu unterstützen, habe ich dies bisher:BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}
bei 74 Zeichen. gawk unterstützt das Ändern,ARGV
sodass SieBEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1
mit 63 Zeichen arbeiten können.Perl, 40
Rennen wie
(dh die Animationsdatei wird über STDIN gelesen).
p00
Zur Zählung wurden 3 Bytes hinzugefügt. Es ist 2 Zeichen kürzer, dh 38 unter Windows wegencls
stattclear
. Oder um portabel zu sein:Oder Dehnungsregeln ein wenig (und dann 31 + 3 = 34 ):
quelle
Rebol, 74
Erwartet, dass der Dateiname in einer Variablen gespeichert wird
f
. Unten ist ein ungolfed Beispiel:quelle
Java, 678 Zeichen (beim Golfen)
Natürlich mit GUI, da die Arbeit in der Konsole mit Java nichts bringt, vor allem, wenn Sie den Bildschirm löschen möchten ...
quelle
Cobra - 163
quelle
Python 117
Angenommen, der Dateiname ist in Variable gespeichert
f
.Hinweis: ersetzen
'cls'
durch'clear'
wenn Sie auf einem Unix-basierten System arbeiten, und fügen Sie 2 Chrs hinzu.ctl+C
beendenquelle
for i in F: s.addstr(y,0,i); ... if i=='': ...
open(f).read()
stattdessenfile.read(file(f))
, um 4 Bytes kürzer.Groovy -
121119 ZeichenPortierte ProgramFOX-Antwort auf Groovy 2.2.1. Die "Klare Konsole" ist schwach.
edit : rekursives Schließen durch einfache while-Schleife ersetzt, die kürzer ist und keinen Stapelüberlauf verursacht
Ungolfed:
quelle
GNU sed, 32
quelle
Groovy, 81 Jahre alt
Das ist ein groovigerer Weg:
ungolfed
quelle
cls
ist für Windows, denke ich ... tryclear
C # 226
Warum eh stören?
Nicht golfen :
Oder in LINQPAD (damit C # mit der Kurzschrift langs: D halb konkurrenzfähig bleibt)
C # LINQPAD - 134
Ich fühle mich ein bisschen schmutzig, aber hey, das ist Code-Golf.
quelle
SmileBASIC, 74 Bytes
F sollte der Dateiname sein
quelle