อาร์เรย์ของฉันควรเท่ากัน แต่ไม่ได้!


21

รับอาร์เรย์ของจำนวนเต็มaซึ่งมีnจำนวนเต็มและจำนวนเต็มเดียวx; เอาจำนวนเงินที่น้อยที่สุดขององค์ประกอบจากaที่จะทำให้ผลรวมของการเท่าเทียมกันa xหากไม่มีการรวมกันของaรูปแบบสามารถxส่งคืนค่าเท็จ

ตามที่ระบุไว้ในความคิดเห็นนี้เป็นชุดสูงสุดที่มีผลรวมของx , แก้ตัวสมองคณิตศาสตร์น้อยของฉัน ฉันลืมคำศัพท์มาตั้งแต่เรียนมหาวิทยาลัย


ตัวอย่าง (ความจริง):

f([1,2,3,4,5,6,7,8,9,10], 10) = [1,2,3,4]

f([2,2,2,2,2,2,2,2,2], 10) = [2,2,2,2,2]

f([2,2,2,2,-2,-2,-2,-4,-2], -8) = [2,2,-2,-2,-2,-4,-2]

f([-2,-4,-2], -6) = [-4,-2] OR [-2,-4]

f([2,2,2,4,2,-2,-2,-2,-4,-2], 0) = [2,2,2,4,2,-2,-2,-2,-4,-2] (ไม่เปลี่ยนแปลง)

f([], 0) = [] (กรณีผลรวมเป็นศูนย์ไม่เปลี่ยนแปลง)


ตัวอย่าง (ค่าเท็จค่า non-array ที่สอดคล้องกัน):

เป็นไปไม่ได้ที่จะทำให้กรณี: f([-2,4,6,-8], 3) = falsy (E.G. -1)

กรณีผลรวมเป็นศูนย์: f([], non-zero number) = falsy (E.G. -1)

  • หมายเหตุ: ค่าใด ๆ เช่น[-1]ไม่สามารถใช้ได้สำหรับเท็จเพราะมันเป็นผลลัพธ์ที่อาจเกิดขึ้นจริง

กฎ:

  • xป้อนข้อมูลอาจจะมาในรูปแบบอาร์เรย์หรือเป็นรายการของอาร์กิวเมนต์สุดท้ายถูกหรือแรก
  • ผลลัพธ์อาจเป็นรายการจำนวนเต็มใด ๆ EG หรือ1\n2\n3\n[1,2,3]
  • ค่าใด ๆ ที่สามารถใช้เป็นตัวบ่งชี้ที่ผิดพลาดนอกเหนือจากอาร์เรย์ของจำนวนเต็ม
  • รหัสของคุณจะต้องเพิ่มขนาดของอาเรย์ให้จบโดยที่ลำดับนั้นไม่สำคัญ
    • EG สำหรับf([3,2,3],5)ทั้งคู่[2,3]และ[3,2]ใช้ได้อย่างเท่าเทียมกัน
    • EG สำหรับf([1,1,2],2)คุณสามารถส่งคืนได้[1,1]ตามที่[2]มีความสั้น
  • ทั้งผลรวมของaและความคุ้มค่าของxจะน้อยกว่าและมากกว่า2^32-1-2^32-1
  • นี่คือชนะน้อยที่สุดนับไบต์
  • หากมีหลาย subarrays ที่มีขนาดเดียวกันที่ถูกต้องจะไม่สามารถส่งออกทั้งหมดได้ คุณต้องเลือกหนึ่งอันและเอาท์พุทอันนั้น

แจ้งให้เราทราบหากโพสต์นี้ถูกโพสต์ฉันหามันไม่พบ

โพสต์ที่ฉันพบเช่นนี้ : เกี่ยวข้อง แต่ปิด , ...


1
ฉันคิดว่า "ไม่แน่นอนค่าที่ไม่ใช่อาร์เรย์ที่สอดคล้องกัน" รวมถึงการเพิ่มข้อผิดพลาดหรือไม่
Jonathan Allan

" ค่าใด ๆ ที่สามารถใช้เป็นตัวบ่งชี้ที่ผิดพลาดนอกเหนือไปจากอาร์เรย์ของจำนวนเต็ม " นั่นรวมถึงอาร์เรย์ที่ว่างเปล่าหรือไม่?
Shaggy

@shaggy [] บ่งบอกถึงค่าความจริงที่เป็นไปได้ใช่มั้ย การอนุญาตให้เมตากฎนั้นสำคัญกว่าความจริงและเท็จที่แตกต่างกันอย่างชัดเจนหรือไม่
Magic Octopus Urn

@JohnathanAllan หากข้อผิดพลาดนั้นไม่สามารถยกขึ้นในสถานการณ์จริงได้ - ฉันคิดว่า แต่ฉันรู้สึกว่านี่คือการพยายามยืดสเป็คอย่างตั้งใจ หากฉันเปลี่ยนข้อความจากตัวบ่งชี้เป็นค่าที่ส่งคืนจะเป็นไร
Magic Octopus Urn

ฉันเชื่อว่าค่าการออกที่สอดคล้องกันจะนับเป็นมูลค่าส่งคืน แต่ต่อเมตาดาต้าหรือไม่
Magic Octopus Urn

คำตอบ:


7

Brachylogขนาด 8 ไบต์

h⊇.+~t?∧

ลองออนไลน์!

คำตอบ Brachylog รายเดือน ส่งคืนfalse.ถ้ามันเป็นไปไม่ได้

คำอธิบาย

h⊇.           The output is a subset of the head of the input
  .+~t?       The sum of the elements of the output must equal the tail of the input
       ∧      (Avoid implicit unification between the output and the input)

6

Python 2 , 108 104 ไบต์

lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]
from itertools import*

ลองออนไลน์!

-4 ไบต์ขอบคุณ Jonathan Allan


Python 2 , 108 106 ไบต์

def f(a,n):
 q=[a]
 while q:
  x=q.pop(0);q+=[x[:i]+x[i+1:]for i in range(len(x))]
  if sum(x)==n:return x

ลองออนไลน์!

-2 ไบต์ขอบคุณ Janathan Frech


1
คุณสามารถใช้range(-len(a),1)และ-lบันทึก 2 แต่lambda a,n:[x for l in range(len(a)+1)for x in combinations(a,l)if sum(x)==n][-1]บันทึก 4
Jonathan Allan


1
เป็นไปได้106 ไบต์
Jonathan Frech

@ JonathanFrech ขอบคุณฉันต้องเหนื่อยเมื่อวานนี้;)
TFeld



4

Pyth , 8 ไบต์

  • 8-byter ( ลองใช้! ) - ให้ผลลัพธ์ทางออกเดียวเท่านั้น สำหรับอินพุตที่ไม่สามารถแก้ไขได้มันจะไม่พิมพ์สิ่งใดไปยัง STDOUT ซึ่งเป็นสตริงว่างซึ่งเป็นเทคนิคการพูดเท็จใน Pyth แต่เขียนไปยัง STDERR ขอบคุณFryAmTheEggmanสำหรับการแนะนำสิ่งนี้ (ละเว้น STDERR และมุ่งเน้นไปที่เอาต์พุต STDOUT เท่านั้น) ซึ่งช่วยประหยัด 1 ไบต์

    efqz`sTy    
    
  • 9-byter ( ลองเลย! ) - ให้ผลลัพธ์ที่เป็นไปได้เพียงทางออกเดียวเท่านั้นโดยห่อในรายการเดี่ยวตามค่าเริ่มต้นที่อนุญาต (เช่น([1...10], 10) -> [[1,2,3,4]]; ([], 0) -> [[]]) สำหรับอินพุตที่ไม่สามารถแก้ไขได้จะส่งคืน[]ซึ่งเป็นเท็จในPyth

    >1fqz`sTy
    
  • 10-byter ( ลอง it! ) - สำหรับเอาต์พุตที่ชัดเจนโดยไม่ต้องใช้กฎ singleton-list และใช้0แทน[]ค่าที่ผิดพลาด

    e+0fqz`sTy
    

คำอธิบาย

ก่อนอื่นโค้ดจะคำนวณ powerset ของรายการอินพุท จากนั้นจะเก็บเฉพาะคอลเล็กชันเหล่านั้นที่มีผลรวมเท่ากับจำนวนอินพุต ควรสังเกตว่าคอลเลกชันนั้นสร้างขึ้นจากช่วงสั้นที่สุดถึงยาวที่สุดดังนั้นเราจึงมุ่งเน้นไปที่สิ่งสุดท้าย ที่จะได้รับมัน:

  • 8 byterเพียงแค่ใช้ปลายในตัวซึ่งโยนข้อผิดพลาด แต่ STDERR สามารถปฏิเสธตามกฎเว็บไซต์ของเราออกไป STDOUT เป็นสตริงที่ว่างเปล่าซึ่งเป็น falsy
  • 9 byterต้องใช้องค์ประกอบที่ผ่านมา แต่การใช้รหัสหลามเทียบเท่าlst[-1:]ในสถานที่ของlst[-1]ข้อผิดพลาดหลีกเลี่ยงจากการถูกโยนสำหรับปัจจัยการผลิตที่แก้ไม่ได้
  • 10 byter prepends 0ไปยังรายการของกรองย่อยคอลเลกชันแล้วจะใช้เวลาในตอนท้ายของคอลเลกชัน (องค์ประกอบสุดท้าย) ว่า หากอินพุตไม่สามารถแก้ไขได้จะใช้0แทนตามธรรมชาติ

[]เป็นเท็จ? เรียบร้อย ทำไม Pyth ถึงทำเช่นนั้น[]?
Magic Octopus Urn

@MagicOctopusUrn Pyth สืบทอดว่าจากงูหลามจริง: ลองออนไลน์
Mr. Xcoder

@FryAmTheEggman จะไม่แสดงรายการว่างเปล่าเป็นความจริงในกรณีทดสอบf([], 0) = []หรือไม่
Sok

@FryAmTheEggman ขอบคุณสำหรับคำแนะนำของคุณ! ฉันได้ทำการเปลี่ยนแปลงที่จำเป็น :)
นาย Xcoder


3

Perl 6 , 38 37 ไบต์

{*.combinations.grep(*.sum==$_).tail}

ลองออนไลน์!

ฟังก์ชั่น curried


เดี๋ยวก่อน;จำเป็นไหม?
Jo King

@ โจ้กกิ้งมันจำเป็นในการทำซ้ำก่อนหน้านี้เพื่อหลีกเลี่ยงข้อผิดพลาด แต่ด้วยเหตุผลบางอย่างมันสามารถละเว้นได้ในขณะนี้ (ฉันคิดว่าหลังจากที่ฉันเปลี่ยน$^xไป$_แล้ว)
nwellnhof

3

Brachylogขนาด 4 ไบต์

⟨⊇+⟩

ลองออนไลน์!

เกือบเทียบเท่ากับ Fatalize's h⊇.+~t?∧ยกเว้นสั้นกว่ามากขอบคุณคุณลักษณะองค์ประกอบของคำกริยาซึ่งตามประวัติการแก้ไขของการอ้างอิงเป็นงานที่ดำเนินการจนถึง 8 มกราคมโพสต์คำตอบโดยกว่าสองเดือน ⟨⊇+⟩เป็นแซนวิชขยายไปถึง{[I,J]∧I⊇.+J∧}ที่จัดฟันอยู่ในกรณีนี้ไม่เกี่ยวข้องเพราะแซนวิชอยู่ในสายของตัวเอง แต่อย่างใด

                The input
[I,J]           is a list of two elements I and J.
        .       The output,
         +J     which sums to J
           ∧    (which we don't unify with the output),
      I⊇        is a sublist of I
     ∧          (which we don't unify with [I,J]).

การเปลี่ยนแปลงที่น่าทึ่งของคำตอบของ Fatalize ที่น้อยลงอย่างมากซึ่งใช้ภาคแสดงเดียวกันกับตัวแปรเดียวกัน แต่มีไบต์ที่สั้นกว่าจากการจัดระเบียบที่แตกต่างกัน:

Brachylogขนาด 7 ไบต์

h⊇.&t~+

ลองออนไลน์!

           The input
h          's first element
 ⊇         is a superlist of
  .        the output,
   &       and the input
    t      's last item
     ~+    is the sum of the elements of
           the output.

(นอกจากนี้หากใครต้องการเห็นสิ่งแปลก ๆ ให้เปลี่ยนขีดล่างใด ๆ ในกรณีทดสอบเป็นเครื่องหมายขีดคั่น)


1
แซนวิชถูกนำมาใช้โดย @ ais523 ในเดือนพฤศจิกายน 2018แต่ถูกดึงเข้ามาใน Brachylog เท่านั้นในช่วงต้นเดือนมกราคม 2019
เสียชีวิต

1
แน่นอนว่าไม่มีการขุดประวัติศาสตร์เนื่องจากภาษาที่โพสต์วันที่การท้าทายได้รับอนุญาตเป็นเวลาหลายปี
pppery




2

สิ่งนี้เริ่มต้นออกมาเท่ห์และเล็ก แต่เคสขอบทำให้ฉัน ไม่ว่าจะเกิดอะไรขึ้นฉันภูมิใจในงานที่ฉันทำลงไป

Python 3 , 169 161 154 ไบต์

from itertools import*
def f(a,x):
	if sum(a)==x:return a
	try:return[c for i in range(len(a))for c in combinations(a,i)if sum(c)==x][-1]
	except:return 0

ลองออนไลน์!


โปรดจำไว้ว่านี่คือ [code-golf] ดังนั้นคุณควรพยายามทำให้จำนวนไบต์ของคุณเล็กที่สุด! คุณมี newline ชั้นนำและสนามกอล์ฟอื่น ๆ ที่น่าสนใจและฉันคิดว่าคนที่รู้ว่าหลามสามารถตีกอล์ฟนี้ได้ไกลกว่านี้
Giuseppe

@Giuseppe ขอบคุณที่เตือนฉันถึงช่องว่างชั้นนำ ฉันใช้เวลาพยายามรวมบางส่วนของเรื่องนี้ แต่ตัดสินใจที่จะโพสต์ในระหว่างนี้ในกรณีที่คนอื่น ๆ สามารถแนะนำการแก้ไข
Gigaflop

ไม่ใช่ปัญหา! เป็นเวลา 5 ปีแล้วที่ฉันทำ Python แต่ไม่ได้range(x)สร้าง(0...x-1)อะไรขึ้นมา? ดังนั้นคุณrange(len(a))ไม่ได้ให้ความเป็นไปได้ในการเปลี่ยนอาร์เรย์
Giuseppe

@Giuseppe Eureka นั่นเป็นสิ่งที่ทำ ฉันอาจมุ่งเน้นไปที่เนื้อหาใหม่ที่ฉันทำงานด้วยมากเกินไป
Gigaflop

แทนการใช้งานif a==[] and x==0 if sum(a)==xแล้วคุณยังสามารถลบจาก+1 range
Vedant Kandoi

2

R , 100 80 ไบต์

function(a,x){i[sum(a|1):0,j[combn(a,i,,F),if(sum(j)==x)return(j)]]
F}
`[`=`for`

ลองออนไลน์!

บันทึกไปแล้ว 20 ไบต์ด้วย digEmAll

ส่งคืนFALSEสำหรับเกณฑ์ที่เป็นไปไม่ได้



@digEmAll ฉันดีใจที่ฉันไม่ได้มีโอกาสแก้ไขคำตอบ 98 ไบต์ของคุณ :-)
Giuseppe

eheh ลืมที่จะลบมัน: D
digEmAll

1

ทูต , 28 ไบต์

${(y&`=@Sum\Radiations@x)@0}

ลองออนไลน์!

ทางเลือก

34 ไบต์ :f[x,y]:=({y=Sum@_}\Radiations@x)@0

30 ไบต์ :First@${y&`=@Sum\Radiations@x}

29 ไบต์ :{(_&`=@Sum\_2)@0}#/Radiations

29 ไบต์ :${({y=Sum@_}\Radiations@x)@0}

29 ไบต์ :`@&0@${y&`=@Sum\Radiations@x}

29 ไบต์ :{_}@@${y&`=@Sum\Radiations@x}

คำอธิบาย

${(y&`=@Sum\Radiations@x)@0}
${                         }    function receiving two arguments, x and y
            Radiations@x        calculate the radiations of x
                                (simulates removing all possible subslices of x)
           \                    keep those radiations
        Sum                     ...whose sum...
     `=@                        ...equals...
   y&                           ...y
  (                     )@0     select the first one (always the longest)

0

APL (NARS) 65 ตัวอักษร 130 ไบต์

{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

used ใช้เนื่องจากองค์ประกอบแรกของชุดเซตจะเป็นหนึ่งชุดโมฆะ (ที่นี่⍬ Zilde) ที่ต้องการกำจัดเนื่องจากดูเหมือนว่า + / ⍬เป็นศูนย์ ...

หากไม่พบหรือมีข้อผิดพลาดมันจะส่งคืน⍬หรือในข้อความที่พิมพ์:

  o←⎕fmt
  o ⍬
┌0─┐
│ 0│
└~─┘

ทดสอบ:

  z←{m←⍺=+/¨v←1↓{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}⍵⋄0=↑⍴b←m/v:⍬⋄b⊃⍨n⍳⌈/n←⍴¨b}

  o 1 z ,1
┌1─┐
│ 1│
└~─┘
  o 2 z ,1
┌0─┐
│ 0│
└~─┘
  o 10 z 1 2 3 4 5 6 7 8 9 10
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 2,2,2,2,2,2,2,2,2
┌5─────────┐
│ 2 2 2 2 2│
└~─────────┘
  o ¯8 z 2,2,2,2,¯2,¯2,¯2,¯4,¯2
┌7──────────────────┐
│ 2 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~──────────────────┘
  o ¯6 z ¯2,¯4,¯2
┌2─────┐
│ ¯4 ¯2│
└~─────┘
  o 0 z 2,2,2,4,2,¯2,¯2,¯2,¯4,¯2
┌10───────────────────────┐
│ 2 2 2 4 2 ¯2 ¯2 ¯2 ¯4 ¯2│
└~────────────────────────┘
  o 10 z 1 2 3 4
┌4───────┐
│ 1 2 3 4│
└~───────┘
  o 10 z 1 2 3
┌0─┐
│ 0│
└~─┘
  o 0 z ⍬
┌0─┐
│ 0│
└~─┘
  o +/⍬  
0
~
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.