In các đỉnh của khối lập phương và các hình tam giác bao phủ của nó


9

Tọa độ đầu ra của các đỉnh của một khối. Sau đó, xuất ra một danh sách mười hai hình tam giác sẽ bao phủ khối lập phương, mỗi hình tam giác là một danh sách gồm ba chỉ số đỉnh, được định hướng nhất quán. Đầu ra phải là một chuỗi ASCII gồm các số thập phân riêng biệt. Golf này không có đầu vào. Người chiến thắng là ít ký tự nhất, trong đó bộ ký tự là Unicode.

Ví dụ, hãy xem xét một khối 1x1x1 bị dồn vào góc 0,0,0. Tám đỉnh của khối có thể được mô tả bằng các tọa độ xyz sau trên lưới 3d Cartesian:

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)

Mỗi đỉnh có thể được cung cấp một chỉ mục: 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

Bây giờ hãy xem xét mặt trên, các đỉnh được lập chỉ mục từ 0 đến 3. Hai hình tam giác bao phủ có thể được mô tả bởi ba chỉ số mỗi:

[0,1,2] [2,3,0]

Dưới đây là hình ảnh của khuôn mặt trên cùng này, nhìn từ phía trên khối lập phương:

 3_____2
 |    /| 
 |   / |                  
 |  /  |
 | /   |
 0_____1                

Và đây là một cái nhìn từ một góc độ.

    3____2
   / __-/|
 0/_`__1 |
  |    | /6
  |____|/
 4     5

Lưu ý hướng, hoặc 'quanh co' của cả hai hình tam giác này là 'ngược chiều kim đồng hồ' khi nhìn từ 'bên ngoài' khối lập phương trực tiếp nhìn vào mặt trong câu hỏi (hãy tưởng tượng truy cập từng đỉnh như được liệt kê, nó đi ngược chiều kim đồng hồ). Bây giờ hãy tưởng tượng điều này được thực hiện cho tất cả sáu mặt của khối lập phương.

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]

Bạn có thể xuất bất kỳ kích thước nào của khối lập phương ở bất kỳ tọa độ nào. Bạn có thể đánh số và sắp xếp các tọa độ đỉnh theo cách bạn muốn. Các chỉ số có thể là 0 dựa hoặc 1 dựa. Hướng của tam giác có thể theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ khi nhìn từ bên ngoài khối lập phương miễn là phù hợp với tất cả các tam giác.

Đầu ra có thể được định dạng theo bất kỳ cách nào bạn muốn, miễn là mỗi số thập phân ASCII được phân tách bằng ít nhất một ký tự ASCII không phải là số. Ví dụ, ví dụ trên cũng có thể là đầu ra như sau:

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

Môn golf này được lấy cảm hứng từ nhiều hệ thống và định dạng đồ họa 3d khác nhau, bao gồm OpenGL, OBJ, OFF, AMF, CGAL, v.v. Môn golf này tương tự như môn đánh gôn bởi Sở thích của Calvin có tên là Output a Face on Numbered Cube , sự khác biệt lớn mà bạn cần để tự xuất các tọa độ xyz của các đỉnh và các chỉ số tam giác đầu ra. Cảm ơn vì đã đọc.

Theo cảm hứng của mỗi người dùng ở đây là chương trình xác thực "người trợ giúp" trong python2 (không chơi gôn) sẽ in 'ok' hoặc 'không ok' cho dữ liệu đầu ra thử nghiệm trong các biến vertstr và idxstr. Nó không hoạt động hoàn hảo ... nhưng nó có thể bắt được một số lỗi.

Chỉnh sửa: sửa lỗi chính tả trong ví dụ và lỗi trong mã xác nhận.

    

#vertstr = '0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 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'

lớp Vector:
    def __init __ (tự, v):
        self.x, self.y, self.z = v [0], v [1], v [2]
    def __add __ (tự, v):
        trả về Vector ([self.x + vx, self.y + vy, self.z + vz])
    def __sub __ (tự, v):
        trả về Vector ([self.xv.x, self.yv.y, self.zv.z])
    def __str __ (tự):
        return str (self.x) + ',' + str (self.y) + ',' + str (self.z)

def chéo (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
    trả về Vector ([x, y, z])

# http://mathforum.org/l Library / drmath / view / 55343.html & http://sympy.org
cuộn dây 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. x, 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 
    trở lại d

định mức def (v1, v2, v3):
    va = v2-v1
    vb = v3-v2
    vc = v1-v3
    n1 = chéo (va, vb)
    n2 = chéo (vb, vc)
    n3 = chéo (vc, va)
    trả về [n1, n2, n3]


def triplify (str):
    số, ba lần = [], []
    cho num trong str.split (''): nums + = [int (num)]
    cho i trong phạm vi (0, len (nums), 3):
        bộ ba + = [[nums [i], nums [i + 1], nums [i + 2]]]
    ba lần trở về

verts = triplify (vertstr)
chỉ số = triplify (idxstr)
nsum = Vector ([0,0,0])
gió = 0
xs, ys, zs = [], [], []
cho v trong câu:
    xs + = [v [0]]
    ys + = [v [1]]
    zs + = [v [2]]
#print xs, ys, zs, len (xs)
centre = Vector ([float (sum (xs)) / len (xs), float (sum (ys)) / len (ys), float (sum (zs)) / len (zs)])
cho tam giác trong các chỉ số:
    v1 = Vector (động từ [tam giác [0]])
    v2 = Vector (động từ [tam giác [1]])
    v3 = Vector (động từ [tam giác [2]])
    định mức = định mức (v1, v2, v3)
    in v1, v2, v3, định mức [0], định mức [1], định mức [2]
    cho n trong định mức:
        nsum + = n
    w = quanh co (v1, v2, v3, trung tâm)
    in 'quanh co', w
    nếu w <0: Windsum- = 1
    elif w> 0: Windsum + = 1
if abs (Windsum) == 12: in 'quanh co ok'
khác: in 'quanh co không ok'
if (nsum.x == 0 và nsum.y == 0 và nsum.z == 0): in 'tổng bình thường ok'
khác: in 'tổng bình thường không ok'

1
Rõ ràng từ ví dụ, nhưng chỉ để làm cho nó hoàn toàn rõ ràng, bạn có thể muốn đề cập rằng các chỉ số đều dựa trên 0. Đây không phải là nhất định, vì ít nhất một trong các định dạng bạn liệt kê làm ví dụ (OBJ) sử dụng các chỉ mục dựa trên 1.
Reto Koradi

Điều đó sẽ làm việc như là tốt. Tôi nghĩ một khó khăn với thử thách này là việc kiểm tra tính đúng đắn của đầu ra là rất khó khăn. Bạn khá nhiều phải phác thảo một khối lập phương với thứ tự đỉnh đã chọn trên một tờ giấy và xác nhận thủ công tất cả 12 hình tam giác. Vâng, bạn có thể viết một chương trình xác nhận. Đó thực sự có thể là một ý tưởng thử thách khác ... khó hơn cái này, tôi nghĩ vậy.
Reto Koradi

Tôi thực sự thích ý tưởng về một sân golf khác cho một người xác nhận. tôi đã cập nhật ví dụ để cung cấp một bộ dữ liệu đầy đủ. cảm ơn lần nữa
don sáng

ok Tôi đã thêm một chương trình xác nhận rất nhanh và bẩn, lấy các sản phẩm chéo của từng cặp vectơ trong mỗi tam giác, thêm tất cả chúng và nếu 0 nói 'ok'.
don sáng

Câu trả lời:


1

Pyth, 18 ký tự

j`CM"⭧勛囃勦⾽仵ᶌﻘꚱ쥎➡˻ì

Ý tưởng tương tự như câu trả lời Haskell của tôi; in:

[
1
1
1
1
1
,

2
1
2
1
1
...

Tôi thích rằng bạn đã sử dụng cùng một chuỗi unicode trong 3 ngôn ngữ khác nhau
không sáng

1
Phép thuật unicode này là gì?
RK.

2

CJam, 35 byte

YZm*`3{[XY4]m<)\0+_:+1$f-+_@f+W%}%`

Dùng thử trực tuyến

Đầu ra là:

[[0 0 0] [0 0 1] [0 1 0] [0 1 1] [1 0 0] [1 0 1] [1 1 0] [1 1 1]] [[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]]

Hướng tam giác là chiều kim đồng hồ từ bên ngoài. Tôi đã kiểm tra điều này bằng tay, và nó có vẻ đúng với tôi.

Giải trình:

YZ      Push 2 and 3 on stack.
m*      Cartesian power, creates the coordinates of the 8 vertices.
`       Convert to string for output. Done with vertices.
3{      Start loop over 3 coordinate directions.
  [XY4]   Push [1 2 4], which are the vertex index offsets for the 3 directions.
  m<      Rotate by loop counter. So the remaining loop body will be executed once
          with [1 2 4], once with [2 4 1], once with [4 1 2].
  )       Pop off last offset. Will use this as index offset between the two
          parallel faces.
  \       Swap pair of remaining two offsets to top. These are the index offsets
          within the face.
  0+      Add a 0 to the list. These 3 indices define the first triangle.
  _:+     Calculate the sum. This is the vertex index of the opposite corner.
  1$      Copy first triangle to the top.
  f-      Subtract all indices from the index of the opposite corner, producing
          the second triangle of the face.
  +       Concatenate the indices of the two triangles, resulting in a list with
          the 6 vertex indices for the face.
  _       Copy the list.
  @       Bring the offset between the two faces to the top.
  f+      Add the offset to each index in the copied list.
  W%      Revert the order, resulting in the properly oriented list of the 6 vertex
          indices for the parallel face.
}%      End of loop over 3 coordinate directions.
`       Convert to string for output. Done with triangles.

Điều này thực sự mát mẻ. . . yêu sự đối xứng ...
don sáng

Đây rõ ràng là câu trả lời thú vị nhất, nhưng tôi đã nhầm lẫn định nghĩa vấn đề của mình để có mô tả tĩnh và "không có đầu vào", vì vậy tôi phải giữ thỏa thuận và trao số lượng ký tự thấp nhất, bên dưới (cũng là một câu trả lời thú vị nhưng trong một cách khác nhau), dấu kiểm Trả lời. cảm ơn vì đã tham gia.
don sáng

1

JavaScript (ES6) 78

alert([...'1010011100101110111:120213756465240426735153410145763236'].join` `)

Xin lỗi nhưng tôi thực sự không hiểu những thách thức này mà không có đầu vào.


xin lỗi, đó là câu hỏi golf đầu tiên của tôi tôi đoán bây giờ đã quá muộn để thay đổi nó ...
đừng sáng

Lần sau tốt hơn. Bạn có phiếu bầu của tôi nào.
edc65

1

Ruby, 98 106

Đã sửa lỗi phát hiện bởi Reto Koradi.

s=sprintf'%024b',342391
6.times{|i|t='15462315'[i,3];t+=t.reverse;t[1+i%2*3]='07'[i%2];s+=t}
p s.split(//)

Cho rằng tọa độ là bắt buộc, sơ đồ đánh số góc duy nhất có ý nghĩa dường như là tọa độ mà mỗi góc là biểu diễn nhị phân của tọa độ của nó. Điều đó hoàn toàn khác với câu hỏi được liên kết, trong đó các phương án đánh số khác nhau đã được thử. Cuối cùng, tôi quyết định in tọa độ bằng một mã cứng bẩn: sđược khởi tạo thành phiên bản chuỗi của số 24 bit 000001010011100101110111có biểu diễn thập phân là 342391. Thực tế với phương pháp in tọa độ này, việc đánh số các đỉnh là linh hoạt, vì vậy tôi có thể làm một câu trả lời khác

Đi vòng quanh đường xích đạo của khối lập phương, chúng ta tìm thấy các đỉnh 1,5,4,6,2,3 và chúng ta có thể xác định một tam giác cho mỗi mặt từ bất kỳ 3 số liên tiếp nào trong danh sách này (bao bọc từ đầu đến cuối. ) Tam giác khác trên mỗi mặt được xác định bằng cách đảo ngược các chữ số và thay thế chữ số giữa bằng 0 hoặc 7 nếu phù hợp.

Điều này cung cấp cho tất cả các đầu ra cần thiết, nhưng không có bất kỳ ký tự phân tách. Để đạt được điều đó, tôi chỉ cần chuyển đổi thành một mảng các ký tự và in mảng đó, như thế này (ngắt dòng được chèn để ngăn cuộn):

["0", "0", "0", "0", "0", "1", "0", "1", "0", "0", "1", "1", "1", "0", "0",
 "1", "0", "1", "1", "1", "0", "1", "1", "1", "1", "0", "4", "4", "5", "1",
 "5", "4", "6", "6", "7", "5", "4", "0", "2", "2", "6", "4", "6", "2", "3",
 "3", "7", "6", "2", "0", "1", "1", "3", "2", "3", "1", "5", "5", "7", "3"]

Bạn có chắc chắn rằng thứ tự quanh co là phù hợp? Dựa trên bản phác thảo của tôi, 1, 5, 4là CCW, 5, 4, 6là CW.
Reto Koradi

@RetoKoradi đã sửa với chi phí 8 byte. Cảm ơn. Ngoài ra, tôi đã nhận ra rằng tôi có thể làm tốt hơn với một sơ đồ đánh số khác.
Cấp sông St

1

Haskell, 38 ký tự

f=mapM(mapM print.show)"⭧勛囃勦⾽仵ᶌﻘꚱ쥎➡˻ì"

In đúng số, cách nhau bởi rất nhiều rác:

'\''
'\\'
'1'
'1'
'1'
'1'
'1'
'\''
'\''
'\\'
'2'
'1'
'2'
'1'
'1'
...

Đường chéo của khối là từ (1, 1, 1) đến (2, 2, 2).


1

CJam, 20 ký tự

"⭧勛囃勦⾽仵ᶌﻘꚱ쥎➡˻ì":isS*

Ý tưởng tương tự như câu trả lời Haskell của tôi; in:

1 1 1 1 1 2 1 2 1 1 2 2 2 1 1 2 1 2 2 2 1 2 2 2 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

1

Ruby, Rev 1 62

29.downto(0){|c|p c>5?73888640>>c&1:[c,c^1,c|6,c|6,(c+3)%6,c]}

Loại bỏ số c-6nhân bằng cách nhân số ma thuật với 64.

Việc gán tọa độ là dưới đây. Thật kỳ lạ khi tôi gán 100cho số 1. Tôi có thể đã lưu một byte trong rev 0 bằng cách trao đổi các trục và gán 001cho số 1. Lý do là vì ban đầu tôi đã đếm trong vòng lặp, điều đó có nghĩa là tôi phải đặt mọi thứ ngược lại trong chuỗi ma thuật. Dù sao, với sự thay đổi tôi đã thực hiện bây giờ, sẽ không có tiết kiệm bổ sung nào được thực hiện, vì vậy tôi sẽ rời khỏi tọa độ như hiện tại

Cube rotated with 0163 face at back
Top layer from above
01   000 100
74   010 110    
Bottom layer from above
36   001 101   
25   011 111

Ruby, Rev 0 63

29.downto(0){|c|p c>5?1154510>>c-6&1:[c,c^1,c|6,c|6,(c+3)%6,c]}

Sử dụng mã hóa dữ liệu tọa độ để linh hoạt trong việc chọn các góc. Có 54 chữ số trong đầu ra, có nghĩa là giải pháp ngây thơ sẽ có 63-54 = 9 byte có sẵn cho mã. Vì tôi không thể nghĩ ra cách chèn khoảng trắng trong 9 byte, tôi tin rằng nó ngắn hơn giải pháp ngây thơ.

Lược đồ đánh số (được điều chỉnh từ câu trả lời Ruby của tôi cho câu hỏi được liên kết https://codegolf.stackexchange.com/a/48867/15599 )

4---7
|  /|
| / |
|/  |
1---0---7
|  /|  /|
| / | / |
|/  |/  |
6---3---2---7
    |  /|  /|
    | / | / |
    |/  |/  |
    6---5---4
        |  /|
        | / |
        |/  |
        6---1

Đầu ra

0
0
0
1
0
0
0
1
1
0
0
1
1
1
0
1
1
1
0
0
1
1
1
0
[5, 4, 7, 7, 2, 5]
[4, 5, 6, 6, 1, 4]
[3, 2, 7, 7, 0, 3]
[2, 3, 6, 6, 5, 2]
[1, 0, 7, 7, 4, 1]
[0, 1, 6, 6, 3, 0]

Tôi thực sự thích sự kết hợp của phương pháp @ Runer112
không sáng

@donbright Tôi là người đầu tiên nghĩ đến việc đặt 6 đỉnh đầu tiên trên đường xích đạo và 2 đỉnh cuối cùng trong câu hỏi trước đó, đó là lý do tại sao câu trả lời C của tôi là câu trả lời phổ biến nhất. Tôi đã có 6 đỉnh theo thứ tự liên tiếp. Runer112 xứng đáng nhận được một số tín dụng cho việc sắp xếp lại 6 đỉnh trên đường xích đạo. Tôi đã phải sửa đổi thứ tự khuôn mặt cho Ruby trong câu hỏi trước, nhưng thứ tự đỉnh thực sự giống hệt với Runer112. Sự sắp xếp lại thay thế của Phinotphi trong 6 đỉnh trên đường xích đạo sẽ cho tôi độ dài bằng nhau cho câu hỏi trước, nhưng sẽ dài hơn trên đỉnh này
Level River St

wow tuyệt vời ... cảm ơn vì lời giải thích chi tiết ... rất thú vị. tôi nên cho phép đầu vào sau đó nó sẽ là một thách thức tốt hơn.
don sáng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.