Чи можна цей список збалансувати?


23

Щоб перевірити, чи збалансований список невід’ємних цілих чисел , можна уявити, як розмістити відповідні ваги на дошці, а потім спробувати врівноважити дошку на шарнір, щоб узагальнені відносні ваги зліва та справа від стрижня були однаковими. Відносна вага задається шляхом множення ваги на її відстань до шарніра (див. Закон важеля ).

важіль вікіпедії (Джерело: wikipedia )

Це зображення відповідає списку [100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5]. Цей список збалансований, тому що 5має відстань 20 до стрижня, 100відстань 1 і 5*20 = 100 = 100*1.

Приклади

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

У цьому випадку шарнір знаходиться прямо під 5, а 3має відстань 2 та значення 1та 7має відстань 1. Отже, обидві сторони зліва та справа від зсуву підсумовуються до 7( 3*2 + 1*1ліворуч та 7*1праворуч), тому список [3, 1, 5, 7]збалансований.

Однак зауважте, що шарнір не повинен розміщуватися під одним із елементів списку, але він також може бути розміщений між двома елементами списку:

 6 3 1
#######
  ^

У цьому випадку відстані стають 0.5, 1.5, 2.5, ...тощо. Цей список також збалансований, оскільки 6*0.5 = 3 = 3*0.5 + 1*1.5.

Сверток може бути розміщений лише під одним числом або точно посередині між двома номерами, а не, наприклад, на дві третини між двома номерами.

Завдання

Враховуючи список невід’ємних цілих чисел у будь-якому розумному форматі, виведіть truthyзначення, якщо список можна збалансувати, а falsyзначення - інакше.

Можна припустити, що список вхідних даних містить щонайменше два елементи і що принаймні один елемент не дорівнює нулю.

Це завдання з , тому відповідь з найменшою кількістю байтів на кожній мові виграє.

Трубні тести

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

Фальшиві тести

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

Чимало пов'язаних з цим проблем, коли ця проблема виявилася піскою : це збалансоване число? , Індекс рівноваги послідовності , Збалансуйте набір ваг на мотовилі , Балансуючи слова , Чи підкажу я? і куди належить стрижень?


Чи можна встановити зведення перед першим номером або після останнього номера?
Ерік Аутгольфер

@EriktheOutgolfer Якщо всі ваги невід’ємні, ні.

Думаю, це може бути дура. Або деякий час сидів у пісочниці?
Shaggy

пов'язані . (cc @Shaggy Можливо, саме про це ви думали)
Містер Xcoder

2
@Giuseppe @Steadybox Я додавYou can assume that the input list contains at least two elements and that at least one element is non-zero.
Laikoni

Відповіді:


7

Pyth, 12 10 байт

!%ys*VQUQs

Спробуйте в Інтернеті

Збережено 2 байти завдяки містеру Xcoder та Еріку Захисника.

Пояснення

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

Ви можете використовувати yзамість*2
Містер Xcoder

10 байт:!%ys*VQUQs
Ерік Атголфер


4

05AB1E , 6 байт

ƶO·IOÖ

Спробуйте в Інтернеті!

Як?

·O · IOÖ ~ Повна програма. I = вхід.

ƶ ~ Підніміть I. Помножте кожен елемент на його 1-індекс.
 O ~ Сума.
  · ~ Подвійний. 
     Ö ~ Чи кратний?
   ІО ~ Сума І.

Здається, що не вдається [1,1](має бути правдою). Здається, неявного подвоєння насправді немає.
Згарб

@ Zgarb Виправлено (?)
Містер Xcoder

2

Желе , 6 байт

×JSḤọS

Спробуйте в Інтернеті!

Добре, схоже, що Leaky Nun вказала на безглузде.

Використання підходу Mnemonic Pyth.

Повертає додатне ціле число (truthy) або нуль (false).


Буде чи ця робота?
Лина монахиня

@LeakyNun Не настільки впевнений, тому я використовував LḶнатомість (хоча це вдалося б для всіх тестових випадків). EDIT: Ооо, тепер, коли я знову замислююся над цим, здається, що так ... ( b | a ⇔ b | a + b duh)
Erik the Outgolfer


2

Japt , 10 байт

í* x*2 vUx

Спробуйте в Інтернеті!

Пояснення:

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

Повертається 1за правдою, 0за помилкою .







1

Perl 6 , 23 байти

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

Перевірте це

Використовує алгоритм з різних інших записів.

Розширено:

{  # 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 байт

Спочатку надихнув рішення Mnemonic

x* vUx*½

Спробуй це

1 3 байти збережено завдяки ETHproductions.


Пояснення

Неявне введення масиву U. Зменшіть на додавання ( x), помноживши кожен елемент на його індекс на основі 0 ( *). Перевірте, чи результат рівномірно ділиться ( v) на суму вихідного вводу ( Ux), при цьому кожен елемент помножується на 0,5 ( ).


Збережіть байт за допомогою m* x*2 vUx. Це змушує мене замислитися, чи m* x*2можна зменшити далі ...
ETHproductions

Спасибі, @ETHproductions; це ще одна нова хитрість, яку я навчився сьогодні.
Кудлатий

У мене це є, просто скористайтеся x*і перевірте, чи воно ділиться на Ux*½:)
ETHproductions

Так, я не думаю, що цей трюк ніде не задокументований ... Але щоразу, коли ви використовуєте двійковий оператор як автоматичну функцію без другого аргументу, він використовує індекс за замовчуванням (наприклад, якщо ви зробили XY{X*Y})
ETHproductions

О, тепер це просто геніально, @ETHproductions. :)
Shaggy

1

C # , 71 байт


Гольф

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

Безумовно

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

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

    return 2 * S % s < 1;
};

Повний код

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

Релізи

  • v1.0 - 71 bytes- Початкове рішення.

Примітки

Я б, можливо, не мав, кричущо "запозичив" рішення Dennis Python 2 ...






0

PHP , 139 128 байт

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

Спробуйте в Інтернеті!


1
Якщо я неправильно зрозумію це [ codegolf.meta.stackexchange.com/questions/2447/…, ви повинні мати можливість використовувати die(1)та die(0)зберігати 4 байти, використовуючи код виходу замість друкованого рядка.
manassehkatz-Reinstate Моніка

@manassehkatz Якщо ви використовуєте die без лапок на tio.run, він буде розглядати це як код статусу (який він повинен бути), а не ставити його у розділі Вихідні дані. Тому я щойно додав цитати, щоб запобігти людям не
пиякувати


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.