Может ли этот список быть сбалансированным?

23

Чтобы проверить, сбалансирован ли список неотрицательных целых чисел , можно представить, что на доске выставлены соответствующие веса, а затем попытаться уравновесить доску на стержне так, чтобы суммарные относительные веса слева и справа от стержня были одинаковыми. Относительный вес дается умножением веса на его расстояние до оси (см. Закон рычага ).

рычаг википедии (Источник: Википедия )

Это изображение соответствует списку [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]

Множество связанных с этим проблем было найдено в то время, когда эта задача была в песочнице : сбалансированное число? , Индекс равновесия последовательности , Балансировать набор весов на качелях , Балансирующие слова , Я опрокинусь? и где находится стержень?

Laikoni
источник
Можно ли поставить точку перед первым или последним номером?
Эрик Outgolfer
@EriktheOutgolfer Если все веса неотрицательные, нет.
Я думаю, что это может быть дураком. Или он какое-то время сидел в Песочнице?
Лохматый
связанные . (cc @Shaggy Может быть, именно об этом вы и думали)
Mr. 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 и Эрику Outgolfer.

объяснение

!%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
Эрик Outgolfer
4

Wolfram Language (Mathematica) , 36 байт

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

Это проблема центра масс в системе координат с началом координат в одной из точек, и затем вы определяете, попадает ли КМ в точку решетки, где ширина решетки = 1/2.

Попробуйте онлайн!

Келли Лоудер
источник
4

05AB1E , 6 байтов

ƶO·IOÖ

Попробуйте онлайн!

Как?

ƶO · IOÖ ~ Полная программа. Я = вход.

I. ~ Lift I. Умножьте каждый элемент с его индексом, основанным на 1.
 O ~ Sum.
  · ~ Двойной 
     Ö ~ является кратным?
   IO ~ сумма I.
Мистер Xcoder
источник
Кажется, провалиться [1,1](должно быть правдой). Кажется, что неявного удвоения на самом деле нет.
Згарб
@Zgarb Исправлено (?)
Мистер Xcoder
2

Желе , 6 байт

×JSḤọS

Попробуйте онлайн!

Ну, похоже, Лаки Монахиня указала на бессмысленность.

Используя подход Mnemonic's Pyth.

Возвращает положительное целое число (правда) или ноль (ложь).

Эрик Outgolfer
источник
Будет ли это работать?
Утренняя монахиня
@LeakyNun Не совсем уверен, поэтому я использовал LḶвместо этого (хотя это будет успешно для всех тестовых случаев). РЕДАКТИРОВАТЬ: Ооо, теперь, когда я снова думаю об этом, кажется, что так ... ( b | a⇔b | a + b дух)
Эрик 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за ложь.

Оливер
источник
2

Python 2 , 41 байт

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

Вывод осуществляется через код выхода, поэтому 0 соответствует действительности, а 1 - неверно.

Попробуйте онлайн!

Деннис
источник
1

Perl 6 , 23 байта

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

Попробуй это

Использует алгоритм из различных других записей.

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 「$_」)
}
Брэд Гилберт b2gills
источник
1

Джапт, 11 10 8 байт

Первоначально вдохновленный решением Mnemonic

x* vUx*½

Попытайся

1 3 байта сохранены благодаря ETHproductions.


объяснение

Неявный ввод массива U. Сократите путем add ( x), умножая каждый элемент на его индекс на основе 0 ( *) в процессе. Проверьте, является ли результат равномерно делимым ( v) на сумму исходного input ( Ux), при этом каждый элемент умножается на 0.5 ( ).

мохнатый
источник
Сохранить байт с m* x*2 vUx. Это заставляет меня задуматься о том, m* x*2можно ли уменьшить это далее ...
ETHproductions
Спасибо, @ETHproductions; это еще одна новая уловка, которую я узнал сегодня.
Лохматый
У меня это есть, просто используйте x*и проверьте, делится ли оно на Ux*½:)
ETHproductions
Да, я не думаю, что этот трюк документирован где-либо ... Но всякий раз, когда вы используете бинарный оператор в качестве авто-функции без второго аргумента, он использует индекс по умолчанию (как если бы вы это сделали XY{X*Y})
ETHproductions
О, это просто гениально, @ETHproductions. :)
Лохматый
1

C # , 71 байт


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

Полный код

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

auhmaan
источник
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);}?>

Попробуйте онлайн!

Mic1780
источник
1
Если я не пойму это неправильно [ codegolf.meta.stackexchange.com/questions/2447/…), вы сможете использовать die(1)и die(0)сохранять 4 байта, используя код выхода вместо печатной строки.
manassehkatz-Восстановить Монику
@manassehkatz Если вы используете die без кавычек на tio.run, он будет обрабатывать его как код состояния (что следует), а не помещать его в раздел «Вывод». Поэтому я просто добавил цитаты, чтобы не дать людям
придираться