Pertimbangkan segitiga sama sisi standar, dengan simpul yang berlabel menggunakan koordinat barycentric :
Kita dapat mengubah segitiga 3 simpul ini menjadi segitiga 6 simpul dengan menambahkan baris baru 3 simpul (satu lagi dari yang ada di sisi segitiga 3 simpul asli), menghilangkan tepi internal (tetapi bukan simpul internal) dan kembali menormalkan koordinat:
Mengulangi proses untuk pergi dari segitiga 6 simpul ke segitiga 10 simpul, tambahkan garis 4 simpul (sekali lagi, satu lagi dari yang ada di sisi segitiga 6 simpul yang asli), hapus setiap tepi internal (tetapi bukan simpul internal ) dan menormalkan kembali koordinat:
Proses ini dapat diulang tanpa batas. Tujuan dari tantangan ini adalah memberikan bilangan bulat yang N
menunjukkan berapa kali proses ini telah dilakukan, menampilkan semua node untuk segitiga terkait dalam koordinat barycentric.
Memasukkan
Program / fungsi Anda harus memasukkan bilangan bulat non-negatif tunggal yang N
menunjukkan berapa kali proses ini telah diterapkan. Perhatikan bahwa untuk N=0
, Anda harus menampilkan segitiga asli dengan 3 node.
Input dapat berasal dari sumber apa pun (parameter fungsi, stdio, dll.).
Keluaran
Program / fungsi Anda harus menampilkan semua node dalam koordinat barycentric yang dinormalisasi. Urutan node tidak masalah. Suatu angka dapat ditentukan sebagai fraksi (pengurangan fraksi tidak diperlukan) atau angka floating point. Anda juga dapat menampilkan vektor "skala" untuk menentukan suatu simpul. Misalnya, ketiga output berikut ini setara dan diizinkan:
0.5,0.5,0
1/2,2/4,0
[1,1,0]/2
Jika menggunakan output floating point, output Anda harus akurat hingga dalam 1%. Outputnya dapat berupa sink yang diinginkan (stdio, nilai balik, parameter balik, dll.). Perhatikan bahwa meskipun koordinat barycentric secara unik ditentukan oleh hanya 2 angka per node, Anda harus mengeluarkan semua 3 angka per node.
Contohnya
Contoh kasus diformat sebagai:
N
x0,y0,z0
x1,y1,z1
x2,y2,z2
...
di mana baris pertama adalah input N
, dan semua baris berikut membentuk simpul x,y,z
yang harus di output tepat sekali. Semua angka diberikan sebagai perkiraan angka floating point.
0
1,0,0
0,1,0
0,0,1
1
1,0,0
0,1,0
0,0,1
0.5,0,0.5
0.5,0.5,0
0,0.5,0.5
2
1,0,0
0,1,0
0,0,1
0.667,0,0.333
0.667,0.333,0
0.333,0,0.667
0.333,0.333,0.333
0.333,0.667,0
0,0.333,0.667
0,0.667,0.333
3
1,0,0
0.75,0,0.25
0.75,0.25,0
0.5,0,0.5
0.5,0.25,0.25
0.5,0.5,0
0.25,0,0.75
0.25,0.25,0.5
0.25,0.5,0.25
0.25,0.75,0
0,0,1
0,0.25,0.75
0,0.5,0.5
0,0.75,0.25
0,1,0
Mencetak gol
Ini adalah kode golf; kode terpendek dalam byte menang. Celah standar berlaku. Anda dapat menggunakan built-in yang diinginkan.
[1,2,3]/6
?Jawaban:
CJam (22 byte)
Ini adalah blok anonim (fungsi) yang mengambil
N
stack dan meninggalkan array array ganda pada stack. Demo onlinePembedahan
sumber
Haskell, 53 byte
sumber
Python 3, 87 byte
Ini sebenarnya seharusnya menjadi komentar untuk solusi oleh TheBikingViking tetapi saya tidak memiliki reputasi yang cukup untuk komentar.
Satu dapat menyimpan beberapa byte dengan hanya mengulangi variabel
i,j
dan menggunakan fakta bahwa dengan yang ketiga ditambahkann+1
.sumber
Mathematica,
4443 byteIni adalah fungsi tanpa nama yang mengambil argumen integer tunggal. Output adalah daftar daftar fraksi yang tepat (dikurangi).
Menghasilkan semua 3-tupel kelipatan
1/(N+1)
antara 0 dan 1, inklusif, dan kemudian memilih mereka yang jumlahnya adalah 1 (seperti yang dipersyaratkan oleh koordinat barycentric).sumber
05AB1E , 10 byte
Penjelasan
Cobalah online
sumber
¤
mengkonsumsi array, mengapa/
membagi array dengan itu? Apakah itu "mengingat" nilai terakhir yang muncul dan menggunakannya jika diperlukan?¤
adalah salah satu dari beberapa perintah yang tidak muncul dan dikonsumsi dari tumpukan. Ini mendorong elemen terakhir dari daftar sambil meninggalkan daftar di tumpukan.MATL , 17 byte
Cobalah online!
Penjelasan
Pendekatannya sama dengan jawaban lainnya:
[0, 1/(n+1), 2/(n+1), ..., 1]
, di manan
inputnya;1
.Lebih spesifik:
sumber
Ubur-ubur ,
3733 byteTerima kasih kepada Zgarb karena telah menghemat 4 byte.
Cobalah online!
Seperti jawaban Mathematica dan CJam Peter saya, ini menghasilkan satu set kandidat tupel dan kemudian hanya memilih yang jumlahnya 1. Saya belum sepenuhnya senang dengan tata letaknya, dan saya ingin tahu apakah saya dapat menyimpan beberapa byte dengan kait atau garpu, tapi aku harus memeriksanya nanti.
sumber
Perl 6:
5040 byteMengembalikan urutan 3-elemen daftar angka rasional (tepat).
Penjelasan:
$_
Parameter yang dinyatakan secara implisit dari lambda.
0, 1/($_ + 1) ... 1
Menggunakan operator urutan
...
untuk membangun urutan aritmatika yang sesuai dengan nilai koordinat yang mungkin.[X] EXPR xx 3
Mengambil produk Cartesian dari tiga salinan EXPR, yaitu menghasilkan semua 3-tuple yang mungkin.
grep *.sum == 1, EXPR
Saring tupel dengan jumlah 1.
sumber
Ruby, 62
Saya akan terkejut jika ini tidak dapat diperbaiki pada:
Mengambil saran yang tersembunyi dalam teka-teki, ini menghitung opsi simpul kedua berdasarkan yang pertama, dan simpul ketiga dengan mengurangi dua yang pertama.
sumber
Brachylog , 24 byte
Cobalah online!
sumber
Python 3, 106 byte
Sebuah fungsi yang mereka ambil input melalui argumen dan mencetak daftar daftar float ke STDOUT.
Python tidak pandai produk Cartesian ...
Bagaimana itu bekerja
Cobalah di Ideone
sumber
Sebenarnya , 15 byte
Ini menggunakan algoritma yang mirip dengan yang ada di jawaban Python TheBikingViking . Saran golf diterima. Cobalah online!
Tidak Terkumpul:
sumber
Ruby,
7774 byteJawaban lain menggunakan algoritma dalam jawaban Python TheBikingViking . Saran golf diterima.
Algoritma 74-byte lain yang didasarkan pada Not that Charles's Ruby menjawab .
sumber
JavaScript (Firefox 30-57),
8881 byteMengembalikan array array angka floating-point. Sunting: Disimpan 7 byte dengan menghitung koordinat ketiga secara langsung. Saya mencoba menghilangkan
if
dengan menghitung rentangy
langsung tetapi biaya byte tambahan:sumber
[x/n,y/n/z/n]
, apakah Anda lupa koma?