Perkembangan kolom matriks

17

Pertimbangkan matriks tak terbatas:

0  1  0  1  0  1  0  1  0  1  0  1  0  1  0  1
0  0  2  3  0  0  2  3  0  0  2  3  0  0  2  3
0  0  0  4  5  6  0  0  0  4  5  6  0  0  0  4 ...
0  0  0  0  7  8  9 10  0  0  0  0  7  8  9 10
0  0  0  0  0 11 12 13 14 15  0  0  0  0  0 11
              ...

Setiap baris baru dari matriks dibangun dengan memulai dengan znol, di mana zpanjang digit positif yang kami gunakan di baris itu. Digit positif dikonstruksi dengan memulai dengan 1dan menambah dan menambahkan digit tambahan setiap kali Anda mengulangi baris. Pola itu diulang tanpa batas ke kanan. Jadi, misalnya, baris pertama dimulai 0, 1, 0, 1...saat baris kedua dimulai 0,0, 2,3, 0,0, 2,3.... Mengikuti polanya, baris ketiga dimulai 0,0,0, 4,5,6, 0,0,0, 4,5,6....

Diberi dua bilangan bulat sebagai input, ndan x, menghasilkan angka pertama (paling atas) xdari nkolom ke - th dari matriks di atas. (Anda dapat memilih pengindeksan 0 atau 1 untuk kolom, cukup tentukan yang mana dalam kiriman Anda.)

Misalnya, untuk input n = 0(0-diindeks), kolom seluruhnya 0s, jadi outputnya hanya x 0s.

Untuk input n = 15dan x = 6, hasilnya adalah [1, 3, 4, 10, 11, 0].

Untuk input n = 29dan x = 15, hasilnya adalah [1, 0, 6, 8, 15, 0, 0, 34, 39, 0, 0, 0, 0, 0, 120].

Untuk input n = 99dan x = 25, hasilnya adalah [1, 3, 4, 0, 15, 0, 0, 0, 37, 55, 56, 0, 87, 93, 0, 0, 151, 163, 176, 0, 0, 0, 0, 0, 325].

I / O dan Aturan

  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Input dan output dapat dianggap sesuai dengan jenis nomor asli bahasa Anda.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber

Jawaban:

4

JavaScript (ES6), 45 byte

Mengambil input dalam sintaks currying (n)(x).

n=>g=x=>x?[...g(x-1),n/x&1&&n%x+x*~-x/2+1]:[]

Cobalah online!

Bagaimana?

Kami menggunakan rumus langsung untuk mendapatkan nilai sel pada kolom n (0-diindeks) dan baris x (1-diindeks):

n / x & 1 &&     // is this cell zero or non-zero?
n % x +          // column modulo row --> increment for a non-zero value at this position
x * ~-x / 2 + 1  // minimum value of non-zero values for this row:
                 // ∑(i=1...x-1)(i) + 1 = x(x - 1) / 2 + 1
Arnauld
sumber
3

R , 80 76 byte

Terima kasih kepada @JayCe karena telah menunjukkan bug!

function(n,x)for(a in 1:x)print(rep(c(rep(0,a),((y=sum(1:a))-a+1):y),,n)[n])

Cobalah online!

Menggunakan pengindeksan berbasis 1 untuk n. Sangat mungkin ada algoritma golfier tetapi repmerupakan enabler untuk solusi naif.

Giuseppe
sumber
Kesalahan untuk n=1karena hasil dari sapply tidak lagi menjadi matriks. perbaikan ini mahal saya bertanya-tanya apakah ada yang golf?
JayCe
Oh, ya, kamu benar. Yah, untungnya ada satu!
Giuseppe
Untuk loop, yeah! Dan Anda
bermain golf
@JayCe ya pemikiran asli saya adalah untuk mengindeks bagian terluar repdengan ndi dalam sapply, yang menyimpan byte, tapi kemudian saya ingat bahwa forloop lebih pendek daripada sapplykarena saya tidak perlu mendefinisikan fungsi.
Giuseppe
2

APL (Dyalog Classic) , 27 24 23 byte

-1 terima kasih kepada @FrownyFrog

⊢∘⍳(<×(+\⊣)--){+\⍵/2}|⊣

Cobalah online!

ngn
sumber
1 lebih pendek {+ \ ⍵ / 2} | ⊣
FrownyFrog
2

MATL , 25 18 byte

x:"@:t~ys:b@-)h1G)

Cobalah online!

Terima kasih kepada Luis Mendo karena bermain golf 6 byte!

Ini pada dasarnya adalah port MATL jawaban R saya.

x		 % implicit input, read n and delete
:		 % implicit input, read x and push [1..x]
"		 % for loop with i = 1..x
 @:		 % push [1..i]
   t		 % duplicate
    ~		 % logical negate, turn to array of zeros
		 % stack: [[1..i], [0 .. (i times)]]
     y		 % duplicate from below
		 % stack: [[1..i], [0 .. (i times)], [1..i]]
      s:	 % sum and range
		 % stack: [[1..i], [0 .. (i times)], [1..(i * (i + 1)/2)]]
	b	 % bubble up
		 % stack: [[0 .. (i times)], [1..(i * (i + 1)/2)], [1..i]]
	 @-	 % push i and subtract. This will be used as a modular index to get the last i elements
		 % stack: [[0 .. (i times)], [1..(i * (i + 1)/2)], [1-i..0]]
	   )	 % index into array modularly to get the last i elements
		 % stack: [[0 .. (i times)], [(i-1)*i/2 + 1, .. (i * (i + 1)/2)]]
	    h	 % horizontally concatenate the array
	     1G) % push n and index modularly, leaving the result on the stack
		 % implicit end of for loop. The stack now contains the appropriate elements in order
		 % implicit end. Print stack contents
Giuseppe
sumber
1

Sekam , 14 byte

↑!Tzo¢+MRN0CNN

Argumen n(pertama) diindeks 1, coba online!

Atau kita bisa menggunakan ↑!TṠzo¢+†K0CNNjumlah byte yang sama.

Penjelasan

↑!Tz(¢+)MRN0CNN -- example inputs n=4, x=3
            C N -- cut the natural numbers: [1,2,3,4,…]
             N  -- | using the natural numbers
                -- : [[1],[2,3],[4,5,6],[7,8,9,10],…]
        M N     -- map over the naturals
         R 0    -- | replicate 0 that many times
                -- : [[0],[0,0],[0,0,0],[0,0,0,0],…]
   z(  )        -- zip these two lists
      +         -- | concatenate
     ¢          -- | cycle
                -- : [[0,1,0,1,…],[0,0,2,3,0,0,2,3,…],…]
  T             -- transpose: [[0,0,0,0,…],[1,0,0,0,…],[0,1,0,0,…],[1,3,4,0,…],…]
 !              -- index into that list using n: [1,3,4,0,…]
↑               -- take x: [1,3,4]
ბიმო
sumber
1

Sekam , 21 19 byte

↑mȯ!⁰¢§+`R0§…ȯ→Σ←ΣN

Membawa argumen sebagai n(1-diindeks), kemudian x.
Disimpan 2 byte berkat BMO, tetapi masih tidak sesingkat jawaban BMO.
Upaya pertama saya menggunakan Sekam.
Cobalah online!


sumber
1

Python 2 , 55 byte

lambda n,x:[n/y%2*(n%y+y*~-y/2+1)for y in range(1,x+1)]

Cobalah online!

Dikembangkan secara mandiri; tapi saya perhatikan bahwa ini akhirnya menjadi port dari jawaban Javascript Arnauld .

Chas Brown
sumber
1

Jelly , 11 byte

ṖS+R¬;$)⁹ịⱮ

Cobalah online!

-1 terima kasih kepada Jonathan Allan .

Argumen 1: x
Argumen 2: n +1

Erik the Outgolfer
sumber
0ṁ;Ɗ-> ¬;$menyimpan satu byte.
Jonathan Allan
@ Jonathan Allan Dan saya curiga itu belum cukup. Setidaknya aku menghapus penghinaan ’R... (yaitu, setidaknya untukku). Yang aneh adalah bahwa selama beberapa hari terakhir aku memikirkan urutan Thue-Morse (yang, dalam Jelly, berisi ;¬$).
Erik the Outgolfer
1

05AB1E , 25 byte

LO©LsL£¹£¹LÅ0s)øε˜®Ì∍}ø¹è

Cobalah online!


05AB1E berjalan dengan matriks seperti pasta gigi dan jus jeruk, tetapi bukan byte-count yang buruk dianggap seberapa buruk implementasi saya. Bahkan kode saya menertawakan saya " LO©L".

Guci Gurita Ajaib
sumber
0

Arang , 19 byte

IE…·¹N§⁺Eι⁰EιL⊞Oυωη

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

    ¹               Literal 1
     N              First input (`x`) as a number
  …·                Inclusive range
 E                  Map (value `i`, 0-indexed counter `k`)
         ι          Current value
        E           Map over implicit range
          ⁰         Literal 0 (i.e. create array of `i` zeros)
            ι       Current value
           E        Map over implicit range
                 ω  Arbitrary variable
                υ   Predefined array
              ⊞O    Push
             L      Length
       ⁺            Concatenate arrays
      §           η Index by second input (`n`)
I                   Cast to string and implicitly print on separate lines

Cuplikan EιL⊞Oυωmenghasilkan ibilangan bulat berikutnya dengan cara mendorong nilai dummy ke array yang masing-masing melewati loop dan mengambil panjang array yang dihasilkan.

Neil
sumber
0

Haskell, 67 byte

i#l=cycle((++)=<<(0<$)$[i..l-1]):l#(l+l-i+1)
n!x=take x$(!!n)<$>1#2

Cobalah online!

i#l                  -- function # builds the infinite matrix
                     -- input: i and l are lowest and highest+1 non-zero number of
                     -- the current line
   = cycle           -- for the current line, repeat infinitely
           [i..l-1]  --   the non-zero numbers of the line appended 
     (++)=<<(0<$)    --   to a list of 0s with the same length
   :                 -- append next row of the matrix
     l#(l+l-i+1)     --   which is a recursive call with i and l adjusted

n!x =                -- main function
              1#2    -- create matrix
      (!!n)<$>       -- pick nth element of each row
  take x             -- take the first x numbers thereof
nimi
sumber