ดัชนีสมดุลของลำดับ


10

ดัชนีดุลยภาพของลำดับคือดัชนีที่ผลรวมขององค์ประกอบที่ดัชนีต่ำกว่าเท่ากับผลรวมขององค์ประกอบที่ดัชนีสูงกว่า ตัวอย่างเช่นในลำดับ A:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

3 คือดัชนีดุลเนื่องจาก:

A[0]+A[1]+A[2]=A[4]+A[5]+A[6]

6 ยังเป็นดัชนีดุลยภาพเนื่องจาก:

A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0

(ผลรวมขององค์ประกอบศูนย์คือศูนย์) 7 ไม่ใช่ดัชนีดุลเนื่องจากมันไม่ใช่ดัชนีที่ถูกต้องของลำดับ A

แนวคิดคือการสร้างโปรแกรมที่ให้ลำดับ (อาร์เรย์) ส่งคืนดัชนีดุล (ใด ๆ ) หรือ -1 หากไม่มีดัชนีสมดุล

คำตอบ:


6

Golfscript 17 16

เนื่องจากไม่ได้ระบุรูปแบบของอินพุตสิ่งนี้ใช้สตริงในรูปแบบอาร์เรย์ Golfscript จาก stdin

~0\{1$+.@+\}/])?

ดังนั้นวิ่งเช่น

golfscript.ry eqindex.gs <<<"[-7 1 5 2 -4 3 0]"

ความคิดนั้นง่ายมาก: ใช้อาร์เรย์A_iและแม็พกับอาร์เรย์A_i + 2 SUM_{j<i} A_jแล้วมองหาดัชนีแรกซึ่งเท่ากับผลรวมของทั้งอาร์เรย์


สำหรับความท้าทายของ @ mellamokb ฉันขอเสนอ:

~0\{1$+.@+\}/:S;]:A,,{A=S=},`

สำหรับ 29 ตัวอักษร


เนื่องจากคุณได้อย่างง่ายดายมีโซลูชั่นที่สั้นที่สุดฉันขอประกาศคุณจะต้องกลับทั้งหมดของดัชนีที่ไม่เพียง แต่ครั้งแรกหนึ่ง :)
mellamokb

@ mellamokb พร้อมคำชมของฉัน
Peter Taylor

เย็น! ตอนนี้ผมได้มีการเรียนรู้มากขึ้นบาง GolfScript ที่จะทำ ...
mellamokb

5

Python - 72 ตัวอักษร

A=input()
print[i for i in range(len(A))if sum(A[:i])==sum(A[i+1:])]or-1

ใช้อินพุตที่คั่นด้วยเครื่องหมายจุลภาค


ดีเลิศ ... อันนี้คืนค่าดัชนีสมดุลทั้งหมด ... เจ๋งจริงๆ
Cristian

@ คริสเตียน: ของฉันก็ทำเช่นกัน
FUZxxl

ฉันเห็น :) จริง ๆ แล้วฉันไม่รู้วิธีเรียกใช้รหัส haskell ... จะต้องศึกษา
Cristian

คริสเตียน: มี ghc, คอมไพเลอร์และกอดเป็นล่าม ผมขอแนะนำให้ดาวน์โหลดกอด จะดีกว่าการดาวน์โหลด ghc เนื่องจากการกอดมีค่าประมาณ 7 MiB ในขณะที่การแจกจ่าย ghc ทั้งหมดประมาณ 300 MiB ใช้กอดคุณก็สามารถพิมพ์เพื่อเรียกใช้โปรแกรมrunhugs FILE.hs FILE.hs
FUZxxl

5

Haskell ( 95 83)

e l=[n|n<-[0..length l-1],sum(take n l)==sum(drop(n+1)l)]
main=interact$show.e.read

อ่านรายการในสไตล์ Haskell จาก stdin เช่น

[-7,1,5,2,-4,3,0]

และส่งคืนรายการสไตล์ของ Haskell ของดัชนีเช่น

[3,6]

ผลลัพธ์คือ[]ถ้าไม่มีดัชนี

โปรดบอกฉันหากสเป็คของคุณต้องการพฤติกรรมที่แตกต่าง

การแก้ไข:

  • (95 → 83): ความเข้าใจในรายการนั้นมีความชัดเจนมากกว่า

4

C - 96

a[99],*p=a,s;main(){for(;scanf("%d",p)>0;s+=*p++
);for(;p>a;s-=*p)(s-=*--p)||printf("%d\n",p-a);}

โปรดทราบว่าสิ่งนี้จะพิมพ์ดัชนีสมดุลในลำดับย้อนกลับ

ตัวอย่างการใช้งาน:

$ ./equilibrium <<< "-7 1 5 2 -4 3 0"
6
3

3

ทับทิม (83 77)

a=*$<.map(&:to_i)
p (0...a.size).select{|x|a[0..x].reduce(:+)==a[x..-1].reduce(:+)}

แก้ไข: รุ่นที่สั้นกว่าตามที่ Ventero แนะนำ:

a=$<.map &:to_i
p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}

อินพุตคือหนึ่งหมายเลขต่อบรรทัดเอาต์พุตเป็นรายการที่คั่นด้วยเครื่องหมายคอมมาของดัชนีในเครื่องหมายวงเล็บเหลี่ยม


1
คุณไม่จำเป็นต้องใส่วงเล็บในบรรทัดแรกและคุณสามารถบันทึกตัวอักษรสองสามตัวได้โดยใช้การรวม + eval เพื่อรับผลรวม: p (0...a.size).select{|x|eval"#{a[0..x]*?+}==#{a[x..-1]*?+}"}(โปรดทราบว่านี่คือ Ruby 1.9 เนื่องจากใช้ตัวอักษรเป็นตัวอักษรสตริง)
Ventero

คำแนะนำยอดเยี่ยมขอบคุณ! น่ารำคาญที่ Array # sum ไม่ได้อยู่ใน Ruby core
ลาร์ส Haugseth

หากฉันลบ parantheses ในบรรทัดแรกฉันจะได้รับ: "SyntaxError: (irb): 17: ข้อผิดพลาดทางไวยากรณ์, tAMPER ที่ไม่คาดคิดคาดหวัง $ end"
Lars Haugseth

จะต้องมีช่องว่างระหว่างmapและเครื่องหมาย และคุณไม่จำเป็นต้องมีผู้ประกอบการเครื่องหมายในด้านหน้าของทั้งสองดังนั้นในทุกสายจะมีลักษณะเช่นนี้$< a=$<.map &:to_i;)
Ventero

อ่าขอบคุณอีกครั้งมันเป็นเครื่องหมายที่ทำลายไวยากรณ์
ลาร์ส Haugseth



2

J (12 ตัวอักษร)

คำกริยา monadic ในรูปแบบโดยปริยายที่ส่งคืนเวกเตอร์ของดัชนีดุลยภาพ แทรกช่องว่างเพื่อความชัดเจนเท่านั้น

[: I. +/\. = +/\

เพื่ออธิบายสิ่งนี้ก่อนอื่นให้สังเกตคำจำกัดความที่ชัดเจน yเป็นพารามิเตอร์ที่เป็นทางการ:

3 : 'I. (+/\. y) = (+/\ y)'
  • +เพิ่มข้อโต้แย้ง /เป็นคำวิเศษณ์ที่แทรกคำกริยาด้านซ้ายของมันระหว่างสมาชิกของการโต้แย้งสิทธิของตนเช่นเป็นเช่นเดียวกับ+/ 1 2 3 41 + 2 + 3 + 4
  • \เป็นคำวิเศษณ์ที่ใช้กริยาไปทางซ้ายกับคำนำหน้าทั้งหมดของคำนำหน้าของอาร์กิวเมนต์ที่ถูกต้อง ตัวอย่างเช่นด้วยการ<วาดกล่องรอบอาร์กิวเมนต์ของมัน<\ 1 2 3 4ผลิต

    ┌─┬───┬─────┬───────┐
    │1│1 2│1 2 3│1 2 3 4│
    └─┴───┴─────┴───────┘
    
  • ดังนั้น+/\คำนวณคำนำหน้าของอาร์กิวเมนต์ที่ถูกต้องของผลรวม

  • \.เป็นเหมือน\แต่ทำงานกับคำต่อท้ายแทนคำนำหน้า ดังนั้น+/\.คำนวณเวกเตอร์ผลรวมของคำต่อท้าย
  • =ทำการเปรียบเทียบข้อโต้แย้งของ item-wise ยกตัวอย่างเช่นอัตราผลตอบแทน1 1 3 3 = 1 2 3 41 0 1 0
  • ดังนั้น(+/\. y) = (+/\ y)อัตราผลตอบแทนหนึ่งสำหรับดัชนีทั้งหมดที่ผลรวมคำต่อท้ายเท่ากับผลรวมคำนำหน้าหรือสร้างสมดุล
  • สำหรับเวกเตอร์ของเลขศูนย์และวัตถุให้I.ส่งคืนเวกเตอร์ของดัชนีที่มีเวกเตอร์หนึ่งอัน

1

Python 2, 70

A=input()
e=i=s=0
for x in A:e=[e,~i][s*2==sum(A)-x];s+=x;i+=1
print~e

แนวคิดคือการติดตามผลรวมสะสมsและตรวจสอบว่าเป็นครึ่งหนึ่งของผลรวมของอาร์เรย์โดยไม่มีองค์ประกอบปัจจุบันหรือไม่ดังนั้นจึงเท่ากับผลรวมของอาร์เรย์หลังจากองค์ประกอบปัจจุบัน ถ้าเป็นเช่นนั้นเราจะปรับปรุงดัชนีดุลยภาพเป็นดัชนีปัจจุบัน ดัชนีสมดุลสุดท้ายจะถูกพิมพ์หรือค่าเริ่มต้น-1หากไม่มี

ที่จริงแล้วเราเก็บ bit-complement ของดัชนีดุลยภาพเพื่อให้เราสามารถเริ่มต้นเป็น 0 แทน


0

Python - 114

i=map(lambda x:int(x),raw_input().split(" "));x=0
print map(lambda x:(sum(i[0:x])==sum(i[x+1::])),range(0,len(i)))

Python - 72

i=input()
print map(lambda x:sum(i[0:x])==sum(i[x+1::]),range(0,len(i)))

พิมพ์ว่าดัชนีที่กำหนดเป็นดัชนีสมดุลหรือไม่ไม่พิมพ์ดัชนีเลขจำนวนเต็มที่อาร์เรย์มีความสมดุล


คุณหมายถึงอะไรมันหยุด? 6 คือดัชนีดุลเนื่องจากรายการก่อนที่จะรวมเป็นศูนย์ไม่มีรายการหลังจากนั้นและ 50 จะถูกละเว้น
Joey Adams

อา. ขอบคุณสำหรับการชี้แจงโจอี้ฉันไม่ทราบว่าควรจะละเว้นค่าที่ x
arrdem

0

PHP, 134 ตัวอักษร

<?for($a=explode(",",fgets(STDIN));++$i<($c=count($a));$o.=$s==0?$i:"")for($n=$s=0;$n<$c;)$s+=$n<$i?$a[$n++]:-$a[++$n];echo$o?$o:"-1";

ฉันมีอาการคันที่อยู่ไกลจากการเล่นกอล์ฟ PHP ที่ดีที่สุด แต่เพิ่งหมดแรง (สมอง) อย่างน้อยก็สั้นกว่ากับ array_sum และ array_splice :-)


0

PHP (81)

for($i=count($a)-1,$c=0;$i+1&&$c!=(array_sum($a)-$a[$i])/2;$c+=$a[$i--]);echo $i;

http://3v4l.org/qJvhO

เนื่องจากไม่มีการป้อนข้อมูลได้รับการระบุความต้องการนี้จะได้รับการ initialised $aกับอาร์เรย์เป็นตัวแปร

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