পজিশনাল বাথরুম শিষ্টাচার


24

পটভূমি

বাথরুমের শিষ্টাচার, উপলভ্য প্রস্রাবের সাথে সম্পর্কিত হয়ে বলে যে পরবর্তী মূত্রটি পূরণ করতে হবে যা সম্পূর্ণ অস্বস্তি হ্রাস করতে পারে। মোট অস্বস্তি সমীকরণ নিম্নলিখিত সমীকরণগুলির সেট দ্বারা দেওয়া হয়:

ডিস্ট (x, y) = ইউরিনাল ইউনিটগুলিতে ব্যক্তির এক্স এবং ব্যক্তির y এর মধ্যে রৈখিক দূরত্ব = এক্স
 (x) = যোগ (1 / (ডিস্ট (এক্স, y) * ডিএস (এক্স, ওয়াই))) x ব্যতীত সকল ব্যক্তির জন্য
 সমস্ত এক্স এর জন্য অ্যাসোসিয়েশন = যোগফল (অস্বস্তি (এক্স))

অনুরূপ (ঠিক একই নয়) সমস্যার সাথে গভীরভাবে কাজ করার আরও গভীরতার কাগজ এখানে পাওয়া যাবে: (এই আশ্চর্যজনক হোয়াইটপেপার সম্পর্কে আমাকে সতর্ক করার জন্য @ লিলিককে ধন্যবাদ!)


ইনপুট আউটপুট

খালি এবং পূর্ণ ইউরিনালের একটি ইনপুট দেওয়া হয়েছে, একজন ব্যক্তির সংযোজন সহ ইউরিনালগুলির ফলস্বরূপ সেট আউটপুট করুন। যদি কোনও পজিশনের জন্য কোনও টাই থাকে তবে ইউরিনালগুলি বাম থেকে ডানে পূরণ করা উচিত। আউটপুট ইনপুট হিসাবে একই বিন্যাসে হওয়া উচিত।

  • যদি পুরো ইউরিনাল দিয়ে কেস দেওয়া হয় তবে ইনপুটটি ফিরিয়ে দিন।
  • ইনপুটটিতে সর্বদা কমপক্ষে একটি ইউরিনাল সংজ্ঞায়িত হবে।


পরীক্ষার মামলা

ইনপুট -> আউটপুট
1000001 -> 1001001
101010101 -> 111010101
100 -> 101
00000 -> 10000
1111111 -> 1111111
0100 -> 0101
101000 -> 101001


বিধি

এটি , তাই বাইট জেতে সংক্ষিপ্ততম কোড। স্ট্যান্ডার্ড লুপ-গর্ত নিষিদ্ধ।



1
উত্তর গ্রহণের আগে প্রায় এক সপ্তাহ অপেক্ষা করার পরামর্শ দেওয়া হয়। এক দিনেরও কম সময়ে গ্রহণ করা আপনার চ্যালেঞ্জের উত্তরগুলির পরিমাণ হ্রাস করতে পারে।
এমিগানা

1
আমি যুক্ত করার 0100এবং 101000পরীক্ষার ক্ষেত্রে পরামর্শ দেব (কিছু প্রকৃত পরীক্ষার ক্ষেত্রে রেজেেক্স-ভিত্তিক পদ্ধতির কাজ করে তবে এখনও যেগুলি পরিচালনা করা উচিত সেগুলি নিয়ে কাজ করবে না)
দাদা


@ দ্য বিটবাইট কীভাবে আপত্তিকর? পুরুষরা কীভাবে বাথরুমে ইউরিনাল বেছে নেয় তার একটি দুর্দান্ত নির্ভুল বর্ণনা।
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

এমএটিএল , 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

জাভাস্ক্রিপ্ট (ES6), 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 এর সাথে প্রতিস্থাপন করি the এর মধ্যে সমস্ত [ ]কিছুই সেরা সূচকটি কী তা নির্ধারণ করে।

যেহেতু বিদ্যমান ইউরিনালগুলি পরিবর্তনযোগ্য নয় তাই আমাদের মধ্যে তাদের মধ্যকার দূরত্বগুলি বিবেচনা করার দরকার নেই। আমাদের কেবল অধিকৃত ইউরিনাল এবং সম্ভাব্য নতুনের মধ্যে দূরত্ব বিবেচনা করা দরকার। সুতরাং আমরা দখলযুক্ত মূত্রের সূচকগুলি নির্ধারণ করি। whichলজিকাল ভেক্টরের সূচকগুলি ফিরিয়ে আনতে আমরা একটি ফাংশন ব্যবহার করি TRUE। আর-তে সমস্ত সংখ্যা, যখন টাইপ করতে বাধ্য হয় logical, তা TRUEযদি ননজারো হয় এবং FALSEশূন্য হয়। কেবলমাত্র করছেন which(x)এক ধরনের ত্রুটি স্থাপিত হবে, argument to 'which' is not logical, যেমন xএকটি সাংখ্যিক বাহক। সুতরাং আমরা এটি যৌক্তিক জোর করতে হবে। !আর এর লজিকাল নেগ্রেশন ফাংশন, যা স্বয়ংক্রিয়ভাবে যৌক্তিকতায় প্রচ্ছন্ন হয়। এটি দুটিবার প্রয়োগ করা, এবং এর !!xএকটি ভেক্টর দেয়TRUEFALSEকোন ইউরিনাল দখল করা হয়েছে তা নির্দেশ করে। (লজিক্যাল বিকল্প বাইট সমতুল্য coercions লজিক্যাল অপারেটর জড়িত &এবং |এবং builtins 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যা সমস্ত ইউরিনাল এবং অধিষ্ঠিত ইউরিনালের মধ্যে দূরত্বের নিম্নলিখিত ম্যাট্রিক্স:

[, 1] [, 2]

[1,] 0 -6

[2,] 1 -5

[3,] 2 -4

[4,] 3 -3

[5,] 4 -2

[6,] 5 -1

[7,] 6 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))

এবং যাইহোক, আমাদের অনুকূল মূত্রের সূচক রয়েছে। আমরা এই সূচিতে মানকে প্রতিস্থাপন xসঙ্গে 1। ক্ষেত্রে 1111যেমন ইনপুট, এটা কোন ব্যাপার না যা এক আমরা প্রতিস্থাপন, আমরা এখনও একটি বৈধ আউটপুট আছে।

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

পরিবর্তিত ইনপুট ফিরিয়ে দিন।

x

2

পিএইচপি, 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 এ চিত্কার করুন, এছাড়াও আমি দেখেছি যে আমার অনলাইন চরিত্রের কাউন্টারটি সমস্ত ট্যাবগুলি নিয়ে গেছে এবং সেগুলিকে স্পেসে পরিণত করছে, সুতরাং গণনাটি আমি মূলত আমার চেয়ে অনেক কম ছিল is

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 শেলের মধ্যে চলতে পেয়েছি এবং এটি কোনও সমস্যা ছাড়াই চলছে, সুতরাং আমি মনে করি এটি এখনও ঠিক আছে
বাইওয়েজেল

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)

ওয়েল এটি এখন আরও ভাল যে আমি শিখেছি আপনি একক স্পেস ব্যবহার করতে পারেন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.