Tiến trình của cột ma trận


17

Hãy xem xét ma trận vô hạn:

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
              ...

Mỗi hàng mới của ma trận được xây dựng bằng cách bắt đầu bằng zsố không, trong đó zđộ dài của các chữ số dương chúng tôi đang sử dụng trong hàng đó. Các chữ số dương được xây dựng bằng cách bắt đầu 1và tăng dần và thêm một chữ số bổ sung mỗi khi bạn lặp lại các hàng. Mô hình đó được lặp lại vô tận ở bên phải. Vì vậy, ví dụ, hàng đầu tiên bắt đầu 0, 1, 0, 1...trong khi hàng thứ hai bắt đầu 0,0, 2,3, 0,0, 2,3.... Theo mô hình, hàng thứ ba bắt đầu 0,0,0, 4,5,6, 0,0,0, 4,5,6....

Cho hai số nguyên làm đầu vào nx, xuất các số đầu tiên (trên cùng) xcủa ncột thứ nhất của ma trận trên. (Bạn có thể chọn lập chỉ mục 0 hoặc 1 cho các cột, chỉ cần chỉ định mục nào trong bài gửi của bạn.)

Ví dụ, đối với đầu vào n = 0(được lập chỉ mục 0), cột hoàn toàn 0là s, vì vậy đầu ra sẽ chỉ là x 0s.

Đối với đầu vào n = 15x = 6, đầu ra sẽ là [1, 3, 4, 10, 11, 0].

Đối với đầu vào n = 29x = 15, đầu ra sẽ là [1, 0, 6, 8, 15, 0, 0, 34, 39, 0, 0, 0, 0, 0, 120].

Đối với đầu vào n = 99x = 25, đầu ra sẽ là [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 và Nội quy

  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp thuận tiện .
  • Đầu vào và đầu ra có thể được coi là phù hợp với loại số gốc của ngôn ngữ của bạn.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Câu trả lời:


4

JavaScript (ES6), 45 byte

Đưa đầu vào theo cú pháp currying (n)(x).

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

Hãy thử trực tuyến!

Làm sao?

Chúng tôi sử dụng một công thức trực tiếp để lấy giá trị của ô tại cột n (được lập chỉ mục 0) và hàng x (được lập chỉ mục 1):

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

3

R , 80 76 byte

Cảm ơn @JayCe đã chỉ ra một lỗi!

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

Hãy thử trực tuyến!

Sử dụng lập chỉ mục dựa trên 1 cho n. Rất có khả năng một thuật toán golfier tồn tại nhưng replà yếu tố quyết định cho giải pháp ngây thơ.


Nó lỗi n=1vì kết quả của sapply không còn là ma trận. Sửa chữa này là tốn kém Tôi tự hỏi nếu có một golfier?
JayCe

Ồ, vâng, bạn đúng. Vâng, may mắn là có một!
Giuseppe

Vòng lặp for, yeah! Và bạn đã chơi 4 byte trong quá trình này :)
JayCe

@JayCe vâng, suy nghĩ ban đầu của tôi là lập chỉ mục ngoài cùng repvới một nbên trong sapply, nó đã lưu một byte, nhưng sau đó tôi nhớ rằng forcác vòng lặp ngắn hơn sapplyvì tôi sẽ không phải xác định hàm.
Giuseppe



2

MATL , 25 18 byte

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

Hãy thử trực tuyến!

Cảm ơn Luis Mendo vì đã chơi golf 6 byte!

Đây thực chất là một cổng MATL trong câu trả lời R của tôi.

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


1

Husk , 14 byte

↑!Tzo¢+MRN0CNN

Đối số n(đầu tiên) là 1 chỉ mục, hãy thử trực tuyến!

Ngoài ra, chúng ta có thể sử dụng ↑!TṠzo¢+†K0CNNcho cùng một số byte.

Giải trình

↑!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]

1

Husk , 21 19 byte

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

Lấy các đối số là n(1-index), sau đó x.
Đã lưu 2 byte nhờ BMO, nhưng vẫn không ngắn như câu trả lời của BMO.
Nỗ lực đầu tiên của tôi khi sử dụng Husk.
Hãy thử trực tuyến!





1

Thạch , 11 byte

ṖS+R¬;$)⁹ịⱮ

Hãy thử trực tuyến!

-1 cảm ơn Jonathan Allan .

Đối số 1: x
Đối số 2: n + 1


0ṁ;Ɗ-> ¬;$lưu một byte.
Jonathan Allan

@Jonathan ALLan Và tôi nghi ngờ điều đó vẫn chưa đủ. Ít nhất là tôi đã loại bỏ sự nhục nhã ’R... (ít nhất là đối với tôi) Điều kỳ lạ là trong vài ngày qua tôi đã nghĩ đến chuỗi Thue-Morse (trong Jelly, có chứa ;¬$).
Erik the Outgolfer

1

05AB1E , 25 byte

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

Hãy thử trực tuyến!


05AB1E đi với các ma trận như kem đánh răng và nước cam, nhưng không phải là một byte tồi tệ xem xét việc thực hiện của tôi tệ như thế nào. Ngay cả mã của tôi cũng cười tôi " LO©L".


0

Than , 19 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

    ¹               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

Đoạn mã EιL⊞Oυωtạo ra các isố nguyên tiếp theo bằng cách đẩy giá trị giả vào một mảng mỗi lần đi qua vòng lặp và lấy độ dài của mảng kết quả.



0

Haskell, 67 byte

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

Hãy thử trực tuyến!

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.