ग्रिड सुडौल हो सकते हैं। कब तक तुम्हारा है?


12

पाठ के H उच्च ग्रिड द्वारा W चौड़े पर एक सरल , खुले , दो-आयामी वक्र को चित्रित करने पर विचार करें जहां Xवक्र का हिस्सा होता है और .खाली स्थान का प्रतिनिधित्व करता है और किसी अन्य वर्ण का उपयोग नहीं किया जाता है।

प्रत्येक ग्रिड स्थान में 8 पड़ोसी ग्रिड स्थान हैं, इसका मूर पड़ोस । सीमाओं से परे ग्रिड रिक्त स्थान को खाली माना जाता है।

एक ग्रिड में एक वक्र होता है अगर यह बिल्कुल एक है X या यदि इसमें एक से अधिक है Xजहां:

  • ठीक दो Xएस में केवल एक पड़ोसी है X। ये वक्र के समापन बिंदु हैं।
  • प्रत्येक Xसमापन बिंदु पड़ोसियों के अलावा बिल्कुल दो Xएस। ये वक्र के थोक बनाते हैं।

उदाहरण के लिए, यह ग्रिड जहाँ W = 9 और H = 4 में एक वक्र है:

....X....
.X.X.X.X.
X..X..X.X
.XX.....X

इसी तरह, इन ग्रिड (W = 4, H = 3) में वक्र हैं:

....  .X..  ....  ....  .X.X
....  X..X  ..X.  XX..  X.X.
..X.  .XX.  .X..  ....  ....

ये ग्रिड, हालांकि, एक वक्र शामिल नहीं हैं:

....  .XX.  ...X  XX..  ....  X.X.
....  X..X  ..XX  XX..  .X.X  .X..
....  .XX.  .X..  ....  ...X  X.X.

हम सभी पड़ोसी जोड़े के बीच की दूरी को जोड़कर एक वक्र की लंबाई पा सकते हैं X:

  • दो orthogonally पड़ोसी Xs के बीच की दूरी 1 इकाई है।

    XX
    X
    X
  • दो तिरछे पड़ोसी Xएस के बीच की दूरी agon2 इकाइयां है।

    X.
    .X
    .X
    X.

उदाहरण के लिए, ग्रिड में वक्र की लंबाई

XXX.
...X
..X.

के रूप में कल्पना की जा सकती है

लंबाई उदाहरण

तो हम देख सकते हैं कि यह 1 + 1 + √2 + 4.82 = 4.828427 है ...

केवल एक के साथ एक वक्र की लंबाई Xशून्य है।

जब एक ग्रिड एक वक्र नहीं बनाता है तो इसकी लंबाई अच्छी तरह से परिभाषित नहीं होती है।

चुनौती

XS और .s के टेक्स्ट के ग्रिड को देखते हुए , इसमें जो कर्व होता है उसकी लंबाई को आउटपुट करता है, या फिर कुछ ऐसा आउटपुट करता है जैसे -1या Nullग्रिड को इंगित करने के लिए कोई वक्र नहीं है।

इनपुट के लिए आप यदि चाहें तो अन्य वर्णों का उपयोग कर सकते हैं Xऔर .यदि आवश्यकता हो तो H और W को इनपुट के रूप में लिया जा सकता है। एक स्ट्रिंग के बजाय 1s और 0s से भरी हुई नेस्टेड सूची या मैट्रिक्स के रूप में इनपुट भी ठीक है।

आप वक्र लंबाई या वैकल्पिक रूप से दो पूर्णांकों A और B के लिए फ्लोट का उत्पादन कर सकते हैं length = A + B*√2

बाइट्स में सबसे छोटा कोड जीतता है।

परीक्षण के मामलों

XXX.
...X
..X.
2 + 2*√2 = 4.828427...

....X....
.X.X.X.X.
X..X..X.X
.XX.....X
3 + 8*√2 = 14.313708...

....
....
..X.
0 + 0*√2 = 0

.X..
X..X
.XX.
1 + 3*√2 = 5.242640...

....
..X.
.X..
0 + 1*√2 = 1.414213...

....
XX..
....
1 + 0*√2 = 1

.X.X
X.X.
....
0 + 3*√2 = 4.242640...

....
....
....
....
-1

.XX.
X..X
.XX.
-1

...X
..XX
.X..
-1

....
.X.X
...X
-1

X.X.
.X..
X.X.
-1

मैं सॉल्वर को ग्रिड के लिए अपने आउटपुट स्वरूप को चुनने की अनुमति देता हूं जिसमें कोई घटता नहीं है (कोई सुसंगत मूल्य जो किसी भी m, n≥0 के लिए फॉर्म m + n * sqrt (2) का नहीं है)।
ग्रेग मार्टिन

@Greg ठीक लगता है। हो गया
केल्विन के शौक

[x.x,...,.x.]एक वैध वक्र नहीं है, है ना?
मैजिक ऑक्टोपस Urn

@carusocomputing सही
केल्विन के शौक

जवाबों:


3

MATL , 52 51 बाइट्स

t2Y6~Z+*ssGt3Y6Z+*tt1=z2=wssGzqE=*Gz1=+?}_q]ssy-h2/

इनपुट शून्य और लोगों का एक मैट्रिक्स है।

आउटपुट Bतो है A। नॉन-कर्व एक नेगेटिव देता है A

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें

व्याख्या

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

एम और डी के परिणामों को उन बिंदुओं को छोड़ने के लिए फ़िल्टर किया जाना चाहिए जो वक्र से संबंधित नहीं हैं। इसके अलावा, उन्हें 2 से विभाजित किया जाना चाहिए, क्योंकि "पड़ोसी होने का" एक सममित संबंध है, इसलिए वक्र में प्रत्येक बिंदु को दो बार गिना जाता है।

यह निर्धारित करना कि क्या वक्र वैध है, मेरी अपेक्षा से अधिक बोझिल है। ऐसा करने के लिए, कोड तीन स्थितियों का परीक्षण करता है:

  1. क्या M की संख्या समान है 2? (यही है, एक पड़ोसी के साथ ठीक दो अंक हैं?)
  2. के कुल योग करता है एम इनपुट वक्र समय में अंकों की संख्या के बराबर 2शून्य से 2? (शर्त 1 के साथ, यह परीक्षण अगर सभी गैर-शून्य मान एम में उनमें से दो को छोड़कर समान है 2)
  3. क्या इनपुट वक्र में एक बिंदु होता है?

यदि स्थिति 1 और 2 सही है, या यदि स्थिति 3 है तो वक्र मान्य है।

t       % Implicit input matrix of zeros and ones. Duplicate
2Y6~    % Push [1 0 1; 0 0 0; 1 0 1]
Z+      % 2D convolution, keeping size
*       % Multiply to zero out results for non-curve points. Gives matrix D
ss      % Sum of matrix D
Gt      % Push input again wtice
3Y6     % Push [1 1 1; 1 0 1; 1 1 1]
Z+      % 2D convolution, keeping size
*       % Multiply to zero out results for non-curve points. Gives matrix M
tt      % Duplicate twice
1=z     % Number of ones
2=      % Does it equal 2? This is condition 1
wss     % Swap. Sum of matrix
G       % Push input again
zqE     % Number of nonzeros values minus 1, and then multiplied by 2
=       % Are they equal? This is condition 2
*       % Multiply. This is a logical AND of conditions 1 and 2
G       % Push input again
z1=     % Does it contain exactly one nonzero value? This is condition 3
+       % Add. This is a logical OR with condition 3
?}      % If result was false
  _q    %   Negate and subtract 1. This makes sure we get a negative value
]       % End
ss      % Sum of matrix M
y       % Duplicate sum of matrix D from below
-       % Subtract
h       % Concatenate horizontally
2/      % Divide by 2. Implicitly display

1 बातचीत सफलता की कुंजी है


1

पायथन 3 , 316 315 311 बाइट्स

मुझे लगता है कि यह सभी मामलों को कवर करता है; कम से कम परीक्षण के मामले काम करते हैं।

इसके अलावा, निश्चित रूप से नीचे गोल्फ के लिए अभी भी बहुत कुछ है, शायद शुरुआत में जहां किनारे के मामलों को संभाला जाता है।

def f(d,R,C):
 s=sum;d=[0]*(C+2),*[[0,*r,0]for r in d],[0]*(C+2);o=-1,0,1;k=[[[(1,0),(0,1)][i*j]for i in o for j in o if d[r+i][c+j]and i|j]for c in range(1,-~C)for r in range(1,-~R)if d[r][c]];w=[x/2for x in map(s,zip(*s(k,[])))]or[0,0];print([w,-1][s(w)!=s([s(z)for z in d])-1or[len(t)for t in k].count(1)>2])

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

यह काम किस प्रकार करता है:

  1. d,R,C 1. सूची के रूप में 1 के रूप में वक्र और 0 के रूप में पृष्ठभूमि के साथ सूचियों की एक सूची है। 2. पंक्ति और स्तंभ गणना
  2. 0 के पहले और बाद की पंक्ति और 0 के पहले और बाद के कॉलम को सम्मिलित करें dताकि हमें 2d सरणी के किनारे के बारे में चिंता न करनी पड़े
  3. 2d सरणी में प्रत्येक 1 के लिए, पड़ोस को 1 के लिए स्कैन करें और सूची में जोड़ें (1,0) यदि संबंध विकर्ण है, तो और जोड़ें (0,1)
  4. सभी टुपल्स, ताकि (n, m) क्रमशः विकर्ण और गैर-विकर्ण पड़ोसियों की संख्या का प्रतिनिधित्व करता है
  5. जांचें कि क्या संबंधों की संख्या ठीक 1 के शून्य से एक की संख्या है; यदि नहीं, तो वक्र नहीं।

एक लापता मामले की ओर इशारा करने के लिए @ हेलका होम्बा का धन्यवाद। गोल्फ टिप्स के लिए @TuukkaX और @Trelzevir को धन्यवाद।


ऐसा लगता है कि d=[[1,0,1],[0,1,0],[1,0,1]]यहां असफल हो जाएगा (जोड़ा गया अंडकोष)।
केल्विन के शौक

@ हेलकाहोम्बा आप सही कह रहे हैं, मैं देख रहा हूं। धन्यवाद! इसे निश्चित किया (अब दुर्भाग्य से अधिक बाइट्स के साथ)।
नील

1
s=sum4 बाइट्स बचाता है।
ट्रेलज़ेविर

0

गणितज्ञ, १५३ १५० बाइट्स

Switch[Sort[Join@@BlockMap[If[#[[2,2]]<1,Nothing,Tr[Tr/@#]]&,#~ArrayPad~1,{3,3},1]],{1},0,{2,2,3...},1/.#~ComponentMeasurements~"PolygonalLength",_,]&

के साथ, एक 2 डी सरणी ले जाता है 0के लिए रों .रों और 1के लिए है Xरों। Nullगैर-घटता के लिए आउटपुट ।

1/.#~ComponentMeasurements~"PolygonalLength"&

मैथेमेटिका में इसके लिए एक 45-बाइट अंतर्निहित है, लेकिन यह इनपुट के लिए गैर-घटता और 1 / sqrt (2) के लिए कुछ संख्याओं को आउटपुट करता है {{1}}। इन लागतों को ठीक करने के लिए 105 बाइट (गोल्फ हो सकती है?)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.