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?


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.

Możesz użyć yzamiast*2
Mr. Xcoder

10 bajtów:!%ys*VQUQs
Erik the Outgolfer,


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.

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


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.





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!



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 「$_」)
}

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


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






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!


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.