एक लूप के अंदर का पता लगाएं


14

कार्य

एक पाश के ASCII आरेख को देखते हुए

जैसे

....................
......@@@@@.........
......@...@.........
.....@@...@@@@@.....
....@@........@.....
....@........@@.....
....@@@@@@@@@@......
....................
....................

और लूप पर एक स्थान

जैसे

(7,1)

आपको लूप के अंदर और बाहर खोजना होगा

जैसे

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

विशेष विवरण

  • आप आरेख को इनपुट के रूप में ले सकते हैं जैसे कि newlines या स्पष्ट समकक्ष द्वारा अलग किए गए स्ट्रिंग

  • आप अपने इनपुट के भाग के रूप में लूप (0 या 1 अनुक्रमित) पर एक समन्वय प्राप्त करेंगे। आप अपनी इच्छा किसी भी स्थान पर रख सकते हैं। आप इस में समन्वय लग सकता है (<row>, <column>), (<column>, <row>)या स्ट्रिंग पर रैखिक स्थिति के रूप में। आप किसी उचित विधि में ये डेटा प्राप्त कर सकते हैं। लूप पर सभी वर्ण उस सूचकांक पर वर्ण के समान होंगे।

  • पसंदीदा उत्पादन truthy और falsy मूल्यों की एक 2 आयामी सरणी, के तार है, लेकिन 1और 0नई पंक्तियों या बाद में दोनों में से किसी भी स्पष्ट बराबर स्वीकार कर रहे हैं से अलग कर दिया। अंदर और बाहर अलग-अलग सत्य मूल्य होने चाहिए, लेकिन इससे कोई फर्क नहीं पड़ता कि कौन सा है।

  • एक लूप को वर्णों के एक समूह के रूप में परिभाषित किया जाता है जैसे कि वे सभी एक ही वर्ण ( जैसे@ ) हैं और इसलिए कि लूप के प्रत्येक वर्ण में मूल वर्ण (इनपुट के समन्वय पर वर्ण) का एक मार्ग होता है जो केवल उसी से होकर गुजरता है चरित्र (टैक्सीकैब ज्यामिति कोई विकर्ण )।

  • अंदर सभी लूप स्वयं हैं और वे स्थान जो लूप को पार किए बिना आरेख के किनारे तक नहीं पहुंच सकते हैं।

  • बाहर हर जगह है

  • यह

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

pastebin


क्या हम तार में रैखिक निर्देशांक के रूप में निर्देशांक भी ले सकते हैं?
16:17 पर दोष

@flawr आप कर सकते हैं।
पोस्ट रॉक गार्फ हंटर

क्या हमें आरेख को वर्णों के मैट्रिक्स के रूप में लेने की अनुमति है, sth। के [['.', '.'],['.', '@']]बजाय की तरह newlines के साथ एक स्ट्रिंग?
१६

@ हवादर्ट्स एक स्पष्ट समकक्ष है
पोस्ट रॉक गार्फ हंटर

1
@WheatWizard अतिरिक्त परीक्षण मामले के लिए धन्यवाद! हालाँकि मैं उन्हें एक स्निपेट में या एक
जिस्ट

जवाबों:


6

MATLAB, 163 159 146 78 बाइट्स

function m=f(m,y,x);[~,i]=bwfill(m~=m(y,x),x,y,8);m=m*0;m(i)=1;m=bwfill(m,'h')

धन्यवाद @ rahnema1 for -66 बाइट्स !!!

अब यह ऑनलाइन कोशिश पर काम करता है ! लेकिन कुछ समायोजन की आवश्यकता थी, क्योंकि MATLAB और ऑक्टेव पूरी तरह से संगत नहीं हैं।

व्याख्या

पहले हम एक द्विआधारी छवि बनाते हैं जो केवल उन सभी पात्रों को मास्क करता है जो प्रारंभिक चरित्र के बराबर हैं। फिर हम कनेक्ट किए गए घटक को निर्धारित करते हैं कि प्रारंभिक वर्ण अंदर है।

% determine the connected component that is contains initial character

[~,i]=bwfill(m~=m(y,x),x,y,8);     % i contains the indices of the connected component
m=m*0;m(i)=1;                      % create an image of the connected component

उसके बाद हम उस जुड़े हुए घटक की एक छवि बनाते हैं और छवि में सभी "छेद" भरते हैं।

m=bwfill(m,'h')

मुझे लगता है कि गोल्फ के लिए ऑक्टेव बेहतर है इसलिए आप इसे कम से कम 72 बाइट्स तक कम कर सकते हैं
rahnema1

@ rahnema1 मैंने पहले ही MATLAB में शुरू कर दिया था, इसलिए मैं अब इसे प्रस्तुत करने वाला नहीं हूं, लेकिन सुझाव के लिए धन्यवाद =)
त्रुटी

5

MATLAB: 67 बाइट्स

function A=f(A,r,c),A=bwlabel(A==A(r,c),4);A=imfill(A==A(r,c),'h');

कुछ युगल:

  • A एक चरित्र सरणी माना जाता है।
  • MATLAB में इंडेक्स पहले-आधारित पंक्तियों के साथ, 1-आधारित हैं। यह माना जाता है कि ये परिवर्तन फ़ंक्शन इनपुट के लिए किए जाएंगे (यानी प्रश्न उदाहरण के रूप में कहा जाएगा output = f(A,2,8))।
  • bwlabelऔर imfillइमेज प्रोसेसिंग टूलबॉक्स का हिस्सा हैं।

1
codegolf में आपका स्वागत है!
rahnema1

@ rahnema1: अचंभित मैं इतनी जल्दी नहीं गया, क्योंकि मैंने इस साइट के जन्म से पहले एसओ पर कुछ गोल्फिंग की थी।
ग्नोविस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.