矩阵列的进展


17

考虑无限矩阵:

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

矩阵的每个新行都是z从零开始的,这里z是我们在该行中使用的正数的长度。1每次迭代行时,通过以递增,递增和增加的方式构造正数。该模式在右侧无限重复。因此,例如,第一行开始,0, 1, 0, 1...而第二行开始0,0, 2,3, 0,0, 2,3...。按照该模式,第三行开始0,0,0, 4,5,6, 0,0,0, 4,5,6...

给定两个整数作为输入,nx,输出上述矩阵xn第t列的第一个(最上面的)数字。(您可以为列选择0或1索引,只需在提交中指定哪个索引即可。)

例如,对于输入n = 0(0索引),该列完全是0s,因此输出将只是x 0s。

对于输入n = 15x = 6,输出将为[1, 3, 4, 10, 11, 0]

对于输入n = 29x = 15,输出将为[1, 0, 6, 8, 15, 0, 0, 34, 39, 0, 0, 0, 0, 0, 120]

对于输入n = 99x = 25,输出将为[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和规则

  • 输入和输出可以通过任何方便的方法给出。
  • 可以假定输入和输出适合您语言的本机数字类型。
  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 禁止出现标准漏洞
  • 这是因此所有常见的高​​尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

Answers:


4

JavaScript(ES6),45个字节

以currying语法接受输入(n)(x)

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

在线尝试!

怎么样?

我们使用一个直接公式来获取第n列(索引为0)和第x行(索引为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

R80 76字节

感谢@JayCe指出错误!

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

在线尝试!

使用基于1的索引n。高尔夫球手算法很可能存在,但却rep是幼稚解决方案的推动力。


它的误差为n=1自sapply中不再是一个矩阵的结果。这个修理费用很高,我想知道是否有高尔夫球手?
JayCe

哦,是的,你是对的。好吧,幸运的是有一个!
朱塞佩

for循环,是的!您在此过程中打了4个字节:)
JayCe

@JayCe是的,我最初的想法是rep使用的n内部索引最外面的索引,该索引sapply节省了一个字节,但是后来我想起,for循环要比sapply不需要定义函数的循环短。
朱塞佩



2

MATL25 18字节

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

在线尝试!

感谢Luis Mendo打出6个字节!

这实际上是我的R答案的MATL端口。

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

外壳,14个字节

↑!Tzo¢+MRN0CNN

参数n(第一个)是1索引的,在线尝试!

或者我们可以使用 ↑!TṠzo¢+†K0CNN相同数量的字节。

说明

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

外壳21 19字节

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

将参数设为n(1索引),然后设为x
多亏了BMO,节省了2个字节,但仍不及BMO的答案那么短。
我第一次尝试使用Husk。
在线尝试!






1

05AB1E,25个字节

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

在线尝试!


05AB1E可以与牙膏和橙汁之类的矩阵配合使用,但考虑到我的实现有多糟糕,字节数也不错。甚至我的代码都在嘲笑我“ LO©L”。


0

木炭,19字节

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

在线尝试!链接是详细版本的代码。说明:

    ¹               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

该代码段通过将伪值推入数组(每次通过循环并取所得数组的长度)的权宜之计,EιL⊞Oυω生成了下一个i整数。



0

Haskell,67个字节

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

在线尝试!

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.