Tantangan
Kita semua tahu tentang pohon Natal yang normal - tetapi bagaimana dengan pohon Natal yang terbalik ! Ini adalah tantangan bertema Natal yang cukup mudah. Tujuan dari tantangan ini adalah menjadikan saya pohon Natal terbalik ASCII. Berikut adalah aturan untuk tantangan ini:
- Terima bilangan bulat ganjil dan positif. Anda dapat menganggap itu akan selalu antara
7
dan51
. Pangkal pohon akan dibuat dari karakter:
___ \ / |
Bagian atas pohon (bintang), akan terdiri dari satu
*
.Setiap baris pohon akan dibangun menggunakan format di
<?>
mana?
sejumlah-
s. Misalnya, jika membuat garis panjang5
, garis itu seharusnya<--->
. Atau jika membuat garis panjang8
, garis itu seharusnya<------>
.Inilah bagaimana tubuh pohon seharusnya dibangun:
Ambil angka ganjil yang
n
diberikan sebagai input, dan buat garis pohon sepanjang itu.Kurangi
4
darin
dan membuat garis pohon yang panjang.Kurangi
2
darin
dan membuat garis pohon yang panjang.Pengurangan
n
oleh2
. Setelah itu, kecualin
sama dengan5
, kembali ke langkah 2.
Basis (lihat langkah 2.) bintang (lihat langkah 3.) dan setiap baris pohon (lihat langkah 4. dan 5.) semuanya harus dipusatkan menggunakan input nomor ganjil asli (lihat langkah 1.) sebagai maksimum lebar.
Contoh / Kasus Uji
odd number inputed: 7
___
\ /
|
<-----> line length -> 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 13
___
\ /
|
<-----------> line length -> 13
<-------> line length -> 13 - 4 = 9
<---------> line length -> 13 - 2 = 11
<-----> line length -> 11 - 4 = 7
<-------> line length -> 11 - 2 = 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 9
___
\ /
|
<-------> line length -> 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 17
___
\ /
|
<---------------> line length -> 17
<-----------> line length -> 17 - 4 = 13
<-------------> line length -> 17 - 2 = 15
<---------> line length -> 15 - 4 = 11
<-----------> line length -> 15 - 2 = 13
<-------> line length -> 13 - 4 = 9
<---------> line length -> 13 - 2 = 11
<-----> line length -> 11 - 4 = 7
<-------> line length -> 11 - 2 = 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
Aturan
- Celah standar berlaku .
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang!
repeat the above steps until the odd number minus 2 equals 5
- pada input pertama, angka ganjil adalah 7, dan 7-2 = 5, oleh karena itu pohon harus berakhir secara instan (saya tahu apa yang Anda maksud, tetapi perlu7
, input minimum, pertama - tama Anda harus membuat tiga garis pohon (sub-langkah .1.1, .1.2, .1.3), kemudian kurangi2
dari angka ganjil dan uji jika jumlahnya sama5
. Instruksi untuk memeriksa apakah "angka ganjil minus 2 sama dengan 5" adalah pada akhirnya, tiga langkah lainnya harus dilakukan terlebih dahulu. Tetapi untuk menjawab komentar pertama Anda, itu akan baik-baik saja.7
sebagai input atau jika Anda dapat menerima4
, seperti pada nomor ganjil keempat (atau3
jika itu 0-diindeks).Jawaban:
Python 3 ,
12712110510310098 byteIni adalah fungsi lambda tanpa nama yang mengembalikan daftar baris:
Cobalah online!
Bagian utama dari jawaban ini adalah
(o-i+2-i%2*3)
, yang menghitung jumlah tanda hubung yang harus dimiliki pada sebuah garis. Sisa jawabannya hanyalah dengan mengubahnya menjadi ASCII-art yang diinginkan.Terima kasih banyak kepada Tn. Xcoder , karena mencukur 6 byte, dan mendiskusikan golf dengan saya dalam obrolan.
Terima kasih juga kepada Lynn untuk memperhatikan hal
3*(i%2)
itui%2*3
, 2 byte lebih pendek!sumber
f
-stringso-i+2-i%2*3
menghemat dua byte.C, 163 byte
Cobalah online!
Belum dibuka:
sumber
Proton , 83 byte
Terima kasih kepada FlipTack untuk menyimpan 4 byte, dan untuk berkolaborasi dalam obrolan (kami benar-benar membentuk tim yang hebat). Secara tidak langsung menyimpan 2 byte berkat Lynn .
Cobalah online!
sumber
Arang , 28 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Cetak alasnya.
Ulangi dari setengah jumlah input menjadi 1.
Cetak dua baris, yang pertama dengan satu lebih
-
dari indeks lingkaran, yang kedua dengan yang lebih sedikit.Cermin untuk menyelesaikan pohon.
Tempatkan bintang.
sumber
SOGL V0.12 ,
3530 byteCoba Di Sini!
Menggunakan algoritma Arang Neil , mengambil input sebagai indeks dalam angka ganjil - jadi 13 akan sesuai dengan input 7
sumber
Retina , 89 byte
Cobalah online! Penjelasan: Tahap pertama mengubah input menjadi unary dan menambahkan a
>
. Tahap kedua menggantikan dua-
s dengan<
untuk memperbaiki panjang garis. Tahap ketiga kemudian mereplikasi cabang tetapi sedikit lebih pendek setiap kali sampai cabang tidak dapat dipersingkat lebih jauh. Tahap akhir menambahkan basis dan bintang.sumber
Javascript 506 byte
Versi golf:
Versi ungolf:
Pemakaian:
console.log(tree(13)), console.log(tree(17)),
ES6 165 byte (dari teman saya)
Versi golf:
Versi ungolf:
Pemakaian:
p(31); p(17);
sumber
const
kata kunci, dllPowerShell , 131 byte
Cobalah online!
Nah, ini adalah kekacauan yang tepat bagi siapa pun yang tidak fasih dalam PowerShell ... jadi, mari kita lihat seberapa baik saya bisa menjelaskan cara kerjanya.
Untuk penjelasannya, saya akan menggunakan
input = 17
.Kami memulai cukup sederhana, dengan mengatur variabel pembantu
$i=2
dan pengaturan$x
ke<something>
, dengan<something>
mulai sebagai rentang dari input$args
ke bawah5
, jadi17,16,15,...,6,5
. Kisaran itu dipompa ke dalam for loop.Setiap iterasi, kita mulai dengan menetapkan variabel pembantu
$j
untuk menjadi hasilif
pernyataanif($_%2){$i-2}else{($i++)}
,. Jika aneh$j=$i-2
,, sebaliknya$j=($i++)
. Ini, ditambah dengan$i=2
pada awalnya, memberi kita urutan0, 2, 1, 3, 2, 4, 3, 5...
yang kebetulan berhubungan persis dengan berapa banyak ruang yang kita butuhkan untuk dipertukarkan dengan garis pohon kita. ;-) Kami mengambil' '
dan mengalikannya dengan angka itu.Selanjutnya kita perlu cabang kita. Ini dilakukan dengan
'<'
ditambah bagian tengah'-'
dikalikan, ditambah bagian akhirnya'>'
. Perkalian dilakukan dengan mengenali bahwa-
alternatif dalam suatu2, 5, 2, 5, 2...
pola berdasarkan pada nomor input$_
, jadi kami memilih dari pseudo-ternary berdasarkan pada pola itu.Untuk klarifikasi lebih lanjut, berikut adalah istilah pasangan pertama di setiap bagian:
Jadi sekarang kita telah menetapkan
$x
untuk menjadi array cabang (yaitu, string). Di luar loop, kita sekarang membangun "atas" pohon kami dengan jumlah ruang yang tepat disimpan$y
, kemudian menampilkan cabang kami$x
, dan kemudian pohon "bawah" dengan*
. Masing-masing dibiarkan di jalur pipa dan hasilnya tersirat dengan baris baru di antara item.sumber
JavaScript (ES6),
150147 byteTampilkan cuplikan kode
sumber
Kanvas , 28 byte
Coba di sini!
Port jawaban SOGL saya yang merupakan port jawaban Neil's Charcoal.
sumber
Usaha saya di JS ESGoogoltriplex.
Tampilkan cuplikan kode
sumber