Tulis program yang menampilkan bola ASCII bergerak *
di dalam persegi panjang (20 dengan 10 karakter termasuk perbatasan). Bola tidak boleh melewati kotak, misalnya menabrak ketika menyentuh dinding. Adegan harus dibersihkan dan digambar ulang setiap 0,1 detik dan bola harus menggerakkan 1 karakter dalam arah x dan y setiap frame. Program terpendek yang ditulis dalam bahasa apa pun menang.
Contoh output (frame 1)
+------------------+
|* |
| |
| |
| |
| |
| |
| |
| |
+------------------+
Contoh output (bingkai 2)
+------------------+
| |
| * |
| |
| |
| |
| |
| |
| |
+------------------+
Contoh output (frame 8)
+------------------+
| |
| |
| |
| |
| |
| |
| |
| * |
+------------------+
Contoh output (frame 9)
+------------------+
| |
| |
| |
| |
| |
| |
| * |
| |
+------------------+
1080x1920
resolusi :)Jawaban:
Ruby 1.9, 115 karakter
Logika Gerakan ini sangat mirip dengan Danko 's jawaban .
Versi ini telah diuji di Linux saja.
sumber
puts"\e[2J"
cukup cetak←[2J
(dan baris baru) di layar.cls
tidak bekerja untuk saya, tetapisystem ("cls")
tidak.Powershell, 144 karakter
Berdasarkan jawaban Joey yang luar biasa , menggunakan fakta bahwa koordinat bola adalah fungsi dari frame index (i), jadi jika Anda memiliki sesuatu seperti
x=n-abs(n-(i mod (2*n)))
, x akan berubah dari 0 ke n, kembali ke 0, dan seterusnya ...sumber
if(-1,18-eq$x){$a*=-1;$x+=2*$a}if(-1,8-eq$y){$b*=-1;$y+=2*$b}
yang menggantikan empatif
s sebelumnya ;-). Tapi saya yakin harus ada formula.Python 2, 234
Saya yakin ini bisa bermain golf lebih banyak, tetapi saya harus pergi jadi inilah yang saya miliki. akan bekerja lebih banyak lagi nanti
Catatan: berfungsi pada konsol perintah Windows. Sistem operasi lain mungkin menggunakan perintah yang berbeda dari
cls
untuk membersihkan layar, seperticlear
sumber
print "\e[H\e[2J"
berfungsi di windows?Ruby (
179174147)EDIT menghilangkan beberapa karakter lagi:
EDIT mencukur beberapa karakter, sekarang 174:
Tidak Disatukan:
sumber
sleep .1
bekerja juga?SyntaxError: (irb):1: no .<digit> floating literal anymore; put 0 before dot
. Tapi saya akan kembali ke itu jika saya membutuhkannya di masa depan, terima kasih!?*
alih-alih'*'
, dll.←[2J←[f+------------------+
sebagai baris pertama.$> << "\e[2J\e[f"+f
ke'cls';$><<f
(gunakan backticks untukcls
)JavaScript (275
283)Demo: http://jsfiddle.net/eKcfu/2/
Saya menulis ini dengan cukup cepat jadi saya yakin masih ada sedikit ruang untuk perbaikan. Saran dipersilahkan :)
Sunting 1 : Hapus panggilan fungsi terpisah yang tidak perlu, sematkan langsung di
setInterval
.sumber
Haskell, 212 karakter
Gunakan pendekatan yang lebih fungsional untuk menghitung koordinat, dengan membuat urutan tak terbatas untuk masing-masing koordinat secara terpisah dan kemudian mengikatnya bersama-sama (baris 2 dan 3). Sisanya menggambar kode.
sumber
PowerShell, 184
185215Hanya semi-golf karena otak saya tidak berfungsi dengan baik ketika saya sakit ...
Tapi ada beberapa trik bagus di dalamnya.
[Sunting]: Looping di atas lapangan jauh lebih pendek.
sumber
QBasic (QB64),
178173 byte-5 byte berkat DLosc
sumber
DO ... LOOP
di tempatWHILE 1 ... WEND
dan menyimpan 5 byte.Perl 5, 141 karakter
Tidak mulai di sudut kiri atas seperti contoh output, tetapi itu tidak dinyatakan sebagai persyaratan.
sumber
Ruby 1.9, 162 karakter
35 karakter malu dengan jawaban @ Ventero, tapi saya terkesan bahwa saya bisa turun sejauh ini sambil masih menggunakan pendekatan yang relatif mudah ke logika yang sebenarnya. ^ [Adalah ESC literal (1 char).
sumber
R, 233 karakter
sumber
Entri bash lain -
213204 karakterSebenarnya bukan pemenang hadiah, tapi tetap saja menyenangkan. Ini menggunakan urutan char vt100 untuk gambar. (kode yang dilaporkan di sini menggunakan 215 karakter untuk dibaca, 2 karakter dapat dihapus dengan melarikan diri, misalnya '*' -> \ *
sumber
Powershell, 139 byte
Terinspirasi oleh jawaban Danko Durbić .
Script ini menggunakan
-replace
operator untuk menggambar*
di dalam persegi panjang.Lebih sedikit skrip golf untuk menjelaskan cara kerjanya:
sumber
Bash 278
300, 296\ E di baris
echo -e "\e[$2;$1H$3"
dapat diproduksi olehuntuk menggantinya. Sebagai biner 0x1b, 3 karakter lebih pendek; Saya menghitung hanya 1 untuk "\ e", karena hanya perangkat lunak tata letak yang memaksa saya untuk menggunakannya
\e
.sumber
$
simbol di dalamnya((...))
dan menggantix=$(($x+$p))
dengan((x+=p))
dan juga pada baris berikut. (Mereka juga menyarankan penggunaan\e
untuk karakter pelarian).\*
mungkin berfungsi sebagai pengganti"*"
.1,337
perlu dikunci secara permanen di tempat: PTI Basic,
169167 byteSangat lambat, tapi berhasil.
sumber
(X=20)→S
dapat(X=20→S
, dan Anda dapat mengambil keuntungan dari Ans untuk menyimpan beberapa byte di akhir For (loop. Saya positif baris 8 dan 9 dapat golf, tapi saya tidak yakin bagaimana saat ini."| \ Output(O,1,Ans \ Output(O,20,Ans
harus bekerja.Ans
adalah token satu byte , diketik dengan2nd
(-)
. Itu akhirnya akan menghemat satu byte, karena|
tokennya dua byte pada kalkulator.PHP,
196 186148 byteSaya menghapus menghindari integer overflow untuk menghemat 6 byte. Itu akan berjalan selama 29 miliar tahun sebelum meluap; masih 6,8 tahun pada sistem 32 bit. Saya katakan itu bisa diterima.
Menghitung posisi alih-alih menyesuaikannya banyak menghemat, menyiapkan templat lengkap sekaligus lot lain.
Jalankan dengan
-nr
. Membutuhkan PHP 7.1.kerusakan :
sumber