स्थिति बाथरूम शिष्टाचार


24

पृष्ठभूमि

बाथरूम शिष्टाचार, जब उपलब्ध मूत्रल से संबंधित होता है, कहता है कि अगला मूत्रालय भरा होना चाहिए जो कुल असुविधा को कम करता है। कुल असुविधा समीकरण के निम्नलिखित सेट द्वारा दी गई है:

dist (x, y) = यूरिनल यूनिट्स में व्यक्ति x और व्यक्ति y के बीच रैखिक दूरी
 असुविधा (x) = sum (1 / (dist (x, y) * Dist (x, y)) सभी व्यक्तियों के लिए y छोड़कर व्यक्ति x
 Total_Discomfort = sum (असुविधा (x)) सभी x के लिए

एक समान (समान सटीक नहीं) समस्या से निपटने के लिए अधिक गहराई के कागज यहां देखे जा सकते हैं: (मुझे इस अद्भुत श्वेतपत्र से सावधान करने के लिए @Lembik के लिए धन्यवाद!)


इनपुट आउटपुट

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

  • यदि पूर्ण यूरिनल के साथ मामला दिया जाता है, तो इनपुट वापस करें।
  • इनपुट में हमेशा कम से कम एक मूत्रल परिभाषित होगा।


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

INPUT -> OUTPUT
1000001 -> 1001001
101010101 -> 111010101
100 -> 101
00000 -> 10000
1111111 -> 1111111
0100 -> 0101
101000 -> 101001


नियम

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है। मानक लूप-होल निषिद्ध हैं।


2
संबंधित समस्या: codegolf.stackexchange.com/questions/47952/the-urinal-protocol
hobbs

1
एक उत्तर को स्वीकार करने से पहले लगभग एक सप्ताह इंतजार करने की सलाह दी जाती है। एक दिन से भी कम समय में स्वीकार करने से आपकी चुनौती के जवाबों की मात्रा घट सकती है।
15

1
मैं जोड़ने का सुझाव देता हूं 0100और 101000परीक्षण के मामलों में (कुछ regex- आधारित दृष्टिकोण वास्तविक परीक्षण मामलों पर काम करते हैं, लेकिन उन लोगों पर काम नहीं करेंगे जिन्हें अभी भी संभाला जाना चाहिए)
दादा


@ TheBitByte यह कैसे आक्रामक है? यह एक बहुत सटीक वर्णन है कि पुरुष बाथरूम में यूरिनल कैसे चुनते हैं।
mbomb007

जवाबों:


3

जेली , 13 12 बाइट्स

J_þTݲSiṂ$Ṭo

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

व्याख्या

J_þTݲSiṂ$Ṭo  Input: boolean array A
J             Indices, returns [1, 2, ..., len(A)]
   T          Truthy indices, returns the indices which have a truthy value
 _þ           Form the subtraction (_) table (þ) between them
    İ         Inverse, find the reciprocal of each
     ²        Square each
      S       Sum the sublists column-wise
         $    Monadic chain
        Ṃ       Minimum
       i        Find the first index of that
          Ṭ   Untruth indices, returns a boolean array with 1's at those indices
           o  Logical OR between that and A, and return

10

MATL , 19 18 17 बाइट्स

lyf!Gn:-H_^Xs&X<(

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें (थोड़ा संशोधित कोड)।

व्याख्या

यह प्रत्येक संभावित नई स्थिति से पहले से ही कब्जा किए गए लोगों के लिए दूरी की गणना करने के लिए पर्याप्त है। शेष दूरी संभावित नई स्थिति पर निर्भर नहीं होती है, और इसलिए एक निरंतर अवधि का गठन किया जाता है, जिसे अनदेखा किया जा सकता है।

[1 0 0 0 0 0 1]एक उदाहरण के रूप में इनपुट लेते हैं ।

l      % Push 1
       % STACK: 1
y      % Take input implicitly. Duplicate from below
       % STACK: [1 0 0 0 0 0 1], 1, [1 0 0 0 0 0 1]
f!     % Indices of nonzero elements, as a column array
       % STACK: [1 0 0 0 0 0 1], 1, [1 7]
Gn:    % Push [1 2 ... n], where n is input size (array of possible positions)
       % STACK: [1 0 0 0 0 0 1], 1, [1; 7], [1 2 3 4 5 6 7]
-      % Matrix with all pairs of differences 
       % STACK: [1 0 0 0 0 0 1], 1, [1; 7], [0 -1 -2 -3 -4 -5 -6;
                                             6  5  4  3  2  1  0]
H_^    % Raise each entry to -2
       % STACK: [1 0 0 0 0 0 1], 1, [   Inf 1.0000 0.2500 0.1111 0.0625 0.0400 0.0278;
                                     0.0278 0.0400 0.0625 0.1111 0.2500 1.0000    Inf]
Xs     % Sum of each column
       % STACK: [1 0 0 0 0 0 1], 1, [Inf 1.04 0.3125 0.2222 0.3125 1.04 Inf]
&X<    % Index of minimum. Takes the first if there is a tie
       % STACK: [1 0 0 0 0 0 1], 1, 4
(      % Assign: write 1 at the position of the minimizer
       % STACK: [1 0 0 1 0 0 1]
       % Implicitly display

4

जावास्क्रिप्ट (ईएस 6), 89 बाइट्स

a=>a[a.map((e,i)=>!e&&(t=0,a.map((e,j)=>t+=(j-=i)&&e/j/j),t<m&&(m=t,k=i)),k=0,m=1/0),k]=1

इनपुट सरणी को संशोधित करके आउटपुट।


4

आर, 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साथ वैल्यू को बदल देते हैं 11111इनपुट के रूप में, इससे कोई फर्क नहीं पड़ता कि हम किसकी जगह लेते हैं, फिर भी हमारे पास एक वैध आउटपुट होगा।

x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1

संशोधित इनपुट लौटाएं।

x

2

PHP, 135 बाइट्स

$a=explode(1,$argv[1]);$b=0;foreach($a as$c=>$d){$l=strlen($d);if($l>$b){$b=$l;$e=$c;}}if($b)$a[$e][intval($b/2)]=1;echo implode(1,$a);

मुझे यकीन है कि ऐसा करने का एक बहुत तेज़ तरीका है, लेकिन मुझे एक फजी सिर मिल गया है और वह एक के बारे में नहीं सोच सकता है!

पुराना कोड

बिना मिनिमाइजेशन वाला कोड:

$a=explode(1,$argv[1]);
$b=0;
foreach($a as $c=>$d){
    $l=strlen($d);
    if($l>$b){
        $b=$l;
        $e=$c;
    }
}
if($b){
    $a[$e][intval($b/2)]=1;
}
echo implode(1,$a);

2

पायथन 3 223 222 165 बाइट्स

ठीक है, मुझे पता है कि यह सबसे सुंदर जवाब नहीं है, और मुझे यकीन है कि इसे थोड़ा नीचे गिराया जा सकता है, लेकिन मैं बस गड़बड़ कर रहा था और देख रहा था कि मैं क्या कर सकता हूं।

व्हॉट्सएप और कंप्रेशर्स पर टिप्स के लिए mbomb007 पर जाएं। इसके अलावा, मैंने देखा कि मेरा ऑनलाइन कैरेक्टर काउंटर सभी टैब ले रहा था और उन्हें स्पेस में बदल रहा था, इसलिए मेरे लिए मूल रूप से गिनती बहुत कम है

def u(a):
 m,r,x=9,0,len(a)
 for i in range(x): 
    d=0
    if a[i]<'1':
     for j in range(x):
        if a[j]>'0':d+=float((j-i)**-2)
     if d<m:r=i;m=d
 return a[:r]+'1'+a[r+1:]

संशोधित व्हाट्सएप दिखा रहा है:

def u(a):
<sp> m,r,x=9,0,len(a)
<sp> for i in range(x): 
<tab> d=0
<tab> if a[i]<'1':
<tab><sp> for j in range(x):
<tab><tab> if a[j]>'0':d+=float((j-i)**-2)
<tab><sp> if d<m:r=i;m=d
<sp> return a[:r]+'1'+a[r+1:]

मूल:

def u(a):
    m,r,x=9,0,len(a)
    for i in range(x): 
        d=0
        if a[i]!='1':
            for j in range(x):
                if a[j]=='1':d+=float(1/(j-i)**2)
            if d<m:r=i;m=d
    return a[:r]+'1'+a[r+1:]

यह अपेक्षा करता है कि यह 1 और 0 की तरह "10001"एक स्ट्रिंग को पास करे और एक स्ट्रिंग लौटाए"10101"

संपादित करें: बदल दिया 1/float((j-i)**2)गयाfloat((j-i)**-2)


!='1'हो सकता है <'1'और =='1'हो सकता है >'0'। इसके अलावा, इस टिप
mbomb007

उस व्हॉट्सएप टिप के लिए धन्यवाद। निश्चित तौर पर मुझे यह पता नहीं था। वह तो कमाल है!
बायोवाल

मुझे लगता है कि व्हाट्सएप टिप केवल पायथन 2 में काम करता है। शायद पायथन 3 के शुरुआती संस्करण, लेकिन आइडीके। आपको अपना उत्तर पायथन 2 या 3 के कुछ विशिष्ट संस्करण के साथ काम करने के लिए सीमित करना होगा।
mbomb007

मैं इसे एक 3.5.2 शेल में चल रहा हूँ और यह बिना किसी समस्या के चल रहा है, इसलिए मुझे लगता है कि यह अभी भी ठीक है
bioweasel

2

पायथन 3, 574 471 347 बाइट्स

मैं शायद इस पर कुछ और काम करूँगा, अन्य पायथन समाधान पर विचार करना इस पांचवें के समान है: [।

def a(I):
 D,l,r={},len(I),range
 for i in r(l):
  if I[i]<1:
   n,t,n[i]=I[:],[],1
   for j in r(l):
    if n[j]>0:
     q,Q=[],0
     for k in r(l):
      if k!=j and n[k]>0:q.append((k-j,j-k)[k<j])
     for i in q:Q+=1/(i**2)
    t.append(Q)
   T=sum(t)
   if T not in D.keys():D[T]=i
 if len(D)>0:I[D[min(D.keys())]]=1
 print(I)

खैर अब यह बहुत बेहतर है कि मैंने सीखा है कि आप सिंगल स्पेस का उपयोग कर सकते हैं।


1

पायथन, 165 163 158 147 141 140 139 बाइट्स

def u(p):e=enumerate;a=[(sum((i-j)**-2for j,y in e(p)if"0"<y),i)for i,x in e(p)if"1">x];return a and p[:min(a)[1]]+"1"+p[min(a)[1]+1:] or p

if"1"*len(p)==p:return pएक बाइट को बचाने के लिए दूसरी पंक्ति को फिर से
लिखें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.