Введение
Гиперкуб / тессеракт - это 4-мерный эквивалент нормального куба. Это делается путем взятия сетки кубов, расширения ее до 3-го измерения, а затем - с использованием 4-го измерения - складывания в гиперкуб. Это в основном куб, где каждая сторона - куб.
Для создания гиперкуба вам нужно 16 4d векторов (вектор с an x
, a y
, a z
и w
компонентом). Эти векторы следующие:
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);
Гиперкуб имеет 24 лица. Следующий список содержит их все (каждая группа помечена квадратом):
ABFE, CDHG, BCGF, DAEH, DCBA, FEHG
IJNM, KLPO, JKON, LIMP, LKJI, PMNO
ABJI, DCKL, BCKJ, DAIL, FEMN, GHPO, FGON, EHPM, EAIM, BFNJ, CGOK, HDLP
Со всей этой информацией у вас технически есть гиперкуб в коде. Чтобы повернуть это, вам нужно 6 различных матриц для каждой плоскости вращения, по одной для плоскостей YZ, XZ, XY, XW, YW и ZW. После того, как у вас есть каждая матрица, вам нужно умножить вершины куба на них.
Следующие изображения показывают структуру каждой матрицы:
Для вращения на плоскости YZ:
Для вращения на плоскости XZ:
Для вращения на плоскости XY:
Для вращения на плоскости XW:
Для вращения на плоскости YW:
Для вращения на плоскости ZW:
Вращения применяются в этом порядке.
После всего этого у вас есть повернутый гиперкуб. Теперь вам нужно нарисовать это. Вы должны использовать ортогональную проекцию в сочетании с перспективной проекцией , чтобы отправить (x, y, z, w)
в (2x/(2+z), 2y/(2+z))
.
вход
Вы вводите 6 целых чисел от 0 (включительно) до 360 (исключительно). Они представляют повороты в градусах на разных плоскостях вращения гиперкуба.
Выход
Ваш вывод должен быть одним изображением, содержащим гиперкуб. Дисплей может быть растровым изображением, векторным изображением или ASCII-изображением. Выходное изображение должно быть не менее 100 * 100 пикселей, а куб должен занимать не менее 50% экрана. Разрешен любой формат вывода изображения по умолчанию.
Контрольные примеры
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
Откройте изображения в новой вкладке, чтобы увидеть их в полном размере.
правила
- Применяются правила по умолчанию
- Стандартные лазейки запрещены
- Самый короткий код в байтах выигрывает
Ответы:
Октава,
474433429 байтповернутый:
Матрицы вращения по-прежнему занимают много байтов, но цикл Эйлера сработал довольно хорошо, сократив число посещенных вершин с
96120 до 33.Вершины генерируются, принимая 4-битное двоичное представление
[0:15]
и рассматривая msb как x-координату, а lsb w-координату.Изменить: Предварительное умножение всех матриц вращения было кошмаром, поэтому я не использовал его изначально, но предварительное умножение их в парах сэкономило 41 байт.
Теперь искать оптимальную комбинацию. :)Умножение матриц на три было хуже, чем отсутствие предварительного умножения, поэтому я буду счастлив с парным подходом.Выход:
источник
постскриптум
1075732683640631601590545542526514478470Использует mat.ps и G .
Редактировать: -343 Прикладная двоичная кодировка генерации векторов и эйлерова схема
краденыхзаимствовано из других ответов. И применил строки двоичных токенов из библиотеки G.Изменить: -49 Переопределено
sin
cos
иneg
для более коротких имен.Изменить: -43 Определены короткие имена для последовательностей
0 0
0 1
1 0
.Изменить: -9
al
(т.е.aload
) короче, чем(")@
. Факторинг 3 звонкаidi
(т.е.idiv
) за счет ничего не делать1 idiv
.Редактировать: -30 Применяется блок неявного определения из G.
Редактировать: -10 Еще несколько трижды используемых последовательностей.
Редактировать: -45 Удалить переменные
i
j
k
l
m
n
для углов и всегда определять текущий угол как переменную. Отложить выполнение кода-описания матрицы вращения до егоt
функции углов используют значение (глобальное)t
t
значение готово.Редактировать: -3 Удалить
<16>$
т.е.closepath
, И пространство.Редактировать: -16 скобок массива фактора из векторов единиц в матрицах вращения (
J
K
L
иM
). Повторно подать заявку упалmo
заmod
иsu
заsub
.Edit: -12 В-Выложи проект-и-начертить функцию и удалить (теперь пустой) ограждающий словарь.
Редактировать: -36 Кодировать схему (т.е. грани ) в строку.
Редактировать: -8 Удалить определение массива вершин
V
. Вместо этого оставьте на стеке иdup
рабочие копии по мере необходимости (один раз, сначала и снова в конце цикла). Кроме того, переведено несколько операторов из строк двоичных токенов обратно в сокращенные имена, где BTS не дала сбережений,(I)$
как и сейчасfora
(т.е.forall
).if du
может быть(T8)$
, ноif du
это явно лучший выбор (это гольф , а не запутывание как таковое). Кроме того, выполнитеscale
доtranslate
, так что переведенные координаты могут быть3
и4
вместо300
и400
.Символы
3
4
и100
в первой строке второго блока представляют собой параметры, представляющие соответственно центр-х, центр-у и масштаб чертежа на странице (координаты центра масштабируются с помощьюscale
). (300 400) - примерно центр американской бумаги размером с букву (612 792) в единицах PS.Если вы можете приблизительно следовать postScript, важными причудливыми вещами являются неявный блок процедур и закодированные строки операторов. Как показано в комментариях к рабочему файлу ниже, каждая строка первого блока неявно именуется A, B, C и т. Д. Так, например,
F E D
будет производить1 0 0 1 0 0
. Для закодированных строк операторов - все, что является аргументом$
#
или@
является последовательностью вызовов операторов, используя байты для выбора операторов из таблицы системных имен, PLRM 3ed, Приложение F. Эти и другие функции доступны для PostScript с библиотекой G ( теперь включает в себя функции mat.ps).Рабочий файл:
Неутомимый и слегка прокомментированный:
Некоторые из моих выводов являются зеркальным отображением примеров вопроса.
Ибо
gs -- hc.ps 0 0 0 0 0 0
я получаю: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
Бонусную анимацию я только что сделал с помощью этой программы. Это изображение соответствует последовательности вращения 0 30 60 0 i i , где i варьируется от 0 до 360 на 2.
источник
C # + Unity,
1060845835 байтC # - Java
Предполагается, что эта функция находится в сценарии
MainCamera
.Редактировать:
Спасибо @TuukkaX за предложения по сохранению 19 байт. Сохранено ~ 200 байт с использованием цикла Эйлера.
Golfed:
Новые строки + отступы + Полная оболочка:
Я не мог найти простую формулу для построения матриц вращения или «граней» для рисования, так что это стоило бы много байтов для жесткого кода.Я позаимствовал цикл Эйлера у @beaker. Кроме того, встроенные модули Unity чрезвычайно многословны.Вы можете проверить все тестовые случаи онлайн .
источник
0.5f
может быть уменьшен до.5f
и0.01f
до.01f
. Я также думаю, что целочисленные массивы могут быть разделены запятой вместо того, чтобы говоритьint[]
несколько раз.int[,]
. Тем не менее, спасибо.Vector4(0.5f,0.5f,0.5f,0.5f)
который может быть уменьшен доVector4(.5f,.5f,.5f,.5f)
.Javascript ES6, 584 байта
"Ungolfed":
Посмотрите это в действии (изменено, чтобы непрерывно вращаться):
Функция возвращает объект холста HTML5, вам нужно добавить его на страницу,
document.body.appendChild(f(0,0,0,0,0,0))
например.В настоящее время повороты применяются не по порядку, я работаю над переупорядочением, но, как есть, он вращает гиперкуб правильно.
источник
Mathematica,
453415 байт *Сокращенный с помощью тура Эйлера и очистки всего этого в один оператор без определения функций в переменных. Это делает код медленнее по какой-то причине. Я предполагаю, что Mathematica переоценивает функции несколько раз, поскольку они не хранятся в переменной.
* Я подсчитывать
°
и==
как одиночные байты каждый , так как они представлены в виде одного символа в системе Mathematica. Я думаю, что это справедливо, так как многие языки используют странные кодировки символов.Разгулялся с комментариями. Ввод жестко закодирован вверху как
a={30,0,0,0,0,30};
. Я не считал это к моему счету.0 0 0 0 0 30
0 0 0 30 30 30
405 10 -14 -8 -9 205
источник