มารยาทในการดำรงตำแหน่ง


24

พื้นหลัง

มารยาทในห้องน้ำเมื่อเกี่ยวข้องกับโถฉี่ที่มีอยู่ระบุว่าโถปัสสาวะต่อไปที่ควรเติมควรเป็นถังที่ช่วยลดความรู้สึกไม่สบายทั้งหมด สมการไม่สบายทั้งหมดนั้นได้มาจากชุดสมการต่อไปนี้:

dist (x, y) = ระยะห่างเชิงเส้นระหว่าง person x และ person y ในหน่วยปัสสาวะ
 (x) = ผลรวม (1 / (dist (x, y) * dist (x, y)) สำหรับทุกคน y ไม่รวมบุคคล x
 total_Discomfort = sum (ไม่สบาย (x)) สำหรับ x ทั้งหมด

คุณสามารถดูบทความเชิงลึกเกี่ยวกับปัญหาที่คล้ายกัน (ไม่เหมือนกัน) ได้ที่นี่: (ขอบคุณ @Lembik ที่แจ้งให้ฉันทราบถึงกระดาษแข็งสีขาวที่น่าทึ่งนี้!)


Input / Output

ให้อินพุตของโถฉี่ที่ว่างเปล่าและเต็มเอาท์พุทชุดผลลัพธ์ของโถฉี่ด้วยการเพิ่มคนเดียว หากมีเน็คไทสำหรับตำแหน่ง Urinals ควรกรอกข้อมูลจากซ้ายไปขวา เอาต์พุตควรอยู่ในรูปแบบเดียวกับอินพุต

  • หากได้รับกรณีที่มีโถฉี่เต็มให้กลับเข้า
  • อินพุตจะมีการกำหนดปัสสาวะอย่างน้อยหนึ่งครั้งเสมอ


กรณีทดสอบ

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


กฎระเบียบ

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ ห้ามลูปรูมาตรฐาน


2
ปัญหาที่เกี่ยวข้อง: codegolf.stackexchange.com/questions/47952/the-urinal-protocol
hobbs

1
ขอแนะนำให้รอประมาณหนึ่งสัปดาห์ก่อนรับคำตอบ การยอมรับในเวลาน้อยกว่าหนึ่งวันอาจลดจำนวนคำตอบที่คุณได้รับ
Emigna

1
ผมขอแนะนำให้เพิ่ม0100และ101000ในกรณีทดสอบ (บางงานวิธี regex ที่เอามาจากกรณีทดสอบที่เกิดขึ้นจริง แต่จะไม่ทำงานกับคนเหล่านั้นซึ่งจะยังคงได้รับการจัดการ)
Dada

ยังเกี่ยวข้องกับ: codegolf.stackexchange.com/questions/94074/ …
ติตัส

@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

JavaScript (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

R, 83 76 67 ไบต์

เพิ่งรู้ว่าฉันสามารถบันทึกหลายไบต์โดยไม่รบกวนเพื่อตรวจสอบว่าโถฉี่ผู้สมัครว่างเปล่า โถฉี่ที่ไม่ว่างเปล่าจะคืนInfค่าความรู้สึกไม่สบายให้กับพวกเขาดังนั้นพวกเขาจึงถูกยกเว้นในการคำนวณ นอกจากนี้เพียงแค่ใช้การจัดทำดัชนีโดยตรงแทนreplaceดังนั้นจึงสั้นกว่า แต่สง่างามน้อยลง

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

คำอธิบาย

x=scan()

เราอ่านสถานะปัจจุบันจาก stdin xและเรียกมันว่า เราสมมติว่าอินพุตเป็นลำดับของ1s และ0s คั่นด้วยช่องว่างหรือบรรทัดใหม่ 1 0 0 0 0 0 1สำหรับวัตถุประสงค์ของคำอธิบายที่สมมติว่าเราป้อนข้อมูล

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

เราแทนที่ค่าของxดัชนีหนึ่ง ๆ ด้วย 1 ทุกสิ่งระหว่างนั้น[ ]คือการหาว่าดัชนีที่ดีที่สุดคืออะไร

เนื่องจากโถฉี่ที่มีอยู่นั้นไม่เปลี่ยนรูปเราจึงไม่จำเป็นต้องพิจารณาระยะห่างระหว่างพวกมัน เราต้องพิจารณาระยะห่างระหว่างโถฉี่ที่ถูกยึดครองกับระยะทางใหม่ที่เป็นไปได้ ดังนั้นเราจึงกำหนดดัชนีของโถฉี่ที่ถูกครอบครอง เราใช้ฟังก์ชั่นที่จะกลับดัชนีของเวกเตอร์ตรรกะซึ่งเป็นwhich TRUEตัวเลขทั้งหมดใน R เมื่อถูกบังคับให้พิมพ์logicalจะเป็นจำนวนที่TRUEไม่ใช่ศูนย์และFALSEถ้าเป็นศูนย์ การทำเช่นwhich(x)นั้นจะส่งผลให้เกิดข้อผิดพลาดประเภทargument to 'which' is not logicalเช่นเดียวxกับเวกเตอร์ที่เป็นตัวเลข เราจึงต้องบีบบังคับให้เป็นตรรกะ !คือฟังก์ชันการปฏิเสธแบบลอจิคัลของ R ซึ่งจะรวมเข้ากับลอจิคัลโดยอัตโนมัติ นำไปใช้สองครั้ง, !!xให้ผลเป็นเวกเตอร์ของTRUEและFALSEระบุว่าโถฉี่ใดถูกครอบครอง (ทางเลือก 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ฟังก์ชั่นเพื่อรับ "การลบด้านนอก" ซึ่งเป็นเมทริกซ์ระยะทางต่อไปนี้ระหว่าง urinals ทั้งหมดและ urinals ที่ถูกครอบครอง:

[, 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พลังที่ (สำหรับผู้ที่สูญเสียไปเล็กน้อยใน OP หมายถึง "ความรู้สึกไม่สบาย" หมายถึง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

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

Python 3 223 222 165 Bytes

โอเคฉันรู้ว่านี่ไม่ใช่คำตอบที่สวยที่สุดและฉันแน่ใจว่ามันสามารถลงสนามได้ไม่น้อย แต่ฉันก็แค่ล้อเล่นไปรอบ ๆ และเห็นสิ่งที่ฉันสามารถทำได้

ส่งเสียงไปที่ 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

ขอบคุณสำหรับเคล็ดลับช่องว่างนั้น ฉันไม่รู้แน่นอน ที่น่ากลัว!
bioweasel

เคล็ดลับช่องว่างนั้นใช้งานได้ใน Python 2 เท่านั้นฉันคิดว่า อาจเป็นรุ่นแรก ๆ ของ Python 3 แต่เป็น idk คุณจะต้อง จำกัด คำตอบของคุณไว้กับ Python 2 หรือ 3 เวอร์ชันที่เฉพาะเจาะจงเพื่อใช้งาน
mbomb007

ฉันได้รับมันทำงานในเชลล์ 3.5.2 ใน IDLE และมันทำงานโดยไม่มีปัญหาดังนั้นฉันคิดว่ามันยังคงเป็นไร
bioweasel

2

Python 3, 574 471 347 ไบต์

ฉันอาจจะทำสิ่งนี้มากกว่านี้เพราะการใช้ Python ตัวอื่นนั้นเป็นหนึ่งในห้าของอันนี้: [

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

Python, 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เพื่อบันทึก byte
FlipTack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.