这个清单可以平衡吗?


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
#########
     ^

在这种情况下,枢轴位于的正下方53具有距离2和17具有距离1。因此,枢轴的左侧和右侧的两边总计为73*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]

沙盒化过程中发现了许多相关的挑战: 数量是否均衡?序列的均衡指数平衡在跷跷板上一组权重平衡话我将翻倒?哪里枢轴属于?


可以将枢轴放置在第一个数字之前还是最后一个数字之后?
Erik the Outgolfer '17

@EriktheOutgolfer如果所有权重均为非负数,否。

我认为这可能是骗子。还是在沙盒中坐了一段时间?
毛茸茸的

相关的。(抄送@Shaggy也许这就是您的想法)
Xcoder先生17年

2
我添加了@Giuseppe @SteadyboxYou can assume that the input list contains at least two elements and that at least one element is non-zero.
Laikoni '17

Answers:


7

Pyth,12个 10字节

!%ys*VQUQs

在线尝试

感谢Xcoder先生和Outgolfer的Erik,节省了2个字节。

说明

!%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先生17年

10个字节:!%ys*VQUQs
Erik the Outgolfer


4

05AB1E,6个字节

ƶO·IOÖ

在线尝试!

怎么样?

·O·IOÖ〜完整程序。I =输入。

Lift〜提升I.将每个元素与其从1开始的索引相乘。
 喔〜
  ·〜双。 
     Ö〜是的倍数?
   IO〜I之和

似乎失败了[1,1](应该是事实)。似乎隐式加倍实际上并不存在。
Zgarb

@Zgarb Fixed(?)
Xcoder先生17年

2

果冻,6个字节

×JSḤọS

在线尝试!

好吧,看起来Leaky Nun指出了毫无意义。

使用助记符的Pyth方法。

返回正整数(真)或零(伪)。


请问这个工作?
Leaky Nun

@LeakyNun不太确定,这就是我LḶ改用的原因(尽管它在所有测试用例中都会成功)。编辑:噢,现在我再考虑一遍,似乎是...(b |
a⇔b


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

C, 140个  137字节

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

在线尝试!



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由于ETHproductions,节省了3个字节。


说明

数组的隐式输入U。通过加法(x)进行缩减,从而将每个元素乘以基于0的索引(*)。检查结果是否被v原始输入(Ux)的总和平均除(),并且每个元素都乘以0.5()。


用保存一个字节m* x*2 vUx。这让我想知道是否m* x*2可以进一步减少...
ETHproductions'Dec 21'17

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

发布

  • 1.0 - 71 bytes-初始溶液。

笔记

我可能有,也可能没有,很“借用” Dennis Python 2解决方案 ...






0

PHP139128字节

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

在线尝试!

  • -2字节,用于消除周围的引号,die这要归功于manassehkatz
  • -9个字节归功于学习社区标准

1
除非我误解这[ codegolf.meta.stackexchange.com/questions/2447/...你应该能够使用die(1)die(0)和保存4个字节使用exit代码,而不是打印字符串。
manassehkatz-恢复莫妮卡

@manassehkatz如果在tio.run上使用不带引号的die,它将被视为状态码(应该如此),而不是将其放在Output部分中。所以我只是加了引号来防止人们挑剔
Mic1780 '17


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.