Будь почтительным в уборной


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 очень хорошо осведомлена о том, как быть уважительным в туалете " [цитата необходима]
Алекс А.

7
@AlexA .: Ознакомьтесь с вопросами и ответами в туалете на сайте travel.stackexchange, чтобы оценить уровень образования сети SE (или самообучения).
Джонас

30
Но все знают, что критерием уважения является максимизировать минимальное расстояние, а не среднее :-)
Луис Мендо

2
@Dopapp Вы должны добавить [1,0,0,1]в качестве контрольного примера. Ни один из текущих тестов не проверяет, правильно ли нарушены связи.
Деннис

8
Почему 101000011возвращается 1 (вместо 4 или 5)?
Амани Килуманга

Ответы:


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 использует пользовательскую кодовую страницу, которая кодирует единственные символы, которые она понимает как один байт каждый. В байтах ссылаются в точках заголовка к нему.
Деннис

Я не знал об этом ... спасибо, что указал на это.
Рене Ниффенеггер

@Dennis Сделали ли вы пользовательский скрипт с автоматическим комментарием, чтобы вы могли просто нажать «Комментарий байтов Jelly», и он будет опубликован?
NoOneIsHere

@NoOneIsHere у меня есть этот пользовательский скрипт ( не мой ), но я еще не добавил этот. Я, вероятно, должен хотя ...
Деннис

6

Swift, 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:

Сохранение байта путем преобразования в bools с помощью сравнения строк

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 большую часть времени), язык должен быть очень выразительным и статически типизированным. Хотя синтаксис закрытия действительно хорош
Александр - восстановите Монику

Я должен, вероятно, объяснить, как этот код работает LOL
Александр - Восстановить Монику

1
@downrep_nation Я добавил неутолкованную версию, если вам интересно
Александр - Восстановите Монику

Возможно, сэкономьте 3 байта, удалив «let» idk, если вам это нужно или нет, но из того, что я понимаю, вам не нужно «let», которое служит только индикатором постоянного значения
Рохан Джхунджхунвала

5

Желе , 13 байт

1-индексироваться.

³Tạ⁸S
JUÇÞḟTṪ

Попробуйте онлайн!

Алгоритм

Наивная реализация вопроса.


LOL примерно в 16 раз короче, чем мой ответ +1! (1! == 1)
Рохан Джунджхунвала

@RohanJhunjhunwala Что ты сказал?
Утренняя монахиня

По сути, Java никогда не может конкурировать с Jelly Seeing. Ответы, длина которых составляет 12 байт (короче, чем любая возможная Java-программа), смешны. Так что попридержите ..
Рохан

@LeakyNun LOL пропустил гольф: D
Рохан Jhunjhunwala

2
1001 выводит 3, когда он должен вернуть 2
Даниэль

5

Ява "только" 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;
}

input как логический массив, где true подразумевает открытый ларек.


Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Алекс А.

Вам не нужен массив a.
Утренняя монахиня

@ LeakyNun, как мне удалить это?
Рохан Джунджхунвала

Найдя минимум за одну итерацию (объедините внешние циклы for)
Leaky Nun

о @LeakyNun будет делать, когда я вернусь сегодня
Рохан Jhunjhunwala

4

Рубин, 79 78 76 + nфлаг = 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...~/$/хороший трюк J
Иордания

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

@NoOneIsHere Hum, это было бы плохо. Спасибо
Дада

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

Принимает логический массив (true / false или 1/0). Нет смысла вычислять среднее расстояние, так как все они используют один и тот же общий коэффициент, поэтому просто вычислите общее расстояние для каждого киоска и найдите первый индекс самого высокого. Редактировать: 1 байт, используя *вместо &&. Сохранение 5 байт путем нахождения наибольшего расстояния вручную на основе комментария @Dendrobium. Сохранение 7 байтов путем повторного использования uв качестве псевдоредуцирующего аккумулятора на основе комментария @ edc65.


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 Вопрос требует абсолютного расстояния; Вы, кажется, рассчитываете среднеквадратичное расстояние.
Нил

1
Использование массива в качестве входных данных - хорошая идея. Подсчет общего вместо среднего - хорошая идея. Использование reduceвместо map-
мммм

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, просто квадраты расстояний, которые не должны влиять на результат решения, если нет связей на общих расстояниях несимметричных входов (например, 1100011101связей в 2и 8при использовании абсолютного, 8при использовании квадрата), не то, чтобы это имело значение, так как кажется, что правила были уточнены, и теперь связи разрешены с самым левым киоском ...
Дендробиум


1

Рубин, 87 76 байт

Быстро скомбинировал этот первый черновик, но тем временем Value Ink уже опубликовал 80-байтовый ответ Ruby ...

редактировать: снял несколько байтов с помощью 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)а затем карту на том , что вместо использования with_index: r.map{|j|a[j]?(i-j).abs: 0}. Это должно получить 78 байт.
Value Ink

@ValueInk Отлично, спасибо! Имея только функцию, без присваивания, я получаю 76 байт
daniero

1

Mathematica, 53 байта

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

Использует индексирование на основе 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)

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, содержащую любые входные данные командной строки.

Я немного разочарован тем, что использовал цикл for in, но я не мог придумать иного способа, как это осуществить.

Кроме того, поскольку использовалась индексация на основе lua, 1.

Отредактировано 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();}
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.