आर, 83 76 67 बाइट्स
बस मुझे एहसास हुआ कि उम्मीदवार यूरिनल खाली हैं या नहीं, यह जांचने की जहमत न उठाकर मैं कई बाइट्स बचा सकता हूं। गैर-खाली यूरिनल हमेशा एक Infअसुविधा मान लौटाएंगे , इसलिए उन्हें गणना के दौरान बाहर रखा गया है। इसके अलावा, बस के बजाय प्रत्यक्ष अनुक्रमण का उपयोग कर replace, तो यह कम लेकिन कम सुंदर है।
x=scan()
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
x
व्याख्या
x=scan()
हम वर्तमान स्थिति को स्टड से पढ़ते हैं और इसे कॉल करते हैं x। हम मानते हैं कि इनपुट का क्रम है 1और 0रिक्त स्थान या नई पंक्तियों द्वारा अलग रहा है। स्पष्टीकरण के प्रयोजनों के लिए, मान लें कि हम इनपुट करते हैं 1 0 0 0 0 0 1।
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
हम xएक विशेष सूचकांक में 1. के साथ एक मान को प्रतिस्थापित करते हैं। सब कुछ के बीच [ ]यह पता लगा रहा है कि सबसे अच्छा सूचकांक क्या है।
चूंकि मौजूदा यूरिनल अपरिवर्तनीय हैं, इसलिए हमें उनके बीच की दूरी पर विचार करने की आवश्यकता नहीं है। हमें केवल कब्जे वाले मूत्रालयों और संभावित नए के बीच की दूरी पर विचार करने की आवश्यकता है। इसलिए हम कब्जे वाले मूत्रालयों के सूचकांक का निर्धारण करते हैं। हम उपयोग करते हैं which, एक तार्किक वेक्टर के सूचकांकों को वापस करने के लिए एक फ़ंक्शन जो हैं TRUE। आर में सभी संख्या, जब टाइप करने के लिए मजबूर किया जाता है logical, TRUEयदि नॉनजरो और FALSEयदि शून्य हो। बस करने के which(x)परिणामस्वरूप एक प्रकार की त्रुटि होगी argument to 'which' is not logical, जैसा xकि एक संख्यात्मक वेक्टर है। इसलिए हमें इसे तार्किक रूप से प्रस्तुत करना होगा। !R का तार्किक निषेध फ़ंक्शन है, जो स्वचालित रूप से तार्किक के साथ समन्वय करता है। इसे दो बार लगाने से, !!xवेक्टर की TRUEऔर पैदावार होती हैFALSEयह दर्शाता है कि किन मूत्रालयों पर कब्जा है। (तार्किक बाइट के लिए वैकल्पिक बाइट-समतुल्य ज़बरदस्त तार्किक ऑपरेटरों &और |बिलिंस को शामिल करता है Tऔर F, जैसे F|xया T&xतो और !!xअधिक विस्मयादिबोधक लगता है इसलिए हम इसका उपयोग करेंगे।)
which(!!x)
इस के साथ युग्मित किया जाता है seq(x), जो पूर्णांक अनुक्रम को लौटाता 1है x, अर्थात सभी मूत्रल स्थानों (और इस प्रकार सभी संभावित स्थानों पर विचार करने के लिए) से।
seq(x)
अब हमारे पास हमारे कब्जे वाले मूत्रालयों के संकेत हैं: 1 7और हमारे खाली मूत्रालय 1 2 3 4 5 6 7। हम "एक्सट्रीम सबट्रैक्शन" प्राप्त `-`करने के लिए फंक्शन, सबट्रैक्शन फंक्शन पास करते हैं , outerजो सभी यूरिनल और ऑक्यूपाइड यूरिनल्स के बीच की दूरी का निम्न मैट्रिक्स है:
[, १] [, २]
[१,] ० -६
[२,] १ -5
[३], २ -४
[४], ३-३
[५,] ४ -२
[६,] ५ -१
[0], ६ ०
outer(seq(x),which(!!x),`-`)
हम इसे -2वें शक्ति तक बढ़ाते हैं । (उन लोगों के लिए, जो ओपी में थोड़ा खो गए हैं, "असुविधा" को परिभाषित किया गया है 1 / (distance(x, y) * distance(x, y)), जो सरल बनाता है 1/d(x,y)^2, अर्थात d(x,y)^-2।)
outer(seq(x),which(!!x),`-`)^-2
मैट्रिक्स में प्रत्येक पंक्ति का योग लें।
rowSums(outer(seq(x),which(!!x),`-`)^-2)
सबसे छोटे मूल्य का सूचकांक प्राप्त करें, यानी इष्टतम मूत्रालय। कई सबसे छोटे मूल्यों के मामले में, पहले (यानी सबसे बाईं ओर) एक लौटाया जाता है।
which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))
और voilà, हमारे पास इष्टतम मूत्रालय का सूचकांक है। हम इस इंडेक्स के xसाथ वैल्यू को बदल देते हैं 1। 1111इनपुट के रूप में, इससे कोई फर्क नहीं पड़ता कि हम किसकी जगह लेते हैं, फिर भी हमारे पास एक वैध आउटपुट होगा।
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
संशोधित इनपुट लौटाएं।
x