pengantar
Hypercube / tesseract adalah setara 4 dimensi dari kubus normal. Itu dibuat dengan mengambil jaring kubus, memperluasnya ke dimensi 3, lalu - menggunakan dimensi 4 - melipatnya menjadi hypercube. Ini pada dasarnya sebuah kubus, di mana setiap sisi adalah kubus.
Untuk membuat hypercube, Anda memerlukan 16 vektor 4d (vektor dengan komponen x
, a y
, a, z
dan w
komponen). Vektor-vektor ini adalah sebagai berikut:
A(0, 0, 0, 0); B(1, 0, 0, 0); C(1, 0, 1, 0); D(0, 0, 1, 0); E(0, 1, 0, 0); F(1, 1, 0, 0); G(1, 1, 1, 0); H(0, 1, 1, 0);
I(0, 0, 0, 1); J(1, 0, 0, 1); K(1, 0, 1, 1); L(0, 0, 1, 1); M(0, 1, 0, 1); N(1, 1, 0, 1); O(1, 1, 1, 1); P(0, 1, 1, 1);
Hypercube memiliki 24 wajah. Daftar berikut berisi semuanya (setiap grup menandai kuad):
ABFE, CDHG, BCGF, DAEH, DCBA, FEHG
IJNM, KLPO, JKON, LIMP, LKJI, PMNO
ABJI, DCKL, BCKJ, DAIL, FEMN, GHPO, FGON, EHPM, EAIM, BFNJ, CGOK, HDLP
Dengan semua informasi ini, secara teknis Anda memiliki hypercube dalam kode. Untuk memutar ini, Anda membutuhkan 6 matriks yang berbeda untuk setiap bidang rotasi, satu untuk pesawat YZ, XZ, XY, XW, YW dan ZW. Setelah Anda memiliki setiap matriks, Anda perlu mengalikan simpul kubus dengan mereka.
Gambar-gambar berikut menunjukkan struktur setiap matriks:
Untuk rotasi pada bidang YZ:
Untuk rotasi pada bidang XZ:
Untuk rotasi pada bidang XY:
Untuk rotasi pada bidang XW:
Untuk rotasi pada pesawat YW:
Untuk rotasi pada bidang ZW:
Rotasi diterapkan dalam urutan ini.
Setelah semua ini, Anda memiliki hypercube yang diputar. Sekarang kamu harus menggambarnya. Anda harus menggunakan proyeksi orthogonal dikombinasikan dengan proyeksi perspektif untuk mengirim (x, y, z, w)
ke (2x/(2+z), 2y/(2+z))
.
Memasukkan
Input Anda adalah 6 bilangan bulat antara 0 (inklusif) dan 360 (eksklusif). Ini mewakili rotasi dalam derajat pada bidang rotasi yang berbeda dari hypercube.
Keluaran
Output Anda harus berupa gambar tunggal yang mengandung hypercube. Layar dapat berupa gambar raster, gambar vektor atau seni ASCII. Gambar output harus minimal 100 * 100 piksel, dan kubus perlu mengambil setidaknya 50% dari layar. Format output gambar apa pun diizinkan.
Uji kasus
0 0 0 0 0 0
0 0 0 0 0 30
30 0 0 0 0 30
0 0 0 30 30 30
45 45 45 0 0 0
45 45 45 45 45 45
Buka gambar di tab baru, untuk melihatnya dalam ukuran penuh.
Aturan
- Aturan default berlaku
- Celah standar dilarang
- Kode terpendek dalam byte menang
sumber
Jawaban:
Oktaf,
474433429 byteDiputar:
Matriks rotasi masih mengkonsumsi banyak byte, tetapi siklus Euler bekerja dengan cukup baik, mengurangi jumlah simpul yang dikunjungi dari
96120 ke 33.Vertikal dihasilkan dengan mengambil representasi biner 4-bit
[0:15]
dan menganggap msb sebagai koordinat x dan lsb koordinat w.Sunting: Pra-mengalikan semua matriks rotasi adalah mimpi buruk, itulah sebabnya saya tidak menggunakannya pada awalnya, tetapi pra-mengalikannya secara berpasangan menghemat 41 byte.
Sekarang untuk mencari kombinasi optimal. :)Mengalikan matriks dengan bertiga lebih buruk daripada tidak ada pra-perkalian sama sekali, jadi saya akan senang dengan pendekatan pasangan-bijaksana.Keluaran:
sumber
Nota bene
1075732683640631601590545542526514478470Menggunakan mat.ps dan G .
Sunting: -343 Generasi vektor enkode biner terapan dan sirkuit Euler
dicuridipinjam dari jawaban lain. Dan menerapkan string biner-token dari perpustakaan G.Sunting: -49 Redefined
sin
cos
danneg
untuk nama yang lebih pendek.Edit: -43 Nama pendek yang ditentukan untuk urutan
0 0
0 1
1 0
.Sunting: -9
al
(mis.aload
) Lebih pendek dari(")@
. 3 panggilan keidi
(mis.idiv
) Dengan biaya tidak melakukan apa-apa1 idiv
.Edit: -30 Terapan implisit blok definisi dari G.
Edit: -10 Beberapa urutan yang lebih triply digunakan.
Sunting: -45 Hapus variabel
i
j
k
l
m
n
untuk sudut dan selalu mendefinisikan sudut saat ini sebagait
dan fungsi sudut menggunakan nilai (global)t
variabel. Tunda pelaksanaan kode-deskripsi matriks rotasi hinggat
nilainya siap.Sunting: -3 Hapus
<16>$
mis.closepath
. Dan sebuah ruang.Sunting: -16 Kurung array faktor-keluar dari vektor satuan dalam matriks rotasi (
J
K
L
danM
). Lamar kembali berlakumo
untukmod
dansu
untuksub
.Edit: -12 In-line fungsi project-and-draw dan hapus (sekarang kosong) kamus terlampir.
Sunting: -36 Sandi sirkuit (mis. Wajah ) dalam sebuah string.
Sunting: -8 Hapus definisi array simpul
V
. Sebagai gantinya, tinggalkan di tumpukan dandup
copy pekerjaan sesuai kebutuhan (sekali, pertama, dan lagi di akhir loop). Juga, menerjemahkan beberapa operator dari binary-token-string kembali ke nama-nama singkat di mana BTS tidak memberikan penghematan, begitu(I)$
juga sekarangfora
(mis.forall
).if du
bisa jadi(T8)$
, tetapiif du
jelas merupakan pilihan yang lebih baik ( golf , bukan kebingungan ). Juga, lakukanscale
sebelumnyatranslate
, sehingga koordinat yang diterjemahkan dapat3
dan4
bukan300
dan400
.The
3
4
dan100
di baris pertama dari blok kedua adalah parameter yang mewakili pusat-x, pusat-y dan skala, masing-masing, dari gambar pada halaman (koordinat pusat yang skala olehscale
). (300.400) kira-kira merupakan pusat kertas berukuran AS (612.792) di unit PS.Jika Anda dapat secara kasar mengikuti postscript, hal-hal aneh yang penting adalah blok prosedur implisit dan string operator yang disandikan. Seperti yang ditunjukkan oleh komentar di workfile, di bawah ini, setiap baris blok pertama secara implisit dinamai oleh A, B, C, dll. Jadi, misalnya.
F E D
akan menghasilkan1 0 0 1 0 0
. Untuk string operator yang disandikan, segala sesuatu yang merupakan argumen$
#
atau@
urutan dari panggilan operator, menggunakan byte untuk memilih operator dari tabel nama sistem, PLRM 3ed Lampiran F. Fitur-fitur ini dan lebih banyak lagi tersedia untuk PostScript dengan perpustakaan G ( sekarang termasuk fungsi mat.ps juga).Workfile:
Tidak dikomentari dan dengan ringan berkomentar:
Beberapa hasil saya adalah contoh cermin dari contoh pertanyaan itu.
Untuk
gs -- hc.ps 0 0 0 0 0 0
, saya dapat:gs -- hc.ps 0 0 0 0 0 30
gs -- hc.ps 30 0 0 0 0 30
gs -- hc.ps 0 0 0 30 30 30
gs -- hc.ps 45 45 45 0 0 0
gs -- hc.ps 45 45 45 45 45 45
Animasi bonus yang baru saja saya buat dengan program ini. Gambar ini sesuai dengan urutan rotasi 0 30 60 0 i i , di mana i berkisar dari 0 hingga 360 oleh 2.
sumber
C # + Unity,
1060845835 byteC # ≈ Java
Diasumsikan bahwa fungsi ini ada dalam naskah yang ditempatkan di
MainCamera
.Sunting:
Terima kasih kepada @TuukkaX untuk saran untuk menyimpan 19 byte Disimpan ~ 200 byte menggunakan siklus Euler.
Golf:
Baris baru + lekukan + Cangkang penuh:
Saya tidak dapat menemukan rumus sederhana untuk membangun matriks rotasi atau "wajah" yang harus digambar, sehingga memerlukan banyak byte untuk hard-code.Saya meminjam siklus Euler dari @beaker. Juga, built-in Unity sangat verbose.Anda dapat memverifikasi semua kasus uji online .
sumber
0.5f
dapat dikurangi menjadi.5f
dan0.01f
ke.01f
. Saya juga berpikir bahwa array integer dapat dipisahkan dengan koma alih-alih mengatakanint[]
beberapa kali.int[,]
. Tetap terima kasih.Vector4(0.5f,0.5f,0.5f,0.5f)
yang bisa direduksi menjadiVector4(.5f,.5f,.5f,.5f)
.Javascript ES6, 584 byte
"Tidak Disatukan":
Lihat dalam aksi (dimodifikasi untuk terus berputar):
Fungsi mengembalikan objek kanvas HTML5, Anda perlu menambahkannya ke halaman dengan melakukan
document.body.appendChild(f(0,0,0,0,0,0))
misalnya.Saat ini, rotasi diterapkan rusak, saya sedang mengerjakan pemesanan ulang, tetapi seperti, itu memutar hypercube dengan benar.
sumber
Mathematica,
453415 byte *Dipersingkat dengan menggunakan tur Euler dan membersihkan semuanya menjadi satu pernyataan tanpa mendefinisikan fungsi dalam variabel. Ini membuat kode lebih lambat karena beberapa alasan. Saya menduga Mathematica mengevaluasi kembali fungsi beberapa kali sekarang karena mereka tidak disimpan dalam variabel.
* Saya menghitung
°
dan==
sebagai byte tunggal karena masing-masing direpresentasikan sebagai karakter tunggal dalam Mathematica. Saya pikir ini adil karena banyak bahasa menggunakan pengkodean karakter aneh.Tidak dikoleksi dengan komentar. Masukan dikodekan di bagian atas sebagai
a={30,0,0,0,0,30};
. Saya tidak menghitungnya terhadap skor saya.0 0 0 0 0 30
0 0 0 30 30 30
405 10 -14 -8 -9 205
sumber