Zainspirowany tą ofertą z Przewodnika użytkownika Commodore 64:
10 PRINT "{CLR/HOME}"
20 POKE 53280,7 : POKE 53281,13
30 X = 1 : Y = 1
40 DX = 1 : DY = 1
50 POKE 1024 + X + 40 * Y, 81
60 FOR T = 1 TO 10 : NEXT
70 POKE 1024 + X + 40 * Y, 32
80 X = X + DX
90 IF X <= 0 OR X >= 39 THEN DX = -DX
100 Y = Y + DY
110 IF Y <= 0 OR Y >= 24 THEN DY = -DY
120 GOTO 50
Utwórz podobny program w wybranym języku / platformie, aby odbić obiekt podobny do kuli wokół terminala, ekranu, kanwy lub innego obszaru wyświetlania wizualnego.
Nie musisz dokładnie naśladować grafiki PETSCII z C64, proste O
lub o
zrobi to, ani nie musisz używać GOTO
polecenia, jeśli nadal istnieje ono w twoim języku. Tak długo, jak twoja piłka zaczyna się na górze płótna i porusza się po przekątnej, aż osiągnie limit płótna, a następnie odpowiednio się odbija, w następujący sposób:
- Podróż w dół i w prawo i uderzanie w dolną część ekranu, odbija się i kontynuuje w prawo;
- Podróżowanie w górę i w prawo, uderza w skrajną prawą granicę i odbija się w lewo iw górę;
- Podróżując w lewo i w górę i uderzając w górę, odbija się w lewo iw dół;
- Podróżując w lewo i w dół i osiągając skrajną lewą granicę, odbija się w prawo i w dół;
- Uderza w każdy kąt i zmienia kierunek;
Więc wszyscy jesteśmy dobrzy.
Nie musisz też przesuwać piłki 8 pikseli, tak jak dzieje się to na liście BASIC na C64; możesz przesuwać jeden blok znaków lub piksel na raz, w zależności od tego, co uważasz za najbardziej odpowiednie.
Aby zobaczyć działanie tej listy BASIC, możesz wpisać ją za pomocą tego internetowego emulatora Commodore 64, pod warunkiem, że Twoja przeglądarka obsługuje Flash.
Odpowiedzi:
Kod maszynowy 6502 (C64),
908991 bajtów+2 bajty, ponieważ potrzebuje adresu ładowania (nie PIC z powodu własnej modyfikacji)
Demo online
Stosowanie:
sys49152
Starałem się zmniejszyć rozmiar (np. NIE używam IRQ do pomiaru czasu, ale zamiast tego głupie puste pętle), nadal nie jestem w stanie osiągnąć poziomu gry C64 BASIC w grę Titusa : o, cóż. Ale wygląda mniej migotać;)
Objaśnienie: (demontaż imadeł)
Dla zabawy, oto bardziej profesjonalny wariant wykorzystujący duszka do piłki i flashujący ramkę po trafieniu w 385 bajtów (zawierający dane duszka, które są używane w miejscu ):
Demo online - | - przeglądaj źródło asemblera ca65
Rozpocznij i zatrzymaj odbijającą się piłkę za pomocą
sys49152
.$C000
, co wymaga skopiowania zawartości ekranu i zestawu znaków (czcionek).RUN/STOP + RESTORE
jest zepsuty, nie próbuj.TI$
również pozostaje w tyle.źródło
inc $d020
niżjsr flash
;) hithimselfwithalargetrout To jest cudowne!.prg
pliku i z mojego meta pytania tutaj biorę, że muszę go dołączyć ... prawdopodobnie mógłbym go pominąć, gdyby kod był niezależny od pozycji.Narzędzia Bash + Unix,
125117 bajtówAnimacja przykładowego przebiegu:
źródło
Zespół CP-1610 ,
67…6462 DECLE = 78 bajtówTen kod jest przeznaczony do uruchamiania na Intellivision . Używa jednego ze swoich spriteów sprzętowych, znanego jako MOB (dla obiektu mobilnego).
Kod operacji CP-1610 jest kodowany za pomocą 10-bitowej wartości, zwanej „DECLE”. Ten program ma 62 DECLE długości, zaczynając od 4800 $, a kończąc na 483D.
Zrzut szesnastkowy + źródło
Wynik
źródło
HTML (Microsoft Edge / Internet Explorer), 81 bajtów
Udawaj, że jest 1998 z tymi zagnieżdżonymi
<marquee>
znacznikami:Testowany w Microsoft Edge, choć z tego, co przeczytałem, IE powinien nadal obsługiwać markizy. Zdecydowanie nie działa w Chrome.
Ustawienie
direction=up
pozwoliłoby zaoszczędzić 2 bajty, ale łamie zasadę, że piłka musi zaczynać się na górze płótna.źródło
direction
atrybutu.marquee
, to całkiem kreatywne!TI-BASIC,
7170Dosłownie dosłowne tłumaczenie, nie zdziwiłbym się, gdyby istniały sztuczki, aby je zmniejszyć.
Ekran ma wymiary 16 x 8 i indeks 1, więc stałe są różne.
~
jest sposobem SourceCodera na zapisanie symbolu negacji.Wygląda płynniej na sprzęcie.
źródło
Befunge, 209 bajtów
Zakłada się, że ekran ma rozmiar 80 x 25, ale można łatwo dostosować zakres, zastępując
"O"
(79) w ostatnim wierszu i*64
(24) w drugim ostatnim wierszu (zwróć uwagę, że drugi ostatni wiersz jest wykonywany od prawej do lewej). Prędkość można również regulować, zastępując"2"
(50) na ostatniej linii.źródło
Java,
184176 bajtówWykorzystuje to sekwencje specjalne ANSI do przeniesienia kursora, który jest obiektem odbijającym się wokół
85 x 25
wyświetlacza terminala. Zapisz w pliku o nazwieA.java
.Nie golfił
Próbny
źródło
Thread.sleep(50)
. A twoje programy w golfa i nie w golfa się nie zgadzają.Clojure,
398380375 bajtów-18 bajtów, zmieniając nazwę czcionki na pusty ciąg znaków, aby domyślnie, wstawiając kontrole granic i rozwiązując problem dolnej granicy (który można zobaczyć w pliku GIF). Naprawianie faktycznie zapisanych bajtów.
-5 bajtów, zmieniając na bardziej zwięzłą składnię destrukcyjną i zmniejszając piłkę o piksel.
Używa Quil .
Próbowałem przejść do trybu funkcjonalnego, ale wymagało to dużo dodatkowego kodu i ostatecznie było droższe.
(Uwaga: nowa wersja nie odbija się wcześnie u dołu ekranu, tak jak w przypadku GIF-a).
źródło
(+ 0 font-size)
tam mam . To jest żenujące. Naprawię to w następnej wersji. Powinieneś oszczędzić mi 5 bajtów.Rakieta 247 bajtów
Nie golfowany:
Wynik:
źródło
Galaretka, 37 bajtów
Z pewną pomocą od tej odpowiedzi na temat prawidłowego wykonania pętli i znaków ucieczki. Obecnie odbija się na ekranie 80x24, ale można to łatwo zmodyfikować w kodzie.
Współrzędne w każdym kierunku może być reprezentowana jako elementy dwóch list
[0, 1,..., 24, 23,..., 1]
i[0, 1,..., 80, 79,..., 1]
, nazwijmy jeY
iX
, które są powtarzane w nieskończoność. To nieskończone powtarzanie można emulować za pomocą indeksowania modułowego -ị
w Galaretce. Przykład: podczasi
iteracji piłka jest w pozycji(X[i%|X|], Y[i%|Y|]) = (iịY, iịX)
. Ruchoma kula jest tylko kursorem, który jest ustawiany w pozycji, emitująciịY
znaki nowej linii iiịX
spacje.Próbny
Wyjaśnienie
źródło
SmileBASIC,
8574 bajtówPołożenie piłki można modelować za pomocą 2 fal trójkątów, a najkrótszym sposobem, w jaki udało mi się je wytworzyć w SmileBASIC, było arcsine (sine (x)). (algorytm używający MOD był dłuższy, ponieważ SB używa
MOD
zamiast niego%
)źródło
CSS / HTML, 200 + 7 = 207 bajtów
Ta wersja pokazuje rozmiar płótna, a także nadaje animacji bardziej piksele:
Pokaż fragment kodu
źródło
Dyalog APL, 44 bajty
Wyjaśnienie:
{
...}⍨1 1
: wywołaj daną funkcję za pomocą ⍺ = ⍵ = 1 1⎕SM∘←0,G←⍺+⍵
: Przechowywać⍺+⍵
wG
, wyświetlał0
się w tym miejscu w⎕SM
oknie.⎕DL.1
: poczekaj 1/10 sekundy⊃1 G∨.≥G⎕SD
: Sprawdzenie, czyG
znajduje się w⎕SM
granicach okna (1≥G
lubG≥⎕SD
,⎕SD
to y creen d imensions)1-2×
: mapa[1,0]
na[¯1,1]
, aby zmienić kierunek podróży⍵×
: pomnóż przez to bieżący kierunek jazdyG∇
: rekurencja, niechG
będzie nowa lokalizacja (⍺
) i⍵....
będzie nowym kierunkiem (⍵
).źródło
PHP,
1129794103102 bajtówodbija kapitał
O
na siatce 40 x 25, zaczynając od prawego górnego rogu;drukuje 99 nowych linii, aby wyczyścić ekran.
Uruchom z
-nr
.A^K
=chr(10)
= nowa liniaA^a
=chr(32)
= spacjaźródło
for($d=$e=-1;;usleep(1e5))echo($r=str_repeat)(A^K,99),$r(A^a,$x+=$d*=$x%79?1:-1),O,$r(A^K,$y+=$e*=$y%24?1:-1);
. Modulo ma wartość false przy 0 i N i odwraca kierunek. Niestety musimy zainicjować $ d i $ e do -1, ale nadal możemy uzyskać oszczędności.$x%79<=>.5
działa również dla tych samych bajtów.Simons´ BASIC (C64),
6665 bajtówJeden bajt zapisany dzięki @ShaunBebbers.
Potrzebuję tylko jednej linii, ponieważ Simons´ Basic ma funkcję modulo.
Po tym, wymaga to fizycznego C64 i modułu Simona BASIC
(lub dowolnego innego rozszerzenia BASIC, które ma
mod
funkcję).Wpisz 69 znaków:
{CLR}
to PETSCII 147, który czyści ekran. Użyj Shift + CLR / HOME, aby wpisać.bytecount
Kiedy zapisany na dysku, to zajmuje 65 bajtów, ponieważ polecenia są tokenized:
for
,to
,poke
,abs
,next
igoto
to jeden bajt każda;mod
zajmuje dwa bajty.To daje 59 bajtów kodu plus 4 bajty na wskaźniki i 2 bajty na numer linii.
W celach informacyjnych patrz Mapowanie C64 i wyszukiwanie
$800
(Tekst programu w języku BASIC).(Obszar pamięci ekranu wideo można znaleźć pod adresem
$400
.)awaria
Program zapętla
I
od 0 do 623 (= LCM 48 i 78 minus 1). W pętliI
zostanie zmapowany do 39..0..38 odpowiednio 24..0..23(tak jak robi to oryginalny program).
Po zakończeniu pętli program jest ponownie uruchamiany przez przejście do linii 0.
C64 BASIC,
7776 bajtówNiestety potrzebuję dwóch linii, ponieważ nawet przy wszystkich możliwych skrótach zajęłoby to 83 znaki - zbyt wiele, aby użyć edytora linii C64:
(Można użyć edytora szesnastkowego, aby utworzyć dłuższą linię - co dałoby 73 bajty.)
źródło
:
i nie;
goto
w wersjigoto
goto 0
$0400
do$07e7
; lub użyj duszka. Używanie Kernala z$ffd2
(akumulatorem wyjściowym) działałoby, ponieważ dość łatwo można ustawić pozycję X i Y na kursorze (nie pamiętam wezwania do tego), ale może być konieczne uniknięcie pozycji ostatniego znaku na wypadek, gdyby wymusił kanał informacyjny.Python 2,
176168 bajtówZakłada się, że rozmiar terminala wynosi 80 x 24. Zdecydowanie nie optymalne, ale jestem nowy w golfa, więc tak.
Dzięki R. Kap za sugestię x% 79 <1 zamiast x <1 lub x> 79 i to samo dla y.
źródło
x<1or x>78
zx%79<0
iy<1or y>22
zy%23<1
.Rebol / View,
284266 bajtówNie golfowany:
źródło
C 294 bajtów
Wersja bez golfa:
Wyjaśnienie
graphics.h
do mojego/usr/include
katalogu. Dlatego szukałem i to właśnie znalazłem. Jest to implementacja TurboC Graphics wykorzystująca SDL dla systemu Linux. Można również użyć OpenGL. Wydaje mi się, że w Windows jest już zainstalowany, nie jestem pewien co do MacOS.void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);
inicjuje system i przełącza go w tryb graficzny, w tym przypadku sterownik karty graficznej jest wykrywany automatycznie. Więcej informacji można znaleźć pod tym linkiem .x
iy
są współrzędnymi, które określają pozycję piłki.a
ib
są flagami,a
jest ustawiany na zero, gdyx
wartość spada poniżej 60 ib
jest ustawiany na zero, gdyy
spada poniżej 60.x
iy
przekracza wartości graniczne z oknem, i współrzędne są odpowiednio dostosowane.usleep
tak, aby mój procesor się nie stresował.closegraph()
połączenia, aby zamknąć okno. Ale tutaj go brakuje.Musi zostać skompilowany z flagą linkera
-lgraph
Działa płynniej na prawdziwym sprzęcie. :)
źródło
graphics.h
. Ta odpowiedź askubuntu.com/questions/525051/… była pomocna.MATL , 42 bajty
Wykorzystuje ekran i postać 70 × 16
O
. Jeśli zaczekasz na kilka odbić, zobaczysz, jak piłka uderza w róg.Wypróbuj w MATL Online!
Rozmiar ekranu można łatwo modyfikować w kodzie. Odpowiednią częścią jest to
8E70
, która popycha8
, podwaja ją i popycha70
. Na przykład, dla ekranu o wymiarach 80 × 25 zamień na5W80
, który popycha5
, obciosuje i popycha80
(lub zamień na25 80
, ale wymaga jeszcze jednego bajtu).Ponadto dodanie
tD
na końcu kodu pokazuje bieżącą pozycję w czasie rzeczywistym (pionowy, a następnie poziomy,1 1
to lewy górny róg). Na przykład dla80×18
ekranuWypróbuj też!
Wyjaśnienie
Używa nieskończonej pętli. Pozycja jest przechowywana w schowku
H
jako wektor 1 × 2, a kierunek jest przechowywany w schowkuI
jako wektor 1 × 2 z wpisami1
lub-1
.Każda iteracja czyści ekran, określa macierz odstępów, zapisuje
O
odpowiednią pozycję i wyświetla ją. Następnie należy zaktualizować pozycję i kierunek.Pozycja jest
1
oparta, a zatem są krawędzie ekranu1
i maksymalny rozmiar ekranu. Więc jeśli rozmiar ekranu modulo pozycji daje0
lub1
w pierwszym lub drugim składniku, co oznacza, że osiągnęliśmy odpowiednio pionową lub poziomą krawędź, to ten składnik wektora kierunku jest negowany. Następnie nowy kierunek jest dodawany do bieżącej pozycji w celu uzyskania nowej pozycji.źródło
Oto lista ZX Spectrum.
źródło
Klątwy C +, 190 bajtów
Wyjaśnienie:
źródło
Lua ( LÖVE 2D ), 130 bajtów
Lua nie jest najlepszym językiem, jeśli chodzi o golfa kodowego, ale proszę bardzo! Kilka punktów, o których warto wspomnieć:
Domyślny rozmiar płótna to 800 x 600. Można go zmienić w pliku konfiguracyjnym, ale nie widziałem żadnych ograniczeń rozmiaru, więc zostawiłem go bez zmian.
love.draw()
jest funkcją rysunkową LÖVE i ma z góry określoną nazwę. Alternatywnymi funkcjami LÖVE, które mogłyby być użyte, byłybylove.update(dt)
ilove.run()
- pierwsza jest dłuższa, w bajtach, a druga krótsza, tak, ale bez wbudowanej nieskończonej pętli.draw()
Wydaje się więc, że jest to nasz najlepszy zakład tutaj.Powyższa wersja służy
love.graphics.points
do rysowania piłki. Chociaż krótszy, nie jestem pewien, czy jest to dozwolone. Oto GIF jego działania:Jak widać (a może nie), na ekranie porusza się pojedynczy piksel. To oszczędza bajty, ale nie jest to najbardziej satysfakcjonujący wynik.
Więc stworzyłem alternatywne rozwiązanie 131 bajtów :
Ten używa
love.graphics.print
- który drukuje tekst - i0
jako piłkę, dzięki czemu jest znacznie bardziej widoczny i atrakcyjny.źródło
CHIP-8,
363428 bajtówŻadnych wymyślnych sztuczek tutaj ...
Wymaga interpretera, który poprawnie rysuje ikonki (na ramkę można narysować tylko jednego ikonkę, co spowalnia program na tyle, abyś mógł go zobaczyć).
Niska jakość wideo
źródło
ZX Spectrum BASIC - 179 bajtów
Tutaj jest tylko trochę skondensowane. Ma 179 bajtów z dołączoną grafiką
źródło
o
lubO
możesz zapisać niektóre bajty na liście symbolicznej; możesz również edytować poprzednie odpowiedzi, gdy