Zadanie:
Biorąc pod uwagę .txt
plik z ramkami grafiki ASCII, z których każda jest oddzielona znakiem \n
(patrz ten przykład, jeśli nie jest jasne), wyślij film z ramką z 1 klatką na sekundę.
Zwróć uwagę, że \n
na ostatniej klatce jest znak końcowy.
Wymiary każdej ramki będą:
- X <80
- Y <20
Zasady
- Poprzednia ramka musi zostać wyczyszczona przed wyświetleniem następnej, więc samo wydrukowanie każdej ramki na terminalu nie jest prawidłową odpowiedzią.
- Nowość Możesz pobrać nazwę pliku, jak chcesz, albo z pliku przechowywanego w zmiennej, albo z sys args.
- Nowość Obrazy muszą się zapętlać w nieskończoność
- To jest kod golfowy: wygrywa najmniejszy program.
Przykład
Wejście
0 0
0 0
00000
0 0
0 0
00000
0
00000
0
00000
0 0
0 0
0
0
0
Wynik
Nie grał w golfa
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
Odpowiedzi:
Mathematica, 41 bajtów
Oczekuje, że nazwa pliku będzie przechowywana w zmiennej
f
.To pierwszy raz, kiedy Mathematica ma pierwszeństwo
@
i.~.~.
jest dokładnie taka, jakiej potrzebuję.Przy okazji, ten fragment kodu może pójść okropnie źle, jeśli rozszerzenie pliku jest czymś innym niż
.txt
(ponieważ Mathematica spróbuje zgadnąć, jak wykonać import na tej podstawie), ale na szczęście zakończenie pliku jest częścią specyfikacji wyzwania.źródło
Bash, 82
Zakłada się, że nazwa pliku .txt jest podana jako pierwszy argument skryptu.
Zauważ, że końcowy pusty wiersz musi znajdować się na końcu pliku .txt, aby to zadziałało.
Specjalne podziękowania dla @professorfish i @DigitalTrauma.
źródło
$IFS
domyślnie nie jest puste? także użyjfor ((;;)){ ... }
zamiastwhile :;do ... done
''
tak, abyread
mógł odczytywać wiele kolejnych spacji, jak w ostatnim wierszu YIFS=
i[ "$a" ]
zamiast[ -n "$a" ]
Ruby,
88865655 znakówTen program zakłada, że nazwa pliku jest podana jako pierwszy argument.
Bardzo dziękuję Ventero za udostępnienie wspaniałych ulepszeń!
Bez golfa:
Ten program odczytuje plik, dzieli go na części i drukuje każdą część osobno po wyczyszczeniu ekranu.
cls
działa tylko w systemie Windows. Wariant zclear
57 znakami.źródło
;
i pomijając nawiasy podczas wywoływaniasplit
.\n
. Również tutaj, na polu golfowym, nikt nie sprawi, że dodasz kolejny punkt do wyniku za każdą przerwę linii tylko dlatego, że używasz systemu Windows. ;)$*
jest skrótem odARGV
, który uratowałby dwie postacie. W tym przypadku można zaoszczędzić jeszcze więcej za pomocąARGF
(lub$<
), choć:a=$<.read.split"\n\n"
.a.size
jest również krótszy niża.length
. A ponieważsleep
zwraca argument po powrocie, możesz połączyć dwie ostatnie instrukcje w pętlii+=sleep 1
.i
za pomocąArray#cycle
, których pętle na zawsze, jeśli nie podano żadnych argumentów:a.cycle{|i|system"cls";$><<i;sleep 1}
. A dzielenie na$/+$/
to kolejna postać krótsza niż"\n\n"
.a
:$<.read.split($/+$/).cycle{...}
(Przepraszam za potrójny komentarz, zawsze myślę o nowych ulepszeniach zaraz po zakończeniu edycji komentarza :))Dyalog APL (64)
(Tym razem nie można pokonać Mathematiki. Wygląda na to, że ma wbudowane wszystko).
Jest to funkcja, która przyjmuje nazwę pliku jako argument. Zakłada się, że plik ma
\r\n
format Windows ( ).Wyjaśnienie:
⎕ML←3
: ustaw poziom migracji na 3 (pozwalając⊂
na użycie jako funkcji podziału APL2)M←80 ¯1⎕MAP⍵
: przeczytaj plik podany przez właściwy argument jako plik ASCII i zapisz zawartość wM
.M⊂⍨~(4/1)⍷⎕TC∊⍨M
: znajdź wszystkie wystąpienia czterech następujących po sobie znaków kontrolnych terminala i rozdzielM
je. Daje to każdą ramkę.{
...}¨
: dla każdego z nich ...⊂⊃⍵⊂⍨~⍵∊⎕TC
: podziel argument (= jedna ramka) na znaki kontrolne terminala, a następnie zamień wektor wektorów na macierz (aby wyświetlał każdą linię w osobnej linii, jest to konieczne, ponieważ⎕SM
nie rozumie znaków kontrolnych).⎕SM←1 1,⍨
: następnie wyświetl go w lewym górnym rogu⎕SM
okna.⎕DL 1
: a następnie poczekaj sekundę.źródło
Awk, 53Nowe zasady:
Awk, 74
źródło
BEGIN{RS=z}{system("sleep 1;clear")}1
... W awk""
jest wyjątkowy, ponieważRS
oznacza zapisy wielowierszowe. Aby wesprzeć nową zasadę zapętlania w nieskończoność, mam do tej pory:BEGIN{RS=z}END{for(;!system("sleep 1;clear");)print a[i++%NR+1]}{a[NR]=$0}
74 znaki. gawk obsługuje zmiany,ARGV
więc możesz zrobić toBEGIN{RS=z}{system("sleep 1;clear");ARGV[ARGC++]=ARGV[ARGC-1]}1
przy 63 znakach.Perl, 40
Uruchom jako
(tzn. plik animacji jest odczytywany przez STDIN).
p00
Dodano 3 bajty dla zliczania. Jest o 2 znaki krótszy, tj. 38 w systemie Windows z powoducls
zamiastclear
. Lub, aby być przenośnym:Lub rozciąganie trochę rządzi (a potem 31 + 3 = 34 ):
źródło
Rebol, 74
Oczekuje, że nazwa pliku zostanie zapisana w zmiennej
f
. Poniżej znajduje się nieprzygotowany przykład:źródło
Java, 678 znaków (podczas gry w golfa)
Oczywiście z GUI, ponieważ robienie rzeczy w konsoli jest do kitu z Javą, szczególnie jeśli chcesz wyczyścić ekran ...
źródło
Kobra - 163
źródło
Python 117
Zakłada, że nazwa pliku jest przechowywana w zmiennej
f
.Uwaga: wymienić
'cls'
ze'clear'
jeśli w systemie opartym na UNIX, dodając 2 chrs.ctl+C
do wyjściaźródło
for i in F: s.addstr(y,0,i); ... if i=='': ...
open(f).read()
zamiastfile.read(file(f))
, krótszego o 4 bajty.Groovy -
121119 znakówPrzeniesiona odpowiedź programuFOX na Groovy 2.2.1. „Czysta konsola” jest słaba.
edycja : zastąpiono zamknięcie rekurencyjne prostą pętlą while, która jest krótsza i nie powoduje przepełnienia stosu
Nie golfowany:
źródło
GNU sed, 32
źródło
Groovy, 81
To jest bardziej groovy sposób:
bez golfa
źródło
cls
jest dla systemu Windows Myślę, że ... spróbujclear
C # 226
Po co zawracać sobie głowę?
Bez golfa :
Lub w LINQPAD (aby C # mógł pozostać częściowo konkurencyjny z Uber Shorthand Langs: D)
C # LINQPAD - 134
Czuję się trochę brudny, ale hej, to jest golf.
źródło
SmileBASIC, 74 bajty
F powinna być nazwą pliku
źródło