จำนวนขั้นต่ำที่จะรวมเป็น n


15

คำถามแรกที่นี่อย่าตะโกนใส่ฉันถ้านี่เป็นเรื่องที่ท้าทายหรือไม่ดี

บทนำ

ฉันคิดถึงความท้าทายนี้และดูเหมือนว่าจะเป็นปริศนาพื้นฐานที่ดีสำหรับนักกอล์ฟมือใหม่ มันอาจช่วยฉันในการตัดสินใจว่าจะเรียนภาษาไหน

ท้าทาย

ได้รับอาร์เรย์ของจำนวนเต็มที่น้อยกว่าหรือเท่ากับการส่งออกหรือกลับจำนวนขั้นต่ำของตัวเลขจากอาร์เรย์ว่าผลรวมถึงว่าnn

คุณสามารถเลือกที่จะเขียนฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ

อินพุต

0 <= n < 2^31คุณได้อย่างปลอดภัยสามารถสันนิษฐานได้ว่า

ใช้อาร์เรย์หรือรายการใด ๆ ( vectorสำหรับ C ++ หรือ Java LinkedListที่ได้รับอนุญาต) พร้อมด้วยnและพารามิเตอร์ที่เป็นตัวเลือกlengthซึ่งระบุความยาวของอาร์เรย์

คุณยังสามารถรับอินพุตเป็นสตริงที่nคั่นด้วยช่องว่างโดยคั่นด้วยเครื่องหมายจุลภาคหรือช่องว่าง:

1 5 7 3 7 3 6 3 2 6 3,10

1 5 7 3 7 3 6 3 2 6 3 10

ถ้ามันง่ายกว่า

เอาท์พุต

nการส่งออกหรือกลับจำนวนขั้นต่ำของตัวเลขจากอาร์เรย์ว่าผลรวมถึงว่า ใช้ตัวอย่างข้างต้น:

1 5 7 3 7 3 6 3 2 6 3,10

โปรแกรมของคุณควรพิมพ์:

2

เพราะจำนวนขั้นต่ำของจำนวนที่รวม10เป็น2( 7และ3)

ในกรณีที่ไม่มีวิธีแก้ไขให้พิมพ์หรือส่งคืนค่าลบ, 0"ไม่มีวิธีแก้ปัญหา" (แม้ว่าจะไม่ใช่วิธีที่ฉลาด), (ตามที่แนะนำ) หรือค่าเท็จอื่น ๆ ยกเว้นสตริงว่าง

ตัวอย่างอินพุตและเอาต์พุต

การป้อนข้อมูล:

1 5 7 3 7 3 6 3 2 6 3,10
143 1623 1646 16336 1624 983 122,18102
5 6 9,12

เอาท์พุท:

2
3
-1

เกณฑ์การให้คะแนน

นี่คือ code-golf ดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบยอดนิยมจะได้รับการยอมรับในวันคริสต์มาส


ฉันได้แก้ไขสเป็คของคุณเพราะเรามักจะอนุญาตให้ใช้วิธีการ I / O เดียวกันสำหรับฟังก์ชั่นและโปรแกรม ดูมติที่นี่ อย่าลังเลที่จะย้อนกลับหากคุณไม่เห็นด้วย
lirtosiast

เราสามารถส่งออกfalseกรณีที่ไม่มีวิธีแก้ปัญหาได้หรือไม่
ETHproductions

@ ETHproductions แน่นอนว่าจะเพิ่ม
TheCoffeeCup

คุณพิจารณาผลลัพธ์ที่ว่างเปล่าซึ่งเป็นเท็จเนื่องจากสตริงที่ว่างเปล่าเป็นเท็จใน Pyth หรือไม่?
lirtosiast

@ThomasKwa ฉันไม่ชอบเอาต์พุตสตริงที่ว่างเปล่า แต่คุณสามารถรวมเป็น "ถ้า x ได้รับอนุญาต ... " ในคำตอบของคุณ ...
TheCoffeeCup

คำตอบ:


7

Pyth, 12 11 ไบต์

lhafqsTQyEY

สิ่งนี้ใช้nเป็นบรรทัดแรกของอินพุตและรายการบนบรรทัดที่สอง

lhafqsTQyEY     (Implicit: Q = 1st line of input; E = 2nd line)
         E      The list
        yE      Powerset (sorted by increasing length; empty set first)
   f            Filter by lambda T:
     sT         sum(T)
    q                  ==
       Q                  Q
   fqSTQyE      Sublists that sum to Q, sorted by increasing length
  a       Y     append an empty array (in case none match)
lh              take the length of the first element (0 for empty array)

ลองมันนี่


1
รหัสและคำอธิบายของคุณไม่ตรงกัน
isaacg

@isaacg แก้ไขแล้ว
lirtosiast

5

Japt , 30 21 18 ไบต์

กลับกลายเป็นว่ามีวิธีที่มีประสิทธิภาพมากขึ้น ;)

Uà f_x ¥V} ml n- g

ทดสอบออนไลน์! (หมายเหตุ: n-เปลี่ยนเป็นn@X-Y}เหตุผลความเข้ากันได้)

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

Uà f_  x ¥ V} ®   l} n- g
UàfmZ{Zx ==V} mZ{Zl} n- g

            // Implicit: U = input array, V = input integer
Uà fZ{   }  // Generate all possible combinations of U, then filter to only items Z where
Zx ==V      //   the sum of Z is equal to V.
mZ{Zl}      // Map each remaining combination to its length.
n-          // Sort by subtraction; smaller items end up in the front.
g           // Take the first item.
            // Implicit: output last expression

ฉันไม่อยากเชื่อเลยว่าฉันจะไม่นึกถึงเวอร์ชันนี้เมื่อแรกเริ่มฉันเขียนสิ่งนี้ ...

มีการปรับแต่งหลายอย่างตั้งแต่นั้นมาซึ่งมีประโยชน์ที่นี่:

  • โดยปกติแล้วUเมื่อถึงจุดเริ่มต้นของโปรแกรม
  • Ãเป็นทางลัดสำหรับ
  • n ตอนนี้จะเรียงลำดับหมายเลขให้ถูกต้องตามค่าเริ่มต้น

แต่ละอันจะถูกตัดเป็นไบต์รวมเป็น 15:

à f_x ¥VÃml n g

ทดสอบออนไลน์!


นั่นคือ 25 ไบต์ไม่ใช่ 21.
Albert Renshaw

1
@AlbertRenshaw Japt รองรับการเข้ารหัส IEC_8859-1ซึ่งแต่ละอักขระเหล่านี้คือ 1 ไบต์ คุณสามารถบันทึกโปรแกรมนี้เป็นไฟล์ข้อความ IEC_8859-1 เข้ารหัสแล้วอัปโหลดไปยังล่ามออนไลน์
ETHproductions

อ่าดี! ขอบคุณที่แจ้งให้ฉันทราบ
Albert Renshaw

1

Mathematica, 73 65 ไบต์

Min[Length/@Select[IntegerPartitions[#2,#2,#],Sort@#==Union@#&]]&

ฟังก์ชั่นบริสุทธิ์ส่งกลับถ้าไม่มีวิธีแก้ปัญหา


1

Python 3, 128 ไบต์

นี่ไม่ใช่การเล่นกอล์ฟอย่างที่ฉันต้องการ แต่ฉันจะแก้ไขในภายหลัง

from itertools import*
def s(a,n):
 for i in range(len(a)):
  for j in permutations(a,i+1):
   if sum(j)==n:return i+1
 return 0


1

CJam, 34 ไบต์

0q~_,2,m*\f.*{:+1$=},\;0f-{,}$0=,+

ลองมันออนไลน์ รูปแบบอินพุตเป็นผลรวมตามด้วยรายการค่าเช่น:

18102 [143 1623 1646 16336 1624 983 122]

โปรดทราบว่านี่จะเพิ่มข้อยกเว้นหากไม่พบวิธีแก้ไข ข้อยกเว้นไปที่ stderr เมื่อเรียกใช้ CJam จากบรรทัดคำสั่งและผลลัพธ์ที่ถูกต้อง (0 ) ยังคงถูกพิมพ์ไปยัง stdout ดังนั้นสิ่งนี้ตรงตามฉันทามติที่จัดตั้งขึ้นที่ควรส่งอนุญาตให้ออกโดยมีข้อผิดพลาด?

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

คำอธิบาย:

0       Push 0 result for exception case.
q~      Get and interpret input.
_,      Copy and get length of input value list.
2,      Push [0 1].
m*      Cartesian power. This generates all possible lists of 0/1 values with the
        same length as the input value list.
\       Swap input value list to top.
f.*     Apply element-wise product of input value list with all 0/1 lists.
        We now have all combinations of values, with 0 in place of unused values.
{       Start filter block.
  :+      Sum values.
  1$      Copy target sum to top.
  =       Compare.
},      Filter.
\;      Swap target sum to top and discard.
0f-     Remove 0 values. We now have all solution lists.
{,}$    Sort by length.
0=      Get first solution, which after sorting is the shortest.
        This will raise an exception if the list of solutions is empty, bailing
        out with the initial 0 on the stack.
,       Get length of solution.
+       Add the 0 we initially pushed for the exception case.

1

JavaScript (ES6), 84 ไบต์

f=(a,n,m=1e999,x)=>n&&a.map((v,i)=>(x=[...a],x.splice(i,1),x=f(x,n-v)+1)<m?m=x:0)&&m

คำอธิบาย

ใช้เวลาArrayของNumbers และNumberเป็นข้อโต้แย้ง ส่งคืนตัวเลขInfinityหากไม่มีผลลัพธ์ มันเป็นฟังก์ชันเวียนที่หักจากและลบแต่ละองค์ประกอบจากอาร์เรย์หนึ่งโดยหนึ่งจนกว่าnn == 0

f=(a,n,m=1e999,x)=> // m and x are not passed, they are here to declare them in the local
                    //     scope instead of globally, initialise m to Infinity
  n&&               // if n == 0, return 0
  a.map((v,i)=>     // iterate over each number in a
    (x=[...a],      // x = copy of a
    x.splice(i,1),  // remove the added number from the array
    x=f(x,n-v)+1)   // x = result for the numbers in this array
      <m?m=x:0      // set m to minimum result
  )
  &&m               // return m

ทดสอบ

การทดสอบนี้ตั้งค่าไว้mในInfinityภายหลังแทนที่จะเป็นอาร์กิวเมนต์เริ่มต้นเพื่อให้ทำงานได้ใน Chrome (แทนที่จะเป็นแค่ Firefox)


1

Haskell, 72 ไบต์

import Data.List
n#l=head$sort[length x|x<-subsequences l,sum x==n]++[0]

ส่งคืน0ถ้าไม่มีวิธีแก้ไข

ตัวอย่างการใช้งาน: ->10 # [1,5,7,3,7,3,6,3,2,6,3]2

ค้นหารายการย่อยทั้งหมดของรายการอินพุตlที่มีผลรวมnที่มีผลรวมของใช้ความยาวของแต่ละรายการย่อยและเรียงลำดับ ผนวก a 0และใช้องค์ประกอบแรก

ถ้ารายการเดี่ยวที่ได้รับอนุญาตสำหรับการส่งออกเช่น[2]เราสามารถบันทึก 7 n#l=minimum[length x|x<-subsequences l,sum x==n]ไบต์: ในกรณีที่ไม่มีวิธีแก้ปัญหารายการว่าง[]จะถูกส่งคืน

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