Bak pasir
Untuk keperluan tugas saat ini, kubus satuan panjang diberikan dalam proyeksi miring dengan simbol ASCII sebagai berikut:
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
+
untuk simpul.-
untuk tepi X. Panjang unit sepanjang X diwakili oleh lima-
antara dua simpul.|
untuk tepi Y. Panjang unit sepanjang Y diwakili oleh dua|
antara dua simpul./
untuk tepi Z. Panjang unit di sepanjang Z diwakili oleh satu di/
antara dua simpul.- Verteks hanya digambar di mana ketiga pesawat berpotongan.
- Tepi hanya ditarik di mana dua pesawat bersilangan.
Ketika sebuah unit wajah diekstrusi, itu diimbangi oleh panjang unit dari posisi aslinya dan empat tepi baru dibuat untuk setiap arah (positif dan negatif).
Anda dapat memikirkan ekstrusi sebagai menggambar sumbu dari sistem koordinat Cartesian 3D di mana setiap sumbu direpresentasikan sebagai berbentuk kubus dengan penampang 1x1 dan panjangnya n
dari (0,0,0)
Diekstrusi oleh 1 sepanjang X:
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
Tugas
Diberikan tiga angka untuk sumbu XYZ, mengusir wajah kubus unit secara simetris dengan jumlah yang ditunjukkan dan memberikan hasilnya dengan simbol ASCII seperti yang ditentukan di atas.
Memasukkan
x, y, z - angka non-negatif - panjang ekstrusi untuk masing-masing sumbu. 0 berarti tidak ada ekstrusi. Input dapat berupa tiga angka, daftar tiga angka, tiga, string atau apa pun yang sesuai untuk Anda.
Keluaran
Gambar ASCII dari kubus setelah ekstrusi. Wihtespaces terkemuka dan tertinggal diizinkan.
Uji kasus
X Y Z
0 0 0
+-----+
/ /|
+-----+ |
| | +
| |/
+-----+
1 0 0
+-----------------+
/ /|
+-----------------+ |
| | +
| |/
+-----------------+
0 0 1
+-----+
/ /|
/ / |
/ / +
/ / /
/ / /
+-----+ /
| | /
| |/
+-----+
1 1 0
+-----+
/ /|
+-----+ |
+---| | +-----+
/ | |/ /|
+-----+ +-----+ |
| | +
| |/
+-----+ +-----+
| | +
| |/
+-----+
2 0 1
+-----+
/ /|
+-----------+ +-----------+
/ /|
+-----------+ +-----------+ |
| / /| | +
| +-----+ | |/
+---------| | +-----------+
| |/
+-----+
1 1 1
+-----+
/ /|-+
+-----+ |/|
+---| | +-----+
/ | |/ /|
+-----+-----+-----+ |
| / /| | +
| +-----+ | |/
+---| | +-----+
| |/| +
+-----+ |/
+-----+
Kriteria menang
Solusi terpendek dalam byte di setiap bahasa menang. Harap tambahkan deskripsi singkat tentang metode yang digunakan dan kode Anda.
Jawaban:
JavaScript (ES6),
525 ... 475 471459 byteDisimpan 13 byte berkat @Neil
Mengambil input sebagai array
[X,Y,Z]
. Mengembalikan matriks karakter.Cobalah online!
Bagaimana?
Langkah menggambar
Output terdiri dari 15 sisi, dibuat dalam urutan tertentu.
Pelaksanaan
Fungsi menggambar adalahg . Ini bekerja dengan parameter berikut:
Verteks selalu ditarik. Bergantung pada nilai parameter lainc , ujung-ujungnya digambar atau dihapus.
Jikat=0 , fungsi tersebut menggambar sisi depan:
Jikat=1 , itu menarik sisi atas:
Untuk meringkas, suatu sisi sepenuhnya dijelaskan dengan:
Karena itu, kita perlu menyimpan 10 parameter berikut untuk setiap sisi:
Di bawah ini adalah parameter dari 15 sisi yang perlu ditarik:
We force all values into the range[0..9] by applying the following operations:
It results in 15 numbers of exactly 10 decimal digits, which are stored as 15 groups of 7 digits in base 36.
For instance, the first side is encoded as
4032070460
and stored as1uol9h8
.sumber
Array(W*2+9).fill` `
saves a byte.APL (Dyalog Classic) ,
162161132130 bytesCobalah online!
(1 + 4*cx + 2*cy + cz) mod 16
di manacx
,cy
,cz
adalah jumlah yang sama-nilai "batang" sepanjang sumbu x, y, z, yaitu vektor sepanjang sumbu yang yang terdiri dengan nilai yang sama: 0 0 atau 1 1. kami membuat pengecualian jika subarray adalah semua-nol (atau semua-satu - itu tidak masalah) dan kami menganggap angka 0 bukan 28-|/+
thanks Scott Milner for spotting that some
+
s rendered as?
ssumber
Arang , 325 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Masukkan ekstrusi, tetapi sebelum itu untuk menyimpan byte.
Jika setidaknya dua ekstrusi adalah nol, maka cukup gambarkan kuboid dimensi (2x + 1, 2y + 1, 2z + 1). Jika tidak:
Cetak ekstrusi kiri, jika ada.
Cetak ekstrusi bawah, jika ada.
Cetak ekstrusi belakang, jika ada.
Ekstrusi yang tersisa semua bertemu pada titik ini (yang tidak bisa ditarik sampai akhir!)
Cetak ekstrusi depan, jika ada, berhati-hati untuk menghapus bagian ekstrusi kiri dan bawah yang mungkin tumpang tindih.
Cetak ekstrusi ke atas, jika ada, berhati-hati untuk menghapus bagian ekstrusi belakang dan kiri yang mungkin tumpang tindih.
Cetak ekstrusi yang tepat, jika ada, berhati-hati untuk menghapus bagian ekstrusi bawah dan belakang yang mungkin tumpang tindih.
Gambarkan gabungan antara ekstrusi terakhir.
sumber
Charcoal ,
195164144 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Saya memposting ini sebagai jawaban terpisah karena menggunakan pendekatan yang sama sekali berbeda untuk menggambar ekstrusi. Penjelasan:
Masukkan ekstrusi dan hitung setengah ukuran kuboid tertutup, tetapi dalam hitung bilangan bulat karena rentang Charcoal selalu bilangan bulat. Asal peta keluaran ke pusat kubus unit asli.
Lingkari semua koordinat di dalam (termasuk batas) berbentuk kubus yang berisi ekstrusi.
Lompat ke posisi keluaran sesuai dengan koordinat tersebut.
Dari koordinat yang diberikan, mengintip semua delapan arah diagonal untuk menentukan apakah ekstrusi tumpang tindih ke arah itu. Koordinat yang diintip diperiksa bahwa mereka masih berada di dalam kuboid, dan kemudian jumlah sumbu di mana koordinat berada di dalam kubus asli harus lebih besar dari 1. Perhatikan bahwa karena kubus memiliki tinggi tampilan ganjil, nilai sumbu Y nilai sumbu Y yang mengintip adalah bilangan bulat sedangkan sumbu lainnya menggunakan koordinat fraksional.
Pertimbangkan jumlah arah di mana ekstrusi tumpang tindih. Ada lima kasus yang menarik di mana kita ingin mencetak sesuatu, seperti dalam kasus nol, itu berarti bahwa ini adalah ruang kosong dan kami tidak ingin mencetak apa pun, sedangkan dalam kasus delapan, itu berarti bahwa ini ada di dalam ekstrusi dan apa pun yang kami lakukan akan dicetak berlebihan oleh lapisan yang lebih dekat ke titik mata.
Jika ekstrusi hanya tumpang tindih dalam satu arah maka ini adalah sudut luar dan kita perlu output a
+
.Jika ekstrusi tumpang tindih dalam dua arah maka ini adalah tepi luar. Jenis tepi mana yang ditentukan dari pemisahan antara kedua tumpang tindih; 6 dan 7 adalah tepi yang menghadap ke belakang dan akan ditimpa, 4 adalah tepi diagonal, 2 adalah tepi vertikal dan 1 adalah tepi horizontal. (Saya benar-benar menghitung 7 minus pemisahan karena tampaknya lebih mudah dilakukan.)
Jika ekstrusi tumpang tindih dalam tiga arah maka ini adalah sudut dalam dalam kasus di mana salah satu ekstrusi adalah nol dan kita perlu output a
+
.Jika ekstrusi tumpang tindih dalam empat arah maka ada dua kasus: wajah (segala arah), dan sudut dalam kasus dengan tiga ekstrusi positif. Dalam kasus terakhir ada jumlah tumpang tindih ganjil terhadap pemirsa.
Jika ekstrusi tumpang tindih dalam enam arah maka ini adalah tepi bagian dalam. Ini bekerja seperti pelengkap tepi luar kecuali bahwa kami hanya tertarik ketika salah satu dari dua ruang kosong adalah arah menuju titik mata (entri terakhir dalam array).
sumber
K (ngn / k) , 172 byte
Cobalah online!
wajib menulis ulang solusi apl saya
algoritma yang sama, kecuali bahwa rendering 3d-> 2d dilakukan dengan (k ekivalen dari) penugasan indeks alih-alih membuat matriks 2d untuk setiap elemen 3d dan mencampurkannya
sumber
ngn/apl
kinerja Anda jika dibandingkan denganDyalog APL
solusi Anda ?⍤
) dan stensil (⌺
)