Soyez respectueux dans les toilettes

35

Bien sûr, le réseau SE sait très bien comment être respectueux dans les toilettes, mais pour ceux d'entre vous qui ont besoin d'une récapitulation, être respectueux signifie tirer la chasse aux toilettes, etc. d'autres que possible.

Le défi

Étant donné le plan d'un ensemble de stands avec des indications de ceux utilisés comme chaîne, vous devez retourner ou imprimer à partir d'une fonction ou d'un programme où le lieu le plus respectueux pour faire de votre entreprise est.

L'entrée

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

Les stands sont numérotés dans l'ordre croissant de gauche à droite. Il y aura toujours au moins un stand vide. Il peut y avoir jusqu'à 50 stalles dans une entrée. Vous pouvez également prendre l'entrée comme un tableau ou une chaîne de 0s et 1s ou de booléens si vous préférez le faire.

Les stands en cours d'utilisation ont -entre eux (entre les tuyaux).

Le résultat

Le décrochage le plus respectueux est celui qui est en moyenne le plus éloigné de celui utilisé. La distance entre deux stalles est la valeur absolue de la différence des nombres au-dessus d’eux.

Soyons clairs: vous trouvez la distance moyenne entre tous les stands et pas seulement les voisins.

Vous devez sortir le nombre le plus bas du décrochage le plus respectueux, vide .

Exemples

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

C'est du , donc le code le plus court en octets gagne!

Vous pouvez utiliser une indexation basée sur 0 ou 1 dans votre réponse - celle que vous préférez; Si vous utilisez une indexation basée sur 1, vous devez l'indiquer explicitement dans votre réponse.

Daniel
la source
35
" Bien sûr, le réseau SE sait très bien comment être respectueux dans les toilettes " [citation nécessaire]
Alex A.
7
@AlexA .: Consultez les questions et réponses sur les toilettes sur travel.stackexchange pour évaluer le niveau d'éducation du réseau SE (ou pour vous renseigner vous-même).
Jonas
30
Mais tout le monde sait que le critère de respectfulness est de maximiser la minimun distance pas la moyenne :-)
Luis Mendo
2
@Dopapp Vous devriez ajouter [1,0,0,1]comme cas de test. Aucun des cas de test actuels ne vérifie si les liens sont brisés correctement.
Dennis
8
Pourquoi 101000011renvoie 1 (au lieu de 4 ou 5)?
Amani Kilumanga

Réponses:

11

Gelée , 10 à 9 octets

JạþTS׬MḢ

Utilise l'indexation basée sur 1. Essayez-le en ligne! ou vérifier tous les cas de test .

Comment ça marche

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.
Dennis
la source
Je crois que c'est 9 caractères, pas 9 octets.
René Nyffenegger
Jelly utilise une page de code personnalisée qui code les seuls caractères qu’elle comprend sous forme d’octet unique. Le lien d' octets dans l'en-tête pointe vers lui.
Dennis
Je n'étais pas au courant ... merci de l'avoir signalé.
René Nyffenegger
@Dennis Avez-vous créé un user-commentaire automatique pour pouvoir simplement cliquer sur "Commentaire sur les octets de gelée" et l'afficher?
NoOneIsHere
@NoOneIsHere J'ai ce script utilisateur ( pas le mien ), mais je n'ai pas encore ajouté celui-ci. Je devrais probablement si ...
Dennis
6

Rapide, 158, 157, 128, 100 octets

Prend l'entrée de la Array<Bool>variable i, retourne la réponse de la dernière expression.

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

Modifier 1:

Enregistré un octet en convertissant en bools via une comparaison de chaîne

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

Edit 2:

Retravaillé mon algorithme:

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

Edit 3:

Profiter de la nouvelle règle qui permet de prendre directement l’entrée d’un tableau booléen.

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)
Alexander - Rétablir Monica
la source
2
J'aime les réponses rapides
downrep_nation
C'est amusant d'apprendre :) Bien que ce soit une langue assez pénible pour le golf. La bibliothèque standard est vraiment minimale (vous utilisez généralement Foundation), le langage doit être très expressif et typé de manière statique. La syntaxe de fermeture est VRAIMENT bonne
Alexander - Rétablir Monica
Je devrais probablement expliquer comment ce code fonctionne lol
Alexander - Réintégrer Monica
1
Je @downrep_nation ajouté le verison ungolfed, au cas où vous êtes intéressé
Alexander - Réintégrer Monica
Économisez peut-être 3 octets en supprimant "let" idk si vous en avez besoin ou non, mais d'après ce que j'ai compris, vous n'avez pas besoin de "let" qui sert uniquement d'indicateur de valeur constante
Rohan Jhunjhunwala
5

Gelée , 13 octets

1 indexé.

³Tạ⁸S
JUÇÞḟTṪ

Essayez-le en ligne!

Algorithme

Mise en œuvre naïve de la question.

Fuite Nun
la source
lol environ 16 fois plus court que ma réponse + 1! (1! == 1)
Rohan Jhunjhunwala
@ RohanJhunjhunwala Qu'avez-vous dit?
Leaky Nun
Essentiellement, Java ne peut jamais rivaliser avec Jelly Seeing avec des réponses longues de 12 octets (plus courtes que tout programme java possible) est hilarant. Alors ayez un upgoat ..
Rohan Jhunjhunwala
@ LeakyNun lol a raté le golf: D
Rohan Jhunjhunwala
2
1001 sorties 3 quand il devrait revenir 2
Daniel
5

Java "seulement" 270 200 196 187 196 138 138 146 146 octets!

sauvé 4 13 innombrables octets grâce à Leaky Nun! 1 octet grâce à 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;
}

entrée sous forme de tableau booléen où true implique un décrochage ouvert.

Rohan Jhunjhunwala
la source
Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été déplacée pour discuter .
Alex A.
Vous n'avez pas besoin du tableau a.
Leaky Nun
@ LeakyNun comment puis-je l'enlever?
Rohan Jhunjhunwala
En trouvant le minimum en une itération (combinez l'extérieur pour les boucles)
Leaky Nun
oh @ LeakyNun fera quand je reviens aujourd'hui
Rohan Jhunjhunwala
4

Ruby, 79 78 76 + nflag = 77 octets

La sortie est une indexation basée sur 0. L'entrée est la ligne STDIN de 0 et de 1.

p (r=0...~/$/).max_by{|i|k=0;$_[i]>?0?0:r.map{|j|k+=$_[j]<?1?0:(j-i).abs};k}
Valeur d'encre
la source
1
0...~/$/est un bon tour. 👍🏻
Jordanie
2

MATL , 14 octets

~ftGf!-|Xs&X>)

Essayez-le en ligne!

La sortie est basée sur 1.

Explication

~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
Luis Mendo
la source
2

Perl 84 + 3 ( -alpdrapeaux) = 87 octets

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

A besoin de -alpdrapeaux pour courir. Prend une chaîne de 1 et 0 séparés par des espaces en entrée. Par exemple :

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"

Notez que j'ai ajouté $m=0au début, mais ce n'est que pour le tester sur plusieurs entrées.

Dada
la source
Je compte +7: F'' alp. -s ne sont pas comptés.
NoOneIsHere
@NoOneIsHere Hum, en effet, ce serait mon pire. Merci
Dada
2

Matlab, 87 octets

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

Prend un tableau de uns et de zéros; utilise l'indexation basée sur 1.
Comme certaines autres réponses maximise la distance totale et non moyenne.
Probablement il y a un peu plus de golf possible ...

pajonk
la source
2

JavaScript (ES6), 87 86 82 75 octets

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

Prend un tableau booléen (vrai / faux ou 1/0). Aucun point ne calcule la distance moyenne puisqu'ils utilisent tous le même facteur commun. Il suffit donc de calculer la distance totale pour chaque stand et de trouver le premier indice du plus élevé. Edit: 1 octet enregistré en utilisant à la *place de &&. Vous avez enregistré 5 octets en recherchant manuellement la distance la plus élevée sur la base d'un commentaire de @Dendrobium. Sauvegardé 7 octets en réutilisant ucomme accumulateur de pseudo-réduction basé sur un commentaire de @ edc65.

Neil
la source
79 octets: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 La question demande la distance absolue; vous semblez calculer la distance RMS.
Neil
1
Utiliser un tableau comme entrée - bonne idée. Calculer le total au lieu de la moyenne - bonne idée. Utilisation reduceau lieu de 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 Pas tout à fait RMS, juste des distances au carré, ce qui ne devrait pas affecter le résultat de la solution à moins qu'il y ait des liens dans des distances totales d'entrées non symétriques (par exemple, des 1100011101liens à 2et 8en utilisant absolu, 8en utilisant un carré), ce n'est pas important, il semble que les règles ont été clarifiées et les liens sont maintenant résolus avec le décrochage le plus à gauche ...
Dendrobium
1

Ruby, 87 76 octets

Lança rapidement ce premier brouillon, mais entre-temps, Value Ink avait déjà posté une réponse Ruby de 80 octets ...

edit: a enlevé quelques octets avec l'aide de Value Ink:

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

C'est une fonction anonyme qui prend un tableau de valeurs de vérité / fausseté, comme par exemple:

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
Daniero
la source
1
Affectez la plage initiale à une variable (r=0...a.size), puis sur la carte qu'au lieu d'utiliser with_index: r.map{|j|a[j]?(i-j).abs: 0}. Cela devrait vous obtenir 78 octets.
Valeur d'encre
@ValueInk Génial, merci! Avec seulement la fonction, aucune affectation, je reçois 76 octets
daniero
1

Mathematica, 53 octets

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

Utilise l'indexation basée sur 1 et utilise les entrées sous forme de liste de 0 et de 1.

Alephalpha
la source
0

Javascript ES6 - 98 95 91 86 84 88 octets

Edit: Il semble que le décrochage le plus à gauche devrait être utilisé en cas d'égalité. Les distances carrées ne fonctionnent plus, elles sont redevenues des distances absolues.

(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

Tests effectués:

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
Dendrobium
la source
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))

Cela trompe un peu en utilisant le fait que généralement, lua passe une table appelée arg contenant toutes les entrées de ligne de commande.

Je suis un peu déçu d’avoir utilisé une boucle in, mais je ne pouvais pas penser à un moyen plus simple de la réussir.

Aussi, comme lua, 1 indexation basée a été utilisée.

Éditez Snipped 15 octets d'un gsub inutile.

ATaco
la source
0

C #, 127 octets

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

Banc d'essai

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