Mulai dari yang


18

Dengan bilangan bulat positif n , ikuti langkah-langkah ini:

  1. Buat array A dengan n 1 s.
  2. Jika A hanya memiliki satu elemen, akhiri. Jika tidak, mulai dari elemen pertama, ganti setiap pasangan A dengan jumlahnya, biarkan elemen terakhir seolah-olah panjang A aneh, dan ulangi langkah ini.

Output harus berisi A state 's setelah setiap langkah dalam urutan dari langkah pertama untuk yang terakhir. Penggunaan celah standar dilarang. Ini adalah tantangan , sehingga solusi dengan byte paling sedikit di setiap bahasa menang.

Uji kasus

Setiap baris dalam output dari contoh-contoh ini adalah status. Anda dapat menampilkan melalui format apa pun yang wajar.

Memasukkan: 1

[1]

Memasukkan: 4

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

Memasukkan: 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]

Memasukkan: 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]

Bisakah saya menyalin ide pertanyaan ini untuk urutan terbalik? Diberi angka n, keluaran bertahap A, dan seterusnya sampai Anda mencapai n 1s?
pixma140

9
@ pixma140 Itu pada dasarnya akan menjadi tantangan yang sama, hanya dengan output terbalik setelahnya. Modifikasi itu sepele.
Erik the Outgolfer

Jawaban:



4

MATL , 10 byte

:g`t2estnq

Cobalah online!

Bagaimana itu bekerja

:     % 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 byte

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

Cobalah online!

Python 2 , 51 byte

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

Cobalah online!

Total -6 byte berkat tsh

Fungsi rekursif. Untuk setiap langkah, itu membangun daftar kekuatan 2, sehingga jumlahnya lebih kecil dari atau sama dengan bilangan bulat yang diberikan. Kemudian menambahkan sisanya, jika lebih besar dari 0.


1
Python 3 61 byte: def f(i,j=1):l=i//j*[j]+[i%j][:i%j];print(l);i>j and f(i,j*2); Python 2 55 byte:def f(i,j=1):l=i/j*[j]+[i%j][:i%j];print l;i>j>f(i,j*2)
tsh

@tsh Tentu saja, terima kasih! i>jtidak berfungsi pada solusi saya sebelumnya dan saya lupa untuk mencobanya sesudahnya.
Jitse


3

R , 65 byte

-1 byte terima kasih kepada Giuseppe.

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

Cobalah online!

%/%%%k=2^in%/%kkn%%k2n1

Di sini saya menggunakan Talih-alih k, karena ini diinisialisasi sebagai TRUEyang dikonversi ke 1. Saya masih perlu mencetak +Tbukannya Tuntuk menghindari vektor TRUEs di output.


Kalahkan saya sekitar 5 menit dan hampir 60 byte ... Tapi Giuseppe benar, itu tidak menghasilkan langkah terakhir.
Sumner18

@ Sumner18 Harus diperbaiki sekarang.
Robin Ryder

+Tlebih pendek dariT+0
Giuseppe

@Giuseppe Terima kasih, saya tahu saya lupa sesuatu.
Robin Ryder

3

Pyth , 10 byte

.u+McN2m1

Cobalah online!

.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 byte terima kasih kepada FryAmTheEggman







2

JavaScript, 55 byte

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

Cobalah online!

Ini pada dasarnya adalah versi golf dari kode berikut:

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 byte

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

Cobalah online!

Sebagai mengerikan selama ini, saya masih merasa sedikit pintar untuk menggunakan .ẉȮ: cara yang jelas untuk mencetak sesuatu, kemudian memeriksa apakah panjangnya adalah 1 akan ẉ₂l1, ẉ₂~gatau ẉ₂≡Ȯ, di mana dalam satu terakhir ini diperlukan karena ẉ₂unifies input dan output sebelum mencetak mereka, dan Ȯpra-dibatasi untuk menjadi daftar panjang 1, sehingga penyatuan gagal jika input bukan daftar panjang 1. Pada akhir predikat, fitur ini ẉ₂dapat dielakkan, oleh menggunakan variabel output alih-alih subscript : .ẉȮpertama menyatukan inputnya dengan variabel output, kemudian mencetak variabel output, dan hanya setelah itu menyatukan variabel output dengan Ȯ.


2

Stax , 10 byte

Çë⌐ⁿ┤5π»Å╡

Jalankan dan debug itu

Prosedur:

  1. Hasilkan rentang berbasis 0.
  2. Membagi dua setiap elemen berulang kali sampai semua item nol.
  3. Hitung run-length untuk setiap array unik.

Sumber Beranotasi:

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

Arang , 19 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Menggunakan format output default Charcoal, yaitu satu angka per baris, dengan subarrays spasi ganda satu sama lain. Penjelasan:

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 byte

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

Cobalah online!

Ada beberapa jalan pintas untuk rotoring parsial yang saya tidak ingat sekarang ...

Penjelasan:

{                                    }  # 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 byte

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

Cobalah online!

Bekerja mundur dari daftar [n]hingga mencapai daftar yang adil.

Ke depan, saya bisa mendapatkan 80 byte menggunakan chunksofdari 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)

Cobalah online!



0

Gaia , 12 byte

ċ)¦⟨:q2/Σ¦⟩ª

Cobalah online!

ċ)¦		| generate array of n 1's (really, generate array of n 0's and increment each)
   ⟨      ⟩ª	| do the following until you get to a fixed point:
    :q		| dup and print with a newline
      2/	| split into groups of 2, with last group possibly being smaller
	Σ¦	| take the sum
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.