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


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)을 가지며 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.

피벗은 정확히 한 숫자 아래 또는 두 숫자 사이의 가운데에만 배치 할 수 있습니다 사이의 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.