Будьте з повагою в туалеті


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, щоб оцінити рівень освіти мережі ІП (або навчити себе).
Йонас

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 Ви зробили авторський сценарій з автоматичним коментуванням, щоб ви могли просто натиснути на "Коментар желейних байтів", і він опублікує його?
NoOneIsHere

@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:

Збережено байт шляхом перетворення в 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

Безголівки:

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

Це цікаво вчитися :) Хоча це, як правило, досить болюча мова для гри в гольф. Стандартна бібліотека справді мінімальна (ви плануєте використовувати Фонд більшу частину часу), мова має бути дуже виразною та статично набраною. Синтаксис закриття дійсно хороший, хоча
Олександр - Відновіть Моніку

Я, мабуть, повинен пояснити, як працює цей код лол
Олександр - Відновити Моніку

1
@downrep_nation Я додав нерозділену вершину, на випадок, якщо вас цікавить
Олександр - Відновіть Моніку

Можливо, збережіть 3 байти, видаливши "нехай" idk, якщо він вам потрібен чи ні, але з того, що я розумію, вам не потрібно "нехай", який служить лише індикатором постійної величини
Rohan Jhunjhunwala

5

Желе , 13 байт

1-індексований.

³Tạ⁸S
JUÇÞḟTṪ

Спробуйте в Інтернеті!

Алгоритм

Наївна реалізація питання.


LOL приблизно в 16 разів коротше моєї відповіді + 1! (1! == 1)
Rohan Jhunjhunwala

@RohanJhunjhunwala Що ти сказав?
Leaky Nun

По суті Java ніколи не може конкурувати з Jelly. Побачити відповіді, довжиною яких 12 байт (коротше будь-якої можливої ​​програми Java), є смішним. Отож, майте нагору ..
Рохан 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;}

Безумовно

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.
Leaky Nun

@LeakyNun як її видалити?
Rohan Jhunjhunwala

Знайшовши мінімум за одну ітерацію (поєднайте зовнішню для циклів)
Leaky Nun

о @LeakyNun зробить, коли я повернусь сьогодні
Rohan 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...~/$/приємна хитрість. 👍🏻
Йорданія

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. -s не рахуються.
NoOneIsHere

@NoOneIsHere Гум, справді, це було б моїм поганим. Спасибі
Дада

2

Матлаб, 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 Питання задає абсолютну відстань; ви, здається, обчислюєте відстань RMS.
Ніл

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


1

Рубі, 87 76 байт

Скинули цей перший проект швидко разом, але тим часом Value Ink вже опублікував відповідь Ruby на 80 байт ...

edit: зняв кілька байт за допомогою Ink 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 байт.
Значення чорнила

@ValueInk Чудовий, дякую! Маючи лише функцію, без призначення, я отримую 76 байт
daniero

1

Математика, 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

Луа, 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.

Редагувати Знімок 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.