Виведіть координати вершин куба. Потім виведіть список з дванадцяти трикутників, які будуть охоплювати куб, кожен трикутник - це список трьох вершин-індексів, послідовно орієнтованих. Вихід повинен бути рядком ASCII різних десяткових чисел. Цей гольф не має жодної інформації. Переможець - найменше символів, де набір символів - Unicode.
Для прикладу розглянемо куб 1x1x1, закручений кутом 0,0,0. Вісім вершин куба можна описати наступними координатами xyz на 3d декартовій сітці:
x y z = (0,0,1) (1,0,1) (1,1,1) (0,1,1) (0,0,0) (1,0,0) (1,1,0) (0,1,0)
Кожній вершині може бути призначений індекс: x y z->index: 0 0 1->0, 1 0 1->1, 1 1 1->2, 0 1 1->3, 0 0 0->4, 1 0 0->5, 1 1 0->6, 0 1 0->7
Тепер розглянемо верхню грань, вершини з індексом нуля до трьох. Два трикутники, що охоплюють, можна описати трьома індексами кожен:
[0,1,2] [2,3,0]
Ось фотографія цього верхнього обличчя, видно зверху куба:
3_____2
| /|
| / |
| / |
| / |
0_____1
І ось погляд з кута.
3____2
/ __-/|
0/_`__1 |
| | /6
|____|/
4 5
Зауважте, що орієнтація або "звивистість" обох цих трикутників є "проти годинникової стрілки", коли дивитися "зовні" куба, безпосередньо дивлячись на відповідне обличчя (уявіть, що ви відвідуєте кожну вершину, як зазначено, вона йде проти годинникової стрілки). А тепер уявіть, що це зроблено для всіх шести сторін куба.
vertices: (0,0,1) (1,0,1) (1,1,1) (0,1,1) (0,0,0) (1,0,0) (1,1,0) (0,1,0)
triangles as indices: [0,1,2], [2,3,0], [6,5,4], [4,7,6],
[5,2,1], [2,5,6], [0,3,4], [4,3,7], [2,6,3], [3,6,7], [0,4,1], [1,4,5]
Ви можете вивести будь-який розмір куба, розташованого в будь-яких координатах. Ви можете нумерувати та замовляти вершинні координати, за бажанням. Індекси можуть бути 0 або 1. Орієнтація трикутника може бути як за годинниковою стрілкою, так і проти годинникової стрілки, якщо дивитися ззовні куба, якщо це відповідає всім трикутникам.
Вихід може бути відформатований як завгодно, якщо кожне десятичне число ASCII розділено принаймні одним нечисловим символом ASCII. Наприклад, наведений вище приклад також може бути виведений наступним чином:
0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0
0 1 2 2 3 0 6 5 4 4 7 6 5 2 1 2 5 6 0 3 4 4 3 7 2 6 3 3 6 7 0 4 1 1 4 5
Це гольф натхненний різними 3D - графічних систем і форматів, включаючи OpenGL, OBJ, OFF, AMF, CGAL і т.д. Це гольф схожий на гольф по хобі Кальвіна по імені Виведіть особи на нумерованому куб , велика різниця в тому , що вам потрібно самому вивести координати xyz вершин і вивести індекси трикутника. Дякуємо за прочитане
Натхнення користувача тут - програма перевірки "помічників" в python2 (non-golfy), яка буде друкувати "ok" або "not ok" для тестових вихідних даних у змінних vertstr та idxstr. Це не працює ідеально ... але це може привести до деяких помилок.
Редагувати: виправлена помилка в прикладі та помилки в коді перевірки.
#vertstr = '0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1' #idxstr = '1 2 0 2 1 3 7 5 6 4 6 5 2 4 0 4 2 6 7 3 5 1 5 3 4 1 0 1 4 5 7 6 3 2 3 6' vertstr = '0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0' idxstr = '0 1 2 2 3 0 6 5 4 4 7 6 5 2 1 2 5 6 0 3 4 4 3 7 2 6 3 3 6 7 0 4 1 1 4 5' вектор класу: def __init __ (self, v): self.x, self.y, self.z = v [0], v [1], v [2] def __add __ (self, v): повернути вектор ([self.x + vx, self.y + vy, self.z + vz]) def __sub __ (self, v): повернути вектор ([self.xv.x, self.yv.y, self.zv.z]) def __str __ (само): повернути str (self.x) + ',' + str (self.y) + ',' + str (self.z) дефрест (v1, v2): x = v1.y * v2.z-v2.y * v1.z z = v1.x * v2.y-v2.x * v1.y y = v1.z * v2.x-v2.z * v1.x повернути вектор ([x, y, z]) # http://mathforum.org/library/drmath/view/55343.html & http://sympy.org def обмотка (v1, v2, v3, obs): x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4 = v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, v3. х, v3.y, v3.z, obs.x, obs.y, obs.z d = x1 * (y2 * z3 - y2 * z4 - y3 * z2 + y3 * z4 + y4 * z2 - y4 * z3) d = d + y1 * (- x2 * z3 + x2 * z4 + x3 * z2 - x3 * z4 - x4 * z2 + x4 * z3) d = d + z1 * (x2 * y3 - x2 * y4 - x3 * y2 + x3 * y4 + x4 * y2 - x4 * y3) d = d - x2 * y3 * z4 + x2 * y4 * z3 + x3 * y2 * z4 - x3 * y4 * z2 - x4 * y2 * z3 + x4 * y3 * z2 повернути d стандартні значення def (v1, v2, v3): va = v2-v1 vb = v3-v2 vc = v1-v3 n1 = хрест (va, vb) n2 = хрест (vb, vc) n3 = хрест (vc, va) повернення [n1, n2, n3] def помножити (str): nums, triples = [], [] для num in str.split (''): nums + = [int (num)] для i в діапазоні (0, len (nums), 3): трійки + = [[nums [i], nums [i + 1], nums [i + 2]]] повернути трійки verts = помножити (vertstr) індекси = помножити (idxstr) nsum = вектор ([0,0,0]) вітрова = 0 xs, ys, zs = [], [], [] для v у вертах: xs + = [v [0]] ys + = [v [1]] zs + = [v [2]] #print xs, ys, zs, len (xs) центр = вектор ([float (сума (xs)) / len (xs), float (sum (ys)) / len (ys), float (sum (zs)) / len (zs)]) для трикутника в індексах: v1 = вектор (верти [трикутник [0]]) v2 = вектор (верти [трикутник [1]]) v3 = вектор (верти [трикутник [2]]) норми = нормальні (v1, v2, v3) print v1, v2, v3, норми [0], норми [1], норми [2] для n в нормах: nsum + = n w = обмотка (v1, v2, v3, центр) друкувати ‘намотування’, ж якщо w <0: вітра- = 1 elif w> 0: вітрове + = 1 if abs (windum) == 12: надрукувати "обмотка нормально" інше: надрукувати "намотування не нормально" якщо (nsum.x == 0 і nsum.y == 0 і nsum.z == 0): надрукувати "звичайну суму нормально" інше: надрукувати "звичайну суму не нормально"