หมายเลขสรุปตนเอง


12

แปลงตัวเลขเป็นผลรวมของตัวเลข

ไม่ใช่ผลรวมใด ๆ :เราต้องการผลรวมที่สั้นที่สุด
ไม่ใช่ตัวเลขใด ๆ :คุณสามารถใช้ตัวเลขได้เท่านั้น

ตัวอย่าง
คุณจะได้รับเป็นอินพุตจำนวนเต็มn>0

n=27สมมติว่า คุณต้องแสดง27เป็นผลรวมโดยใช้เฉพาะตัวเลข [2,7]ในทางที่สั้นที่สุด คุณไม่จำเป็นต้องใช้ตัวเลขทั้งหมดของตัวเลขที่กำหนด!

27=2+2+2+7+7+7ดังนั้น จากนั้นเราจะใช้ตัวเลขเหล่านั้นและนับพวกเขา[2,2,2,7,7,7] :
คำตอบสุดท้ายสำหรับn=27คือ6

อีกตัวอย่างหนึ่งn=195เพื่อให้ได้ผลรวมสั้นที่สุดเราต้องใช้ตัวเลขต่อไปนี้:
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]และคำตอบคือ23

ความท้าทาย

รับจำนวนเต็มn>0ส่งออกจำนวนหลักขั้นต่ำ (มีอยู่ในจำนวน) ที่รวมถึงจำนวนนี้

กรณีทดสอบ

Input->Output

1->1  
2->1  
10->10  
58->8  
874->110  
1259->142  
12347->1765  
123456->20576  
3456789->384088  

นี่คือคำตอบที่สั้นที่สุดเป็นไบต์ชนะ!


มีตัวเลขใดบ้างที่ไม่สามารถหาผลรวมเข้ากับตนเอง / พวกมันได้หรือไม่?
สตีเฟ่น

1
@ สตีเฟ่นพวกเขาทั้งหมดสามารถ!

7
@ สตีเฟ่นเพราะทุกตัวเลขสามารถแสดงเป็น d_0 + 10 * d_1 + 100 * d_2 ฯลฯ ...
geokavel

เราสามารถรับอินพุตเป็นสตริงอักขระ char หรืออาร์เรย์จำนวนเต็มได้หรือไม่
Kevin Cruijssen

1
@KevinCruijssen String ใช้ได้ char-array หรือ integer-array ไม่ใช่

คำตอบ:


4

Huskขนาด 12 ไบต์

Lḟo=⁰ΣṁΠḣ∞d⁰

จัดการตัวเลขสองหลักอย่างรวดเร็ว ลองออนไลน์!

คำอธิบาย

Lḟo=⁰ΣṁΠḣ∞d⁰  Input is n, say n = 13.
          d⁰  Digits of n: [1,3]
         ∞    Repeat infinitely: [[1,3],[1,3],[1,3],[1,3]...
        ḣ     Prefixes: [[],[[1,3]],[[1,3],[1,3]],[[1,3],[1,3],[1,3]],...
      ṁ       Map and concatenate
       Π      Cartesian product: [[],[1],[3],[1,1],[3,1],[1,3],[3,3],[1,1,1],[3,1,1],...
 ḟo           Find the first element
     Σ        whose sum
   =⁰         equals n: [3,3,3,3,1]
L             Return its length: 5

2

Pyth , 12 ไบต์

lef!-TsM`Q./

ลองออนไลน์!

58แต่น่าเสียดายที่ข้อผิดพลาดของหน่วยความจำในปัจจัยการผลิตที่มีขนาดใหญ่เป็น

คำอธิบาย

lef!-TsM`Q./
          ./    All lists of integers that sum to [the input]
  f             Filter for:
    -TsM`Q           Remove all occurrences of the digits in the input
   !                 Check if falsey (i.e. an empty list)
le              Length of the last occurrence, which is the shortest because all the
                filtered partitions share the same digit pool

คุณจะเพิ่มคำอธิบายได้ไหม?
โยนาห์

@Jonah เพิ่มคำอธิบายแล้ว
notjagan

1
ขอบคุณ น่าสนใจที่ Pyth มีพื้นฐานดั้งเดิมที่สามารถแก้ปัญหาได้./
โจนาห์

ทางเลือก 12 ไบต์: lef<.{TjQ;./(ตัวกรอง - เซ็ตย่อยที่เหมาะสม - ของตัวเลขของอินพุต)
Mr. Xcoder

2

Mathematica, 78 ไบต์

(t=1;While[(s=IntegerPartitions[x=#,t,IntegerDigits@x])=={},t++];Tr[1^#&@@s])&  

ค้นหากรณีทดสอบล่าสุดใน 5 วินาที


สั้นกว่าเล็กน้อย:Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
Kuba

2

R , 78 ไบต์

function(n){while(all(F-n)){F=outer(F,n%/%10^(0:nchar(n))%%10,"+")
T=T+1}
T-1}

ลองออนไลน์! (รุ่น golfed)

อัลกอริทึมแรงเดรัจฉานบริสุทธิ์ดังนั้นจึงไม่แก้ปัญหากรณีทดสอบทั้งหมดจริง ๆ และฉันคิดว่ามันพยายามจัดสรร 40,000 GB สำหรับกรณีทดสอบล่าสุด ...

Tในค่าเริ่มต้น R เพื่อ1ให้เราได้รับข้อผิดพลาดแบบ off-one ซึ่งเราแก้ไขในขั้นตอนการส่งคืน แต่เรายังได้รับFค่าเริ่มต้น0ที่จ่ายออก

คำอธิบายที่ไม่ดี

function(n){
 d <- n%/%10^(0:nchar(n))%%10   # digit list with a 0 appended at end
 d <- unique(d[d>0])            # filter zeros (not technically necessary)
                                # and get unique digits
 x <- 0                         # storage for sums
 i <- 0                         # counter for number of sums done
 while(!any(x==n)){             # until we find a combination
  x <- outer(x,d,"+")           # take all sums of x and d, store as x
  i <- i + 1}                   # increment counter
i}                              # return counter

ลองออนไลน์! (รุ่นที่ตีกอล์ฟน้อย)


2

Python 2, 168 155 144 ไบต์

มันไม่ได้สั้นที่สุดเท่าที่ควร แต่เป็นสิ่งที่ดีที่สุดก่อนและไม่ใช่ของจริงที่ไม่ดีนัก

n=input()
g=sorted(set(n)-{0})[::-1]
def h(k):
 if k<0:return
 if`k`in g:return 1
 for d in g:
  f=h(k-int(d))
  if f:return 1+f
print h(int(n)) 

filter(None...คือการลบ 0 เป็นหลักซึ่งผมได้เรียนรู้ว่าฉันจะทำในขณะนี้ทำให้

ปัญหาที่ใหญ่ที่สุดคือ python stack frames ซึ่งแนบเนียนไม่อนุญาตให้ฉันทำงานในอินพุตที่ใหญ่ที่สุด ดังนั้นมันไม่ได้เป็นทางออกที่ถูกต้องจริงๆฉันเล่นรอบกับการเพิ่มขีด จำกัด การเรียกซ้ำซึ่งเพิ่งนำไปสู่ข้อบกพร่อง seg- สิ่งนี้จะต้องทำกับลูปและสแต็กหรือด้วยความชาญฉลาดมากขึ้นในการทำงานในหลาม

แก้ไข: ขอบคุณ caird และ Chas Brown สำหรับ 13 ไบต์!


คุณสามารถใช้inputและกำหนดให้อินพุตถูกล้อมรอบด้วยเครื่องหมายคำพูด
caird coinheringaahing

2
เป็นที่ยอมรับได้อย่างสมบูรณ์แบบที่จะล้มเหลวเนื่องจากข้อ จำกัด ทางกายภาพตราบใดที่มันประสบความสำเร็จในทางทฤษฎีซึ่งสิ่งนี้ทำ
Jonathan Allan

บันทึก 9 ไบต์ด้วยการแทนที่filter(None,sorted(map(int,set(n)))[::-1])ด้วยsorted(set(map(int,n))-{0})[::-1](แม้ว่าNoneสิ่งนี้ค่อนข้างดีที่จะรู้)
Chas Brown

@ChasBrown ในกรณีส่วนใหญ่คุณสามารถใช้filter(len,...)สำหรับรายการและสตริงและfilter(abs,...)สำหรับจำนวนเต็มและลอย
ovs


0

JavaScript (ES6), 82 ไบต์

f=(n,l=0,a=n,[c,...b]=a)=>n?1/c?Math.min(!+c|+c>n?1/0:f(n-c,l+1,a),f(n,l,b)):1/0:l
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

รับอินพุตเป็นสตริง


คุณช่วยอธิบายได้ไหมว่าทำไมคุณถึงใช้1/0?
Zacharý

1
@ Zacharýฉันต้องการผลรวมสั้นที่สุดนั่นคือจำนวนหลักขั้นต่ำ ความพยายามที่นำไปสู่โซลูชันที่ไม่ถูกต้องจะไม่ถูกนับดังนั้นหากต้องการยกเว้นพวกเขาจะให้คะแนน Infinity ซึ่งจะไม่ส่งผลต่อขั้นต่ำ
Neil

โอ้ไม่ได้ตระหนักว่ามันวนซ้ำ
Zacharý

@ Zacharý f=จุดเริ่มต้นเป็นเงื่อนงำที่ยิ่งใหญ่เนื่องจากคุณไม่ต้องการมันสำหรับ lambdas
Neil

0

ทับทิม 70 ไบต์

->n{w,s=n.digits,0;s+=1while !w.product(*[w]*s).find{|x|x.sum==n};s+1}

ช้ามากลองชุดค่าผสมที่เป็นไปได้ทั้งหมดเพิ่มขนาดจนกว่าเราจะได้วิธีแก้ปัญหา

ขอบคุณเดนนิสสำหรับ Ruby 2.4 ใน TIO

ลองออนไลน์!


0

เยลลี่ 23 ไบต์

D;0ṗµḟ€0
ÇS€=µT
Çị1ĿL€Ṃ

ลองออนไลน์!

สิ่งนี้ไม่มีประสิทธิภาพดังนั้นจึงไม่สามารถใช้สำหรับกรณีทดสอบหลังจากกรณีที่สามใน TIO เนื่องจากมีเวลา จำกัด > _ <

ยินดีต้อนรับเคล็ดลับการเล่นกอล์ฟ!


0

Python 2 , 183 176 172 166 161 ไบต์

def f(n,D=0,p=0,b=0):
	D=D or set(map(int,`n`))-{0}
	d=min(D);c=0;D=D-{d}
	q=[p+n/d,b][n%d>0]
	while c<min(D or{0}):q=b=f(n-c*d,D,p+c,b);c+=1
	return[q,b][q>b>0]

ลองออนไลน์!

ยาวกว่าคำตอบของงูหลามอื่น ๆ แต่ดำเนินการกรณีทดสอบทั้งหมดรวมกันแล้วบวก987654321ด้วยภายในวินาทีที่ TIO

ใช้ประโยชน์จากความจริงที่ว่าถ้าd1<d2เป็นตัวเลขดังนั้นจำเป็นต้องมีd2-1 d1ผลรวมสูงสุด (เนื่องจากd2อินสแตนซ์ของd1สามารถถูกแทนที่ด้วยd1อินสแตนซ์ของd2สำหรับผลรวมสั้นลง) ดังนั้นการเรียงลำดับตัวเลขตามลำดับจากน้อยไปมากมี "เพียง" ที่9! = 362880เป็นไปได้มากที่สุดที่จะต้องพิจารณา และความลึกในการเรียกซ้ำสูงสุด9(โดยไม่คำนึงถึงมูลค่าn)


0

Haskell , 91 ไบต์

f n=[read[c]|c<-show n,c>'0']#n!!0
s#n|n>0,x:m<-(s#).(n-)=<<s=[1+minimum(x:m)]|1<3=[0|n==0]

ลองออนไลน์! ตัวอย่างการใช้งาน: อัตราผลตอบแทนf 58 8รวดเร็วสำหรับตัวเลขสองหลักช้าอย่างน่ากลัวสำหรับอินพุตที่ใหญ่ขึ้น

ฟังก์ชั่นfแปลงหมายเลขอินพุตnให้เป็นรายการของตัวเลขขณะกรองศูนย์ จากนั้นรายการนี้และnตัวมันเองจะถูกส่งไปยัง(#)ฟังก์ชันซึ่งจะส่งกลับรายการแบบซิงเกิล !!0ส่งคืนองค์ประกอบของรายการซิงเกิลนี้

(#)ใช้รายการเดี่ยวและรายการที่ว่างเปล่าเป็นประเภทตัวเลือก เมื่อมีการป้อนข้อมูลn=58และs=[5,8]แนวคิดก็คือการลบตัวเลขทั้งหมดsออกจากnนั้นนำไปใช้ซ้ำ(#)และตรวจสอบว่าตัวเลขใดส่งผลให้จำนวนขั้นต่ำสุดและส่งคืนหนึ่งบวกกับผลลัพธ์ขั้นต่ำนี้ ส่วนแรกคือการคำนวณโดยซึ่งเป็นเช่นเดียวกับ(s#).(n-)=<<s concat(map(s#)(map(n-)s))ดังนั้นในตัวอย่างแรกของเรา[58-5,58-8]คือการคำนวณตามด้วย[[5,8]#53,[5,8]#50]ซึ่งผลลัพธ์ใน[[7],[7]]หรือหลัง[7,7] concatผลลัพธ์จะถูกจับคู่กับรูปแบบx:mเพื่อให้แน่ใจว่ารายการนั้นมีองค์ประกอบอย่างน้อยหนึ่งองค์ประกอบ ( minimumล้มเหลวเป็นอย่างอื่น) จากนั้นรายการเดี่ยวของ 1 รวมถึงผลตอบแทนขั้นต่ำของผลลัพธ์ ถ้าnมีค่าน้อยกว่าศูนย์หรือการเรียกซ้ำเรียกคืนรายการว่างเราอยู่ในสาขาที่ล้มเหลวของการค้นหาและส่งคืนรายการว่างเปล่า หากn==0สาขาประสบความสำเร็จและ[0]ถูกส่งกลับ


Haskell , 101 ไบต์

f n=[d|d<-[9,8..1],show d!!0`elem`show n]#n!!0
s@(d:r)#n|n>=d,[x]<-s#(n-d)=[x+1]|1<3=r#n
s#n=[0|n==0]

ลองออนไลน์! วิธีที่มีประสิทธิภาพมากขึ้นตรวจสอบกรณีทดสอบทั้งหมดในเวลาไม่ถึงหนึ่งวินาที

เวลานี้รายการตัวเลขของอินพุตถูกคำนวณเพื่อเรียงจากมากไปน้อยซึ่งอนุญาตให้(#)พยายามใช้ตัวเลขที่ใหญ่ที่สุดบ่อยที่สุดเท่าที่จะเป็นไปได้จากนั้นจึงเป็นอันดับที่สองที่ใหญ่ที่สุดและจนกว่าจะพบวิธีแก้ไข วิธีแก้ปัญหาแรกพบว่าวิธีนี้รับประกันได้ว่าจะเป็นวิธีที่เล็กที่สุด

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