จงเคารพในห้องน้ำ


35

แน่นอนว่าเครือข่าย SE มีความรู้อย่างมากเกี่ยวกับวิธีการเคารพในห้องน้ำ แต่สำหรับผู้ที่ต้องการสรุปความเคารพหมายถึงการล้างห้องน้ำ ฯลฯ ที่สำคัญที่สุดแม้ว่ามันหมายถึงการใช้แผงลอยไกลออกไป จากคนอื่น ๆ ที่เป็นไปได้

ความท้าทาย

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

การป้อนข้อมูล

 0 1 2 3 4 5    <- The stall number which is not actually visible in the input. 
| | |-| |-|-|   <- the stalls

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

แผงลอยที่ใช้มี-อยู่ในนั้น (ระหว่างท่อ)

ผลลัพธ์

แผงขายของที่น่านับถือที่สุดคือร้านที่อยู่ห่างจากร้านที่ใช้งานมากที่สุด ระยะห่างระหว่างสองแผงคือค่าสัมบูรณ์ของความแตกต่างของตัวเลขที่อยู่เหนือพวกเขา

เพียงเพื่อจะชัดเจน: คุณกำลังมองหาระยะทางเฉลี่ยจากทั้งหมดของร้านไม่ได้เป็นเพียงแค่คนที่อยู่ใกล้เคียง

คุณต้องส่งออกจำนวนต่ำสุดของแผงเคารพมากที่สุดที่จะไปว่าเป็นที่ว่างเปล่า

ตัวอย่าง

Input:
|-| |-| OR 101
Output:
1

Input:
| | |-| |-|-| OR 001011
Output:
0

Input:
|-| |-| | | | |-|-| OR 101000011
Output:
1

Input: 
|-| | | | | |-|-| | | | | OR 100000110000
Output:
11

Input:
|-|-|-|-| | | | | | |-| OR 11110000001
Output:
9

Input:
|-| | OR 10
Output:
1

Input:
|-| | |-| OR 1001
Output:
1

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

คุณสามารถใช้การจัดทำดัชนีตาม 0 หรือ 1 ในคำตอบของคุณ - ตามที่คุณต้องการ; หากคุณใช้การจัดทำดัชนีตาม 1 คุณต้องพูดอย่างชัดเจนในคำตอบของคุณ


35
" แน่นอนเครือข่าย SE มีความรู้อย่างมากเกี่ยวกับวิธีการเคารพในห้องน้ำ " [อ้างจำเป็น]
อเล็กซ์ A.

7
@AlexA: ดูคำถามห้องน้ำและคำตอบเกี่ยวกับการท่องเที่ยวแทนการแลกเปลี่ยนเพื่อประเมินระดับการศึกษาของเครือข่าย SE (หรือเพื่อให้ความรู้ด้วยตนเอง)
Jonas

30
แต่ทุกคนรู้ว่าเกณฑ์ความยำเกรงคือการเพิ่มminimunระยะทางไม่ได้เฉลี่ย :-)
หลุยส์ Mendo

2
@Dopapp คุณควรเพิ่ม[1,0,0,1]เป็นกรณีทดสอบ กรณีทดสอบในปัจจุบันไม่มีการตรวจสอบหากความสัมพันธ์ถูกทำลายอย่างถูกต้อง
เดนนิส

8
ทำไม101000011ส่งคืน 1 (แทน 4 หรือ 5)
Amani Kilumanga

คำตอบ:


11

เยลลี่ , 10 9 ไบต์

JạþTS׬MḢ

ใช้การจัดทำดัชนีแบบอิง 1 ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

JạþTS׬MḢ  Main link. Argument: A (array of Booleans)

J          Yield all indices of A.
   T       Yield all truthy indices of A.
 ạþ        Compute the table of absolute differences.
    S      Compute the sums of all columns.
           For each index, this yields the sum of all distances to occupied stalls.
     ׬    Multiply each sum by the logical NOT of the corresponding Boolean in A.
           This zeroes sums that correspond to occupied stalls.
       M   Maximal; yield an array of all indices of maximal sums.
        Ḣ  Head; extract the first index.

ฉันเชื่อว่านั่นคือ 9 ตัวอักษรไม่ใช่ 9 ไบต์
René Nyffenegger

เยลลี่ใช้หน้ารหัสที่กำหนดเองที่เข้ารหัสอักขระเท่านั้นที่เข้าใจเป็นไบต์เดียว ไบต์เชื่อมโยงในจุดที่ส่วนหัวของมัน
Dennis

ฉันไม่รู้เรื่องนี้ ... ขอบคุณที่ชี้ให้เห็น
René Nyffenegger

@Dennis คุณสร้าง userscript ความคิดเห็นอัตโนมัติเพื่อให้คุณสามารถคลิกที่ "Jelly bytes comment" แล้วมันจะโพสต์หรือไม่
NoOneIsHere ที่นี่

@NoOneIsHere ฉันมี userscript นั้น ( ไม่ใช่ของฉัน ) แต่ฉันยังไม่ได้เพิ่มอันนี้ ฉันอาจจะควร ...
เดนนิส

6

Swift, 158, 157, 128, 100 Bytes

รับอินพุตจากArray<Bool>ตัวแปรiส่งคืนคำตอบจากนิพจน์สุดท้าย

let e=i.characters.map{$0>"0"}.enumerate()
e.flatMap{$1 ?nil:$0}.map{a in(a,e.flatMap{$1 ?$0:nil}.map{abs(a-$0)}.reduce(0){$0+$1})}.maxElement{$0.1 < $1.1}!.0

แก้ไข 1:

บันทึกเป็นไบต์ด้วยการแปลงเป็นบูลส์ด้วยการเปรียบเทียบสตริง

let e=i.characters.map{$0=="1"}.enumerate()
e.flatMap{$1 ?nil:$0}.map{a in(a,e.flatMap{$1 ?$0:nil}.map{abs(a-$0)}.reduce(0){$0+$1})}.maxElement{$0.1 < $1.1}!.0

แก้ไข 2:

ทำใหม่อัลกอริทึมของฉัน:

let e=i.characters.map{$0=="1"}.enumerate()
e.map{x in(x.0,x.1 ?0:e.reduce(0){$1.1 ?$0+abs(x.0-$1.0):$0})}.max{$0.1<$1.1}!.0

แก้ไข 3:

ใช้ประโยชน์จากกฎใหม่ที่อนุญาตให้รับข้อมูลโดยตรงจากอาร์เรย์บูลีน

let e=i.enumerated()
e.map{x in(x.0,x.1 ?0:e.reduce(0){$1.1 ?$0+abs(x.0-$1.0):$0})}.max{$0.1<$1.1}!.0

Ungolfed:

// for the sake of easier copy/pasting of input, take it as string
let s = "100000110000"

// convert input to true for taken, false for free
// this is the input the golfed version actually uses
let input = s.characters.map{$0>"0"}

// Returns an array of tuples storing the array values (vacancy of the stall) and their index (their location)
let valueIndexPairs = bools.enumerated()

// Returns an array of pairs of locations and their avg distance to others
let locationDistancePairs = valueIndexPairs.map{(valueIndexPair: (Int, Bool)) -> (Int, Int) in

    let averageDistance = valueIndexPairs.reduce(0) {partialSum, otherStall in

        let otherStallIsTaken = otherStall.1

        if otherStallIsTaken {
            //don't let other stalls effect average if they're taken
            return partialSum
        }
        else {
            let thisStallLocation = valueIndexPair.0
            let otherStallLocation = otherStall.0
            let distanceToOtherStall = abs(thisStallLocation - otherStallLocation)
            return partialSum + distanceToOtherStall 
        }       
    }

    //if this stall is taken, treat its average distance to others as 0
    let thisStallsLocation = valueIndexPair.0
    let isThisStallTaken = valueIndexPair.1
    return (thisStallsLocation, isThisStallTaken ? 0 : averageDistance)
}

//find location where average distance is maxiumum
let bestLocationIndexPair = locationDistancePairs.max{$0.1 < $1.1}!

let bestLocation = bestLocationIndexPair.0

print(bestLocation)

2
ฉันชอบคำตอบที่รวดเร็ว
downrep_nation

มันสนุกที่จะเรียนรู้ :) แม้ว่ามันจะเป็นภาษาที่เจ็บปวดสำหรับการเล่นกอล์ฟ ไลบรารี่มาตรฐานนั้นมีขนาดเล็กมาก (คุณตั้งใจจะใช้ Foundation เป็นส่วนใหญ่) ภาษานั้นมีความหมายในการแสดงออกและมีการพิมพ์แบบคงที่ ไวยากรณ์การปิดเป็นสิ่งที่ดีจริงๆ
อเล็กซานเดอร์

ฉันอาจจะอธิบายว่ารหัสนี้ทำงานอย่างไรฮ่า ๆ ๆ
Alexander

1
@downrep_nation ฉันเพิ่ม vergolfed verison ในกรณีที่คุณสนใจ
Alexander

บางทีบันทึก 3 ไบต์โดยการลบ "ให้" idk ถ้าคุณต้องการหรือไม่ แต่จากสิ่งที่ฉันเข้าใจคุณไม่ต้องการ "ให้" ซึ่งทำหน้าที่เป็นตัวบ่งชี้ของค่าคงที่
Rohan Jhunjhunwala

5

เยลลี่ขนาด 13 ไบต์

1 การจัดทำดัชนี

³Tạ⁸S
JUÇÞḟTṪ

ลองออนไลน์!

ขั้นตอนวิธี

การปฏิบัติตามคำถามอย่างไร้เดียงสา


lol ประมาณ 16 ครั้งสั้นกว่าคำตอบของฉัน + 1! (1! == 1)
Rohan Jhunjhunwala

@RohanJhunjhunwala คุณพูดว่าอะไร?
Leun Nun

Java เป็นหลักไม่สามารถแข่งขันกับ Jelly ได้คำตอบที่มีความยาว 12 ไบต์ (สั้นกว่าโปรแกรม java ใด ๆ ที่เป็นไปได้) นั้นเฮฮา ดังนั้นจงลุกขึ้น ..
Rohan Jhunjhunwala

@LeakyNun lol พลาดกอล์ฟ: D
Rohan Jhunjhunwala

2
1001 เอาต์พุต 3 เมื่อควรส่งคืน 2
แดเนียล

5

Java "เท่านั้น" 270 200 196 187 196 138 148 146 ไบต์!

บันทึกแล้ว4 13นับไม่ถ้วนขอบคุณ Leaky Nun! ขอบคุณ 1 ไบต์กับ Micheal Golfed

int m(boolean[]b){int r=0,l=b.length,i,j,k=0,z=r;for(i=0;i<l;i++){if(b[i])for(j=0,k=0;j<l;j++)if(!b[j])k+=i>j?i-j:j-i;if(k>z){r=i;z=k;}}return r;}

Ungolfed

int m(int[] s) {
        int l=s.length,i,j=0,k=0;
    boolean[] b = new boolean[l];
    int[] a = new int[l];
    //see what stalls are open
    for (i = 0; i < s.length; i++) {
        if (s[i] == 0){
            b[i] = true;
        }
    }
    //assign the sum of distance to the a[]
    for (i = 0; i < l; i++) {
        if (b[i]) {
            for (j = 0; j < l; j++) {
                if (!b[j]) {
                    a[i]+= Math.abs(i - j);
                }
            }
        }
    }
    //find the stall the greatest distance away breaking ties based on the furthest left
    for (i = 0; i < l; i++) {
        if (b[i] && (a[i] > k || k == 0)) {
            k = a[i];
            j=i;
        }
    }
    //return the index
    return j;
}

อินพุตเป็นอาร์เรย์บูลีนที่ true หมายถึงแผงลอยเปิด


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Alex A.

aคุณไม่จำเป็นต้องอาร์เรย์
Leun Nun

@LeakyNun ฉันจะลบออกได้อย่างไร
Rohan Jhunjhunwala

ด้วยการหาค่าต่ำสุดในการวนซ้ำหนึ่งครั้ง (รวมด้านนอกสำหรับลูป)
Leaky Nun

โอ้ @LeakyNun จะทำอย่างไรเมื่อฉันกลับมาวันนี้
Rohan Jhunjhunwala

4

Ruby, 79 78 76 + nflag = 77 ไบต์

เอาต์พุตเป็นดัชนีแบบอิง 0 อินพุตคือบรรทัด STDIN เป็น 0 และ 1

p (r=0...~/$/).max_by{|i|k=0;$_[i]>?0?0:r.map{|j|k+=$_[j]<?1?0:(j-i).abs};k}

1
0...~/$/เป็นเคล็ดลับที่ดี 👍🏻
จอร์แดน

2

MATL , 14 ไบต์

~ftGf!-|Xs&X>)

ลองออนไลน์!

เอาท์พุทเป็นแบบ 1

คำอธิบาย

~f     % Implicitly take input. Compute row vector with indices of zeros
t      % Duplicate that
Gf!    % Push input again. Compute column vector of indices of ones
-|     % Absolute differences with broadcast. Gives 2D array with all combinations
Xs     % Sum of each column
&X>    % Arg max. Gives the index of the first maximizer if there are several
)      % Index into row vector of indices of zeros. Implictly display

2

Perl 84 + 3 ( -alpแฟล็ก) = 87 ไบต์

for$i(0..$#F){$t=0;map{$t+=abs($i-$_)*$F[$_]}0..$#F;($m,$_)=($t,$i)if$m<$t&&!$F[$i]}

ต้องการ-alpแฟล็กเพื่อรัน รับสตริง 1 และ 0 คั่นด้วยช่องว่างเป็นอินพุต ตัวอย่างเช่น

perl -alpe '$m=0;for$i(0..$#F){$t=0;map{$t+=abs($i-$_)*$F[$_]}0..$#F;($m,$_)=($t,$i)if$m<$t&&!$F[$i]}' <<< "1 0 1
0 0 1 0 1 1
1 0 1 0 0 0 0 1 1
1 0 0 0 0 0 1 1 0 0 0 0
1 1 1 1 0 0 0 0 0 0 1
1 0"

โปรดทราบว่าฉันเพิ่ม$m=0ที่จุดเริ่มต้น แต่เพียงเพื่อทดสอบในหลายรายการ


ฉันนับ:+7 ไม่ถูกนับ F'' alp-
NoOneIsHere

@ ไม่มีใครอยู่ที่นี่ครวญแน่นอนที่จะเป็นของฉันไม่ดี ขอบคุณ
Dada

2

Matlab, 87 ไบต์

n=input('');k=numel(n);[a b]=ndgrid(1:k);[x y]=max(sum(abs(a-b).*repmat(n,k,1)').*~n);y

ใช้อาร์เรย์ของคนและศูนย์; ใช้การจัดทำดัชนีแบบ 1
เช่นเดียวกับคำตอบอื่น ๆ ที่ช่วยเพิ่มระยะทางทั้งหมดโดยเฉลี่ยไม่ใช่สูงสุด
อาจเป็นไปได้ว่าจะมีการตีกอล์ฟมากขึ้น ...


2

JavaScript (ES6), 87 86 82 75 ไบต์

a=>a.map((u,i)=>u||(a.map((v,j)=>u+=v*(i>j?i-j:j-i)),u>x&&(x=d,r=i)),x=0)|r

ใช้อาร์เรย์บูลีน (จริง / เท็จหรือ 1/0) ไม่มีจุดคำนวณระยะทางเฉลี่ยเนื่องจากพวกเขาทั้งหมดใช้ปัจจัยทั่วไปเดียวกันดังนั้นเพียงแค่คำนวณระยะทางทั้งหมดสำหรับแต่ละแผงลอยและค้นหาดัชนีแรกของจุดสูงสุด แก้ไข: บันทึก 1 ไบต์โดยใช้แทน* &&บันทึก 5 ไบต์โดยการค้นหาระยะทางสูงสุดด้วยตนเองตามความคิดเห็นโดย @Dendrobium บันทึกแล้ว 7 ไบต์โดยการใช้ซ้ำuเป็นตัวสะสมหลอกลดตามความคิดเห็นโดย @ edc65


79 bytes:a=>(x=0,a.map((o,i)=>x<(t=a.reduce((r,u,j)=>r+(b=i-j)*b*u*!o,0))&&(x=t,r=i)),r)
Dendrobium

@Dendrobium คำถามที่ถามสำหรับระยะทางที่แน่นอน; คุณดูเหมือนจะคำนวณระยะทาง RMS
Neil

1
การใช้อาร์เรย์เป็นอินพุต - เป็นแนวคิดที่ดี การคำนวณผลรวมแทนที่จะเป็นค่าเฉลี่ย - ความคิดที่ดี ใช้reduceแทนmap- mmmm
edc65

75:s=>s.map((u,i)=>u||(s.map((w,j)=>u-=w*Math.abs(j-i)),u<x&&(x=u,r=i)),x=0)|r
edc65

@Neil ไม่ RMS ค่อนข้างเพียงแค่ระยะทางสแควร์ซึ่งไม่ควรมีผลกระทบต่อผลของการแก้ปัญหาเว้นแต่มีความสัมพันธ์ในระยะทางรวมของปัจจัยการผลิต nonsymmetric (ตัวอย่างเช่น1100011101ความสัมพันธ์ที่2และ8เมื่อใช้แน่นอน8เมื่อใช้สแควร์) ไม่ได้ว่ามันเป็นเรื่องสำคัญตั้งแต่ ดูเหมือนว่ากฎได้รับการชี้แจงและความสัมพันธ์ในขณะนี้ได้รับการแก้ไขด้วยแผงด้านซ้ายมากที่สุด ...
Dendrobium


1

Ruby, 87 76 ไบต์

โยนร่างแรกนี้อย่างรวดเร็วด้วยกัน แต่ในระหว่างนี้Value Valueได้โพสต์คำตอบ Ruby 80 ไบต์แล้ว ...

แก้ไข: เอาออกบางไบต์ด้วยความช่วยเหลือจาก Value Ink:

->a{(r=0...a.size).max_by{|i|a[i]?0:r.map{|j|a[j]?(i-j).abs: 0}.reduce(:+)}}

มันเป็นฟังก์ชั่นนิรนามที่รับค่าความจริง / ค่าเท็จอย่างเช่น:

f=->->a{(r=0...a.size).max_by{|i|a[i]?0:r.map{|j|a[j]?(i-j).abs: 0}.reduce(:+)}}
# Test case number 5:
p f[[1, 1, 1, 1, nil, nil, nil, nil, nil, nil, 1]] # => 9

1
กำหนดช่วงเริ่มต้นให้กับตัวแปร(r=0...a.size)แล้ว map ว่าแทนการใช้:with_index r.map{|j|a[j]?(i-j).abs: 0}คุณควรได้รับ 78 ไบต์
หมึกมูลค่า

@ValueInk เยี่ยมมากขอบคุณ! ด้วยฟังก์ชั่นเท่านั้นไม่มีการมอบหมายฉันได้76 ไบต์
daniero

1

Mathematica, 53 ไบต์

MaximalBy[a=PositionIndex@#;a@0,Tr@Abs[#-a@1]&][[1]]&

ใช้การจัดทำดัชนีแบบอิง 1 และรับอินพุตเป็นรายการ 0s และ 1s


0

Javascript ES6 - 98 95 91 86 84 88 ไบต์

แก้ไข: ดูเหมือนว่าแผงด้านซ้ายสุดควรใช้ในกรณีที่เสมอกัน ระยะทางกำลังสองไม่ทำงานอีกต่อไปเปลี่ยนเป็นระยะทางแน่นอน

(r,x=0,f=g=>r.reduce(g,0))=>f((p,o,i)=>x<(o=f((p,c,j)=>p+c*!o*Math.abs(i-j)))?(x=o,i):p)

Ungolfed:

(r,                            // string input
 x=0,                          // current max distance
 f=g=>r.reduce(g,0))=>         // iterator function
   f((p,o,i)=>                 // for each stall
     x<(o=f((p,c,j)=>          // iterate through all stalls and
       p+c*!o*Math.abs(i-j)))? //   calculate sum of distances from current stall
     (x=o,i):                  // if total dist is greater than x, update x, return index
     p)                        //   else return previous max index

ทดสอบการทำงาน:

f=(r,x=0,f=g=>r.reduce(g,0))=>f((p,c,i)=>x<(c=+c?0:f((p,c,j)=>p+c*Math.abs(i-j)))?(x=c,i):p)
f([1,0,1])                   // 1
f([0,0,1,0,1,1])             // 0
f([1,0,1,0,0,0,0,1,1])       // 1
f([1,0,0,0,0,0,1,1,0,0,0,0]) // 11
f([1,1,1,1,0,0,0,0,0,0,1])   // 9
f([1,0])                     // 1

0

Lua, 165 150 Byes

n=arg[1]n=n:gsub("%|%-","1"):gsub("%| ","0")i=0 for s in n:gmatch("0+")do i=(i<#s)and(#s)or(i)end n,l=n:find(("0"):rep(i))print(n+math.floor((l-n)/2))

กลโกงนี้ใช้ความจริงที่ว่าโดยทั่วไป lua จะส่งผ่านตารางที่เรียกว่า arg ที่มีอินพุตบรรทัดคำสั่งใด ๆ

ฉันผิดหวังเล็กน้อยที่ฉันใช้สำหรับวงใน แต่ฉันไม่สามารถคิดวิธีที่เล็กกว่าเพื่อดึงออก

นอกจากนี้เนื่องจาก lua ใช้การจัดทำดัชนี 1 รายการ

แก้ไข Snipped 15 ไบต์จาก gsub ที่สิ้นเปลือง


0

C #, 127 ไบต์

public int G(char[]s){int i=0;var l=s.ToLookup(b=>b,b=>i++);return l['0'].OrderBy(j=>l['1'].Average(p=>Math.Abs(p-j))).Last();}

ทดสอบเตียง

public static void Main() {
    var respectful = new Respectful();
    foreach (var kvp in testCases) {
        $"{kvp.Key}: Expected {kvp.Value} Actual {respectful.G(kvp.Key.ToCharArray())}".Dump();
    }
}

public static readonly List<KeyValuePair<string, int>> testCases = new List<KeyValuePair<string, int>> {
    new KeyValuePair<string, int>("101", 1),
    new KeyValuePair<string, int>("001011", 0),
    new KeyValuePair<string, int>("101000011", 1),
    new KeyValuePair<string, int>("100000110000", 11),
    new KeyValuePair<string, int>("11110000001", 9),
    new KeyValuePair<string, int>("10", 1),
    new KeyValuePair<string, int>("1001", 1),
};

public class Respectful {
    public int G(char[]s){int i=0;var l=s.ToLookup(b=>b,b=>i++);return l['0'].OrderBy(j=>l['1'].Average(p=>Math.Abs(p-j))).Last();}
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.