Matris Sütunlarının İlerlemesi


17

Sonsuz matrisi düşünü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
              ...

Matrisin her yeni satırı, zsıfırla başlayarak zoluşturulur; bu satırda kullandığımız pozitif basamakların uzunluğu. Pozitif rakamlar, 1satırları her yinelediğinizde ek bir basamak ekleyerek ve artırarak ve ekleyerek oluşturulur. Bu desen sonsuz olarak sağa doğru tekrarlanır. Örneğin, ilk satır 0, 1, 0, 1...ikinci satır başlarken başlar 0,0, 2,3, 0,0, 2,3.... Deseni takiben üçüncü sıra başlar 0,0,0, 4,5,6, 0,0,0, 4,5,6....

İki giriş olarak tam sayıların nve xçıkış ilk (en üst) xsayısı nyukarıda matris sütunda. (Sütunlar için 0- veya 1-endekslemeyi seçebilirsiniz, yalnızca gönderiminizde hangisini belirteceğinizi belirtin.)

Örneğin, girdi n = 0(0 dizinli) için sütun tamamen 0s'dir, bu nedenle çıktı yalnızcax 0 s olur.

Giriş n = 15ve x = 6çıkış için [1, 3, 4, 10, 11, 0].

Giriş n = 29ve x = 15çıkış için [1, 0, 6, 8, 15, 0, 0, 34, 39, 0, 0, 0, 0, 0, 120].

Giriş n = 99ve x = 25çıkış için [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].

G / Ç ve Kurallar

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Giriş ve çıktının, dilinizin yerel sayı türüne uygun olduğu varsayılabilir.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Yanıtlar:


4

JavaScript (ES6), 45 bayt

Körili sözdiziminde girdi alır (n)(x).

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

Çevrimiçi deneyin!

Nasıl?

Sütun n (0 dizinli) ve satır x'te (1 dizinli) hücrenin değerini almak için doğrudan bir formül kullanırız :

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 bayt

@JayCe'ye bir hataya işaret ettiği için teşekkürler!

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

Çevrimiçi deneyin!

İçin 1 tabanlı indeksleme kullanır n. Büyük olasılıkla daha golfçü bir algoritma vardır, ancak repsaf çözümün etkinleştiricisidir.


Artık n=1matrisin içindeki aplikanın sonucundan dolayı hata veriyor . Bu düzeltme pahalı bir golfçü olup olmadığını merak ediyorum?
JayCe

Oh, evet, haklısın. Neyse ki bir tane var!
Giuseppe

Döngü için, evet! Ve bu süreçte 4 bayt golf yaptınız :)
JayCe

Evet @JayCe benim orijinal düşünce dıştaki endekse oldu repbir ile nsapplybir byte kurtardı hangi ama sonra hatırladım fordöngüler daha kısadır sapplyben bir işlevi tanımlamak olmazdı çünkü.
Giuseppe



2

MATL , 25 18 bayt

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

Çevrimiçi deneyin!

6 bayt golf için Luis Mendo için teşekkürler!

Bu aslında R cevabımın bir MATL portu.

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

Kabuk , 14 bayt

↑!Tzo¢+MRN0CNN

n(İlk) argümanı 1 dizinli, çevrimiçi deneyin!

Alternatif olarak ↑!TṠzo¢+†K0CNNaynı sayıda bayt için de kullanabiliriz .

açıklama

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

Kabuk , 21 19 bayt

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

O halde, argümanları n(1 dizinli) olarak alır x.
BMO sayesinde 2 bayt tasarruf etti, ancak yine de BMO'nun yanıtı kadar kısa değil.
Husk'u ilk kullanma girişimim.
Çevrimiçi deneyin!





1

Jöle , 11 bayt

ṖS+R¬;$)⁹ịⱮ

Çevrimiçi deneyin!

-1 Jonathan Allan sayesinde .

Bağımsız değişken 1: x
Bağımsız değişken 2: n + 1


0ṁ;Ɗ-> ¬;$bayt kaydeder.
Jonathan Allan

@JonathanAllan Ve bunun henüz yeterli olmadığından şüpheleniyorum. En azından aşağılayıcıyı kaldırdım ’R... (yani, en azından benim için) Garip olan şey, son birkaç gündür Thue-Morse dizisini (Jelly'de bulunan ;¬$) düşünüyordum.
Outgolfer Erik

1

05AB1E , 25 bayt

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

Çevrimiçi deneyin!


05AB1E, diş macunu ve portakal suyu gibi matrislerle gider, ancak uygulamamın ne kadar kötü olduğu düşünüldüğünde kötü bir bayt sayımı değildir. Kodum bile bana gülüyor " LO©L".


0

Kömür , 19 bayt

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

Çevrimiçi deneyin!Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

    ¹               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

Parçacık , döngüden her geçişte bir diziye kukla bir değer iterek ve sonuçta oluşan dizinin uzunluğunu alarak uygun tam sayıları EιL⊞Oυωoluşturur i.



0

Haskell, 67 bayt

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

Çevrimiçi deneyin!

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.