Tantangan ini terinspirasi dari jawaban ini di Ask Ubuntu Stack Exchange.
Intro
Ingat screensaver Windows ME dengan pipanya ? Saatnya mengembalikan nostalgia!
Tantangan
Anda harus menulis program atau fungsi yang akan menampilkan representasi ASCII dari screensaver. Di screensaver harus ada satu pipa yang akan tumbuh ke arah semi-acak.
Awal pipa akan ditempatkan secara acak di salah satu perbatasan layar dan potongan pipa harus tegak lurus terhadap perbatasan (sudut pertama-pipa bisa horisontal atau vertikal). Setiap tik pipa akan tumbuh ke arah yang dihadapinya (horizontal / vertikal) pada 80%
kesempatan atau mengambil sudut pada 20%
kesempatan.
Representasi pipa
Untuk membuat pipa, 6 karakter unicode akan digunakan
─ \u2500 horizontal pipe
│ \u2502 vertical pipe
┌ \u250C upper left corner pipe
┐ \u2510 upper right corner pipe
└ \u2514 lower left corner pipe
┘ \u2518 lower right corner pipe
Memasukkan
Program / fungsi akan mengambil 3 nilai input, yang dapat dikumpulkan melalui parameter fungsi atau diminta kepada pengguna.
- Jumlah kutu
- Lebar layar
- Tinggi layar
Jumlah kutu
Untuk setiap centang, sepotong pipa akan ditambahkan ke layar. Pipa akan menimpa potongan pipa lama jika mereka bertelur pada posisi yang sama.
Misalnya, ambil layar berukuran 3x3
ticks == 3
─┐
┘
ticks == 4
─┐
└┘
ticks == 5
│┐
└┘
Setiap kali pipa keluar dari layar, seperti pada contoh terakhir di 5 ticks, maka pipa baru akan muncul di perbatasan acak. Sebagai contoh:
ticks == 6
│┐
└┘
─
Pipa baru harus memiliki peluang 50% untuk horisontal atau vertikal.
Lebar layar / tinggi
Lebar dan tinggi layar dapat digabungkan menjadi satu nilai jika itu lebih disukai dalam bahasa pilihan Anda. Lebar dan tinggi layar akan selalu memiliki nilai minimum 1 dan nilai maksimum 255. Jika bahasa pilihan Anda mendukung layar konsol atau output yang lebih kecil dari karakter grid 255x255 maka Anda dapat mengasumsikan bahwa lebar dan tinggi akan jangan pernah melebihi batas konsol Anda. (Contoh: Jendela Windows 80x25 cmd)
Keluaran
Output dari program / fungsi Anda harus dicetak ke layar, atau dikembalikan dari suatu fungsi. Untuk setiap proses program Anda, set pipa yang berbeda harus dihasilkan.
Uji kasus
Kasus uji berikut adalah contoh acak dari output yang valid
f(4, 3, 3)
│
─┘
│
f(5, 3, 3)
│
─┘┌
│
f(6, 3, 3)
─│
─┘┌
│
f(7, 3, 3)
──
─┘┌
│
Jelas, semakin banyak kutu yang terjadi, semakin sulit untuk membuktikan validitas program Anda. Karenanya, memposting gif dari output Anda yang berjalan akan lebih disukai. Jika ini tidak memungkinkan, silakan kirim versi kode Anda yang mencakup pencetakan output. Jelas, ini tidak akan dihitung dalam skor Anda.
Aturan
- Ini adalah kode-golf , jumlah byte terpendek yang menang
- Celah standar berlaku
- Jika Anda menggunakan karakter pipa unicode dalam kode sumber Anda, Anda dapat menghitungnya sebagai satu byte
Ini adalah tantangan yang cukup sulit yang mungkin dapat dipecahkan dengan banyak cara kreatif, Anda didorong untuk menulis jawaban dalam bahasa yang lebih verbal meskipun sudah ada jawaban dalam esolang pendek. Ini akan membuat katalog jawaban terpendek per bahasa. Bonus upvotes untuk gif berwarna mewah;)
Selamat bermain golf!
Penafian: Saya sadar bahwa karakter Unicode bukan ASCII, tetapi karena tidak memiliki nama yang lebih baik, saya hanya menyebutnya sebagai seni ASCII. Saran dipersilahkan :)
ascii-art
bukangraphical-output
- referensiJawaban:
JavaScript (ES6), 264
266 274 281Menghitung karakter gambar unicode masing-masing 1 byte. (Seperti yang ditentukan oleh OP)
Kurang golf
Tes animasi
Catatan: mencoba menjaga waktu animasi di bawah 30 detik, lebih tebal membuat laju animasi lebih cepat
sumber
Tidak ada yang mengatakan nostalgia seperti ...
QBasic, 332 byte
QBasic adalah bahasa yang tepat untuk tugas tersebut karena:
LOCATE
memungkinkan Anda mencetak ke lokasi mana pun di layar, menimpa apa yang ada sebelumnyaSpesifik
Ini QBasic golf, ditulis dan diuji pada QB64 dengan autoformatting dimatikan. Jika Anda mengetik / menempelkannya ke IDE QBasic yang sebenarnya, itu akan menambah banyak ruang dan memperluas
?
kePRINT
, tetapi harus dijalankan persis sama.Program memasukkan tiga nilai yang dipisahkan koma: kutu, lebar, dan tinggi. Kemudian meminta benih nomor acak. (Jika perilaku ini tidak dapat diterima, ubah baris kedua menjadi
RANDOMIZE TIMER
+6 byte.) Akhirnya, ia menarik pipa ke layar.Dimensi maksimum yang bisa dimasukkan adalah 80 (lebar) kali 25 (tinggi). Memberikan ketinggian 25 akan menghasilkan baris bawah terputus ketika QBasic mengatakan "Tekan tombol apa saja untuk melanjutkan."
Bagaimana?
TL; DR: Banyak matematika.
Baris dan kolom saat ini adalah
r
danc
; arah saat inid
dan arah sebelumnya adalahb
. Nilai arah 0-3 turun, kanan, atas, kiri. Aritmatika menerjemahkannya ke dalam nilai langkah yang benar untukr
danc
, serta koordinat tepi yang benar untuk memulai.Karakter kotak menggambar
│┐└─┘┌
adalah titik kode 179, 191, 192, 196, 217, dan 218 di QBasic. Itu tampak sangat acak, tetapi masih menggunakan lebih sedikit karakter untuk menghasilkan angka dengan beberapa (cukup berbelit-belit, saya-tidak-yakin-bahkan-saya-mengerti-itu) matematika daripada melakukan banyak pernyataan kondisional.Kode untuk mengubah arah menghasilkan angka acak antara -0,125 dan 1,125 dan mengambil dasarnya. Ini memberikan
-1
10% dari waktu,0
80% dari waktu, dan1
10% dari waktu. Kami kemudian menambahkan ini ke nilai saat inid
, mod 4. Menambahkan 0 menjaga arah saat ini; menambahkan +/- 1 berbelok.Adapun aliran kontrol,
WHILE t ... WEND
adalah loop utama; bagian sebelumnya, dimulai dengan nomor baris1
(1b=INT(RND*4)
), restart pipa di tepi acak. Kapan sajar
dan dic
luar jendela, kitaGOTO 1
.Tunjukkan pada saya GIF!
Ini dia:
Ini dihasilkan oleh versi yang agak tidak disunat dengan animasi, warna, dan seed acak otomatis:
sumber
Python 2.7,
624616569548552 byteParameter pertama adalah seed, seed yang sama akan menghasilkan output yang sama, mencetak setiap langkah dengan jeda 500 ms.
ganti itu
Contoh dijalankan
akan menampilkan
versi verbose
sumber
if x*y<0 or
.0.5
dapat dikurangi menjadi.5
.import *
bisa jadiimport*
.''.join(k) for
memiliki ruang putih yang tidak berguna. Anda juga harus bisa menyimpandict
dalam variabel dan memanggilnya setiap kali Anda menggunakannya. Belum diuji berapa banyak ini menghemat, tetapi dengan menyimpandict(zip(a,b))
dalam lambda yang melakukan pekerjaan untuk dua string (a, b), itu harus memotong beberapa. +1.C (GCC / linux),
402353352302300298296288 byteKredit untuk edc65 untuk menyimpan arah dalam satu nomor 4-bit.
Membaca lebar / tinggi pada stdin sebelum menggulung screensaver selamanya. Misalnya:
Atau untuk screensaver layar penuh:
Untuk keterbacaan saya menambahkan baris baru. Membutuhkan mesin linux dengan terminal yang menghormati kode ANSI. Memiliki warna! Jika Anda menghapus dukungan warna harganya lebih murah 17 byte.
sumber
Ruby,
413403396 byteFungsi yang mengambil sejumlah kutu dan lebar sebagai input dan mengembalikan layar akhir sebagai string. Tidak diragukan lagi bisa bermain golf lebih banyak.
Lihat di repl.it: https://repl.it/Db5h/4
Untuk melihatnya beraksi, masukkan berikut ini setelah baris yang dimulai
b[n*w+n+m]=
:... kemudian tetapkan lambda ke variabel eg
pipes=->...
dan beri nama sepertipipes[100,20]
(untuk 100 ticks dan layar 20x20).Tidak dikelompokkan & penjelasan
sumber