Hãy tôn trọng trong phòng vệ sinh


35

Tất nhiên, mạng SE rất am hiểu về cách tôn trọng trong phòng vệ sinh, nhưng đối với những người bạn cần một bản tóm tắt, tôn trọng có nghĩa là xả nước trong nhà vệ sinh, vv Quan trọng nhất, mặc dù vậy, nó có nghĩa là sử dụng gian hàng ở xa từ những người khác càng tốt.

Các thách thức

Đưa ra một kế hoạch chi tiết của một tập hợp các quầy hàng với chỉ dẫn về những chuỗi được sử dụng như một chuỗi, bạn phải trả lại hoặc in từ một chức năng hoặc chương trình nơi nơi kinh doanh đáng kính nhất của bạn.

Đầu vào

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

Các quầy hàng được đánh số theo thứ tự tăng dần từ trái sang phải. Sẽ luôn có ít nhất một gian hàng trống. Có thể có tới 50 quầy hàng trong một đầu vào. Bạn cũng có thể lấy đầu vào là một mảng hoặc chuỗi 0s và 1s hoặc booleans nếu bạn muốn làm như vậy.

Các quầy hàng đang sử dụng có -trong chúng (ở giữa các đường ống).

Đầu ra

Gian hàng đáng kính nhất để đến là một trong những trung bình xa nhất so với những người đang sử dụng. Khoảng cách giữa hai quầy hàng là giá trị tuyệt đối của chênh lệch của các con số phía trên chúng.

Nói rõ hơn: bạn đang tìm khoảng cách trung bình từ tất cả các quầy hàng, không chỉ những người hàng xóm.

Bạn phải xuất số lượng thấp nhất của gian hàng tôn trọng nhất để đi đến đó là trống .

Ví dụ

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

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Bạn có thể sử dụng lập chỉ mục dựa trên 0 hoặc 1 trong câu trả lời của mình - tùy theo bạn thích; nếu bạn sử dụng lập chỉ mục 1, thì bạn phải nói rõ ràng trong câu trả lời của mình.


35
" Tất nhiên, mạng SE rất am hiểu về cách tôn trọng trong phòng vệ sinh " [cần dẫn nguồn]
Alex A.

7
@AlexA.: Hãy xem các câu hỏi và câu trả lời về nhà vệ sinh trên Travel.stackexchange để đánh giá mức độ giáo dục của mạng SE (hoặc để giáo dục chính bạn).
Jonas

30
Nhưng mọi người đều biết rằng tiêu chí tôn trọng là tối đa hóa khoảng cách minimun chứ không phải trung bình :-)
Luis Mendo

2
@Dopapp Bạn nên thêm [1,0,0,1]làm trường hợp thử nghiệm. Không có trường hợp kiểm tra hiện tại nào xác minh nếu quan hệ bị phá vỡ chính xác.
Dennis

8
Tại sao 101000011trả về 1 (thay vì 4 hoặc 5)?
Amani Kilumanga

Câu trả lời:


11

Thạch , 10 9 byte

JạþTS׬MḢ

Sử dụng lập chỉ mục 1 dựa trên. Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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.

Tôi tin rằng đó là 9 ký tự, không phải 9 byte.
René Nyffalanger

Jelly sử dụng một trang mã tùy chỉnh mã hóa các ký tự duy nhất mà nó hiểu là mỗi byte đơn. Các liên kết byte trong tiêu đề trỏ đến nó.
Dennis

Tôi đã không biết về điều này ... cảm ơn vì đã chỉ ra nó.
René Nyffalanger

@Dennis Bạn đã tạo một mô tả người dùng tự động nhận xét để bạn chỉ cần nhấp vào "Jelly byte bình luận" và nó sẽ đăng nó?
NoOneIsHãy là

@NoOneIs Tôi đã có bản mô tả đó ( không phải của tôi ), nhưng tôi chưa thêm cái này. Có lẽ tôi nên ...
Dennis

6

Swift, 158, 157, 128, 100 byte

Lấy đầu vào từ Array<Bool>biến i, trả về câu trả lời từ biểu thức cuối cùng.

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

Chỉnh sửa 1:

Đã lưu một byte bằng cách chuyển đổi thành bools thông qua so sánh chuỗi

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

Chỉnh sửa 2:

Làm lại thuật toán của tôi:

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

Chỉnh sửa 3:

Tận dụng lợi thế của quy tắc mới cho phép lấy đầu vào trực tiếp từ một mảng boolean.

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

Ung dung:

// 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
Tôi thích câu trả lời nhanh chóng
downrep_nation

Thật thú vị khi học :) Mặc dù nó có xu hướng là một ngôn ngữ khá đau đớn khi chơi golf. Thư viện tiêu chuẩn thực sự tối thiểu (bạn dự định sử dụng Foundation hầu hết thời gian), ngôn ngữ có nghĩa là rất biểu cảm và được gõ tĩnh. Cú pháp đóng là thực sự tốt mặc dù
Alexander - Tái lập lại

Tôi có lẽ nên giải thích làm thế nào mã này hoạt động lol
Alexander - Tái lập Monica

1
@downrep_nation Tôi đã thêm bản án chưa được xử lý, trong trường hợp bạn quan tâm
Alexander - Tái lập lại

Có lẽ tiết kiệm 3 byte bằng cách xóa idk "let" nếu bạn có cần hay không, nhưng từ những gì tôi hiểu bạn không cần "let" mà chỉ đóng vai trò là một chỉ số của một giá trị không đổi
Rohan Jhunjhunwala

5

Thạch , 13 byte

1 chỉ mục.

³Tạ⁸S
JUÇÞḟTṪ

Hãy thử trực tuyến!

Thuật toán

Ngây thơ thực hiện các câu hỏi.


lol ngắn hơn khoảng 16 lần so với câu trả lời của tôi + 1! (1! == 1)
Rohan Jhunjhunwala

@RohanJhunjhunwala Bạn đã nói gì?
Leaky Nun

Về cơ bản, Java không bao giờ có thể cạnh tranh với các câu trả lời của Jelly Seeing dài 12 byte (ngắn hơn bất kỳ chương trình java nào có thể) rất vui nhộn. Vì vậy, có một upgoat ..
Rohan Jhunjhunwala

@LeakyNun lol đã bỏ lỡ môn đánh gôn: D
Rohan Jhunjhunwala

2
1001 xuất 3 khi nó sẽ trả về 2
Daniel

5

Java "chỉ" 270 200 196 187 196 138 148 146 byte!

đã lưu 4 13 vô số byte nhờ Leaky Nun! 1 byte nhờ 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;}

Ung dung

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;
}

đầu vào như một mảng boolean trong đó true ngụ ý một gian hàng mở.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Alex A.

Bạn không cần mảng a.
Leaky Nun

@LeakyNun làm cách nào để xóa nó?
Rohan Jhunjhunwala

Bằng cách tìm mức tối thiểu trong một lần lặp (kết hợp vòng ngoài cho các vòng lặp)
Leaky Nun

oh @LeakyNun sẽ làm gì khi tôi trở lại hôm nay
Rohan Jhunjhunwala

4

Ruby, 79 78 76 + ncờ = 77 byte

Đầu ra là lập chỉ mục dựa trên 0. Đầu vào là dòng STDIN của 0 và 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...~/$/là một mẹo hay 👍🏻
Jordan

2

MATL , 14 byte

~ftGf!-|Xs&X>)

Hãy thử trực tuyến!

Đầu ra là 1 dựa.

Giải trình

~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 ( -alpcờ) = 87 byte

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

Cần -alpcờ để chạy. Lấy một chuỗi 1 và 0 cách nhau bởi khoảng trắng làm đầu vào. Ví dụ :

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"

Lưu ý rằng tôi đã thêm vào $m=0lúc bắt đầu, nhưng đó chỉ là để kiểm tra nó trên nhiều mục.


Tôi đếm +7: F'' alp. -s không được tính.
NoOneIsHãy là

@NoOneIsHere Hum, quả thực, đó sẽ là điều xấu của tôi. Cảm ơn
Dada

2

Matlab, 87 byte

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

Có mảng của những cái và số không; sử dụng lập chỉ mục 1 dựa trên.
Giống như một số câu trả lời khác tối đa hóa tổng khoảng cách không trung bình.
Có lẽ có thêm một số golf có thể ...


2

JavaScript (ES6), 87 86 82 75 byte

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

Lấy một mảng boolean (đúng / sai hoặc 1/0). Không có điểm nào tính được khoảng cách trung bình vì tất cả đều sử dụng cùng một yếu tố chung, vì vậy chỉ cần tính tổng khoảng cách cho mỗi gian hàng và tìm chỉ số đầu tiên của chỉ số cao nhất. Chỉnh sửa: Đã lưu 1 byte bằng cách sử dụng *thay vì &&. Đã lưu 5 byte bằng cách tìm khoảng cách cao nhất theo cách thủ công dựa trên nhận xét của @Dendrobium. Đã lưu 7 byte bằng cách sử dụng lại udưới dạng bộ tích lũy giả dựa trên nhận xét của @ edc65.


79 byte: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 Câu hỏi yêu cầu khoảng cách tuyệt đối; bạn dường như đang tính toán khoảng cách RMS.
Neil

1
Sử dụng một mảng làm đầu vào - ý tưởng tốt. Tính tổng thay vì trung bình - ý tưởng tốt. Sử dụng reducethay vì 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 Không hoàn toàn RMS, chỉ là khoảng cách bình phương, không ảnh hưởng đến kết quả của giải pháp trừ khi có các mối quan hệ trong tổng khoảng cách của các đầu vào không đối xứng (ví dụ: 1100011101quan hệ tại 28khi sử dụng tuyệt đối, 8khi sử dụng bình phương), không phải là vấn đề vì có vẻ như các quy tắc đã được làm rõ và các mối quan hệ hiện đã được giải quyết với gian hàng bên trái nhất ...
Dendrobium


1

Ruby, 87 76 byte

Đã đưa bản thảo đầu tiên này nhanh chóng cùng nhau, nhưng trong khi đó, Ink Ink đã đăng một câu trả lời Ruby 80 byte ...

chỉnh sửa: đã gỡ bỏ một số byte với sự trợ giúp từ Value Ink:

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

Đây là một hàm ẩn danh có một loạt các giá trị trung thực / giả, ví dụ như:

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
Chỉ định phạm vi ban đầu cho một biến (r=0...a.size)và sau đó ánh xạ vào đó thay vì sử dụng with_index: r.map{|j|a[j]?(i-j).abs: 0}. Điều này sẽ giúp bạn có được 78 byte.
Mực giá trị

@ValueInk Tuyệt vời, cảm ơn! Chỉ với chức năng, không có sự phân công, tôi nhận được 76 byte
daniero

1

Toán học, 53 byte

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

Sử dụng lập chỉ mục dựa trên 1 và lấy đầu vào là danh sách 0 và 1.


0

Javascript ES6 - 98 95 91 86 84 88 byte

Chỉnh sửa: Có vẻ như gian hàng ngoài cùng bên trái nên được sử dụng trong trường hợp hòa. Khoảng cách bình phương không còn hoạt động, trở lại khoảng cách tuyệt đối.

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

Ung dung:

(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

Chạy thử:

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 Tạm biệt

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))

Điều này gian lận một chút bằng cách sử dụng thực tế là nói chung, lua vượt qua một bảng gọi là arg chứa bất kỳ đầu vào dòng lệnh nào cho nó.

Tôi hơi thất vọng vì tôi đã sử dụng một vòng lặp for, nhưng tôi không thể nghĩ ra một cách nhỏ hơn để kéo nó đi.

Ngoài ra, bởi vì lua, lập chỉ mục dựa trên 1 đã được sử dụng.

Chỉnh sửa Snipped 15 byte từ một gsub lãng phí.


0

C #, 127 byte

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();}

Giường thử

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();}
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.