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


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]

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


Можно ли поставить точку перед первым или последним номером?
Эрик 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

05AB1E , 6 байтов

ƶO·IOÖ

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

Как?

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

I. ~ Lift I. Умножьте каждый элемент с его индексом, основанным на 1.
 O ~ Sum.
  · ~ Двойной 
     Ö ~ является кратным?
   IO ~ сумма I.

Кажется, провалиться [1,1](должно быть правдой). Кажется, что неявного удвоения на самом деле нет.
Згарб

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

2

Желе , 6 байт

×JSḤọS

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

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

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

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


Будет ли это работать?
Утренняя монахиня

@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за ложь.







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

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






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-Восстановить Монику

@manassehkatz Если вы используете die без кавычек на tio.run, он будет обрабатывать его как код состояния (что следует), а не помещать его в раздел «Вывод». Поэтому я просто добавил цитаты, чтобы не дать людям
придираться


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.