ผลรวมของตัวเลข 1 ถึง 7


21

ท้าทาย

กำหนดจำนวนเต็มบวกNที่เป็น 28 หรือสูงกว่าเอาท์พุทรายการของจำนวนรวมNที่ใช้แต่ละหลัก1ผ่าน7หนึ่งครั้ง คุณสามารถให้เป็นโปรแกรมหรือฟังก์ชั่น

ตัวเลขสามารถปรากฏได้ด้วยตัวเองหรือต่อกันตราบใดที่คุณใช้แต่ละครั้งโดยไม่ต้องทำซ้ำ ตัวอย่างเช่น[12, 34, 56, 7]ถูกต้องตามที่เป็น[1, 27, 6, 4, 35]และ[1234, 567]แต่ไม่ใช่[123, 34567][3, 2, 1476]หรือ ลำดับที่หมายเลขนั้นไม่สำคัญ

ถ้า Nไม่สามารถทำได้ด้วย 1-7 ให้ส่งคืนหรือส่งออกโดยไม่มีอะไร

ข้อมูลอื่น ๆ

  • นี่คือรหัสกอล์ฟดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ในวันพฤหัสบดีที่ 15 ตุลาคมจะเป็นผู้ชนะ

  • ถามคำถามใด ๆ ในความคิดเห็น

  • สิ่งที่ฉันไม่ได้ระบุในการท้าทายนั้นขึ้นอยู่กับคุณ

  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต

ตัวอย่าง

สิ่งเหล่านี้อาจช่วยทำให้สับสนได้:

อินพุต

28

เอาท์พุต

[1, 2, 3, 4, 5, 6, 7]

อินพุต

100

เอาท์พุต

[56, 7, 4, 31, 2]

อินพุต

1234567

เอาท์พุต

[1234567]

อินพุต

29

เอาท์พุต

ไม่มีอะไร 29 ไม่ถูกต้อง

อินพุต

1891

เอาท์พุต

[1234, 657]

อินพุต

370

เอาท์พุต

[15, 342, 7, 6]

ฉันจะทำมากขึ้นถ้าจำเป็น

นี่คือ pastebin ของตัวเลขที่เป็นไปได้ทั้งหมดที่สร้างขึ้นด้วยตัวเลขทั้งเจ็ดนี้ซึ่งได้รับความอนุเคราะห์จาก FryAmTheEggman


เอาท์พุท29คืออะไร
Geobits

4
หากคุณต้องการให้เอาต์พุตไม่มีค่าอะไรอย่าวาง(N/A)เป็นเอาต์พุต
mbomb007

1
@LukStorms [1234566, 1]ไม่ใช่เอาต์พุตที่ถูกต้องเนื่องจากมีการทำซ้ำ 6 คุณไม่สามารถทำซ้ำตัวเลขในผลลัพธ์ได้
The_Basset_Hound

2
อาจจะ» ... รายการตัวเลขที่ทำจากตัวเลขทศนิยม 1 ถึง 7 ซึ่งผลรวมถึง N «เป็นถ้อยคำที่ชัดเจนกว่าตัวเลขที่อยู่ในคำถาม
Paŭlo Ebermann

3
สำหรับการแก้ปัญหาแรงเล็กน้อยเดรัจฉานน้อย: นี้จะเทียบเท่ากับการกำหนดค่าสัมประสิทธิ์พลังงานของ-10 ให้กับแต่ละ1, ..,, 7เพื่อให้มีอย่างน้อยเป็นจำนวนมาก1's เป็น10ของอย่างน้อยเป็นจำนวนมาก10ในฐานะ100' s และอื่น ๆ
xnor

คำตอบ:


9

Pyth, 18 14 ไบต์

hfqSjkTjkS7./Q

ขอบคุณ @isaacg สำหรับการตีกอล์ฟ 2 ไบต์และปูทางไปอีก 2 ลูก

รหัสจะล้มเหลวหากไม่ควรสร้างผลลัพธ์ซึ่งจะไม่ทำให้เกิดผลลัพธ์

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

เพื่อตรวจสอบว่ารหัสทำงานตามที่ตั้งใจไว้คุณสามารถแทนที่7ด้วย3สำหรับผลรวมของตัวเลข 1 ถึง 3 คลิกที่นี่สำหรับชุดทดสอบ

ตัวอย่างการวิ่ง

$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 28
(1, 2, 3, 4, 5, 6, 7)

real    4m34.634s
user    4m34.751s
sys     0m0.101s
$ time pyth/pyth.py -c 'hfqSjkTjkS7./Q' <<< 29 2>/dev/null

real    9m5.819s
user    9m6.069s
sys     0m0.093s

มันทำงานอย่างไร

           ./Q    Compute all integer partitions of the input.
 f                Filter the integer partitions:
    jkT             Join the integers with empty separator.
   S                Sort the characters of the resulting string.
      jkS7          Join [1, ..., 7] with empty separator.
  q                 Check both results for equality.
                  Keep the partition of `q' returned True.
h                 Retrieve the first element of the filtered list.
                  For a non-empty list, this retrieves the solution.
                  For the empty list, it causes an error and produces no output.

2
ทำได้ดี! ค่อนข้างเป็นแนวทางที่เป็นนวัตกรรม `` `MS7`` r\1\8สั้นกว่า นอกจากนี้ยังเป็นเช่นเดียวกับ@ .. 0 h
isaacg

@isaacg ขอบคุณ! ฉันไม่แน่ใจว่าฉันพลาดhแต่ฉันไม่รู้ว่าคุณสามารถใช้Sวิธีนี้ได้ (การอ้างอิงอักขระในล่ามออนไลน์ไม่ได้พูดถึงมัน) jkS7ดูเหมือนว่าจะสั้นกว่านี้เพราะฉันไม่ต้องการsอีกต่อไป
เดนนิส

5

Python 3, 109

def f(n,s=set('1234567'),l='0,'):[f(n,s-{x},l+x+c)for c in(',','')for x in s]or n-sum(eval(l))or~print(l[2:])

ฟังก์ชั่นที่ใช้ตัวเลขและแสดงผลลัพธ์แบบทูเปิ123,4567,ล ใช่นี่เป็นสิ่งอันดับที่ถูกต้อง

แนวคิดคือการสร้างสตริงที่เป็นไปได้ทั้งหมด43,126,7,5,ที่มีตัวเลข1ผ่าน7คั่นด้วยเครื่องหมายจุลภาคโดยไม่มีเครื่องหมายจุลภาคสองตัวติดต่อกัน ประเมินนิพจน์นี้เป็น tuple และผลรวมเท่ากับnพิมพ์และสิ้นสุดด้วยข้อผิดพลาด

ในการสร้างสตริงดังกล่าวทั้งหมดเราติดตามชุดsของตัวอักษรที่จะใช้และลอง appenping แต่ละอันด้วยเครื่องหมายจุลภาคซึ่งทำให้ตัวเลขสิ้นสุดรายการหรือไม่มีในกรณีที่ตัวเลขในอนาคตจะเชื่อมโยงกับมัน

ลัดวงจรจะใช้ในการตรวจสอบว่าsเป็นที่ว่างเปล่าเพราะรายการ comp เป็นที่ว่างเปล่าและที่n==sum(eval(l))ซึ่งในกรณีนี้เราพิมพ์lและยุติกับข้อผิดพลาดโดยการใช้~ของNoneกลับโดยการพิมพ์ (ขอบคุณสำหรับ SP3000 นี้.)

ฉันเชื่อว่าใน Python 3.5 สองตัวอักษรสามารถบันทึกได้โดยการเขียนs={*'1234567'}(ขอบคุณ Sp3000)

มีความรำคาญเล็กน้อยที่กินตัวละคร หนึ่งคือในกรณีที่lดูเหมือน1234567ไม่มีเครื่องหมายจุลภาคจะแยกเป็นหมายเลขเดียวและโทรsumให้ข้อผิดพลาด นี่คือการจัดการกับการแฮ็กของการเริ่มต้นlด้วยองค์ประกอบ0และลอกออกเมื่อพิมพ์ ค่าใช้จ่าย 6 ตัวอักษร

วนcซ้ำเครื่องหมายจุลภาคและสตริงว่างเปล่าน่ารำคาญfor c in(',','')เพราะ Python 3 ไม่อนุญาตให้ tuple นี้เปลือยเปล่า ฉันต้องการให้มีอักขระบางตัว?ที่ไม่สนใจตัวเลขให้ทำ',?'เพื่อ 4 ตัวอักษรน้อยลง แต่ดูเหมือนจะไม่เป็นแบบตัวอักษร


วิธีเก่า:

Python 2, 117

def f(n,s={1,2,3,4,5,6,7},l=[],p=0):
 if{n,p}|s=={0}:print l;1/0
 if p:f(n-p,s,l+[p])
 for x in s:f(n,s-{x},l,p*10+x)

กำหนดฟังก์ชั่นที่ใช้ตัวเลขและพิมพ์รายการ

แนวคิดคือใช้การเรียกซ้ำเพื่อลองทุกสาขา การติดตามตัวแปรคือ

  • ยอดรวมที่เหลือnจำเป็น
  • ชุดของตัวเลขsที่เหลือที่จะใช้
  • รายการlตัวเลขที่ทำไปแล้ว
  • จำนวนที่เกิดขึ้นบางส่วนในปัจจุบัน p

เมื่อใดn==0และsว่างเปล่าให้พิมพ์lและยุติโดยมีข้อผิดพลาด

หากตัวเลขที่เกิดขึ้นบางส่วนในปัจจุบัน pไม่ใช่ศูนย์ให้ลองเพิ่มเข้าไปในรายการและลบออกจากผลรวมที่เหลือ

สำหรับแต่ละหลักxเราสามารถใช้จากsลองท้ายมันและลบออกจากps


4

Pyth, 23

#iRThfqQsiR10Ts./M.pS7q

แรงเดรัจฉานไร้เดียงสาออนไลน์ช้าเกินไปใช้เวลาประมาณหนึ่งนาทีบนคอมพิวเตอร์ของฉัน การใช้งานทั่วไป "ห่วงตลอดจนข้อยกเว้น" รูปแบบของโรงแรมพร้อมสนามกอล์ฟ pyth 29ที่เข้าถึงที่เกิดรายการที่กรองของการรวมกันทำให้เกิดข้อผิดพลาดสำหรับตัวเลขที่เป็นไปไม่ได้เช่น

ผลลัพธ์เช่นรายการ pythonic เช่น

1891
[1234, 657]
100
[1, 2, 34, 56, 7]
370
[12, 345, 6, 7]

นี่คือการวางของหมายเลขทั้งหมด 1,0136 ที่สามารถทำได้ด้วยวิธีนี้


ฉันสามารถใช้ลิงค์ Pastebin เพื่อเป็นตัวอย่างได้หรือไม่?
The_Basset_Hound

@The_Basset_Hound แน่นอนไปเลย
FryAmTheEggman

3

Python 2.7, 178 172 169 ไบต์

n=input()
for i in range(8**7):
 for j in len(set('%o0'%i))/8*range(128):
    s=''
    for c in'%o'%i:s+='+'[:j%2*len(s)]+c;j/=2
    if eval(s)==n:print map(int,s.split('+'));1/0

โปรดทราบว่าสามบรรทัดสุดท้ายควรมีการเยื้องกับแท็บ แต่ฉันไม่สามารถหาวิธีการแก้ไขได้ในตัวแก้ไขนี้

แก้ไข: ทำรังแบนราบหนึ่งชั้นด้วยความช่วยเหลือของ Sp3000


SE แยกแท็บออกไปอย่างน่าเสียดายดังนั้นเพียงแค่บอกว่าการเยื้องออกมานั้นดีแค่ไหน :)
Sp3000

เอาละยังคงหาทางของฉันรอบเว็บไซต์นี้
xsot

3

JavaScript (ES6), 165 196

แก้ไขสั้นลงเล็กน้อย อาจใช้เวลาสั้นกว่าevalนี้ แต่ฉันชอบที่จะรวดเร็ว

เดรัจฉานแรงน่าอับอายนานกว่ารุ่น Pith แต่เร็วขึ้น ทดสอบการเรียกใช้ตัวอย่างข้อมูลด้านล่างในเบราว์เซอร์ที่สอดคล้องกับ EcmaScript 6

f=z=>{for(r=i=1e6;r&&++i<8e6;)for(m=/(.).*\1|[089]/.test(w=i+'')?0:64;r&&m--;t.split`+`.map(v=>r-=v,r=z))for(t=w[j=0],l=1;d=w[++j];l+=l)t+=l&m?'+'+d:d;return r?'':t}

function test() { O.innerHTML=f(+I.value) }

test()

// Less golfed

f=z=>{
  for(r=i=1e6; r&&++i<8e6;)
    for(m=/(.).*\1|[089]/.test(w=i+'')?0:64; r&&m--; t.split`+`.map(v=>r-=v,r=z))
      for(t=w[j=0],l=1;d=w[++j];l+=l)
        t+=l&m?'+'+d:d;
  return r?'':t
}
<input id=I value=28><button onclick=test()>-></button><span id=O></span>


ไม่น่าละอายที่จะอยู่อีกต่อไปเพราะภาษาฉันสนุกกับคำตอบ JS ของคุณจริงๆ +1
FryAmTheEggman

1

Python 2, 270 268 bytes

from itertools import*;P=permutations
x,d,f=range(1,8),[],input()
r=sum([[int(''.join(str(n)for n in i))for i in list(P(x,j))]for j in x],[])
z=1
while z:
 t=sum([[list(j)for j in P(r,z)]for i in x],[])
 v=filter(lambda i:sum(i)==f,t)
 if v:print v[0];break
 else:z+=1

ยังคงทำงานเกี่ยวกับการเล่นกอล์ฟ

สิ่งนี้จะวนซ้ำจนกว่าจะพบการแข่งขัน


import asไม่ค่อยจำเป็น - คุณสามารถทำได้from itertools import*;P=permutations
Sp3000

มันสั้นกว่าที่จะใช้map(str,i)มากกว่าความเข้าใจในรายการและคุณสามารถสร้างรายการ r โดยตรงแทนที่จะเขียนด้วยรายการที่ซ้อนกัน: r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]และสิ่งที่คล้ายกันสำหรับ t
รู ธ แฟรงคลิน

คุณสามารถใช้`n`แทนstr(n)เนื่องจากnจะไม่มีวันเกินจำนวนเต็มที่สูงสุด
mbomb007

1

Haskell (145 ไบต์)

main=getLine>>=print.head.f[1..7].read
f[]0=[[]]
f b s=[n:j|(n,g)<-m b,j<-f g$s-n]
m b=[(d+10*z,g)|d<-b,(z,g)<-(0,filter(/=d)b):m(filter(/=d)b)]

ใช้การเรียกซ้ำ

Ungolfed (337 ไบต์):

delete d = filter (/= d)
main = getLine >>= print . (`form` [1..7]) . read

form s [] | s == 0    = [[]]
form s ds | s <= 0    = []
form s ds | otherwise = [n:ns | (n, ds') <- makeNumbers ds, ns <- form (s-n) ds']

makeNumbers [] = []
makeNumbers ds  = [(d + 10 * n',ds') | d <- ds, (n',ds') <- (0,delete d ds):makeNumbers (delete d ds)]

0

สกาลา, 195 ไบต์

นี่ไม่ใช่ประสิทธิภาพที่สุดและใช้เวลา 15 นาทีกว่าจะได้ผลลัพธ์ 29 แต่ใช้งานได้

def g(s: Seq[Int]): Iterator[Seq[Int]]=s.combinations(2).map(c=>g(c.mkString.toInt +: s.filterNot(c.contains))).flatten ++ Seq(s)
def f(i: Int)=(1 to 7).permutations.map(g).flatten.find(_.sum==i)

นี่คือผลลัพธ์บางส่วน

scala> f(100)
res2: Option[Seq[Int]] = Some(Vector(46, 35, 12, 7))

scala> f(1891)
res3: Option[Seq[Int]] = Some(Vector(567, 1324))

scala> f(370)
res4: Option[Seq[Int]] = Some(Vector(345, 12, 6, 7))

scala> f(29)
res5: Option[Seq[Int]] = None

0

Ruby, 105 ไบต์

กำลังดุร้าย! ตรวจสอบชุดย่อยของความยาวทุกช่วงระหว่าง 0 ถึง 7 ของจำนวนเต็มตั้งแต่ 1 ถึง 7654321 และดูว่าชุดใดตรงกับเกณฑ์ของเราหรือไม่ คุณอาจไม่ต้องการรอให้เรื่องนี้สิ้นสุดลง

->n{8.times{|i|[*1..7654321].permutation(i){|x|return x if
x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}

ในการรันและตรวจสอบอัลกอริทึมคุณสามารถ จำกัด พื้นที่การค้นหาโดยแทนที่7654321ด้วยจำนวนที่มากที่สุดที่คุณรู้ว่าจะอยู่ในคำตอบ ตัวอย่างเช่น 56 สำหรับ n = 100 หรือ 1234 สำหรับ n = 1891 นี่คือการทดลองใช้หลัง:

$ ruby -e "p ->n{8.times{|i|[*1..1234].permutation(i){|x|return x if x.join.chars.sort==[*?1..?7]&&eval(x*?+)==n}}}[gets.to_i]" <<< 1891
[657, 1234]

จำนวนเต็ม 0 ถึง 7 คุณควรใช้จำนวนเต็ม exaclty 7: 1,2,3,4,5,6,7
edc65

@ edc65 คุณหมายถึงว่า 7 หลัก ผลลัพธ์คือชุดของจำนวนเต็มและขนาดของชุดขึ้นอยู่กับอินพุต
daniero

ฉันไม่ได้พูดรูบีฉันคิดว่าโปรแกรมทำงานได้ แต่ฉันไม่ได้รับคำอธิบาย หากจำนวนเต็มน้อยกว่า 1234567 คุณจะได้รับ 7654321 อย่างไร
edc65

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