이 목록의 균형을 잡을 수 있습니까?


23

음이 아닌 정수의 목록이 균형 을 이루는 지 확인하기 위해 보드에 각 가중치를 적용한 다음 피벗의 왼쪽과 오른쪽에 요약 된 상대적 가중치가 동일하도록 피벗 에서 보드의 균형을 맞추는 것을 상상할 수 있습니다 . 상대적 무게는 무게와 피벗까지의 거리를 곱하여 주어집니다 ( 레버 법칙 참조 ).

wikipedia lever (출처 : 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)을 가지며 17양측 좌우 요동 합 닫하도록 거리가 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.

피벗은 정확히 한 숫자 아래 또는 두 숫자 사이의 가운데에만 배치 할 수 있습니다 사이의 2/3에는 없습니다 .

태스크

출력 어떤 적당한 형식으로 음이 아닌 정수의리스트에 근거 truthy값리스트가 될 수 있는지 균형falsy달리 값.

입력 목록에 둘 이상의 요소가 있고 하나 이상의 요소가 0이 아닌 것으로 가정 할 수 있습니다.

이것은 도전이므로 각 언어에서 가장 적은 바이트 수의 응답이 이깁니다.

진실한 테스트 케이스

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

@EriktheOutgolfer 모든 무게가 음수가 아닌 경우, 아닙니다.

나는 이것이 속이는 것 같아요. 아니면 샌드 박스에 잠시 앉아 있었습니까?
Shaggy

관련 . (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

피스, 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
Mr. Xcoder

10 바이트 :!%ys*VQUQs
Outgolfer Erik


4

05AB1E , 6 바이트

ƶO·IOÖ

온라인으로 사용해보십시오!

방법?

ƶO · IOÖ ~ 전체 프로그램. I = 입력

Lift ~ 리프트 I. 각 요소에 1 기반 인덱스를 곱합니다.
 O ~ 합계
  · ~ 두 배. 
     Ö ~의 배수는?
   IO ~ I의 합

실패하는 것 같습니다 [1,1](진실해야 함). 암시 적 배가가 실제로 존재하지 않는 것 같습니다.
Zgarb

@Zgarb Fixed (?)
Mr. Xcoder

2

젤리 , 6 바이트

×JSḤọS

온라인으로 사용해보십시오!

Leaky Nun 이 무의미한 것을 지적한 것 같습니다 .

니모닉의 Pyth 접근 방식을 사용합니다.

양의 정수 (거짓) 또는 0 (거짓)을 반환합니다.


겠습니까 작품은?
Leaky Nun

그게 내가 사용하는 이유는, 그래서 확실하지 @LeakyNun LḶ(가 있지만 대신 모든 테스트 케이스에 대한 성공). 편집 : 우우, 이제 다시 생각하면, 그렇게 보인다 ... ( b | a ⇔ b | a + b duh)
에릭 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

펄 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*½

시도 해봐

ETH 프로덕션 덕분에 1 3 바이트가 절약되었습니다.


설명

배열의 암시 적 입력 U. 프로세스에서 x각 요소에 0부터 시작하는 인덱스 ( *)를 곱하여 더하기 ( )로 줄 입니다. 각 요소에 0.5 ( )를 곱한 v원래 입력 ( Ux) 의 합으로 결과를 균등하게 나눌 수 있는지 ( ) 확인하십시오 .


로 바이트를 저장하십시오 m* x*2 vUx. 이렇게하면 m* x*2더 줄일 수 있는지 궁금해집니다 .
ETHproductions

감사합니다, @ETHproductions; 그것이 제가 오늘 배운 또 다른 새로운 요령입니다.
Shaggy

나는 그것을 얻었고, 그것을 사용 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 , 139128 바이트

<?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 Monica

@manassehkatz tio.run에 따옴표없이 die를 사용하면이를 상태 코드 (필수)로 취급하여 출력 섹션에 넣지 않습니다. 그래서 사람들이 nitpicking을 막기 위해 인용구를 추가했습니다
Mic1780


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.