เริ่มจากสิ่งที่


18

รับจำนวนเต็มบวกอย่างเคร่งครัดnทำตามขั้นตอนเหล่านี้:

  1. สร้างอาร์เรย์Aด้วยn 1 s
  2. ถ้าA มีเพียงองค์ประกอบเดียวให้ยุติ มิฉะนั้นเริ่มต้นจากองค์ประกอบแรกแทนที่แต่ละคู่ของAด้วยผลรวมของมันออกจากองค์ประกอบสุดท้ายเช่นถ้าความยาวของAเป็นคี่และทำซ้ำขั้นตอนนี้

ผลลัพธ์ควรประกอบด้วยสถานะของAหลังจากแต่ละขั้นตอนตามลำดับจากขั้นตอนแรกจนถึงสุดท้าย ห้ามมิให้มีการใช้ช่องโหว่มาตรฐาน นี่เป็นความท้าทายของการดังนั้นการแก้ปัญหาด้วยจำนวนไบต์ที่น้อยที่สุดในแต่ละภาษาจะเป็นผู้ชนะ

กรณีทดสอบ

แต่ละบรรทัดในผลลัพธ์ของตัวอย่างเหล่านี้คือสถานะ คุณสามารถส่งออกในรูปแบบที่เหมาะสม

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

[1]

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

[1, 1, 1, 1]
[2, 2]
[4]

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

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 2, 2, 2, 2, 2, 1]
[4, 4, 4, 1]
[8, 5]
[13]

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

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 2, 2, 2, 2, 2, 2, 1]
[4, 4, 4, 3]
[8, 7]
[15]

ฉันสามารถคัดลอกความคิดคำถามนี้สำหรับลำดับย้อนกลับได้หรือไม่ ได้รับหมายเลข n, เอาท์พุทแบบขั้นตอน A, และอื่น ๆ จนกว่าจะถึง n 1s?
pixma140

9
@ pixma140 นั่นจะเป็นความท้าทายที่เหมือนกันโดยมีเพียงผลลัพธ์ที่กลับด้านหลังจากนั้น การปรับเปลี่ยนเล็กน้อย
Erik the Outgolfer

คำตอบ:



4

MATL 10 ไบต์

:g`t2estnq

ลองออนไลน์!

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

:     % Input n (implicit). Range [1 2 ... n]
g     % Convert to logical. Gives [1 1 ... 1]
`     % Do...while
  t   %   Duplicate
  2   %   Push 2
  e   %   Reshape as 2-column matrix, in column-major order, padding with 0 if needed
  s   %   Sum of each column
  t   %   Duplicate
  n   %   Number of elements
  q   %   Subtract 1. This will be used as loop condition
      % End (implicit). If top of the stack is not zero run new iteration
      % Display stack, bottom to top (implicit)

4

Python 3 , 57 ไบต์

def f(i,j=1):print(i//j*[j]+[i%j][:i%j]);i>j and f(i,j*2)

ลองออนไลน์!

Python 2 , 51 ไบต์

def f(i,j=1):print i/j*[j]+[i%j][:i%j];i>j>f(i,j*2)

ลองออนไลน์!

รวม -6 ไบต์ขอบคุณด้วย tsh

ฟังก์ชั่นวนซ้ำ สำหรับแต่ละขั้นตอนมันสร้างรายการของพลังของ2เช่นว่าผลรวมมีขนาดเล็กกว่าหรือเท่ากับจำนวนเต็มที่กำหนด 0จากนั้นก็ผนวกที่เหลือถ้ามันมีขนาดใหญ่กว่า


1
Python 3 61 ไบต์: def f(i,j=1):l=i//j*[j]+[i%j][:i%j];print(l);i>j and f(i,j*2); งูหลาม 2 55 ไบต์:def f(i,j=1):l=i/j*[j]+[i%j][:i%j];print l;i>j>f(i,j*2)
TSH

@tsh แน่นอนขอบคุณ! i>jไม่ทำงานในโซลูชันก่อนหน้าของฉันและฉันลืมลองอีกครั้ง
Jitse


3

R , 65 ไบต์

-1 ไบต์ขอบคุณ Giuseppe

n=scan();while(T<2*n){cat(rep(+T,n%/%T),if(n%%T)n%%T,"\n");T=2*T}

ลองออนไลน์!

%/%%%k=2^in%/%kkn%%k2n-1

ที่นี่ฉันใช้Tแทนkเนื่องจากเริ่มต้นได้TRUEซึ่งถูกแปลงเป็น 1 ฉันยังคงต้องพิมพ์+TแทนTเพื่อหลีกเลี่ยงเวกเตอร์ของTRUEs ในผลลัพธ์


เอาชนะฉันประมาณ 5 นาทีและเกือบ 60 ไบต์ ... แต่จูเซปเป้นั้นถูกต้องมันจะไม่ส่งออกขั้นตอนสุดท้าย
Sumner18

@ Sumner18 ควรได้รับการแก้ไขแล้ว
Robin Ryder

+Tสั้นกว่าT+0
จูเซปเป้

@iuseppe ขอบคุณฉันรู้ว่าฉันลืมบางสิ่งบางอย่าง
Robin Ryder

3

Pyth , 10 ไบต์

.u+McN2m1

ลองออนไลน์!

.u          # Apply until a result is repeated, return all intermediate steps: lambda N,Y:
  +M        # map by + (reduce list on +):
    cN2     # chop N (current value) into chunks of 2, last one is shorter if needed
       m1Q  # map(1, range(Q)) (implicit Q = input)

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







2

JavaScript ขนาด 55 ไบต์

f=(n,t=1,r=n)=>r>t?t+[,f(n,t,r-t)]:n>t?r+`
`+f(n,t+t):r

ลองออนไลน์!

นี่คือรหัสต่อไปนี้ของ golfed:

function f(n) {
  var output = '';
  t = 1;
  for (t = 1; ; t *= 2) {
    for (r = n; r > t; r -= t) {
      output += t + ',';
    }
    output += r;
    if (n <= t) break;
    output += '\n';
  }
  return output;
}


2

Brachylogขนาด 17 ไบต์

;1j₍ẹẉ₂{ġ₂+ᵐ}ⁱ.ẉȮ

ลองออนไลน์!

ในฐานะที่เป็นน่ากลัวยาวเช่นนี้เป็นผมยังคงรู้สึกบิตฉลาดสำหรับการใช้.ẉȮ: วิธีที่ชัดเจนที่จะพิมพ์อะไรบางอย่างแล้วตรวจสอบว่าความยาวของมันคือ 1 จะเป็นẉ₂l1, ẉ₂~gหรือẉ₂≡Ȯที่ในคนสุดท้ายเป็นสิ่งจำเป็นเพราะẉ₂เอกภาพอินพุทและเอาท์พุทก่อนที่จะพิมพ์พวกเขาและȮถูก จำกัด ไว้ล่วงหน้าให้เป็นรายการความยาว 1 ดังนั้นการรวมจะล้มเหลวหากอินพุตไม่ใช่รายการความยาว 1 ในตอนท้ายของเพรดิเคตคุณลักษณะนี้ẉ₂สามารถถูกหลีกเลี่ยงได้อย่างไรก็ตามโดย ใช้ตัวแปรที่ส่งออกแทน subscripting : เอกภาพแรกการป้อนข้อมูลที่มีตัวแปรที่ส่งออกแล้วพิมพ์ตัวแปรที่ส่งออกและมีเพียงหนึ่งเดียวหลังจากนั้นตัวแปรที่ส่งออกด้วย.ẉȮȮ


2

Stax , 10 ไบต์

Çë⌐ⁿ┤5π»Å╡

เรียกใช้และแก้ไขข้อบกพร่อง

ขั้นตอน:

  1. สร้างช่วงตาม 0
  2. แบ่งครึ่งแต่ละส่วนซ้ำ ๆ กันจนกว่ารายการทั้งหมดจะเป็นศูนย์
  3. คำนวณ run-lengths สำหรับแต่ละอาร์เรย์ที่ไม่ซ้ำกัน

คำอธิบายประกอบที่มา:

r       main:[0 .. 5] 
{{hmgu  main:[[0 .. 5], [0, 0, 1, 1, 2, 2], [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0]] 
m:GJ    main:"1 1 1 1 1 1" 

1

ถ่าน 19 ไบต์

NθIE↨⊖⊗θ²E⪪Eθ¹X²κLλ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้รูปแบบเอาต์พุตเริ่มต้นของ Charcoal ซึ่งเป็นหนึ่งหมายเลขต่อบรรทัดโดยมี subarrays เว้นระยะห่างสองเท่าจากกัน คำอธิบาย:

Nθ                  Input `n` into a variable
       θ            `n`
      ⊗             Doubled
     ⊖              Decremented
    ↨   ²           Converted to base 2 (i.e. ceil(log2(input)))
   E                Map
           Eθ¹      List of `1`s of length `n`
          ⪪         Split into sublists of length
               ²    Literal `2`
              X     To power
                κ   Loop index
         E          Map over each sublist
                 Lλ Take the length
  I                 Cast to string for implicit print


1

Perl 6 , 38 ไบต์

{1 xx$_,*.rotor(2,:partial)>>.sum...1}

ลองออนไลน์!

มีทางลัดไปยังบางส่วนของการท่องที่ฉันจำไม่ได้ในตอนนี้ ...

คำอธิบาย:

{                                    }  # Anonymous code block
                                 ...    # Return a sequence
 1 xx$_,            # Starting with a list of 1s with input length
        *           # Where each element is
         .rotor(2,:partial)        # The previous list split into chunks of 2 or less
                           >>.sum  # And each chunk summed
                                    1  # Until the list is length 1

1

Haskell , 75 ไบต์

g.pure
g x|x!!0<2=[x]|1>0=(g$(\z->filter(0/=)[-div(-z)2,div z 2])=<<x)++[x]

ลองออนไลน์!

ทำงานย้อนกลับจากรายการ [n]จนกว่าจะถึงรายการของเพียงแค่

ไปข้างหน้าฉันจะได้รับ 80 ไบต์ใช้chunksofจากData.List.Split:

import Data.List.Split
f x=g$1<$[1..x]
g[n]=[[n]]
g x=x:(g$map sum$chunksOf 2 x)

ลองออนไลน์!


0

โอห์ม v2 , 8 ไบต์

@Dv·Ω2σΣ

ลองออนไลน์!

หากได้รับอนุญาตในสัญลักษณ์ทางวิทยาศาสตร์มิฉะนั้น:

โอห์ม v2 , 9 ไบต์

@Dv·Ω2σΣì

ลองออนไลน์!


หากหมายเลขสัญกรณ์ทางวิทยาศาสตร์เป็นประเภทตัวเลขธรรมชาติ (เช่นลอย) ในโอห์มแน่นอนว่าเป็นไปได้
Erik the Outgolfer

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