Tuvalette saygılı ol


35

Tabii ki, SE ağı tuvalette nasıl saygılı olacağı konusunda çok bilgilidir, ancak bir özetlemeye ihtiyaç duyanlar için, saygılı olmak tuvaleti yıkamak anlamına gelir. diğerlerinden mümkün olduğunca.

Meydan okuma

Hangilerinin bir dize olarak kullanıldığını gösteren bir dizi tezgahın bir planı göz önüne alındığında, işinizi yapmak için en saygılı yerin olduğu bir işlev veya programdan geri dönmeli veya yazdırmalısınız.

Girdi

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

Tezgahlar soldan sağa doğru artan şekilde numaralandırılmıştır. Her zaman en az bir boş durak olacaktır. Bir girişte en fazla 50 durak olabilir. Ayrıca bir dizi ya da dize olarak giriş alabilir 0s ve 1bunu yapmak isterseniz s veya Boolean.

Kullanılan tezgahlar içlerinde -(borular arasında) bulunur.

Çıktı

Gidilecek en saygılı durak, kullanılanlardan ortalama olarak en uzak olanıdır. İki durak arasındaki mesafe, üstlerindeki sayıların farkının mutlak değeridir.

Sadece açık olmak gerekirse: sadece komşu olanlara değil tüm tezgahlara olan ortalama mesafeyi buluyorsunuz .

Boş olana gitmek için en saygılı olan en az sayıdaki çıktısını almalısınız .

Örnekler

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

Bu , bayt cinsinden en kısa kod kazanır!

Cevabınızda 0 veya 1 tabanlı indeksleme kullanabilirsiniz - hangisini tercih ederseniz; 1 tabanlı indeksleme kullanıyorsanız, cevabınıza açıkça söylemelisiniz.


35
" Elbette, SE ağı tuvalette nasıl saygılı olunacağı konusunda çok bilgilidir " [kaynak gösterilmeli]
Alex A.

7
@AlexA .: SE ağının eğitim seviyesini değerlendirmek için (veya kendinizi eğitmek için) tuvalet sorularına ve travel.stackexchange'in cevaplarına göz atın .
Jonas

30
Ancak herkes, saygınlık kriterinin ortalama :-) değil, minimum mesafeyi maksimuma çıkarmak olduğunu biliyor.
Luis Mendo

2
@Dopapp [1,0,0,1]Bir sınama durumu olarak eklemelisiniz . Mevcut test durumlarının hiçbiri, ilişkilerin doğru bir şekilde kırıldığını doğrulamaz.
Dennis,

8
Neden 1010000111 döndürür (4 veya 5 yerine)?
Amani Kilumanga,

Yanıtlar:


11

Jöle , 10 9 bayt

JạþTS׬MḢ

1 tabanlı indeksleme kullanır. Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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 bayt değil 9 karakter olduğuna inanıyorum.
René Nyffenegger

Jelly, her biri bir bayt olarak anladığı tek karakterleri kodlayan özel bir kod sayfası kullanır. Bayt buna başlık noktalarında bağlar.
Dennis,

Bunun farkında değildim ... işaret ettiğin için teşekkürler.
René Nyffenegger

@Dennis Otomatik yorum kullandığınız bir kullanıcı yorumu yaptınız, böylece sadece "Jelly bytes comment" i tıklamanız yeterli;
NoOneIsHere

@NoOneIsBurada kullandığım usercript var ( benim değil ), fakat henüz bunu eklemedim. Muhtemelen olsa gerekir ...
Dennis

6

Swift, 158, 157, 128, 100 Bayt

Array<Bool>Değişkenden girdi alır i, son ifadeden cevap döndürür.

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

Düzenleme 1:

Dize karşılaştırma yoluyla boollara dönüştürerek bir bayt kaydedildi

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

Düzenleme 2:

Algoritmam elden geçirildi:

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

Düzenleme 3:

Doğrudan bir boolean dizisinden girdi almayı sağlayan yeni kuralın avantajını aldı.

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
Hızlı cevapları severim
downrep_nation

Öğrenmesi eğlenceli :) :) Golf oynamak için oldukça acı verici bir dil olma eğiliminde olmasına rağmen. Standart kütüphane asgari düzeydedir (çoğu zaman Foundation'ı kullanmayı düşünüyorsunuz), dilin çok etkileyici olması amaçlanmıştır ve statik olarak yazılmıştır. Kapanış sözdizimi GERÇEKTeyse olsa iyi
Alexander,

Muhtemelen bu kodun nasıl çalıştığını açıklamalıyım
Alexander

1
@downrep_nation İlgilendiğiniz takdirde ungolfed verison ekledim
Alexander

Belki ihtiyaç duyup duymadığın takdirde "let" i çıkartarak 3 bayt kurtar, ama anladığım kadarıyla "değişmez" olan sadece sabit bir değerin göstergesi olarak hizmet eder
Rohan Jhunjhunwala

5

Jöle , 13 bayt

1 endeksli.

³Tạ⁸S
JUÇÞḟTṪ

Çevrimiçi deneyin!

Algoritma

Sorunun Naive uygulaması.


lol cevabımdan 16 kat daha kısa. (1! == 1)
Rohan Jhunjhunwala

@RohanJhunjhunwala Ne dedin?
Sızdıran Rahibe,

Temelde Java, Jelly ile asla rekabet edemez. 12 bayt uzunluğunda (olası herhangi bir java programından daha kısa olan) cevapları görmek komiktir. Yani bir upgoat ..
Rohan Jhunjhunwala

@LeakyNun lol golfü kaçırdı: D
Rohan Jhunjhunwala

2
1001, 2'ye döndüğünde 3
Daniel

5

Java "yalnızca" 270 200 196 187 196 138 148 146 bayt!

Leaky Nun sayesinde 4 13 sayısız byte kurtardı ! Micheal Golfed sayesinde 1 bayt

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

true bir açık duraklama anlamına gelen bir boolean dizisi olarak girdi.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Alex A.

Diziye ihtiyacınız yok a.
Sızdıran Rahibe

@LeakyNun nasıl kaldırabilirim?
Rohan Jhunjhunwala

Bir yinelemede minimum bulunarak (döngüler için dış birleştirin)
Leaky Nun

oh @LeakyNun bugün geri döndüğümde yapacak
Rohan Jhunjhunwala 11

4

Ruby, 79 78 76 + nbayrak = 77 bayt

Çıktı 0 tabanlı indekslemedir. Giriş, 0 ve 1'in STDIN satırıdır.

p (r=0...~/$/).max_by{|i|k=0;$_[i]>?0?0:r.map{|j|k+=$_[j]<?1?0:(j-i).abs};k}

1
0...~/$/güzel bir numara. 👍🏻
Ürdün

2

MATL , 14 bayt

~ftGf!-|Xs&X>)

Çevrimiçi deneyin!

Çıktı 1 tabanlıdır.

açıklama

~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 ( -alpbayraklar) = 87 bayt

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

İhtiyaç -alpçalıştırmak için bayraklar. Giriş olarak boşluklarla ayrılmış 1 ve 0 dizesini alır. Örneğin :

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=0Başlangıçta eklediğime dikkat edin, ancak bu yalnızca çoklu girişlerde test etmek içindir.


Ben saymak +7: F'' alp. -sayılmaz.
NoOneIsHere

@Hiçbir yerdeHere Hum, gerçekten, bu benim kötü olurdu. Teşekkürler
Dada

2

Matlab, 87 bayt

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

Birler ve sıfırlar dizisini alır; 1 tabanlı indeksleme kullanır.
Diğer bazı cevaplar gibi, ortalama değil toplam mesafeyi maksimize eder.
Muhtemelen biraz daha golf oynamak mümkün.


2

JavaScript (ES6), 87 86 82 75 bayt

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

Boolean dizi alır (true / false veya 1/0). Hepsi aynı ortak faktörü kullandıkları için ortalama mesafeyi hesaplamanın bir anlamı yoktur, bu nedenle her durak için toplam mesafeyi hesaplayın ve en yüksek olanın ilk dizinini bulun. Düzenleme: *yerine kullanarak 1 bayt kaydedildi &&. @Dendrobium tarafından yapılan açıklamaya göre en yüksek mesafeyi bularak 5 bayt kurtarıldı. u@ Edc65 tarafından yapılan yoruma dayanarak sözde azaltma akümülatör olarak tekrar kullanarak 7 bayt kurtarıldı.


79 bayt: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 Bu soru mutlak mesafe ister; RMS mesafesini hesaplıyor gibisiniz.
Neil

1
Diziyi girdi olarak kullanmak - iyi fikir. Ortalama yerine toplamın hesaplanması - iyi fikir. Kullanma reduceyerine 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

Çözümün sonucunu etkisi olmamalıdır Pek RMS, sadece kare mesafeler, @Neil sürece (örneğin orada nonsymmetric girdilerinin toplam mesafelerde bağları vardır 1100011101at bağları 2ve 8mutlak kullanırken 8kare kullanılırken), o zamandan beri önemli değil kurallar açıklığa kavuştu ve bağlar şimdi en soldaki durakla çözüldü ...
Dendrobium


1

Ruby, 87 76 bayt

Bu ilk taslağı hızlı bir şekilde birlikte attı, ancak bu arada Value Ink zaten 80 baytlık bir Ruby ...

edit: Value Ink'in yardımıyla bazı baytları çıkardı:

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

Bu, örneğin şöyle bir tuhaf / sahte değer dizisi alan anonim bir işlevdir:

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
Bir değişkene başlangıç aralığı atama (r=0...a.size)ve daha sonra bu yerine kullanımı ile ilgili harita with_index: r.map{|j|a[j]?(i-j).abs: 0}. Bu size 78 bayt vermeli.
Value Ink

@ValueInk Başar, teşekkürler! Sadece işlev, ödev yok, 76 bayt
daniero 19

1

Mathematica, 53 bayt

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

1-tabanlı indeksleme kullanır ve girdiyi 0 ve 1s listesi olarak alır.


0

Javascript ES6 - 98 95 91 86 84 88 bayt

Düzenleme: En soldaki ahırın kravat durumunda kullanılması gerektiğini düşünüyor. Kare mesafeler artık çalışmaz, mutlak mesafeye döner.

(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

Test çalıştırması:

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 Bayi

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

Bu, genellikle, lua'nın kendisine herhangi bir komut satırı girişi içeren arg adlı bir tablodan geçtiği gerçeğini kullanarak biraz hile yapar.

Ben for döngüsü kullandığım için biraz hayal kırıklığına uğradım, ancak çıkarmak için daha küçük bir yol düşünemedim.

Ayrıca, Çünkü, lua, 1 tabanlı indeksleme kullanıldı.

Düzenle Snipped 15 byte israflı bir gsub'dan.


0

C #, 127 bayt

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

Test Yatağı

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();}
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.