ตัวเลขแบ่งกลุ่ม


15

ลำดับของตัวเลขที่แบ่งกลุ่มหรือตัวเลขที่สำคัญของการวัด ( OEIS A002048 ) เป็นลำดับของตัวเลขดังกล่าวว่าสมาชิกแต่ละคนเป็นที่เล็กที่สุดในเชิงบวก (มากกว่าศูนย์) a(0) = 1จำนวนที่ไม่สามารถทำจากผลรวมของตัวเลขติดต่อกันก่อนหน้านี้ด้วย

ตัวอย่าง

ในการคำนวณเราคำนวณครั้งแรกa(7) a(0->6) = [1, 2, 4, 5, 8, 10, 14]จากนั้นเราจะเริ่มจากศูนย์และผ่านตัวเลขจนกว่าเราจะพบหมายเลขที่ไม่ใช่ผลรวมของหนึ่งหมายเลขหรือมากกว่านั้นตามลำดับ

1  = 1
2  = 2
3  = 1 + 2
4  = 4
5  = 5
6  = 2 + 4
7  = 1 + 2 + 4
8  = 8
9  = 4 + 5
10 = 10
11 = 2 + 4 + 5
12 = 1 + 2 + 4 + 5
13 = 5 + 8
14 = 14
15 = ????

เนื่องจากสิบห้าไม่สามารถทำได้โดยการสรุปการเรียงลำดับใด ๆ ที่ต่อเนื่องกันและทุก ๆ จำนวนที่น้อยกว่าสามารถมีสิบห้าคือหมายเลขถัดไปในลำดับ a(7) = 15

งาน

งานของคุณคือการใช้ตัวเลข (ผ่านวิธีการมาตรฐาน) และส่งออกคำที่ n ในลำดับนี้ (ผ่านวิธีการส่งออกมาตรฐาน) นี่คือโค้ดกอล์ฟและคุณจะได้รับคะแนนเช่นนี้

กรณีทดสอบ

0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21

คำตอบ:


12

Haskell, 62 58 ไบต์

-4 ไบต์ต้องขอบคุณ @xnor!

(x:y)#z=x:filter(`notElem`scanl(+)x z)y#(x:z)
([1..]#[]!!)

ลำดับคือ 0 ดัชนี


1
ฉันคิดว่าคุณต้องการอีกสองไบต์และล้อมรอบบรรทัดสุดท้ายด้วย()เพื่อให้เป็นฟังก์ชันที่เหมาะสม การนำไปใช้บางส่วน!!นั้นเป็นส่วนของโอเปอเรเตอร์และจะต้องใส่ไว้ใน()เพื่อให้เป็นฟังก์ชัน หากไม่มีมันเป็นเพียงตัวอย่างข้อมูลเท่านั้นที่จะกลายเป็นฟังก์ชัน (หรือ "ค่า" เพื่อใช้คำศัพท์ Haskell ที่เข้มงวด) กับอาร์กิวเมนต์ที่ขาดหายไป
nimi

1
วิธีการที่สวยงาม! ดูเหมือนว่าการนำเข้ามากเกินไป filter(`notElem`scanl(+)x z)yควรทำ.
xnor

7

Perl, 50 49 ไบต์

รวม +1 สำหรับ -p

รันด้วยอินพุตบน STDIN:

segmented.pl <<< 7

segmented.pl:

#!/usr/bin/perl -p
${$_-=$\}++for@F;1while${-++$\};++$#F<$_&&redo}{

คำอธิบาย

@Fมีรายการของ (จำนวนลบ) ของผลรวมของตัวเลขที่ต่อเนื่องกันซึ่งลงท้ายด้วยหมายเลขสุดท้ายปัจจุบัน เมื่อค้นพบหมายเลขใหม่รายการจะถูกขยายด้วย 0 จากนั้นค่าทั้งหมดจะลดลงตามหมายเลขใหม่ที่รักษาค่าคงที่ไว้

ทั่วโลก%::ใช้เป็นแฮชจับคู่หมายเลข (เชิงลบ) ทั้งหมดที่ได้รับการเห็น (ผ่าน@F) ไปยังค่าที่ไม่เป็นศูนย์

$\%::เป็นจำนวนในปัจจุบันและได้รับเพิ่มขึ้นจนกว่าจะถึงมูลค่าที่ยังไม่อยู่ใน

โดยระมัดระวังเกี่ยวกับลำดับที่ทุกอย่างเกิดขึ้นไม่จำเป็นต้องเริ่มต้น1จะกลายเป็นหมายเลขแรกโดยอัตโนมัติ

เนื่องจากขนาด@Fคือจำนวนที่สร้างขึ้นจึงสามารถใช้เป็นเงื่อนไขการหยุดทำงานได้


4

05AB1E , 17 16 ไบต์

Xˆ$µ>D¯ŒOså_i¼Dˆ

คำอธิบาย

Xˆ                # initialize global array to [1]
  $               # push 1 and input to stack
   µ              # while counter != input
    >             # increase variable on stack
      ¯ŒO         # list of all sums of consecutive number in global array
     D   så_i     # if current stack value is not in the list
             ¼    # increase counter
              Dˆ  # add current stack value to global array

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณAdnan


ทำงาน$แทนXsไหม
Adnan

@Adnan: ใช่แน่นอน โง่ของฉัน ขอบคุณ!
Emigna

4

เจลลี่ , 14 13 11 ไบต์

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

ลองออนไลน์!

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

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n - 1].
 ߀          Recursively map the main link over the range.
   Ẇ         Window; yield all subarrays of consecutive elements of the result.
    ;        Append n to the array of subarrays.
     ḅ1      Convert all subarrays from base 1 to integer.
             This is equivalent to S€ (sum each), but it allows ; to hook.
         $   Combine the previous two links into a monadic chain.
       ‘       Increment all sums.
        ḟ      Filter; remove the original sums from the incremented ones.
          Ṃ  Compute the minimum.

2

Pyth - 19 17 ไบต์

ประณามหนึ่งโดยทำลายสิ่งที่ฉันทำ (ไบต์เดียวกันนับ literaly incrementing Q: =hQesmaYf!}TsM.:Y)

esmaYf!}TsM.:Y)1h

Test Suite


การใช้ลดการบันทึก (เฉพาะ) หนึ่งไบต์ คาดว่าจะมีมากขึ้น ...eu+Gf!}TsM.:G))hQY
Jakube

1
แผนที่ @Jakube มักจะสั้นกว่าสำหรับลำดับการอ้างอิงตัวเองเช่นนี้
Maltysen

2

javascript, 125 112 110 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Neil

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)a.some(b=>b.includes(i))||(a[z+1]=[0,...a[z++]||[]].map(v=>i+v));alert(i-1)}

คำตอบก่อนหน้า

112 ไบต์ขอบคุณ @Neil:

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)if(!a.some(b=>b.includes(i))){a[z+1]=[0,...a[z++]||[]].map(v=>i+v)}alert(i-1)}

125 ไบต์:

f=n=>{a=[[]];for(i=1,k=z=0;z<=n;i++)if(a.every(b=>b.every(c=>c-i))){a[i]=[i].concat((a[k]||[]).map(v=>i+v));k=i,z++}alert(k)}

1
สำหรับb.every(c=>c-i)ผมลอง!b.includes(i)หรืออาจจะ!a.some(b=>b.includes(i))ทำงานในขณะที่อาจจะเข้ามาแทนที่[0,...a[k]||[]].map(v=>i+v) [i].concat((a[k]||[]).map(v=>i+v))คุณต้องการจริงๆkหรือ
Neil

1
ตอนนี้คุณif(!...){...}เป็นเพียงคำสั่งอย่างใดอย่างหนึ่งคุณอาจจะแทนที่ด้วยหรือ...||(...) ...?0:...
Neil

1

Python, 113 105 92 80 ไบต์

s=F={1}
x=1
exec"while{x}<=s:x+=1\nF={x+j for j in{0}|F};s|=F\n"*input()
print x

ไบต์สุดท้ายที่ฉันบันทึกไว้ได้แรงบันดาลใจจากคำตอบ Perl ของ Ton: ฉันFทำสิ่งเดียวกันกับเขา@F; ฉันไม่เป็นหลักเป็นสิ่งเดียวกับเขาs%::


1

JavaScript (ES6), 77 ไบต์

(n,a=[],s=a,i=1)=>s[i]?f(n,a,s,i+1):--n?f(n,[0,...a].map(j=>s[j+=i]=j),s,i):i

โดยทั่วไปจะเป็นพอร์ตแบบเรียกซ้ำของคำตอบ Perl ของ @ TonHospel

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