क्यूब के कोने और उसके कवरिंग त्रिकोण को प्रिंट करें


9

एक घन के कोने के आउटपुट निर्देशांक। फिर, बारह त्रिकोणों की एक सूची का उत्पादन करें जो घन को कवर करेगा, प्रत्येक त्रिकोण तीन शीर्ष-अनुक्रमित की एक सूची है, लगातार उन्मुख। आउटपुट को विभिन्न दशमलव संख्याओं का ASCII स्ट्रिंग होना चाहिए। इस गोल्फ का कोई इनपुट नहीं है। विजेता सबसे कम वर्ण हैं, जहां चरित्र सेट यूनिकोड है।

एक उदाहरण के लिए, 0,0,0 पर 1x1x1 क्यूब कॉर्नर्ड पर विचार करें। घन के आठ शीर्षकों को एक 3 डी कार्टेशियन ग्रिड पर निम्नलिखित xyz निर्देशांक द्वारा वर्णित किया जा सकता है:

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 दशमलव संख्या कम से कम एक गैर-संख्यात्मक ASICII वर्ण द्वारा अलग न हो जाए। उदाहरण के लिए उपरोक्त उदाहरण भी निम्नानुसार आउटपुट हो सकता है:

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, इत्यादि शामिल हैं। यह गोल्फ Calvin के शौकीनों के समान है जिसका आउटपुट आउटपुट ए फेस ऑन ए नम्बर क्यूब है , जो बड़े अंतर की आवश्यकता है। अपने आप को कोने के xyz निर्देशांक और आउटपुट त्रिकोण सूचकांकों का उत्पादन करने के लिए। पढ़ने के लिए धन्यवाद।

प्रति उपयोगकर्ता प्रेरणा यहाँ python2 (गैर-गोल्फरी) में एक "सहायक" सत्यापन कार्यक्रम है जो वेरिएबस वर्टस्ट्रेट और आइडैक्स में टेस्ट आउटपुट डेटा के लिए 'ठीक' या 'ठीक नहीं' प्रिंट करेगा। यह पूरी तरह से काम नहीं करता है ... लेकिन यह कुछ त्रुटियों को पकड़ सकता है।

संपादित करें: सत्यापन कोड में उदाहरण और बग में तय टाइपो।

    

# ओवरस्ट्रेट = '0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1'
#idxstr = '1 2 0 2 1 3 7 5 6 4 4 6 5 2 4 4 4 6 6 3 3 5 1 5 3 4 1 0 1 4 5 7 6 3 3 3 6'
चक्कर = '0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1'
idxstr = '0 1 2 2 3 0 6 5 4 4 7 6 5 2 1 2 5 6 0 3 4 4 3 3 3 6 6 3 3 6 6 7 4 4 1 1 4 5'

कक्षा वेक्टर:
    def __init __ (स्व, वी):
        self.x, self.y, self.z = वी [0], वी [1], वी [2]
    def __add __ (स्व, वी):
        वापसी वेक्टर ([self.x + vx, self.y + vy, self.z + vz]
    def __sub __ (स्व, v):
        वापसी वेक्टर ([self.xv.x, self.yv.y, self.zv.z])
    डीई __str __ (स्व):
        वापसी str (self.x) + ',' + str (self.y) + ',' + str (self.z)

डीप क्रॉस (v1, वी 2):
    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
डीईएफ वाइंडिंग (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 * y3 * z3 + x4 * y3 * z2 
    वापसी d

मानदंड (v1, v2, v3):
    va = v2-v1
    vb = v3-v2
    vc = v1-v3
    n1 = क्रॉस (va, vb)
    n2 = क्रॉस (vb, vc)
    n3 = क्रॉस (vc, va)
    वापसी [एन १, एन २, एन ३]


डीईए ट्रिपलाइज़ (str):
    nums, ट्रिपल = [], []
    संख्या के लिए str.split ('') में: nums + = [int (num)]
    मैं सीमा में (0, len (संख्या), 3):
        triples + = [[nums [i], nums [i + 1], nums [i + 2]]]
    त्रिकोणीय वापसी

क्रिया = तिगुना (सीधा)
सूचकांक = तिगुना (मूर्ख)
nsum = वेक्टर ([0,0,0])
आँधी = ०
XS, वाईएस, zs = [], [], []
वी में वी के लिए:
    XS + = [v [0]]
    वाईएस + = [v [1]]
    zs + = [v [2]]
# छाप xs, ys, zs, len (xs)
केंद्र = वेक्टर ([नाव (राशि (XS)) / LEN (XS), नाव (राशि (Y)) / लेन (Y), नाव (राशि (zs)) / लेन (zs)])
सूचकांकों में त्रिकोण के लिए:
    v1 = वेक्टर (क्रिया [त्रिकोण [0]])
    v2 = वेक्टर (क्रिया [त्रिकोण [1]])
    v3 = वेक्टर (क्रिया [त्रिकोण [2]])
    मानदंड = मानदंड (v1, v2, v3)
    प्रिंट v1, v2, v3, मानदंड [0], मानदंड [1], मानदंड [2]
    n में मानदंडों के लिए:
        nsum + = n
    w = वाइंडिंग (v1, v2, v3, केंद्र)
    प्रिंट 'वाइंडिंग', डब्ल्यू
    अगर w <0: windsum- = 1
    एलिफ w> 0: विंडस + = 1
अगर एब्स (विंडसुम) == 12: प्रिंट 'वाइंडिंग ओके'
और: प्रिंट 'घुमावदार ठीक नहीं'
if (nsum.x == 0 और nsum.y == 0 और nsum.z == 0): 'सामान्य योग ठीक' प्रिंट करें
और: प्रिंट 'सामान्य योग ठीक नहीं'

1
यह उदाहरण से स्पष्ट है, लेकिन इसे पूरी तरह से अस्पष्ट बनाने के लिए, आप उल्लेख करना चाह सकते हैं कि सूचकांक 0-आधारित हैं। यह एक दिया नहीं है, क्योंकि कम से कम एक प्रारूप जिसे आप उदाहरण के रूप में सूचीबद्ध करते हैं (ओबीजे) 1-आधारित सूचकांकों का उपयोग करता है।
रेटो कोराडी

वह भी काम करेगा। मुझे लगता है कि इस चुनौती के साथ एक कठिनाई यह है कि आउटपुट की शुद्धता को सत्यापित करने के लिए यह मामूली दर्दनाक है। आपको बहुत अधिक एक क्यूब को स्केच के साथ चुनना पड़ता है जिसे कागज के एक टुकड़े पर चुना जाता है, और मैन्युअल रूप से सभी 12 त्रिकोणों को मान्य करता है। ठीक है, आप एक सत्यापन कार्यक्रम लिख सकते हैं। यह वास्तव में एक और चुनौती विचार हो सकता है ... इस एक से अधिक मुश्किल, मुझे लगता है।
रेटो कोराडी

मैं वास्तव में एक सत्यापनकर्ता के लिए एक और गोल्फ का विचार पसंद करता हूं। मैंने संपूर्ण डेटासेट देने के लिए उदाहरण को अपडेट किया। एक बार फिर धन्यवाद।
उज्ज्वल

ठीक है मैंने एक बहुत तेज और गंदा सत्यापन कार्यक्रम जोड़ा है जो प्रत्येक त्रिकोण में प्रत्येक जोड़ी वैक्टर के क्रॉस उत्पादों को लेता है, उन सभी को जोड़ता है, और यदि 0 'ठीक है' कहता है।
उज्ज्वल

जवाबों:


1

पायथ, 18 वर्ण

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

मेरे हास्केल जवाब के रूप में एक ही विचार; प्रिंट:

[
1
1
1
1
1
,

2
1
2
1
1
...

मुझे लगता है कि आपने 3 अलग-अलग भाषाओं में एक ही यूनिकोड स्ट्रिंग का उपयोग किया है
उज्ज्वल

1
यह यूनिकोड जादू क्या है?
आर.के.

2

सीजेएम, 35 बाइट्स

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

इसे ऑनलाइन आज़माएं

आउटपुट है:

[[० ० ०] [० ० १] [० १ ०] [० १ १] [१ ० ०] [१ ० १] [१ १ ०] [१ १ १]] [[१ २ ० १ २] ] [0 ५ ५ ४ ४ ५ ५] [२ ४ ४ ४ २ ६] [1 ३ ५ १ ५ ५]] [४ १ ० १ ४ ५] [3 ६ ३ २ ३ ६]]

त्रिभुज अभिविन्यास बाहर से दक्षिणावर्त है। मैंने इसे मैन्युअल रूप से जांचा, और यह मुझे सही लगता है।

स्पष्टीकरण:

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.

यह वास्ताव में अच्छा है। । । समरूपता से प्यार करें ...
उज्ज्वल

यह स्पष्ट रूप से सबसे मजेदार जवाब है, लेकिन मैंने अपनी समस्या की परिभाषा को स्थिर विवरण और "कोई इनपुट नहीं" के रूप में गड़बड़ कर दिया है, इसलिए मुझे समझौते को रखना होगा और सबसे कम वर्ण गणना को पुरस्कार देना होगा, नीचे (जो कि एक मजेदार उत्तर भी है लेकिन अलग तरीके से), उत्तर चेकमार्क। भाग लेने के लिए धन्यवाद।
उज्ज्वल

1

जावास्क्रिप्ट (ईएस 6) 78

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

क्षमा करें, लेकिन मैं वास्तव में इन चुनौतियों को बिना किसी इनपुट के नहीं समझता।


क्षमा करें, यह मेरा पहला गोल्फ सवाल था। मुझे लगता है कि अब इसे बदलने में बहुत देर हो चुकी है ...
उज्ज्वल

अगली बार बेहतर होगा। मेरे पास वैसे भी आपका वोट है।
edc65

1

रूबी, 98 106

रेटो कोरदी द्वारा निर्धारित फिक्स्ड त्रुटि।

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(//)

यह देखते हुए कि निर्देशांक की आवश्यकता होती है, केवल एक कोने की नंबरिंग योजना जो समझ में आती है कि ऐसा प्रतीत होता है जहां प्रत्येक कोने अपने निर्देशांक का द्विआधारी प्रतिनिधित्व है। यह लिंक किए गए प्रश्न से काफी अलग है, जहां विभिन्न विभिन्न नंबरिंग योजनाओं की कोशिश की गई थी। अंत में मैंने निर्देशांक को एक गंदे हार्डकोड के साथ मुद्रित करने का निर्णय लिया: s24-बिट संख्या के स्ट्रिंग संस्करण के लिए आरंभिक है 000001010011100101110111जिसका दशमलव प्रतिनिधित्व 342391 है। वास्तव में मुद्रण निर्देशांक की इस पद्धति के साथ, वर्टिस की संख्या लचीली होती है, इसलिए आप ऐसा कर सकते हैं। एक और जवाब दो।

क्यूब के भूमध्य रेखा के चारों ओर घूमते हुए, हम लंबवत 1,5,4,6,2,3 पाते हैं और हम इस सूची में किसी भी 3 लगातार संख्या से प्रत्येक चेहरे के लिए एक त्रिकोण को परिभाषित कर सकते हैं (अंत में शुरुआत में वापस लपेटते हुए)। ) प्रत्येक चेहरे पर अन्य त्रिकोण को अंकों को उल्टा करके परिभाषित किया जाता है, और बीच के अंक को 0 या 7 के साथ उपयुक्त के रूप में प्रतिस्थापित किया जाता है।

यह सभी आवश्यक आउटपुट देता है, लेकिन बिना किसी अलग चरित्र के। इसे प्राप्त करने के लिए, मैं केवल वर्णों के एक सरणी में परिवर्तित करता हूं और सरणी को प्रिंट करता हूं, इस तरह (स्क्रॉलिंग को रोकने के लिए डाली गई लाइनब्रेक):

["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"]

क्या आप सुनिश्चित हैं कि घुमावदार क्रम सुसंगत है? मेरे स्केच के आधार पर, 1, 5, 4CCW है, 5, 4, 6CW है।
रेटो कोराडी

@RetoKoradi 8 बाइट्स की लागत पर तय किया गया। धन्यवाद। इसके अलावा, मैंने महसूस किया है कि मैं एक अलग नंबरिंग स्कीम के साथ बेहतर कर सकता हूं।
लेवल रिवर सेंट

1

हास्केल, 38 वर्ण

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

सही संख्याओं को प्रिंट करता है, पूरी तरह से कबाड़ से अलग:

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

क्यूब का विकर्ण (1, 1, 1) से (2, 2, 2) होता है।


1

सीजेम, 20 अक्षर

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

मेरे हास्केल जवाब के रूप में एक ही विचार; प्रिंट:

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

रूबी, रेव १ १२

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

c-6जादू की संख्या 64 से गुणा करके छुटकारा पा लिया ।

निर्देशांक का कार्य नीचे है। यह अजीब है कि मैंने 100नंबर 1 को सौंपा है। मैं 0 में एक बाइट बचा सकता था एक्सिस का आदान-प्रदान करके 001और नंबर 1 पर असाइन कर रहा था। इसका कारण यह था कि मूल रूप से मैं लूप में गिनती कर रहा था, जिसका मतलब था कि मैं मैजिक स्ट्रिंग में सब कुछ उल्टा रखना था। वैसे भी, अब मैंने जो बदलाव किया है, उसमें कोई अतिरिक्त बचत नहीं की जानी है, इसलिए मैं निर्देशांक छोड़ दूंगा जैसे वे हैं

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

रूबी, रेव ० ६३

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

कोनों को चुनने में लचीलापन देने के लिए निर्देशांक डेटा के हार्डकोडिंग का उपयोग करना। आउटपुट में 54 अंक हैं, जिसका अर्थ है कि भोले समाधान में कोड के लिए 63-54 = 9 बाइट्स उपलब्ध होंगे। जैसा कि मैं 9 बाइट्स में रिक्त स्थान डालने का एक तरीका नहीं सोच सकता, मेरा मानना ​​है कि यह भोले समाधान से छोटा है।

नंबरिंग स्कीम (मेरे रूबी के जवाब से जुड़े सवाल https://codegolf.stackexchange.com/a/48867/15599 से अनुकूलित )

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

उत्पादन

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]

मुझे वास्तव में @ Runer112 की विधि का समावेश पसंद है
उज्ज्वल

@donbright मैं पहले वाला था जिसने भूमध्य रेखा पर पहले 6 छोरों और उस पिछले प्रश्न में डंडे पर अंतिम 2 डालने के बारे में सोचा, यही कारण है कि मेरा सी उत्तर सबसे लोकप्रिय उत्तर है। मैं क्रमिक क्रम में 6 कोने था। Runer112 भूमध्य रेखा पर 6 कोने के अपने पुन: संचालन के लिए कुछ श्रेय का हकदार है। मुझे पिछले प्रश्न पर रूबी के लिए फेस ऑर्डर को संशोधित करना था, लेकिन शीर्ष क्रम वास्तव में रनर 112 के समान है। भूमध्य रेखा पर फीनोटफी के वैकल्पिक 6 विकल्प, मुझे पिछले प्रश्न पर समान लंबाई दे सकते हैं, लेकिन यह एक लंबे समय तक रहेगा
लेवल रिवर सेंट

वाह कमाल ... विस्तृत विवरण के लिए धन्यवाद ... बहुत दिलचस्प। मुझे इनपुट की अनुमति देनी चाहिए थी तो यह एक बेहतर चुनौती थी।
उज्ज्वल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.