Fortschreiten der Matrixsäulen

17

Betrachten Sie die unendliche Matrix:

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

Jede neue Zeile der Matrix wird erstellt, indem mit zNullen begonnen wird. Dabei zhandelt es sich um die Länge der positiven Ziffern, die wir in dieser Zeile verwenden. Die positiven Ziffern werden erstellt, 1indem jedes Mal, wenn Sie Zeilen durchlaufen, mit einer zusätzlichen Ziffer begonnen, diese erhöht und hinzugefügt wird. Dieses Muster wird unendlich rechts wiederholt. So beginnt beispielsweise die erste Reihe, 0, 1, 0, 1...während die zweite Reihe beginnt 0,0, 2,3, 0,0, 2,3.... Nach dem Muster beginnt die dritte Reihe 0,0,0, 4,5,6, 0,0,0, 4,5,6....

Geben Sie zwei Ganzzahlen als Eingabe ein nund xgeben Sie die ersten (obersten) xZahlen der nachten Spalte der obigen Matrix aus. (Sie können 0- oder 1-Indizierung für die Spalten auswählen, geben Sie einfach an, welche in Ihrer Einreichung.)

Bei der Eingabe n = 0(0-indiziert) ist die Spalte beispielsweise vollständig 0s, sodass die Ausgabe nur x 0s ist.

Für Eingabe n = 15und x = 6Ausgabe wäre [1, 3, 4, 10, 11, 0].

Für Eingabe n = 29und x = 15Ausgabe wäre [1, 0, 6, 8, 15, 0, 0, 34, 39, 0, 0, 0, 0, 0, 120].

Für Eingabe n = 99und x = 25Ausgabe wäre [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 und Regeln

  • Die Eingabe und Ausgabe kann durch jede bequeme Methode erfolgen .
  • Es kann davon ausgegangen werden, dass die Eingabe und Ausgabe in den Typ Ihrer Muttersprache passen.
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
AdmBorkBork
quelle

Antworten:

4

JavaScript (ES6), 45 Byte

Übernimmt Eingaben in der Currying-Syntax (n)(x).

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

Probieren Sie es online!

Wie?

Wir verwenden eine direkte Formel, um den Wert der Zelle in Spalte n (0-indiziert) und Zeile x (1-indiziert) zu erhalten:

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
quelle
3

R , 80 76 Bytes

Vielen Dank an @JayCe für den Hinweis auf einen Fehler!

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

Probieren Sie es online!

Verwendet 1-basierte Indizierung für n. Sehr wahrscheinlich gibt es einen golferischen Algorithmus, aber er repist der Wegbereiter für die naive Lösung.

Giuseppe
quelle
Es fehler denn n=1da das ergebnis von sapply nicht mehr in einer matrix ist. Dieses Update ist teuer. Ich frage mich, ob es ein Golfspiel gibt.
JayCe
Oh ja, du hast recht. Zum Glück gibt es eine!
Giuseppe
Die for-Schleife, ja! Und Sie golfen 4 Bytes in den Prozess :)
JayCe
@ JayCe ja, mein ursprünglicher Gedanke war es, das äußerste repmit einem nin das zu indizieren sapply, was ein Byte sparte, aber dann fiel mir ein, dass forSchleifen kürzer sind als sapplyda ich keine Funktion definieren müsste.
Giuseppe
2

MATL , 25 18 Bytes

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

Probieren Sie es online!

Danke an Luis Mendo für die 6 Bytes!

Dies ist im Wesentlichen ein MATL-Port meiner R-Antwort.

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
quelle
1

Schale , 14 Bytes

↑!Tzo¢+MRN0CNN

Das Argument n(zuerst) ist 1-indiziert, versuchen Sie es online!

Alternativ könnten wir ↑!TṠzo¢+†K0CNNfür die gleiche Anzahl von Bytes verwenden.

Erläuterung

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

Schale , 21 bis 19 Bytes

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

Nimmt Argumente als n(1-indiziert) an x.
Dank BMO 2 Byte gespart, aber immer noch nicht so kurz wie die Antwort von BMO.
Mein erster Versuch mit Husk.
Probieren Sie es online!


quelle
1

Python 2 , 55 Bytes

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

Probieren Sie es online!

Unabhängig entwickelt; aber ich stelle fest, dass dies eine Portierung von Arnauld 's Javascript-Antwort ist.

Chas Brown
quelle
1

Jelly , 11 Bytes

ṖS+R¬;$)⁹ịⱮ

Probieren Sie es online!

-1 Danke an Jonathan Allan .

Argument 1: x
Argument 2: n + 1

Erik der Outgolfer
quelle
0ṁ;Ɗ-> ¬;$speichert ein Byte.
Jonathan Allan
@ JonathanAllan Und ich vermute, das ist noch nicht genug. Zumindest habe ich die Demütigung beseitigt ’R... (zumindest für mich) Das Seltsame ist, dass ich in den letzten Tagen an die Thue-Morse-Sequenz (die in Jelly enthalten ist ;¬$) gedacht habe .
Erik der Outgolfer
1

05AB1E , 25 Bytes

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

Probieren Sie es online!


05AB1E passt zu Matrizen wie Zahnpasta und Orangensaft, aber keine schlechte Byteanzahl, wenn man bedenkt, wie schlecht meine Implementierung ist. Sogar mein Code lacht mich aus " LO©L".

Magische Kraken-Urne
quelle
0

Holzkohle , 19 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

    ¹               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

Das Snippet EιL⊞Oυωgeneriert die nächsten iGanzzahlen, indem es einen Dummy-Wert zu einem Array schiebt, der die Schleife durchläuft, und die Länge des resultierenden Arrays nimmt.

Neil
quelle
0

Haskell, 67 Bytes

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

Probieren Sie es 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
quelle