Czy ta lista może być zrównoważona?

23

Aby sprawdzić, czy lista liczb całkowitych nieujemnych jest zrównoważona , można sobie wyobrazić umieszczenie odpowiednich wag na tablicy, a następnie spróbować zrównoważyć tablicę na osi obrotu, tak aby podsumowane względne wagi po lewej i prawej stronie osi były takie same. Względny ciężar jest podawany przez pomnożenie ciężaru przez jego odległość od osi obrotu (patrz prawo dźwigni ).

dźwignia wikipedia (Źródło: wikipedia )

Ten obraz odpowiada liście [100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]. Ta lista jest zrównoważona, ponieważ 5ma odległość 20 do osi obrotu, 100odległość 1 i 5*20 = 100 = 100*1.

Przykłady

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

W tym przypadku punkt obrotu znajduje się bezpośrednio pod 5, 3ma odległość 2 i 1oraz 7odległość 1. Tak więc obie strony po lewej i prawej stronie osi obrotu sumują się do 7( 3*2 + 1*1po lewej i 7*1po prawej stronie), a zatem lista [3, 1, 5, 7]jest zrównoważona.

Należy jednak pamiętać, że oś przestawna nie musi być umieszczana pod jednym z elementów listy, ale może również znajdować się pomiędzy dwoma elementami listy:

 6 3 1
#######
  ^

W tym przypadku odległości stają się 0.5, 1.5, 2.5, ...i tak dalej. Ta lista jest również zrównoważona, ponieważ 6*0.5 = 3 = 3*0.5 + 1*1.5.

Oś może być umieszczona tylko dokładnie pod jedną liczbą lub dokładnie pośrodku między dwiema liczbami, a nie np. W dwóch trzecich między dwiema liczbami.

Zadanie

Biorąc pod uwagę listę liczb całkowitych nieujemnych w dowolnym rozsądnym formacie, wypisz truthywartość, jeśli listę można zrównoważyć, a falsywartość w przeciwnym razie.

Możesz założyć, że lista wejściowa zawiera co najmniej dwa elementy i że co najmniej jeden element jest różny od zera.

To jest wyzwanie dla , więc wygrywa odpowiedź z najmniejszą liczbą bajtów w każdym języku.

Prawdziwe przypadki testowe

[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]

Falsy 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]

Znaleziono wiele powiązanych wyzwań, podczas gdy to wyzwanie było piaskownicą : czy jest to liczba zrównoważona? , Indeks równowagi sekwencji , Równowaga zestawu wag na huśtawce , Równoważenie słów , Czy przewrócę się? i Gdzie należy czop?

Laikoni
źródło
Czy oś może być umieszczona przed pierwszym numerem lub po ostatnim numerze?
Erik the Outgolfer,
@EriktheOutgolfer Jeśli wszystkie odważniki są nieujemne, nie.
Myślę, że to może być dupek. A może przez jakiś czas siedział w piaskownicy?
Shaggy,
powiązane . (cc @ Shaggy Może o tym właśnie myślałeś)
Pan Xcoder,
2
@Giuseppe @Steadybox DodałemYou can assume that the input list contains at least two elements and that at least one element is non-zero.
Laikoni

Odpowiedzi:

7

Pyth, 12 10 bajtów

!%ys*VQUQs

Wypróbuj online

Zaoszczędzono 2 bajty dzięki panu Xcoder i Erikowi Outgolfer.

Wyjaśnienie

!%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.

źródło
Możesz użyć yzamiast*2
Mr. Xcoder
10 bajtów:!%ys*VQUQs
Erik the Outgolfer,
4

Wolfram Language (Mathematica) , 36 bajtów

IntegerQ[2#.Range[t=Tr[1^#]]/(t-1)]&

Jest to problem środka masy w układzie współrzędnych z punktem początkowym w jednym z punktów, a następnie określasz, czy CM spada na punkt sieci, gdzie szerokość sieci = 1/2.

Wypróbuj online!

Kelly Lowder
źródło
4

05AB1E , 6 bajtów

ƶO·IOÖ

Wypróbuj online!

W jaki sposób?

ƶO · IOÖ ~ Pełny program. I = wejście.

Lift ~ Lift I. Pomnóż każdy element z jego indeksem 1.
 O ~ Sum.
  · ~ Podwójnie. 
     Ö ~ Czy wielokrotność?
   IO ~ Suma I.
Pan Xcoder
źródło
Wygląda na to, że zawiedzie [1,1](powinno być prawdą). Wygląda na to, że ukrytego dublowania tak naprawdę nie ma.
Zgarb
@Zgarb Naprawiono (?)
Mr. Xcoder,
2

Galaretka , 6 bajtów

×JSḤọS

Wypróbuj online!

Wygląda na to, że Dziurawa Zakonnica zwróciła uwagę na bezcelowość.

Korzystanie z metody Pyth firmy Mnemonic.

Zwraca dodatnią liczbę całkowitą (prawda) lub zero (fałsz).

Erik the Outgolfer
źródło
Czy to zadziała?
Leaky Nun
@LeakyNun Nie jestem pewien, dlatego użyłem LḶzamiast tego (chociaż to się udałoby we wszystkich przypadkach testowych). EDYCJA: Oooh, teraz, kiedy znów o tym myślę, wydaje się, że ... ( b | a ⇔ b | a + b duh)
Erik the Outgolfer
2

Japt , 10 bajtów

í* x*2 vUx

Wypróbuj online!

Wyjaśnienie:

 í* 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

Zwraca 1za prawdę, 0za fałsz.

Oliver
źródło
2

Python 2 , 41 bajtów

S=s=0
for n in input():S-=s;s-=n
1>>2*S%s

Wyjście odbywa się za pomocą kodu wyjścia, więc 0 to prawda, a 1 to fałsz.

Wypróbuj online!

Dennis
źródło
2

Julia , 31 27 bajtów

4 bajty zapisane dzięki @Dennis

!n=2n[i=1:end]⋅i%sum(n)<1

Wypróbuj online!

Uriel
źródło
2

Ruby , 47 bajtów

Zaoszczędzono 2 bajty dzięki Mr. Xcoder

->k{(k.map.with_index{|x,i|x*i*2}.sum%k.sum)<1}

Wypróbuj online!

Tom Lazar
źródło
1
Witamy w PPCG! Ładna pierwsza odpowiedź. 47 bajtów
Mr. Xcoder,
1

C,  140  137 bajtów

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

Wypróbuj online!

Steadybox
źródło
1

Perl 6 , 23 bajtów

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

Sprawdź to

Wykorzystuje algorytm z różnych innych pozycji.

Rozszerzony:

{  # 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 「$_」)
}
Brad Gilbert b2gills
źródło
1

Japt, 11 10 8 bajtów

Pierwotnie zainspirowany rozwiązaniem Mnemonica

x* vUx*½

Spróbuj

1 3 bajty zapisane dzięki ETHproductions.


Wyjaśnienie

Domniemane wejście tablicy U. Zmniejsz przez dodanie ( x), mnożenie każdego elementu przez jego indeks 0 ( *) w procesie. Sprawdź, czy wynik jest równomiernie podzielny ( v) przez sumę oryginalnego wejścia ( Ux), przy czym każdy element jest mnożony przez 0,5 ( ).

Kudłaty
źródło
Zapisz bajt za pomocą m* x*2 vUx. To sprawia, że ​​zastanawiam się, czy m* x*2można to jeszcze bardziej zmniejszyć ...
ETHprodukcje
Dzięki, @ETHproductions; to kolejna nowa sztuczka, której nauczyłem się dzisiaj.
Kudłaty
Mam go, wystarczy użyć x*i sprawdzić, czy można go podzielić przez Ux*½:)
ETHproductions
Tak, nie sądzę, że ta sztuczka jest nigdzie udokumentowana ... Ale ilekroć użyjesz operatora binarnego jako funkcji automatycznej bez drugiego argumentu, domyślnie używa indeksu (tak jakbyś to zrobił XY{X*Y})
ETHproductions
Och, teraz to po prostu genialne @ETHproductions. :)
Kudłaty
1

C # , 71 bajtów


Grał w golfa

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

Bez golfa

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

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

    return 2 * S % s < 1;
};

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

Prasowe

  • v1.0 - 71 bytes- Wstępne rozwiązanie.

Notatki

Mogłem mieć, lub nie, rażąco „pożyczyłem” rozwiązanie Dennis Python 2 ...

auhmaan
źródło
0

APL (Dyalog) , 15 bajtów

0≡+⌿|(+⌿+⍨×⍳∘≢)

Wypróbuj online!

Wygląda mi bardzo niechlujnie ...

Erik the Outgolfer
źródło
0

Python 2 , 78 75 bajtów

dzięki Mr. Xcoder za -3 bajty

lambda l:0in[sum(v*(i-y*2)for y,v in enumerate(l))for i in range(len(l)*2)]

Wypróbuj online!

ovs
źródło
2
Nie potrzeba miejsca w 0 in. Także nie trzeba za 0w range(0,len(l)*2)..
Pan Xcoder
0

PHP , 139 128 bajtów

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

Wypróbuj online!

Mic1780
źródło
1
Chyba, że nie rozumieją tego [ codegolf.meta.stackexchange.com/questions/2447/... powinieneś móc używać die(1)i die(0)zaoszczędzisz 4 bajty za pomocą kodu exit zamiast drukowany napis.
manassehkatz-Reinstate Monica
@manassehkatz Jeśli użyjesz die bez cudzysłowów na tio.run, potraktuje to jako kod statusu (który powinien) i nie umieści go w sekcji Wyjście. Właśnie dodałem cytaty, aby zapobiec
podrywaniu
0

Szybki , 76 bajtów

{var i=0,t=0;print($0.reduce(0){$0+($1*i,t+=$1,i+=1).0}*2%t<1)}as([Int])->()

Wypróbuj online!

Herman L.
źródło