Progression des colonnes matricielles

17

Considérez la matrice infinie:

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

Chaque nouvelle ligne de la matrice est construite en commençant par des zzéros, où zest la longueur des chiffres positifs que nous utilisons dans cette ligne. Les chiffres positifs sont construits en commençant par 1et en incrémentant et en ajoutant un chiffre supplémentaire chaque fois que vous itérez des lignes. Ce motif se répète infiniment vers la droite. Ainsi, par exemple, la première ligne démarre 0, 1, 0, 1...tandis que la deuxième ligne démarre 0,0, 2,3, 0,0, 2,3.... En suivant le modèle, la troisième ligne commence 0,0,0, 4,5,6, 0,0,0, 4,5,6....

Étant donné deux entiers en entrée net xen sortie, les premiers xnombres (les plus élevés ) de la ne colonne de la matrice ci-dessus. (Vous pouvez choisir l'indexation 0 ou 1 pour les colonnes, il suffit de spécifier laquelle dans votre soumission.)

Par exemple, pour l'entrée n = 0(indexée sur 0), la colonne est entièrement 0s, donc la sortie serait juste x 0s.

Pour l'entrée n = 15et x = 6, la sortie serait [1, 3, 4, 10, 11, 0].

Pour l'entrée n = 29et x = 15, la sortie serait [1, 0, 6, 8, 15, 0, 0, 34, 39, 0, 0, 0, 0, 0, 120].

Pour l'entrée n = 99et x = 25, la sortie serait [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].

E / S et règles

  • L'entrée et la sortie peuvent être fournies par n'importe quelle méthode pratique .
  • L'entrée et la sortie peuvent être supposées correspondre au type de numéro natif de votre langue.
  • Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
  • Les failles standard sont interdites.
  • Il s'agit de donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
AdmBorkBork
la source

Réponses:

4

JavaScript (ES6), 45 octets

Prend une entrée dans la syntaxe de curry (n)(x).

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

Essayez-le en ligne!

Comment?

Nous utilisons une formule directe pour obtenir la valeur de la cellule à la colonne n (indexée 0) et à la ligne x (indexée 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
Arnauld
la source
3

R , 80 76 octets

Merci à @JayCe d'avoir signalé un bug!

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

Essayez-le en ligne!

Utilise l'indexation basée sur 1 pour n. Il existe très probablement un algorithme de golfeur, mais il repest le catalyseur de la solution naïve.

Giuseppe
la source
C'est une erreur n=1car le résultat de sapply n'est plus une matrice. cette solution est coûteuse je me demande s'il y en a une de golfeur?
JayCe
Oh, ouais, tu as raison. Eh bien, heureusement, il y en a un!
Giuseppe
La boucle for, ouais! Et vous avez
joué
@JayCe ouais ma pensée originale était d'indexer le plus extérieur repavec un nintérieur le sapply, ce qui a sauvé un octet, mais je me suis souvenu que les forboucles sont plus courtes que sapplyparce que je n'aurais pas à définir de fonction.
Giuseppe
2

MATL , 25 18 octets

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

Essayez-le en ligne!

Merci à Luis Mendo d'avoir joué au golf 6 octets!

Il s'agit essentiellement d'un port MATL de ma réponse R.

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
la source
1

Husk , 14 octets

↑!Tzo¢+MRN0CNN

L'argument n(premier) est indexé 1, essayez-le en ligne!

Alternativement, nous pourrions utiliser ↑!TṠzo¢+†K0CNNpour le même nombre d'octets.

Explication

↑!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]
ბიმო
la source
1

Husk , 21 19 octets

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

Prend alors les arguments comme n(1-indexé) x.
Enregistrement de 2 octets grâce à BMO, mais toujours pas aussi court que la réponse de BMO.
Ma première tentative d'utilisation de Husk.
Essayez-le en ligne!


la source
1

Python 2 , 55 octets

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

Essayez-le en ligne!

Développé indépendamment; mais je note que cela finit par être un portage de la réponse Javascript d' Arnauld .

Chas Brown
la source
1

Gelée , 11 octets

ṖS+R¬;$)⁹ịⱮ

Essayez-le en ligne!

-1 merci à Jonathan Allan .

Argument 1: x
Argument 2: n + 1

Erik le Outgolfer
la source
0ṁ;Ɗ-> ¬;$enregistre un octet.
Jonathan Allan
@JonathanAllan Et je soupçonne que ce n'est pas encore suffisant. Au moins, j'ai enlevé l'humiliante ’R... (c'est-à-dire, au moins pour moi) Ce qui est bizarre, c'est qu'au cours des derniers jours, j'ai pensé à la séquence Thue-Morse (qui, dans Jelly, contient ;¬$).
Erik the Outgolfer
1

05AB1E , 25 octets

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

Essayez-le en ligne!


05AB1E va avec des matrices comme le dentifrice et le jus d'orange, mais pas un mauvais nombre d'octets compte tenu de la gravité de ma mise en œuvre. Même mon code se moque de moi " LO©L".

Urne de poulpe magique
la source
0

Fusain , 19 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

    ¹               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

L'extrait de code EιL⊞Oυωgénère les ientiers suivants en expédiant une valeur fictive à un tableau à chaque passage dans la boucle et en prenant la longueur du tableau résultant.

Neil
la source
0

Haskell, 67 octets

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

Essayez-le en ligne!

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
la source