Terinspirasi oleh daftar ini dari Panduan Pengguna 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
Buat program serupa dalam bahasa / platform yang Anda pilih untuk memantulkan objek yang mirip bola di sekitar terminal, layar, kanvas, atau area tampilan visual lainnya.
Anda tidak harus meniru grafik PETSCII C64 dengan tepat, sederhana O
atau o
akan dilakukan, Anda juga tidak harus menggunakan GOTO
perintah jika masih ada dalam bahasa Anda. Selama bola Anda mulai di atas kanvas Anda dan bergerak secara diagonal hingga menyentuh batas kanvas, dan kemudian memantul sesuai itu, sebagai berikut:
- Bepergian ke bawah dan ke kanan dan menyentuh bagian bawah area layar, memantul ke atas dan terus ke kanan;
- Bepergian ke atas dan ke kanan dan mengenai batas paling kanan, dan memantul ke kiri dan ke atas;
- Bepergian ke kiri dan ke atas dan mengenai bagian atas, memantul ke kiri dan ke bawah;
- Bepergian ke kiri dan ke bawah dan mencapai batas paling kiri, memantul ke kanan dan ke bawah;
- Hit sudut mana pun dan membalikkan arah;
Maka kita semua baik-baik saja.
Anda tidak harus memindahkan bola 8-piksel sekaligus, seperti yang terjadi dalam daftar BASIC di C64; Anda dapat memindahkan satu blok karakter atau satu piksel pada satu waktu, mana yang menurut Anda paling tepat.
Untuk melihat listing BASIC ini berfungsi, Anda dapat mengetikkannya dengan emulator Commodore 64 online ini asalkan browser Anda mendukung Flash.
Jawaban:
6502 kode mesin (C64),
908991 byte+2 byte karena memerlukan alamat pemuatan (bukan PIC karena modifikasi diri)
Demo online
Pemakaian:
sys49152
Saya berusaha keras untuk mengurangi ukuran (mis. BUKAN menggunakan IRQ untuk pengaturan waktu tetapi loop kosong bodoh sebagai gantinya), masih mustahil untuk mencapai tingkat C64 BASIC golf Titus ' : o oh, well. Tapi kelihatannya kurang berkedip;)
Penjelasan: (wakil pembongkaran)
Hanya untuk bersenang-senang, inilah varian yang lebih profesional menggunakan sprite untuk bola dan mem-flash perbatasan ketika dipukul dalam 385 byte (berisi data sprite yang digunakan di tempat ):
Demo online - | - Jelajahi sumber assembler ca65
Mulai dan hentikan bola memantul dengan
sys49152
.$C000
, yang mengharuskan menyalin isi layar dan set karakter (font).RUN/STOP + RESTORE
rusak, jangan coba-coba.TI$
akan tertinggal juga.sumber
inc $d020
lebihjsr flash
;) hitshimselfwithalargetrout IT'S mengagumkan!.prg
file yang valid dan dari pertanyaan meta saya di sini saya ambil saya harus memasukkannya ... mungkin bisa meninggalkannya jika kode itu posisi independen.Utilitas Bash + Unix,
125117 byteAnimasi contoh dijalankan:
sumber
Perakitan CP-1610 ,
67…6462 DECLEs = 78 byteKode ini dimaksudkan untuk dijalankan pada Intellivision . Ini menggunakan salah satu sprite perangkat kerasnya, yang dikenal sebagai MOB (untuk Mobile Object).
Sebuah opcode CP-1610 dikodekan dengan nilai 10-bit, yang dikenal sebagai 'DECLE'. Program ini panjangnya 62 DECLE, mulai dari $ 4800 dan berakhir pada $ 483D.
Sumber dump + heksadesimal
Keluaran
sumber
HTML (Microsoft Edge / Internet Explorer), 81 byte
Berpura-puralah tahun 1998 dengan
<marquee>
tag bersarang ini :Diuji di Microsoft Edge, meskipun dari apa yang saya baca IE juga harus tetap mendukung marque. Jelas tidak bekerja di Chrome.
Pengaturan
direction=up
akan menghemat 2 byte, tetapi melanggar aturan bahwa bola harus dimulai di bagian atas kanvas.sumber
direction
atribut.marquee
, itu cukup kreatif!TI-BASIC,
7170Terjemahan literal, saya tidak akan terkejut jika ada trik untuk membuatnya lebih kecil.
Layar 16x8 dan 1-diindeks sehingga konstanta berbeda.
~
adalah cara SourceCoder untuk menulis simbol negasi.Itu terlihat lebih halus pada perangkat keras.
sumber
Befunge, 209 byte
Ini mengasumsikan ukuran layar 80x25, tetapi Anda dapat dengan mudah mengubah rentang dengan mengganti
"O"
(79) pada baris terakhir dan*64
(24) pada baris terakhir kedua (perhatikan bahwa baris terakhir kedua dijalankan dari kanan ke kiri). Kecepatan juga dapat disesuaikan dengan mengganti"2"
(50) pada baris terakhir.sumber
Jawa,
184176 byteIni memanfaatkan Sequence Escape ANSI untuk memindahkan kursor, yang merupakan objek yang memantul di sekitar
85 x 25
tampilan terminal. Simpan dalam file bernamaA.java
.Tidak disatukan
Demo
sumber
Thread.sleep(50)
. Dan program golf dan ungolfed Anda tidak cocok.Clojure,
398380375 byte-18 byte dengan mengubah nama font menjadi string kosong ke default, inlining pemeriksaan batas, dan memperbaiki masalah batas bawah (yang dapat Anda lihat di GIF). Memperbaiki byte yang sebenarnya disimpan.
-5 byte dengan mengubah sintaksis penataan yang lebih ringkas dan menyusutkan bola dengan piksel.
Menggunakan Quil .
Saya mencoba beralih ke mode fungsional, tetapi membutuhkan banyak kode tambahan dan akhirnya menjadi lebih mahal.
(Catatan, versi baru tidak terpental di awal bagian bawah layar seperti di GIF.)
sumber
(+ 0 font-size)
di sana. Itu memalukan. Saya akan memperbaikinya di versi berikutnya. Haruskah saya menghemat 5 byte.Racket 247 byte
Tidak Terkumpul:
Keluaran:
sumber
Jelly, 37 byte
Dengan bantuan dari jawaban ini untuk mendapatkan loop dan karakter melarikan diri dengan benar. Saat ini memantul di sekitar layar 80x24, tetapi itu dapat dengan mudah dimodifikasi dalam kode.
Koordinat di setiap arah dapat direpresentasikan sebagai elemen dari dua daftar
[0, 1,..., 24, 23,..., 1]
dan[0, 1,..., 80, 79,..., 1]
, sebut sajaY
danX
, yang diulang tanpa batas. Pengulangan tanpa batas ini dapat ditiru menggunakan pengindeksan modular - menggunakanị
di Jelly. Contoh: dalami
iterasi bola berada di posisi(X[i%|X|], Y[i%|Y|]) = (iịY, iịX)
. Bola yang bergerak hanyalah kursor yang diletakkan pada posisinya dengan memancarkaniịY
garis daniịX
spasi baru.Demo
Penjelasan
sumber
SmileBASIC,
8574 bytePosisi bola dapat dimodelkan dengan 2 gelombang segitiga, dan cara terpendek yang dapat saya temukan untuk memproduksinya di SmileBASIC adalah arcsine (sinus (x)). (Algoritma menggunakan MOD lebih lama sejak SB menggunakan
MOD
bukan%
)sumber
CSS / HTML, 200 + 7 = 207 byte
Versi ini menunjukkan kepada Anda ukuran kanvas dan juga memberikan animasi nuansa yang lebih teranimasi:
Tampilkan cuplikan kode
sumber
Dyalog APL, 44 byte
Penjelasan:
{
...}⍨1 1
: panggil fungsi yang diberikan dengan ⍺ = ⍵ = 1 1⎕SM∘←0,G←⍺+⍵
: simpan⍺+⍵
diG
, tampilkan a0
di lokasi itu di⎕SM
jendela.⎕DL.1
: tunggu 1/10 detik⊃1 G∨.≥G⎕SD
: periksa apakahG
ada di⎕SM
batas jendela (1≥G
atauG≥⎕SD
,⎕SD
apakah s creen d imensions)1-2×
: peta[1,0]
ke[¯1,1]
, untuk membalikkan arah perjalanan⍵×
: kalikan arah perjalanan saat ini dengan ituG∇
: rekursi, misalkanG
menjadi lokasi baru (⍺
) dan⍵....
menjadi arah baru (⍵
).sumber
PHP,
1129794103102 bytememantulkan modal
O
pada kisi 40x25, mulai dari sudut kanan atas;mencetak 99 baris baru untuk menghapus layar.
Jalankan dengan
-nr
.A^K
=chr(10)
= baris baruA^a
=chr(32)
= spasisumber
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 salah pada 0 dan N dan membalikkan arah. Sayangnya kita harus init $ d dan $ e ke -1 tetapi masih mendapatkan penghematan.$x%79<=>.5
juga bekerja untuk byte yang sama.BASIC Simons (C64),
6665 byteSatu byte disimpan, terima kasih @ShaunBebbers.
Saya hanya perlu satu baris di sini, karena Simons 'Basic memiliki fungsi modulo.
Namun, ini membutuhkan C64 fisik dan modul BASIC Simons
(atau ekstensi BASIC lainnya yang memiliki
mod
fungsi).Ketikkan 69 karakter ini:
{CLR}
aku s PETSCII 147, yang membersihkan layar. Gunakan Shift + CLR / HOME untuk mengetiknya.bytecount
Ketika disimpan ke disk, dibutuhkan 65 byte, karena perintahnya tokenized:
for
,to
,poke
,abs
,next
dangoto
adalah salah satu byte setiap;mod
membutuhkan dua byte.Itu membuat 59 byte kode ditambah 4 byte untuk pointer dan 2 byte untuk nomor baris.
Untuk referensi, lihat Memetakan C64 dan mencari
$800
(BASIC Program Text).(Anda dapat menemukan Area Memori Layar Video di
$400
.)kerusakan
Program loop
I
dari 0 hingga 623 (= LCM 48 dan 78 minus 1). Dalam lingkaranI
dipetakan menjadi 39..0..38 masing-masing 24..0..23(seperti program aslinya).
Ketika loop selesai, program dimulai kembali dengan melompat ke baris 0.
C64 BASIC,
7776 byteSayangnya saya perlu dua baris, karena walaupun dengan semua singkatan yang mungkin akan membutuhkan 83 karakter - terlalu banyak untuk menggunakan editor baris C64:
(Sebuah hex editor dapat digunakan untuk membuat garis yang lebih panjang - yang akan membuatnya menjadi 73 byte.)
sumber
:
dan tidak;
goto
dalam versi dua-liner Anda, karenagoto
tanpa angka mengasumsikangoto 0
pada BASIC 2$0400
ke$07e7
; atau gunakan sprite. Menggunakan Kernal dengan$ffd2
(keluaran akumulator) akan bekerja karena Anda dapat mengatur posisi X dan Y pada kursor dengan cukup mudah (saya tidak ingat panggilan untuk itu), tetapi Anda mungkin harus menghindari posisi karakter terakhir jika itu memaksa umpan baris.Python 2,
176168 BytesIni mengasumsikan ukuran terminal 80x24. Jelas tidak optimal tapi saya baru bermain golf jadi ya.
Terima kasih kepada R. Kap untuk menyarankan x% 79 <1, bukan x <1 atau x> 79 dan juga untuk y.
sumber
x<1or x>78
denganx%79<0
dany<1or y>22
dengany%23<1
.Rebol / Lihat,
284266 byteTidak Terkumpul:
sumber
C 294 byte
Versi tidak disatukan:
Penjelasan
graphics.h
saya/usr/include
. Karena itu, saya mencari dan ini yang saya temukan. Ini adalah implementasi TurboC Graphics menggunakan SDL untuk Linux. Anda juga bisa menggunakan OpenGL. Di windows, saya kira itu sudah diinstal, tidak yakin tentang MacOS.void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);
menginisialisasi sistem dan menempatkannya dalam mode grafis, dalam hal ini driver grafis terdeteksi secara otomatis. Silakan merujuk ke tautan ini untuk lebih jelasnya.x
dany
merupakan koordinat yang menentukan posisi bola.a
danb
adalah flag,a
diatur ke nol ketikax
nilainya turun di bawah 60 danb
diatur ke nol saaty
turun di bawah 60.x
dany
melebihi nilai batas jendela, dan koordinat disesuaikan.usleep
agar CPU saya tidak stres.closegraph()
panggilan, untuk menutup jendela. Tapi itu hilang di sini.Harus dikompilasi dengan bendera tautan
-lgraph
Ini berjalan lebih lancar pada perangkat keras nyata. :)
sumber
graphics.h
. Jawaban ini askubuntu.com/questions/525051/… bermanfaat.MATL , 42 byte
Ini menggunakan layar dan karakter 70x16
O
. Jika Anda menunggu beberapa bouncing, Anda akan melihat bola memukul sudut.Coba di MATL Online!
Ukuran layar dapat dengan mudah dimodifikasi dalam kode. Bagian yang relevan adalah
8E70
, yang mendorong8
, menggandakannya, dan mendorong70
. Misalnya, untuk layar 80 × 25 ganti dengan5W80
, yang mendorong5
, kuadratkan, dan mendorong80
(atau mengganti dengan25 80
, tetapi itu membutuhkan satu byte lagi).Juga, menambahkan
tD
pada akhir kode menunjukkan posisi saat ini dalam waktu nyata (vertikal, kemudian horisontal,1 1
kiri atas). Sebagai contoh, untuk80×18
layar,Coba juga!
Penjelasan
Ini menggunakan infinite loop. Posisi disimpan di clipboard
H
sebagai vektor 1 × 2, dan arah disimpan di clipboardI
sebagai vektor 1 × 2 dengan entri1
atau-1
.Setiap iterasi membersihkan layar, mendefinisikan matriks ruang, menulis
O
pada posisi yang relevan, dan menampilkannya. Maka posisi dan pengarahan perlu diperbarui.Posisi
1
berbasis, dan dengan demikian tepi layar adalah1
dan ukuran layar maksimum. Jadi jika posisi ukuran layar modulo memberikan0
atau1
dalam komponen pertama atau kedua, yang berarti kita telah mencapai tepi vertikal atau horizontal masing-masing, komponen vektor arah dinegasikan. Setelah itu, arah baru ditambahkan ke posisi saat ini untuk mendapatkan posisi baru.sumber
Berikut daftar ZX Spectrum.
sumber
Kutukan C +, 190 byte
Penjelasan:
sumber
Lua ( LÖVE 2D ), 130 byte
Lua bukan bahasa terbaik dalam hal kode golf, tapi ini dia! Beberapa poin yang layak disebutkan:
Ukuran kanvas default adalah 800 x 600. Dapat diubah dalam file konfigurasi, tetapi saya tidak melihat batasan ukuran, jadi saya membiarkannya apa adanya.
love.draw()
adalah fungsi menggambar LÖVE dan memiliki nama yang telah ditentukan. Fungsi LÖVE alternatif yang dapat digunakan adalahlove.update(dt)
danlove.run()
- yang pertama lebih panjang, dalam byte, dan yang terakhir lebih pendek, ya, tetapi tanpa loop tak terbatas bawaan. Jadi,draw()
tampaknya menjadi taruhan terbaik kami di sini.Versi di atas digunakan
love.graphics.points
untuk menggambar bola. Meski lebih pendek, saya tidak yakin itu diizinkan. Berikut ini adalah GIF cara kerjanya:Seperti yang Anda lihat (atau mungkin tidak bisa), ada satu piksel bergerak di layar. Sementara itu menghemat byte, itu bukan hasil yang paling memuaskan.
Jadi saya telah membuat solusi alternatif 131 byte :
Yang ini menggunakan
love.graphics.print
- yang mencetak teks - dan0
sebagai bola, membuatnya jauh lebih terlihat dan menarik.sumber
CHIP-8,
363428 byteTidak ada trik mewah di sini ...
Membutuhkan juru bahasa yang menggambar sprite dengan benar (hanya satu sprite yang dapat ditarik per frame, yang memperlambat program sehingga Anda bisa melihatnya).
Video berkualitas rendah
sumber
ZX Spectrum BASIC - 179 byte
Ini dia hanya kental sedikit. Ini 179 byte dengan grafik bola disertakan
sumber
o
atauO
Anda mungkin dapat menyimpan beberapa byte dalam daftar simbolis; Anda juga dapat mengedit jawaban sebelumnya ketika Anda memiliki solusi yang lebih baik, daripada menjawab ulang pertanyaan yang sama