Dengan bilangan bulat positif N ("viralitas"), program Anda harus membuat gambar seni ASCII dari pohon dengan dua cabang panjang N memanjang ke bawah dan / atau ke kanan dari sudut kiri atas.
Arah yang diambil oleh masing-masing cabang setelah tanda bintang pertama dapat berupa ke kanan atau ke bawah, dan pilihan ini harus dibuat secara acak 1 pada setiap langkah berikutnya.
Misalnya, diberi input 5, output mungkin terlihat seperti:
***
* ***
**
**
Dua cabang diizinkan untuk menyentuh (berada di sel yang berdekatan), tetapi tidak tumpang tindih (berada di sel yang sama), sehingga hal berikut tidak akan diizinkan:
***
* *
*****
*
*
Contohnya
Untuk input 1
, satu-satunya output yang mungkin adalah:
**
*
(Ini akan hadir di semua output yang valid, karena memiliki dua cabang mengambil jalur yang sama akan menyebabkan mereka tumpang tindih.)
Output yang mungkin untuk input 3
meliputi:
***
* *
**
**
***
*
*
Untuk input 7
:
****
* **
* **
*
***
*
Untuk input 10
:
****
* *
*********
*
*****
Ini adalah kode-golf , sehingga jawaban terpendek yang valid (dalam byte) menang.
1. Ini harus acak seragam (yaitu peluang 50/50 dari setiap arah), atau sedekat mungkin dengan acak seragam yang bisa Anda dapatkan pada perangkat keras normal.
0
s dan1
s bukannya spasi dan tanda bintang?Jawaban:
CJam ,
5851 byteCobalah online!
Ide dasarnya adalah bahwa kita mulai dengan
[0 0]
dan kemudian berulang kali menambahkan 0 atau 1 untuk setiap elemen (memastikan bahwa mereka tidak pernah sama kecuali pada awal untuk menghindari tumpang tindih), mengumpulkan semua hasil antara.Kami kemudian membuat array array besar di mana setiap subarray berisi
*
indeks yang diberikan oleh pasangan yang sesuai dalam array asli dan spasi di tempat lain.Ini menghasilkan irisan diagonal dari matriks output (di mana bergerak kiri ke kanan sesuai dengan bergerak kanan atas ke kiri bawah dalam matriks aktual).
Kita kemudian dapat menggunakan
::a:.+
untuk "mendeagonisasi" dan mendapatkan baris yang dihasilkan:sumber
Arang ,
3124 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Awalnya saya pikir akan lebih mudah untuk membuat langkah pertama secara acak tetapi ternyata menjadi golfier untuk membuat cabang pertama dapat diprediksi. Penjelasan:
Ulangi dua kali, menggunakan variabel indeks
i
. (Ini sebenarnya berulang di atas daftar implisit, jadi aman untuk bermutasii
di dalam loop.)Langsung ke asal kanvas.
N+1
Waktu loop .Cetak a
*
, tetapi biarkan kursor berada di kanan atau di bawah kursor tergantung pada nilaii
.Acak nilai
i
untuk iterasi loop berikutnya.Jika karakter saat ini adalah
*
, ini berarti bahwa kami adalah cabang kedua dan kami turun bukannya kanan, jadi naik ke kanan untuk memperbaikinya. (Cabang pertama selalu dimulai ke bawah sehingga cabang kedua akan selalu di atasnya, artinya kita hanya perlu memeriksa tabrakan vertikal.)sumber
N
cabang tidak berukuran, tetapiN-1
berukuran :)Java 10,
273272268239 byteCobalah online di sini .
Terima kasih kepada Kevin Cruijssen untuk bermain golf 29 byte.
Versi tidak disatukan:
sumber
do{}
bit (dan menempatkan ints di bagian pertama for-loop). PS: Dalam jawaban awal Anda0.5
bisa.5
juga diPerl 5 ,
208124122118 byte118 byte tanpa baris baru, lekukan dan komentar. Mengambil N dari stdin:
Cobalah online!
sumber
2..$N
menjadi1..shift
sekarang dan juga mencukur beberapa byte.<>
dan memasukkan bukanshift
dan argumen serta memesan ulang Anda meneleponrand
untuk menghindari parens. Anda seharusnya tidak perlu membungkus tugas Anda@o
juga. Saya mencoba menggunakan@b=([],[]);
yang tampaknya berfungsi, tetapi saya tidak bereksperimen terlalu banyak sehingga saya mungkin telah melewatkan kasus tepi di sana. Semoga mereka bisa membantu sedikit!Python 2 , 204 byte
Cobalah online!
sumber
Perl 5
-a
,97969392 byteTidak memiliki bias diagonal kanan atau bawah.
Cobalah online!
sumber
PHP, 118 byte
membutuhkan PHP 5.4 atau yang lebih baru untuk operator Elvis. Ganti
?:
dengan?1:
untuk PHP yang lebih lama.Jalankan sebagai pipa dengan
-nR
atau coba online .sumber
$argBak=$argn=
$argn
. Dalam lingkungan nyata,$argn
berasal dari STDIN jika Anda menjalankannya dengan pipa-R
. Ini kemudian akan mengeksekusi kode untuk setiap baris input (tapi saya cukup yakin PHP tidak menghapus variabel di antara; jadi berturut-turut eksplisit berjalan lebih mungkin untuk menghindari kejutan buruk.)Merah ,
195.190byteCobalah online!
Dapat dibaca:
sumber
Jelly ,
504341 byteCobalah online!
Ini sangat menyenangkan untuk ditulis. Mungkin ada beberapa metode yang jauh lebih optimal. Mungkin ada beberapa golf yang bisa dilakukan dalam metode ini juga.
Tepat setelah saya diposting ini saya menyadari bahwa saya bisa menggunakan
,þ`
bukanaþ,""oþ`Ɗ
.sumber
R ,
148142 byteCobalah online!
Selain itu, meskipun tidak memenuhi spesifikasi output, Anda dapat membedakan dua cabang: Coba online!
Penjelasan:
Mulai dari indeks
1
, kami secara acak memilih gerakan kanan atau kiri untuk cabangr
dengan menambahkann
atau1
, masing-masing. Kemudian kita pilih gerakan kanan atau kiri untuk cabangk
, dan jika akan memotong arahr
, kita pilih arah yang lain. Kemudian kami menggunakanr
dank
sebagai indeks ke dalamm
, mengatur nilai-nilai tersebut sebagai"*"
. Berulangn-1
kali, kami kemudian mencetak hasilnya.sumber
Jelly ,
3938 byteCobalah online!
Meskipun tampaknya tidak berhubungan,
d
berguna di sini untuk menyimpan byte (lebih dari pendekatan saya sebelumnya).sumber
Python 2 ,
191187176 byteCobalah online!
Python memiliki dukungan asli untuk bilangan kompleks formulir
a+bj
; ini membuat beberapa masalah 2-D sedikit lebih mudah dikerjakan ...sumber