รายการนี้สามารถสมดุล


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

ในกรณีนี้เดือยอยู่ภายใต้ a 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ค่าอื่น ๆ

คุณสามารถสมมติว่ารายการอินพุตมีองค์ประกอบอย่างน้อยสององค์ประกอบและอย่างน้อยหนึ่งองค์ประกอบนั้นไม่ใช่ศูนย์

นี่เป็นความท้าทายของการเขียนดังนั้นคำตอบที่มีจำนวนไบต์น้อยที่สุดในแต่ละภาษาจะเป็นผู้ชนะ

Truthy Testcases

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

Testals เท็จ

[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

@EriktheOutgolfer ถ้าตุ้มน้ำหนักทั้งหมดเป็นค่าลบไม่ได้

ฉันคิดว่านี่อาจเป็นล่อลวง หรือว่ามันนั่งอยู่ใน Sandbox ซักพักซักพัก?
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

Pyth, 12 10 ไบต์

!%ys*VQUQs

ลองออนไลน์

บันทึก 2 ไบต์ต้องขอบคุณ Mr. Xcoder และ Erik the 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
Mr. Xcoder

10 ไบต์:!%ys*VQUQs
Erik the Outgolfer

4

ภาษา Wolfram (Mathematica)ขนาด 36 ไบต์

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

นี่เป็นจุดศูนย์กลางของปัญหามวลในระบบพิกัดที่มีจุดกำเนิดที่จุดใดจุดหนึ่งจากนั้นคุณจะพิจารณาว่า CM ตรงกับจุดขัดแตะหรือไม่ที่ความกว้างของตาข่าย = 1/2

ลองออนไลน์!


4

05AB1E , 6 ไบต์

ƶO·IOÖ

ลองออนไลน์!

อย่างไร?

ƶO·IOÖ ~ โปรแกรมเต็มรูปแบบ I = อินพุต

Lift ~ ยก I. คูณแต่ละองค์ประกอบด้วยดัชนีที่ใช้ 1
 O ~ Sum
  · ~ สองเท่า 
     Ö ~ มีหลายอย่างใช่ไหม
   IO ~ ผลรวมของ I

ดูเหมือนว่าจะล้มเหลว[1,1](ควรเป็นจริง) ดูเหมือนว่าการเสแสร้งโดยนัยไม่ได้มีอยู่จริง
Zgarb

@Zgarb แก้ไข (?)
Mr. Xcoder

2

เยลลี่ 6 ไบต์

×JSḤọS

ลองออนไลน์!

ดูเหมือนว่าLeaky Nun จะชี้ให้เห็นอย่างไร้จุดหมาย

ใช้วิธีการ Pyth ของ Mnemonic

ส่งกลับจำนวนเต็มบวก (ความจริง) หรือศูนย์ (เท็จ)


Would นี้ทำงานหรือไม่
Leun Nun

@LeakyNun ไม่แน่ใจนั่นเป็นเหตุผลที่ฉันใช้LḶแทน (แม้ว่ามันจะประสบความสำเร็จในทุกกรณีทดสอบ) แก้ไข: Oooh ตอนนี้ฉันคิดอีกครั้งดูเหมือนว่า ... ( b | a ⇔ b | a + b duh)
Erik 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

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 3 ไบต์ที่บันทึกไว้ต้องขอบคุณ ETHproductions


คำอธิบาย

Uการป้อนข้อมูลโดยปริยายของอาร์เรย์ ลดด้วยการเพิ่ม ( x) คูณแต่ละองค์ประกอบด้วยดัชนีที่เป็น 0 ( *) ในกระบวนการ ตรวจสอบว่าผลลัพธ์หารด้วย ( v) โดยผลรวมของอินพุตต้นฉบับ ( Ux) โดยแต่ละองค์ประกอบถูกคูณด้วย 0.5 ( )


m* x*2 vUxบันทึกไบต์ด้วย นี่ทำให้ฉันสงสัยว่าm* x*2จะลดลงอีกหรือไม่ ...
ผลิตภัณฑ์ ETH

ขอบคุณ @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;};

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- โซลูชั่นเริ่มต้น

หมายเหตุ

ฉันอาจมีหรืออาจจะไม่แก้ปัญหาโจ๋งครึ่ม "ยืม" เดนนิส 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-Reinstate Monica

@manassehkatz หากคุณใช้ die โดยไม่ใส่เครื่องหมายอัญประกาศบน tio.run มันจะถือว่าเป็นรหัสสถานะ (ซึ่งควรจะเป็น) และไม่ควรใส่ไว้ในส่วน Output ดังนั้นฉันเพิ่งเพิ่มคำพูดเพื่อป้องกันไม่ให้ผู้คนจาก nitpicking
Mic1780


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.