トイレで敬意を払う


35

もちろん、SEネットワークはトイレで敬意を払う方法について非常に知識がありますが、おさらいが必要な人にとっては、敬意を払うことはトイレを洗い流すことなどを意味します。可能な限り他から。

チャレンジ

どのストールが文字列として使用されているかを示す一連のストールの設計図を考えると、最も敬意を払ってビジネスを行う場所である関数またはプログラムから返されるか、印刷する必要があります。

入力

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

ストールには、左から右へ昇順で番号が付けられます。常に少なくとも1つの空のストールがあります。入力には最大50のストールがあります。必要に応じて、入力を0sと1sまたはブール値の配列または文字列として受け取ることもできます。

使用中のストールに-はそれらがあります(パイプ間)。

出力

最も敬意を表するストールは、使用中のストールから平均して最も離れているストールです。2つのストール間の距離は、それらの上の数値の差の絶対値です。

明確にするために、隣の屋台だけでなく、すべての屋台からの平均距離を見つけています。

あなたはそこに行くために最も敬意を表するストールの最小数を空にする必要があります

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ネットワークの教育レベルを評価する(または自分自身を教育する)ために、travel.stackexchangeのトイレに関する質問と回答をご覧ください。
ジョナス

30
しかし、誰もがrespectfulness基準が最大化することであることを知っているminimunの距離ではなく、平均 :-)
ルイスMendo

2
@Dopapp [1,0,0,1]テストケースとして追加する必要があります。現在のテストケースはどれも、タイが正しく壊れているかどうかを検証しません。
デニス

8
101000011(4または5ではなく)1を返すのはなぜですか?
アマニキルマンガ16

回答:


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文字だと思います。
ルネニフェネガー

Jellyは、それぞれが1バイトとして認識する文字のみをエンコードするカスタムコードページを使用します。ヘッダー内のバイトリンクはそれを指します。
デニス

私はこれを知らなかった...それを指摘してくれてありがとう。
ルネナイフェネガー

@Dennis「Jelly bytes comment」をクリックして投稿できるように、自動コメントのユーザースクリプトを作成しましたか?
-NoOneIsHere

私はそのuserscript(持っている@NoOneIsHere ない鉱山)が、私はまだこれを追加しませんでした。私はおそらく...しかしべき
デニス・

6

スウィフト、158、157、128、 100バイト

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

ゴルフをしていない:

// 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を使用することを意図しています)、言語は非常に表現力があり、静的に型付けされています。しかし、クロージャー構文は本当に良いです
アレクサンダー-モニカの復活

私はおそらくこのコードがどのように機能するかを説明する必要がありますlol
アレクサンダー-モニカの復活

1
@downrep_nation興味のある方のために、私は未ゴルフのバージョンを追加しました
アレクサンダー-モニカの復活

おそらく除去することにより、3つのバイトを保存しますニーズにそれを行うかどうIDKのが、あなたは必要のないものを私は理解してからのみ、一定値の指標として機能する「せ」「せ」
ロハンJhunjhunwala

5

ゼリー、13 バイト

1インデックス。

³Tạ⁸S
JUÇÞḟTṪ

オンラインでお試しください!

アルゴリズム

質問の素朴な実装。


私の答え+ 1よりも約16倍短いです!(1!== 1)
ローハンジュンジュンワラ

@RohanJhunjhunwalaあなたは何と言いましたか?
リーキー修道女

基本的に、JavaはJellyと競合することはありません。12バイトの長さ(可能なJavaプログラムよりも短い)の回答を見るのは楽しいです。..だからupgoatを持っている
ロハンJhunjhunwala

@LeakyNun笑ゴルフを逃した:D
Rohan Jhunjhunwala

2
1001は、2を返す必要があるときに3を出力します。
ダニエル

5

Java「のみ」 270 200 196 187 196 138 148 146バイト!

Leaky Nunのおかげで4 13個の無数のバイトを節約できました!Micheal Golfedのおかげで1バイト

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

非ゴルフ

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はオープンストールを意味します。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
アレックスA.

配列は必要ありませんa
リーキー修道女

@LeakyNunどうすれば削除できますか?
ローハンジュンジュンワラ

1回の反復で最小値を見つける(外側のforループを組み合わせる)
Leaky Nun

ああ、@ LeakyNunが今日戻ってきたらやる
ローハンジュンジュンワラ

4

Ruby、79 78 76 + nフラグ= 77バイト

出力は0ベースのインデックス付けです。入力は、0と1のSTDIN行です。

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最初に追加したことに注意してください。ただし、これは複数のエントリでテストするためのものです。


私は数えます+7F'' alp-sはカウントされません。
-NoOneIsHere

@NoOneIsHereハム、確かに、それは私の悪いだろう。ありがとう
ダダ

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と0の配列を取ります。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

ブール配列(true / falseまたは1/0)を取ります。それらはすべて同じ共通因子を使用しているため、平均距離を計算するポイントはなく、各失速の合計距離を計算し、最も高いものの最初のインデックスを見つけるだけです。編集:の*代わりにを使用して1バイトを保存しました&&。@Dendrobiumのコメントに基づいて最高距離を手動で検索することで5バイトを節約しました。u@ edc65によるコメントに基づいて疑似リデュースアキュムレータとして再利用することで7バイトを節約しました。


79バイト: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質問は絶対距離を要求します。RMS距離を計算しているようです。
ニール

1
入力として配列を使用する-良いアイデア。平均ではなく合計を計算する-良い考えです。使用するreduce代わりにmapMMMM -
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

未かなりRMS、ソリューションの結果に影響を与えるべきではないだけの距離の二乗、@Neil ない限り非対称の入力の合計距離でつながりがある(例えばのための1100011101ネクタイで2かつ8絶対的を使用して、8それがため、重要なことを二乗を使用した場合)、ありませんルールが明確になり、左端のストールで関係が解決されたようです
...-デンドロビウム


1

ルビー、87 76バイト

この最初のドラフトをすぐにまとめましたが、その間にValue Inkはすでに80バイトのRubyの回答を投稿していました...

編集:バリューインクの助けを借りて、いくつかのバイトを取りました:

->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)、次に使用する代わりにそれにマップしますwith_indexr.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ベースのインデックスを使用し、0と1のリストとして入力を受け取ります。


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)

ゴルフをしていない:

(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不戦勝

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と呼ばれるテーブルを渡すという事実を使って少しごまかしています。

forループを使用したことに少しがっかりしていますが、それを実現するより小さな方法は考えられませんでした。

また、luaのため、1ベースのインデックスが使用されました。

無駄なgsubからSnipped 15バイトを編集します。


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.