Bu liste dengeli olabilir mi?


23

Negatif olmayan bir tamsayı listesinin dengelenmiş olup olmadığını kontrol etmek için , kişi bir ağırlığa bir tahtaya konulduğunu hayal edebilir ve sonra tahtayı, bir milin üzerinde bir mil üzerinde dengede bırakmaya çalışarak, milin sol ve sağında özetlenen göreceli ağırlıklar aynı olacaktır. Göreceli ağırlık, ağırlığı pivotla olan mesafesiyle çarpmak suretiyle verilir (bkz . Kaldıraç yasası ).

wikipedia kolu (Kaynak: wikipedia )

Bu görüntü bir listeye karşılık gelir [100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]. Bu liste dengelidir, çünkü 5pivota 20 100, 1 ve 5*20 = 100 = 100*1.

Örnekler

 3 1 5 7
#########
     ^

Bu durumda, pivot doğrudan altındadır 5, 3mesafe 2 sahiptir ve 1ve 7her iki taraf da sol ve sağ eksen toplamı kadar Yani mesafe 1. var 7( 3*2 + 1*1solda ve 7*1sağda) ve bu nedenle liste [3, 1, 5, 7]dengelenmiştir.

Bununla birlikte, pivotun liste elemanlarından birinin altına yerleştirilmesi gerekmediğini, iki liste elemanının arasına da yerleştirilebileceğini unutmayın:

 6 3 1
#######
  ^

Bu durumda mesafeler 0.5, 1.5, 2.5, ...vb. Olur. Bu liste aynı zamanda dengelidir çünkü 6*0.5 = 3 = 3*0.5 + 1*1.5.

Pivot sadece bir sayının altına veya tam olarak ortasına iki sayının arasına yerleştirilebilir, örneğin iki sayının üçte ikisine değil .

Görev

Negatif olmayan tamsayıların herhangi bir makul biçimde listesi göz önüne alındığında, truthyeğer liste dengelenebilirse bir falsydeğer ve aksi takdirde bir değer verin.

Giriş listesinin en az iki öğe içerdiğini ve en az bir öğenin sıfır olmadığını kabul edebilirsiniz.

Bu bir mücadelesidir, bu nedenle her dilde en az sayıda bayt olan cevap kazanır.

Truthy Testcases

[1, 0]
[3, 1, 5, 7]
[6, 3, 1]
[100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]
[10, 4, 3, 0, 2, 0, 5]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[7, 7, 7, 7]

Sahte Testcases

[1, 2]
[3, 6, 5, 1, 12]
[0, 0, 2, 0, 1, 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[6, 3, 2, 4, 0, 1, 2, 3]
[4, 0, 0, 2, 3, 5, 2, 0, 1, 2, 3, 0, 0, 1, 2, 4, 3, 1, 3, 0, 0, 2]
[100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]

Bu zorluk kum kutudayken bulunan birçok zorlu görev : Dengeli bir sayı mı? , Bir dizinin Denge indeksi , Denge bir tahterevalli ağırlıklar seti , Kelimeler Dengeleme , ben devrilebilir mi? ve Pivot nereye ait?


Pivot, ilk numaradan önce veya son numaradan sonra yerleştirilebilir mi?
Outgolfer Erik

@EriktheOutgolfer Tüm ağırlıklar negatif değilse, hayır.

Bunun bir bozuşma olabileceğini düşünüyorum. Yoksa bir süre Sandbox'ta mı oturuyordu?
Shaggy

ile ilgili . (cc @Shaggy Belki de bunun hakkında düşündüğünüz şeydi)
Bay Xcoder

2
@ Griuseppe @Steadybox EkledimYou can assume that the input list contains at least two elements and that at least one element is non-zero.
Laikoni

Yanıtlar:


7

Pyth, 12 10 bayt

!%ys*VQUQs

Çevrimiçi deneyin

Bay Xcoder ve Outgolfer Erik sayesinde 2 bayt kurtarıldı.

açıklama

!%ys*VQUQs
    *VQUQ    Multiply each input by its index.
  ys         Take twice the sum (to handle half-integer positions).
!%       sQ  Check if that's a multiple of the total weight.

Sen kullanabilirsiniz yyerine*2
Sn Xcoder

10 bayt:!%ys*VQUQs
Outgolfer Erik


4

05AB1E , 6 bayt

ƶO·IOÖ

Çevrimiçi deneyin!

Nasıl?

·O · IOÖ ~ Tam program. I = giriş.

Lift ~ Lift I. Her bir elemanı 1-temelli indeksi ile çarpın.
 O ~ Sum.
  · ~ Çift. 
     Ö ~ bir katı mı?
   IO ~ I. toplamı

Başarısız görünüyor [1,1](truthy olmalı). Örtülü iki katının aslında orada olmadığı görülüyor.
Zgarb

@ Zgarb Fixed (?)
Bay

2

Jöle , 6 bayt

×JSḤọS

Çevrimiçi deneyin!

Görünüşe göre Leaky Nun anlamsız işaret etti.

Mnemonic'in Pyth yaklaşımını kullanmak.

Pozitif bir tamsayı (truthy) veya sıfır (falsy) döndürür.


Misiniz bu işler?
Sızdıran Rahibe

O kullandığım yüzden, bu yüzden emin değil @LeakyNun LḶ(o her ne kadar yerine ediyorum tüm test durumları için başarılı). EDIT: Oooh, şimdi tekrar düşünüyorum, öyle görünüyor ... ( b | a ⇔ b | a + b duh)
Outgolfer Erik


2

Japt , 10 bayt

í* x*2 vUx

Çevrimiçi deneyin!

Açıklama:

 í* x*2 vUx
U            // Implicit Input                 [3, 1, 5, 7]
 í           // Pair the input with its index  [[3,0],[1,1],[5,2],[7,3]]
  *          // Multiply each item             [0,1,10,21]
    x        // Sum                            32
     *2      // Double                         64
        v    // Divisible by:
         Ux  //   Sum of Input                 16
             // Explicit Output                1

1Sahte için gerçeği döndürür 0.





1

C,  140  137 bayt

float l,r;i,j,t;f(L,n)int*L;{for(i=t=-1;++i<2*n;t*=l-r)for(l=r=j=0;j<n;++j)l+=j<i/2.?L[j]*(i/2.-j):0,r+=j>i/2.?L[j]*(j-i/2.):0;return!t;}

Çevrimiçi deneyin!



1

Perl 6 , 23 bayt

{sum(1..*Z*$_)*2%%.sum}

Dene

Algoritmayı diğer çeşitli girdilerden kullanır.

Expanded:

{  # bare block lambda with implicit parameter 「$_」

    sum(

        1 .. *  # Range starting from 1

      Z*        # Zip using &infix:«*»

        $_      # the input

    ) * 2

  %%            # is divisible by

    .sum        # the sum of the input (implicit method call on 「$_」)
}

1

Japt, 11 10 8 bayt

Aslen Mnemonic'in çözümünden ilham aldı

x* vUx*½

Dene

ETHproductions sayesinde 1 3 bayt kaydedildi.


açıklama

Dizinin örtük girişi U. xHer bir öğeyi *işlemdeki 0 temelli diziniyle ( ) çarparak, ( ) kullanarak azaltın . Sonuç, her bir öğe 0,5 ( ) ile çarpılarak vorijinal girişin ( Ux) toplamına göre bölünebilir ( ) olup olmadığını kontrol edin .


İle bir bayt kaydedin m* x*2 vUx. Bu beni m* x*2daha da azaltılabilir mi diye merak ediyor ...
ETHproductions

Teşekkürler, @ETHproductions; Bu bugün öğrendiğim bir başka yeni numara.
Shaggy

Anladım, kullanıp kullanıp kullanmadığınızı x*kontrol edin Ux*½:)
ETHproductions

Evet, numarayı hiçbir yerde belgelendiğini sanmıyorum ... Fakat ne zaman ikinci bir argüman olmadan otomatik işlev olarak bir ikili operatör kullanıyorsanız, dizini varsayılan olarak kullanır (eğer yaptıysanız XY{X*Y})
ETHproductions

Oh, şimdi, bu çok zekice, @ETHproductions. :)
Shaggy

1

C # , 71 bayt


golfed

a=>{int i,s,S=s=i=0;while(i<a.Length){S-=s;s-=a[i++];}return 2*S%s<1;};

Ungolfed

a => {
    int
        i, s, S = s = i = 0;

    while( i < a.Length ) {
        S -= s;
        s -= a[ i++ ];
    }

    return 2 * S % s < 1;
};

Tam kod

using System;

namespace Namespace {
    class Program {
        static void Main( String[] args ) {
            Func<Int32[], Boolean> f = a => {
                int
                    i, s, S = s = i = 0;

                while( i < a.Length ) {
                    S -= s;
                    s -= a[ i++ ];
                }

                return 2 * S % s < 1;
            };

            List<Int32[]>
                testCases = new List<Int32[]>() {
                    new Int32[] {1, 0},
                    new Int32[] {3, 1, 5, 7},
                    new Int32[] {6, 3, 1},
                    new Int32[] {100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5},
                    new Int32[] {10, 4, 3, 0, 2, 0, 5},
                    new Int32[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
                    new Int32[] {7, 7, 7, 7},

                    new Int32[] {1, 2},
                    new Int32[] {3, 6, 5, 1, 12},
                    new Int32[] {0, 0, 2, 0, 1, 0},
                    new Int32[] {1, 2, 3, 4, 5, 6, 7, 8, 9},
                    new Int32[] {6, 3, 2, 4, 0, 1, 2, 3},
                    new Int32[] {4, 0, 0, 2, 3, 5, 2, 0, 1, 2, 3, 0, 0, 1, 2, 4, 3, 1, 3, 0, 0, 2},
                    new Int32[] {100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5},
                };

            foreach( Int32[] testCase in testCases ) {
                Console.WriteLine( $"{{ {String.Join(", ", testCase)} }}\n{f( testCase )}" );
            }

            Console.ReadLine();
        }
    }
}

Bültenleri

  • v1.0 - 71 bytes- İlk çözüm.

notlar

Dennis Python 2 çözümünü bariz bir şekilde "ödünç aldım" olabilir veya almamış olabilirim ...






0

PHP , 139 128 bayt

<?php $a=explode(',',fgets(STDIN));for($i=0;$i<count($a)-.5;$i+=.5){$z=0;foreach($a as $k=>$v)$z+=($k-$i)*$v;if($z==0)die(1);}?>

Çevrimiçi deneyin!


1
Ben yanlış anlamak bu [sürece codegolf.meta.stackexchange.com/questions/2447/... kullanmak gerekir die(1)ve die(0)çıkış kodu yerine basılı bir dize kullanarak 4 bayt kurtardı.
manassehkatz-Reinstate Monica,

@ manassehkatz Eğer tio.run'da tırnak işaretleri olmadan die kullanırsanız, bunu bir durum kodu (olması gerektiği gibi) olarak kabul eder ve Çıktı bölümüne koymaz. Bu yüzden insanların
nitpicking


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.