ผลรวมของเลขคี่ที่ต่อเนื่องกัน


24

แม้ว่าจะมีการถามถึงความท้าทายที่เกี่ยวข้อง แต่สิ่งนี้แตกต่างเพื่อรับประกันคำถามของตัวเอง


ท้าทาย

รับค่าเป็นจำนวนเต็มบวกส่งคืนลำดับที่ยาวที่สุดของจำนวนเต็มคี่บวกต่อเนื่องซึ่งผลรวมคือจำนวนเต็มที่กำหนด หากไม่มีลำดับดังกล่าวคุณอาจรายงานข้อผิดพลาดไม่ว่าด้วยวิธีใดก็ตามที่เหมาะสมกับภาษาของคุณรวมถึงการคืนค่าที่ผิดพลาดหรือส่งข้อยกเว้น

กรณีทดสอบ

  1 -> [1]
  2 -> []
  3 -> [3]
  4 -> [1, 3]
  5 -> [5]
  6 -> []
  9 -> [1, 3, 5] (โปรดทราบว่า [9] ไม่ใช่คำตอบที่ถูกต้อง)
 15 -> [3, 5, 7]
104 -> [23, 25, 27, 29] (โปรดทราบว่า [51, 53] ไม่ใช่คำตอบที่ถูกต้อง)

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะเป็นผู้ชนะ


2
โปรแกรมของฉันสามารถทำงานได้ตลอดไปหากไม่มีวิธีแก้ไขหรือไม่?
Dennis

ที่เกี่ยวข้องมาก ความจริงที่ว่าตัวเลขบางตัวไม่สามารถแสดงในอันนี้ได้อาจช่วยให้มันไม่ถูกล่อลวงได้
ETHproductions

6
ไม่สามารถให้ 15 [-1, 1, 3, 5, 7] หรือไม่ หากอนุญาตเฉพาะค่าบวกคุณควรพูดเช่นนั้น
xnor

2
@ ЕвгенийНовиковคุณข้ามไป 17
kalsowerus

1
@ kalsowerus ใช่ ฉันเข้าใจผิดคำว่า "ติดต่อกัน"
ЕвгенийНовиков

คำตอบ:


11

Haskell, 67 65 63 62 58 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ Julian Wolf

f x=[[2*n+1,2*n+3..2*m]|n<-[0..x],m<-[n..x],m^2-n^2==x]!!0

ลองออนไลน์!

ฉันตรวจสอบว่าตัวเลขสามารถแสดงในขณะที่เขาแตกต่างจากสองสี่เหลี่ยม: m^2-n^2. ฉันสามารถสร้างรายการเลขคี่ที่ต่อเนื่องกัน: [2n+1,2n+3...2m-1]. โปรดทราบว่าเนื่องจากnมีการเลือกน้อยที่สุดรายการที่ยาวที่สุดจะถูกส่งออก


7
ผู้ลงคะแนนเสียง: จะเป็นมิตรและสร้างสรรค์มากขึ้นเพื่อเพิ่มความคิดเห็นที่ให้เหตุผลของคุณโดยเฉพาะอย่างยิ่งเมื่อผู้ใช้ใหม่ลงคะแนน
Jonathan Allan

1
ถ้าฉันไม่มีอะไรหายคุณสามารถบันทึก 4 ไบต์โดยขึ้นกับxทั้งคู่nและm
Julian Wolf

เพียงเท่านี้คุณก็จะได้ทราบว่าการลงคะแนนถูกสร้างโดยอัตโนมัติโดยผู้ใช้ชุมชนเมื่อคุณแก้ไขคำตอบของคุณ ผมคิดว่านี่เป็นข้อผิดพลาด (CC @JonathanAllan)
Dennis

มันเป็นหนึ่งในนั้น
Jonathan Allan

9

Python 2 , 66 62 ไบต์

f=lambda n,k=0,*r:n-sum(r)and f(n,k+1,*range(k%n|1,k/n,2))or r

ออกด้วยRuntimeError (เกินความลึกเรียกซ้ำสูงสุด) หากไม่มีวิธีแก้ไข

ลองออนไลน์!


1
หากค่าอินพุตสูงพอ แต่มีวิธีแก้ไขสิ่งนี้จะส่งผลให้เกิดRuntimeErrorหรือไม่?
Okx

หากขีด จำกัด การเรียกซ้ำไม่สูงพอและ / หรือสแต็กไม่ใหญ่พอใช่ อย่างไรก็ตามมันเป็นเรื่องธรรมดาที่จะเพิกเฉยต่อข้อ จำกัด ทางกายภาพ (เช่นคำตอบ C ต้องทำงานกับ 32- บิต ints) และ OP กล่าวอย่างชัดเจนว่าการรันตลอดไปนั้นเป็นที่ยอมรับหากไม่มีวิธีแก้ปัญหา
Dennis

9

เยลลี่ ,  11  10 ไบต์

-1 ไบต์ขอบคุณเดนนิส (ใช้การสร้างช่วงโดยนัยของ- แทนที่Rm2Ẇด้วยẆḤ’)

ẆḤ’S_¥Ðḟ⁸Ṫ

ลิงก์ monadic ส่งคืนรายการของการสรุปถ้าเป็นไปได้หรือ0ไม่

ลองออนไลน์!

อย่างไร?

ẆḤ’S_¥Ðḟ⁸Ṫ - Link: number, n
Ẇ          - all sublists (implicit range of input) note: ordered by increasing length
           -                i.e. [[1], [2], [3], ..., [1,2], [2,3], ..., [1,2,3], ...]]
 Ḥ         - double              [[2], [4], [6], ..., [2,4], [4,6], ..., [2,4,6], ...]]
  ’        - decrement           [[1], [3], [5], ..., [1,3], [3,5], ..., [1,2,5], ...]]
        ⁸  - link's left argument, n
      Ðḟ   - filter out items for which the following yields a truthy value:
     ¥     -   last two links as a dyad:
   S       -     sum
    _      -     subtract the right from the left = sum - n
         Ṫ - tail (last and hence longest such run)

1
ẆḤ’บันทึกเป็นไบต์
Dennis

8

JavaScript (ES7), 87 86 85 81 ไบต์

ส่งคืนรายการจำนวนเต็มที่คั่นด้วยเครื่องหมายจุลภาคหรือ0หากไม่มีวิธีแก้ไข

n=>(g=(s,k,x=n+s)=>(x**.5|0)**2-x?k>n?0:g(s+k,k+2):(n-=k)?k+','+g(-n,k+2):k)(0,1)

อย่างไร?

เราดูครั้งแรกสำหรับตารางที่สมบูรณ์แบบที่เล็กที่สุดsเช่นว่าx = n + Sเป็นอีกหนึ่งตารางที่สมบูรณ์

หากsอยู่nคือความแตกต่างx - s 2 สี่เหลี่ยมที่สมบูรณ์แบบซึ่งสามารถเขียนเป็นความแตกต่างของ 2 ลำดับของเลขคี่ติดต่อกัน จากนั้นเราสร้างรายการผลลัพธ์

ตัวอย่าง:

สำหรับn = 104 :

เราพบว่าs = 11² = 121ซึ่งตอบสนองx = n + s = 225 = 15²

แล้ว:

15² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19
+21 + 23 + 25 + 27 + 29 11² = 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 + 17 + 19 + 21
104 = 15² - 11² = 23 + 25 + 27 + 29


3
คุณจะรอฉันบอกว่าn^2จะเท่ากับผลรวมของnเลขคี่แรกเสมอหรือไม่ Huh น่าสนใจ
Skidsdev



7

05AB1E , 9 8 ไบต์

-1 ไบต์ต้องขอบคุณ Emigna

ÅÉŒʒOQ}н

คำอธิบาย:

ÅÉ           Generate a list of odd numbers up to, and including, the input
  Œ          Substrings
   ʒ         Only keep values
    O          where the sum
     Q         equals the input
       }     End
             For 9, the result would look like this:
             [[1, 3, 5], [9]]
        н    Get the first value

สำหรับอินพุตที่ไม่ถูกต้องจะไม่มีผลใด

ลองออนไลน์!


ʒOQ}แทนการDO¹QÏบันทึกไบต์
Emigna

@JonathanAllan Docs พูดว่า "uneven" ดังนั้นมันอาจจะสับสน ...
Erik the Outgolfer

1
@JanathanAllan ผิดพลาดเล็กน้อย คงที่
Okx

6

Haskell , 61 60 ไบต์

ขอบคุณ @maple_shaft สำหรับการตัด 1 ไบต์

f n=[k|r<-[1,3..],s<-[r,r+2..n],k<-[[r,r+2..s]],sum k==n]!!0

ลองออนไลน์!

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

ฉันต้องการที่จะทำอะไรกับเลขคณิตแทนการบังคับเดรัจฉานkแต่fromIntegerดูเหมือนจะฆ่ามัน


คุณสามารถช่วยตัวเองหนึ่งไบต์ด้วยการเปลี่ยน[1,3..n]เป็น[1,3..]
maple_shaft

1
คุณสามารถบันทึก 7 r?n=[r,r+2..n]ไบต์ที่มีฟังก์ชั่นผู้ช่วย ลองออนไลน์!
Ørjan Johansen

4

Pythonขนาด 67 ไบต์

f=lambda n,R=[1]:n-sum(R)and f(n,[R+[R[-1]+2],R[1:]][sum(R)>n])or R

ลองออนไลน์!

ผมคัดลอกคำตอบของฉันจากความท้าทายรวมติดต่อกันก่อนหน้านี้และมีการเปลี่ยนแปลงไป+1 +2ใครจะรู้ว่ารหัส golfed อาจเป็นแบบแยกส่วนได้

กลยุทธ์ที่ตรงไปตรงมาอย่างแปลกประหลาด: ค้นหาช่วงเวลาRด้วยผลรวมที่ต้องการ

  • หากผลรวมมีขนาดเล็กเกินไปให้เลื่อนจุดปลายด้านขวาของช่วงเวลาขึ้น 2 โดยต่อท้ายหมายเลข 2 ด้านบน
  • หากผลรวมมีขนาดใหญ่เกินไปให้เลื่อนจุดปลายด้านซ้ายขึ้นโดยการลบองค์ประกอบที่เล็กที่สุด
  • ถ้าผลรวมที่ถูกต้อง, Rเอาท์พุท

เนื่องจากจุดสิ้นสุดด้านล่างของช่วงเวลาเพิ่มขึ้นเท่านั้นจึงพบช่วงเวลาที่ยาวนานกว่าก่อนช่วงเวลาที่สั้นลง หากไม่พบช่วงเวลาที่เป็นไปได้ยุติด้วย IndexError


4

JavaScript (ES6), 65 64 ไบต์

f=(a,i=1)=>a>i?(c=f(a-i,i+=2))[0]==i?[i-2,...c]:f(a,i):a<i?0:[i]

ส่งกลับอาร์เรย์ถ้ามีวิธีแก้ปัญหาหรือ 0 ไม่มีวิธีแก้ปัญหา

นี่คือไม่มีประสิทธิภาพสูงยังgolfyวิธีการแก้ปัญหาที่เกิดขึ้น

มันค้นหาโซลูชันแรกที่ใช้a-iและi=1แม้ว่าจะไม่ทำงานซ้ำกอง หากวิธีการแก้ปัญหาที่ไม่ได้เริ่มต้นด้วยi+2แล้วเราซ้ำค้นหาวิธีการแก้ปัญหาครั้งแรกที่ใช้และai+2

Ungolfed

f=(a,i=1)=>
  a > i ? 
    (c = f(a - i, i += 2))[0] == i ? 
      [i-2, ...c] : 
      f(a, i) :
  a < i ? 
    0 :
    [i]

กรณีทดสอบ:

สำหรับแนวคิดของวิธีการที่ไม่มีประสิทธิภาพนี้โซลูชันf(104)ต้องมีการเรียกซ้ำแบบเรียกซ้ำ 69,535 ครั้ง สแต็กนั้นไม่ลึกเกินกว่า 51 ระดับดังนั้นจึงไม่มีปัญหากับสแต็กล้น

โซลูชันที่f(200)ต้องใช้การโทรแบบเรียกซ้ำ8.6 ล้านครั้งโดยมี 99 สแต็กลึก (วิธีแก้ปัญหาคือ[11,13,15,17,19,21,23,25,27,29].)

นี่คือการแสดงภาพของโปรแกรมที่กำลังทำงานอยู่:


3

Python 2.7, 109 108 97 ไบต์

11 ไบต์ลดลงขอบคุณ Erik the Outgolfer

นี่คือรหัสกอล์ฟครั้งแรกของฉัน!

def f(N):
 for n in range(N):
    x=(n*n+N)**.5-n
    if x%1==0:return[2*(k+n)+1for k in range(int(x))]

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

ฉันใช้ตัวตนที่เป็นที่รู้จักกันดีว่า 1 + 3 + 5 + ... + (2n - 1) = n²

ใช้กรณีของ 15

15 = 3 + 5 + 7 = (1 + 2) + (3 + 2) + (5 + 2) = (1 + 3 + 5) + 3×2 = 3² + 3×2

โดยทั่วไปหากมีคำศัพท์xคำที่เริ่มต้น2n + 1เช่น

(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))


มันเท่ากับ 2nx + x²

หากNเป็นจำนวนเต็มอินพุตปัญหาจะลดลงเพื่อหาค่าสูงสุดxเช่นนั้น

x² + 2nx - N = 0

มันเป็นสมการกำลังสองกับการแก้ปัญหา

x = sqrt(n² + N) - n

xลำดับที่ยาวที่สุดเป็นหนึ่งเดียวกับที่ใหญ่ที่สุด โปรแกรมวนซ้ำnจาก0ถึงNและเมื่อพบว่าxเป็นจำนวนเต็มจะสร้างรายการ(2n + 1) + (2n + 3) + (2n + 5) ... (2n + (2x-1))และส่งคืน



@EriktheOutgolfer ขอบคุณฉันลืมเกี่ยวกับการใช้แท็บ (=
dark32

3

Python 3, 190 81 Bytes

def c(q,l,i):
    if sum(l)0:
        l.append(i)
        return c(q,l,i+2)
    elif sum(l)>q:
        l.pop(0)
        return c(q,l,i)
    else:
        print(l)
c(q,[1],1)

c=lambda q,l=[1]:c(q,l+[l[-1]+2])if(sum(l)<q)*l else c(q,l[1:])if sum(l)>q else l

ขอบคุณ @ovs และ @ musicman523


4
คุณจะได้รับนี้ลงถึง 122 ไบต์เพียงโดยการเอาเยื้องบาง หากคุณต้องการที่จะลดลงรหัสของคุณต่อไปมีลักษณะที่เคล็ดลับสำหรับการเล่นกอล์ฟในหลาม
ovs

3
สิ่งนี้ไม่ทำงานใน Python 3 เนื่องจากการเรียกไปยังprintวงเล็บหายไป
musicman523

2
คุณสามารถลบได้l.append(i)โดยใช้เพียงแค่l+[i]ในการโทรซ้ำ คุณสามารถลบl.pop(0)โดยใช้l[1:]ในการโทรซ้ำ คุณสามารถลบการเรียกไปcที่ด้านล่างสุดโดยใช้อาร์กิวเมนต์คำหลักแทน คุณสามารถลบ>0ที่บรรทัดที่ 2 ในที่สุดคุณสามารถเปลี่ยนifและelseงบของคุณเป็นนิพจน์โดยใช้แบบฟอร์มที่ประกอบไปด้วยซึ่งทำให้คุณได้ถึง 92 ไบต์เป็นนิพจน์แลมบ์ดา ลองออนไลน์!
musicman523

1
ขึ้นอยู่กับข้อเสนอแนะ @ musicman523 เรายังคงสามารถร่นเงื่อนไขและวางiที่จะได้รับทั้งหมด81 ไบต์
ovs

ฉันคิดว่าคุณอาจมีการเปลี่ยนแปลงsum(l)>q elseเพื่อq<sum(l)elseที่จะบันทึก 1 ไบต์
Zacharý

2

QBIC , 47 ไบต์

{_Cg=q┘q=q+2~g>:|_Xp\?g,[q,a,2|?b,┘g=g+b~g=a|_X

nพยายามนี้จะนับทุกเลขคี่จากที่หนึ่งจนกว่าผลรวมของมันคือ หากผ่านnให้รีเซ็ตลูปเพิ่ม 1 ถึง 3 แล้วลองอีกครั้ง ออกจากพิมพ์ 0 > nถ้าในช่วงเริ่มต้นของวงจำนวนของเรา

คำอธิบาย

{       Do infinitely
_C      Clear the screen (we basically print every run of odd numbers, but clear out everything that doesn't sum up to n)
g=q     Set g to the first num of this cycle (q starts as 1 in QBIC)    
┘       (Syntatcic linebreak)
q=q+2   Raise q to the next odd number, this sets up both the next outer loop as well as a coming FOR loop
~g>:|   If we start out with a number > n (read as 'a' from the cmd line)
_Xp     THEN quit, printing 0 (the value of the number var 'p')
\       ELSE
[q,a,2| FOR b = q, b <= n, b+=2
?b,┘    PRINT b followed by a tab
g=g+b   Add 'b' to running total 'g'
~g=a|   and if that lands us on 'n'
_X      QUIT (printing nothing: everything is already printed)

1

R , 90 ไบต์

f=function(x,y=1)'if'(length(w<-which(cumsum(r<-y:x*2-1)==x)),r[1:w],'if'(y>x,0,f(x,y+1)))

ลองออนไลน์!

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


1

Python 2 , 89 ไบต์

lambda n,r=range:[v for v in[r(1,n+1,2)[i:j]for i in r(n)for j in r(n+1)]if sum(v)==n][0]

ฟังก์ชั่นที่ไม่มีชื่อการใช้จำนวนเต็มบวกnและส่งคืนผลลัพธ์หากมีอยู่และเพิ่มเป็นIndexErrorอย่างอื่น

ลองออนไลน์!

สร้างรายชื่อของทุกเลขคี่ที่เกี่ยวข้องกับr(1,n+1,2)ซึ่งเป็นrange(start=1, stop=n+1, step=2); สร้างที่เกี่ยวข้องทั้งหมดชิ้นย่อย (บวกบางคนที่ว่างเปล่า) โดยหั่นว่าจากการiรวมการjพิเศษกับ[i:j]ทั่วiใน[0, n) ใช้r(n)และjใน[0] nใช้r(n+1)(คนที่ว่างเปล่าเมื่อi>=jหรือiอยู่นอกขอบเขต); ตัวกรองสำหรับผู้ที่มีผลรวมที่ถูกต้องด้วยif sum(v)==n; ส่งกลับครั้งแรก (และด้วยเหตุที่ยาวที่สุด) [0]ชิ้นดังกล่าวใช้




1

PHP , 73 ไบต์

ไม่มีวิธีแก้ปัญหาเป็นวงไม่สิ้นสุด

for($e=-1;$s-$i=$argn;)$s+=$s<$i?$n[]=$e+=2:-array_shift($n);print_r($n);

ลองออนไลน์!

PHP , 83 ไบต์

พิมพ์อะไรโดยไม่มีวิธีแก้ปัญหา

ทุกอินพุต mod 4 == 2 ไม่มีทางออก

for($e=-1;($i=$argn)%4-2&&$s-$i;)$s+=$s<$i?$n[]=$e+=2:-array_shift($n);print_r($n);

ลองออนไลน์!


ล้มเหลวในการตรวจสอบอินพุตที่แก้ไม่ได้
ติตัส

@Titus fixed ...
JörgHülsermann

0

Python 2 , 122 121 119 115 ไบต์

-1 ไบต์ขอบคุณ musicman523 -4 ไบต์ขอบคุณ Step Hen ฮ่าฮ่า

def f(n,R=range):r=R(1,n,2);print[i for w in R(1,len(r)+1)for i in[r[j:j+w]for j in R(len(r)-w+1)]if sum(i)==n][-1]

ลองออนไลน์!


1
นี่คือหนึ่งไบต์ที่สั้นลงเป็นฟังก์ชัน ลองออนไลน์!
musicman523

บันทึกไบต์ถ้าคุณ redefine range, ลองออนไลน์!
Stephen

นี้ล้มเหลวสำหรับ1
Dennis

0

Python 3 , 93 ไบต์

lambda n,r=range:[[*r(s,e+1,2)]for s in r(1,n+1,2)for e in r(s,n+1,2)if(s+e)*(2+e-s)==4*n][0]

ลองออนไลน์!

สิ่งเดียวที่พิเศษที่ฉันทำคือไม่ได้สังเกตว่า(s+e)*(2+e-s)==4*nเทียบเท่ากับsum(range(s,e+1,2))==nและถึงแม้ว่ามันจะมีขนาดเท่ากันเมื่อr=rangeก่อนหน้าifนี้


0

Python 3 , 185 ไบต์

def f(s):
  d={k:v for k,v in{a:(1-a+((a-1)**2+4*s)**(.5))/2 for a in range(1,s,2)}.items()if int(v)==v};m=max(d.keys(), key=(lambda k: d[k]));return list(range(int(m),int(m+2*d[m]),2))

ลองออนไลน์!


สำหรับวิธีการทำงานนี้ฉันพยายามหาวิธีแก้ปัญหาที่หรูหรากว่าการค้นหาแรงแบบง่ายๆ ฉันจัดเรียงสูตรใหม่สำหรับผลรวมของลำดับเลขคณิตและใช้สูตรสมการกำลังสองเพื่อรับนิพจน์(1-a+((a-1)**2+4*s)**(.5))/2ซึ่งปรากฏในรหัส สิ่งที่นิพจน์คำนวณคือให้ผลรวมที่ต้องการsและคำแรกสำหรับลำดับเลขคณิตaความยาวของลำดับ ความยาวเหล่านี้จะถูกเก็บไว้ในพจนานุกรมเป็นค่าสำหรับคำแรกเป็นคีย์

ถัดไปค่าที่ไม่ใช่จำนวนเต็มทั้งหมดจะถูกลบออกจากพจนานุกรมเนื่องจากค่าเหล่านั้นแสดงถึงลำดับที่ไม่ถูกต้อง จากนั้นค่าที่มากที่สุดจะถูกระบุด้วยและลำดับของเลขคี่ในตำแหน่งที่และที่มีความยาวที่ทำด้วยmax(d.keys(), key=(lambda k: d[k]))list(range(int(m),int(m+2*d[m]),2))


ฉันกำลังมองหาความช่วยเหลือกอล์ฟนี้ถ้าคุณเห็นอะไร ฉันสนใจที่จะเห็นว่าฉันสามารถทำอัลกอริทึมที่ไม่สำคัญได้ดีเพียงใด คำตอบของฉันมีความยาวเกือบสองเท่าของโซลูชั่น Python ที่ดีที่สุด


จะใช้งานได้ไหม repl.it/JTt7 (177 bytes)
Zacharý

0

Mathematica, 56 ไบต์

Last@Cases[Subsequences@Table[n,{n,1,#,2}],x_/;Tr@x==#]&

Function#กับอาร์กิวเมนต์แรก คำนวณรายการเลขคี่บวกน้อยกว่าหรือเท่ากับTable[n,{n,1,#,2}] ส่งคืนลำดับทั้งหมดของรายการที่เรียงลำดับโดยการเพิ่มความยาว จากนั้นเราจะใช้เวลาที่การแข่งขันที่เป็นลำดับดังกล่าวว่าผลรวมของพวกเขาจะมีค่าเท่ากับการป้อนข้อมูล จากนั้นเราจะใช้ลำดับดังกล่าว#SubsequencesCasesx_/;Tr@x==#xTr@x#Last


0

JavaScript (ES6), 72 ไบต์

n=>(g=s=>s?s>0?g(s-(u+=2)):g(s+l,l+=2):u-l?l+' '+g(s,l+=2):u)(n-1,l=u=1)

ส่งคืนสตริงที่คั่นด้วยช่องว่างของตัวเลขคี่หรือส่งออกจากอินพุตที่ไม่ถูกต้อง รุ่น 84 ไบต์ที่ส่งกลับอาร์เรย์ (ว่างเมื่อเหมาะสม):

n=>n%4-2?(g=s=>s?s>0?g(s-(u+=2)):g(s+l,l+=2):u-l?[l,...g(s,l+=2)]:[u])(n-1,l=u=1):[]

คำอธิบาย: อิงตามโซลูชัน awk ของ @ Cabbie407 อย่างไม่เจาะจงไปยังผลรวมของ Integers Integratorยกเว้นว่าฉันสามารถบันทึกไบต์จำนวนหนึ่งโดยใช้การเรียกซ้ำ


0

PHP, 78 ไบต์

for($b=-1;$s-$argn;)for($n=[$s=$x=$b+=2];$s<$argn;)$s+=$n[]=$x+=2;print_r($n);

วงไม่สิ้นสุดถ้าไม่มีวิธีแก้ปัญหา แทรก?$b>$argn+2?$n=[]:1:0หลังจาก$s-$argnพิมพ์อาเรย์ที่ว่างเปล่าแทน

ทำงานด้วย-nRหรือลองออนไลน์


0

C # (. NET Core) , 129 ไบต์

(i)=>{int s,j,b=1,e=3;for(;;){var o="";s=0;for(j=b;j<e;j+=2){s+=j;o+=j+" ";}if(s==i)return o;s=s<i?e+=2:b+=2;if(b==e)return"";}};

ส่งออกตัวเลขในสตริงคั่นด้วยช่องว่าง (อักขระอื่นใดก็แค่ต้องเปลี่ยน" ") อินพุตที่ไม่มีวิธีแก้ปัญหาส่งคืนสตริงว่าง (แม้ว่าถ้ารันตลอดไปโดยไม่มีข้อผิดพลาดเป็นวิธีที่ถูกต้องในการระบุว่าไม่มีวิธีแก้ปัญหาก็สามารถบันทึก 17 ไบต์ได้โดยการลบif(b==e)return""; )

อัลกอริทึมคือ:

  1. เริ่มด้วย [1]
  2. หากผลรวมเท่ากับเป้าหมายให้ส่งคืนรายการ
  3. หากผลรวมต่ำกว่าเป้าหมายให้เพิ่มจำนวนคี่ถัดไป
  4. หากผลรวมมากกว่าเป้าหมายให้ลบรายการแรก
  5. หากรายการว่างเปล่าส่งคืน
  6. ทำซ้ำจาก 2

คุณสามารถเขียน(i)=>เป็นi=>
aloisdg พูดว่า Reinstate Monica

0

C ++, 157 -> 147 ไบต์


-10 ไบต์ขอบคุณ DJMcMayhem

จะคืนค่า 0 หากไม่มีคำตอบมิฉะนั้นจะเป็น 1

บรรทัดสุดท้ายที่พิมพ์ออกมาคือคำตอบ

int f(int n){for(int i=1;;i+=2){int v=0;for(int k=i;;k+=2){v+=k;std::cout<<k<<" ";if(v==n)return 1;if(v>n)break;}if(i>n)return 0;std::cout<<"\n";}}

ungolfed:

int f(int n)
{
    for (int i = 1;; i += 2)
    {
        int v = 0;
        for (int k = i;; k += 2)
        {
            v += k;
            std::cout << k << " ";
            if (v == n)
                return 1;
            if (v > n)
                break;

        }
        if (i > n)
            return 0;
        std::cout << "\n";
    }
}

นี่คือรหัสกอล์ฟครั้งแรกของฉัน ^^


คุณสามารถบันทึกบางไบต์ถ้าคุณทำให้มันเป็นฟังก์ชั่น int และกลับ 0 หรือ 1 นอกจากนี้คุณสามารถทำได้int v=0;แทนint v;....v=0;และถ้าคุณทำออก Newline ของคุณคั่นด้วยคุณสามารถทำได้std::cout<<k<<"\n";และจากนั้นลบ
บรรทัดใหม่

ถ้าฉันไม่แนะนำเพลงสุดท้ายแล้วมันจะพิมพ์บรรทัดใหม่ในหมายเลขเดียวทุก แต่ฉันต้องการกลุ่มจำนวนแยก แต่ anyways ขอบคุณสำหรับ -10 ไบต์
SeeSoftware

0

Kotlin, 152 ไบต์

fun f(a:Double){var n=Math.sqrt(a).toInt()+1;var x=0;while(n-->0){if(((a/n)-n)%2==0.0){x=((a/n)-n).toInt()+1;while(n-->0){println(x.toString());x+=2}}}}

ลองออนไลน์ (รอ 4-5 วินาทีคอมไพเลอร์ช้า)

Ungolfed

fun f(a: Double){
    var n=Math.sqrt(a).toInt()+1;
    var x=0;

    while(n-->0){
        if(((a/n)-n)%2==0.0){
            x=((a/n)-n).toInt()+1;

            while(n-->0){
                println(x.toString());
                x+=2;
            }

        }
    }
}

0

Excel VBA, 139 ไบต์

Subรูทีนที่รับอินพุตnจำนวนเต็มชนิดที่คาดไว้และรายงานลำดับที่ยาวที่สุดของจำนวนคี่ที่ต่อเนื่องกันไปยังเซลล์[A1]

Sub a(n)
For i=1To n Step 2
s=0
For j=i To n Step 2
s=s+j
If s=n Then:For k=i To j-1 Step 2:r=r &k &"+":Next:[A1]=r &j:End
Next j,i
End Sub
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.