Matriks dalam Jangkauan

18

Tantangan

Diberikan n>0keluaran integer, n+1 X n+1matriks yang berisi semua bilangan bulat dari 1hingga 2nseperti yang ditunjukkan dalam kasus uji di bawah

Uji Kasus

n=1  

1  2  
2  2

n=2

1   2   4  
2   3   4  
4   4   4

n=5  

1   2   3   4   5   10  
2   3   4   5   6   10  
3   4   5   6   7   10   
4   5   6   7   8   10  
5   6   7   8   9   10  
10  10  10  10  10  10  

n=10  

1   2   3   4   5   6   7   8   9   10  20  
2   3   4   5   6   7   8   9   10  11  20  
3   4   5   6   7   8   9   10  11  12  20  
4   5   6   7   8   9   10  11  12  13  20  
5   6   7   8   9   10  11  12  13  14  20  
6   7   8   9   10  11  12  13  14  15  20  
7   8   9   10  11  12  13  14  15  16  20  
8   9   10  11  12  13  14  15  16  17  20  
9   10  11  12  13  14  15  16  17  18  20  
10  11  12  13  14  15  16  17  18  19  20  
20  20  20  20  20  20  20  20  20  20  20  

Saya pikir polanya cukup mudah, jadi mari kita lihat siapa yang akan memberikan jawaban terpendek dalam byte.
Ini adalah

Aturan

Input harus berupa bilangan bulat ( 1-diindeks )

Output dapat berupa matriks (seperti yang ditunjukkan dalam kasus uji) atau daftar daftar


sumber

Jawaban:

10

R , 53 byte

function(n)rbind(cbind(outer(1:n,1:n,`+`)-1,2*n),2*n)

Gunakan outer"produk" untuk menghasilkan semua jumlah rentang 1,...,nsebagai matriks, kurangi 1dari masing-masing, kemudian binds 2*nsebagai kolom di sebelah kanan dan satu baris di bagian bawah, daur ulang sesuai kebutuhan, dan kembalikan matriks sebagai hasilnya.

Cobalah online!

R , 78 byte

Implementasi yang lebih naif.

function(n){m=matrix(2*n,n+1,n+1)
for(i in seq(n))m[1:n,i]=(0:(2*n))[1:n+i]
m}

Cobalah online!

Giuseppe
sumber
+1 bagus, saya berpikir tentang luar tetapi belum sampai di sana
MickyT
7

Mathematica, 61 46 byte

ArrayFlatten@{{##-1&~Array~{#,#},2#},{2#,2#}}&

thanx @alephalpha untuk -15 byte

J42161217
sumber
ArrayFlatten@{{Array[+##-1&,{#,#}],2#},{2#,2#}}&
alephalpha
+##-1&bisa saja ##-1&dan Anda dapat menggunakan infix Array:ArrayFlatten@{{##-1&~Array~{#,#},2#},{2#,2#}}&
ngenisis
5

MATL , 12 10 byte

:&+q,!GEYc

Cobalah online!

Penjelasan

:       % Input n (implicit). Push range [1 2 ... n]
&+      % matrix of pairwise additions
q       % Subtract 1
,       % Do twice
  !     %   Transpose
  GE    %   Push 2*n
  Yc    %   Concatenate that value to all rows, thus extending the matrix
        % End (implicit). Display (implicit)
Luis Mendo
sumber
5

Haskell , 48 byte

f n=[[i..n-1+i]++[2*n]|i<-[1..n]]++[2*n<$[0..n]]

Cobalah online!

jferard
sumber
4

Jelly , 11 byte

+þḶ;€Ḥ;ḤzḤG

Cobalah online!

Biarawati Bocor
sumber
Baru saja akan memposting byte untuk byte tanpa Gyang berlebihan untuk persyaratan
Jonathan Allan
Penggunaan produk luar yang bagus
Zacharý
@ JonathanAllan solusi lain menggunakan ;€ḤZ;€Ḥ...
Leaky Nun
... dan yang lainnya adalah Ḷ;Ḥ©µ+þ‘«®; p
Jonathan Allan
1
@JonathanAllan dan kegunaan lain +€Ḷ;Ḥṁ€;€Ḥ: p
Erik the Outgolfer
4

JavaScript (ES6), 64 byte

f=
n=>[...Array(n+1)].map((_,i,a)=>a.map((_,j)=>n-i&&n-j?i-~j:n+n))
<input type=number min=0 oninput="t.innerHTML=f(+this.value).map(a=>`<tr>${a.map(b=>`<td>${b}</td>`).join``}</tr>`).join``"><table id=t>

Neil
sumber
4

Java 8, 99 byte

Lambda dari Integerke int[][](misalnya Function<Integer, int[][]>). Secara mengejutkan tahan terhadap golf.

n->{int p=n+1,o[][]=new int[p][p],i=0,r,c;while(i<p*p)o[r=i/p][c=i++%p]=r<n&c<n?r-~c:2*n;return o;}

Cobalah secara Online

Lambda yang tidak tersentuh

n -> {
    int
        p = n + 1,
        o[][] = new int[p][p],
        i = 0,
        r, c
    ;
    while (i < p * p)
        o[r = i / p][c = i++ % p] =
            r < n & c < n ?
                r - ~c
                : 2 * n
        ;
    return o;
}

Ucapan Terima Kasih

  • -1 byte terima kasih kepada Kevin Cruijssen
Jakob
sumber
Anda dapat golf byte dengan memulai i=0dan meletakkan ++di [c=i++%p].
Kevin Cruijssen
3

Python 2 , 64 62 61 byte

-3 byte terima kasih kepada Tn. Xcoder.

lambda n:[range(i+1,i-~n)+[n*2]for i in range(n)]+[[n*2]*-~n]

Cobalah online!

Saya mungkin kehilangan pola kunci.

Python 2 , 76 byte

lambda n:[[[n*2,i-~j][n-i and n-j>0]for j in range(n+1)]for i in range(n+1)]

Cobalah online!

benar-benar manusiawi
sumber
1
Seperti biasa, *(n+1)adalah *-~n.
Tn. Xcoder
Jika Anda ingin mengadopsi versi Python 3 juga, yang terpendek yang bisa saya dapatkan adalah 64 byte
Tn. Xcoder
Versi 76 byte dapat dikurangi menjadi 72 byte
Halvard Hummel
2

Proton ,  48  44 byte

-4 byte terima kasih kepada @totallyhuman!

n=>[(i+1..i-~n)+[n*2]for i:0..n]+[[n*2]*-~n]

Cobalah online!

Tuan Xcoder
sumber
44 byte
totallyhuman
@ benar-benar, terima kasih manusia.
Tn. Xcoder
2

R , 54 63 67 byte

function(n)cbind(rbind(sapply(1:n-1,'+',1:n),2*n),2*n)

Cobalah online!

Terima kasih kepada @Guiseppe untuk pointer untuk sapply dan 9 byte

MickyT
sumber
Sebenarnya, pendekatan ini dapat ditingkatkan juga: sapply(1:n-1,'+',1:n)tapi kemudian itu hanya 1 byte lebih banyak daripada menggunakan outer(tanda kutip jelas backticks)
Giuseppe
1
\`bekerja untuk menghindari backticks dalam blok kode yang dibatasi oleh backticks @Giuseppe
Cyoce
2

Recursiva , 50 byte

  • Hanya 10 byte lebih pendek dari python dan karena itu resmi, Recursiva sama sekali bukan bahasa golf ... Ini adalah esolang. : D
|{Ba+++++'PJ"	"W+Z~}B+~}'Va'+}'Va'AD'VaJ"	"W*;aADa

Cobalah online!

officialaimm
sumber
1

Röda , 44 byte

f n{seq 1,n|[[seq(_,_1+n-1)]+2*n];[[2*n]*n]}

Cobalah online!

Penjelasan:

f n{seq 1,n|[[seq(_,_1+n-1)]+2*n];[[2*n]*n]}
f n{                                       } /* Function f(n)         */
    seq 1,n                                  /* Sequence 1..n         */
           |                                 /* For each _1:          */
              seq(_,_1+n-1)                  /*   Sequence _1.._1+n-1 */
             [             ]                 /*   As list             */
                            +2*n             /*   Append 2*n          */
            [                   ]            /*   Push to the stream  */
                                   [2*n]     /* List [2*n]            */
                                        *n   /* Multiplied by n       */
                                  [       ]  /* Push to the stream    */
fergusq
sumber
1

Dyalog APL, 29 byte

Membutuhkan ⎕IO←0

{(S,⍨1+¯1 ¯1↓∘.+⍨⍳⍵+1)⍪S←2×⍵}

Cobalah online!

Bagaimana?

  • 1+¯1 ¯1↓∘.+⍨⍳⍵+1 bagian kiri atas array
  • (S,⍨...)⍪S←2×⍵ sudut
Zacharý
sumber
1

> <>, 84 + 2 Bytes

+2 untuk -v flag

Mencetak dengan tab di antara nilai, dan baris baru di antara baris. Juga mencetak tab tambahan di baris terakhir.

Cobalah online

1:r:&r&)?\0:r:&r&(?\~$:@2*nao1+!
a0./:r:0~<.17+1o9\ \$:@$:@+n9o1+
   \&r&)?;$:@2*n /

Pra-golf

1>:r:&r&)?\0>    :r:&r&(?\~$:@2*nao1+\
            \+1o9n+@:$@:$/
 \                                   /
          \~0>:r:&r&)?;$:@2*n9o1+\
             \                   /
Sasha
sumber
0

Jelly, 14 byte

R+’r@R;€Ḥz0;€Ḥ

Cobalah online!

Zacharý
sumber
0

Kotlin , 59 byte

Array(n+1){c->Array(n+1){r->when(n){c,r->n*2;else->1+c+r}}}

Cobalah online.

Valentin Michalak
sumber
0

Clojure, 153 135 byte

Daftar daftar? Yay, Lisp

(fn[n](loop[r[] i 0 d (* 2 n)](if(= i n)(conj r(conj(repeat n d)d))(recur(conj r(conj(vec(map #(+ i %)(range 1(inc n))))d))(inc i)d))))

Tidak Disatukan:

(defn a[n]
  (loop [r[] i 0 d (* 2 n)]
    (if(= i n)
      (conj r(conj(repeat n d)d))
      (recur
        (conj r
            (conj (vec (map #(+ i %)(range 1(inc n)))) d))
        (inc i)
        d))))

Fungsi anonim yang mengambil input sebagai argumen dan mengembalikan daftar daftar.

Output dari n = 5:

[[1 2 3 4 5 10] [2 3 4 5 6 10] [3 4 5 6 7 10] [4 5 6 7 8 10] [5 6 7 8 9 10] (10 10 10 10 10 10)]
Joshua
sumber
0

05AB1E , 17 byte

FLN+I·¸«ˆ}·¸I>.׈

Cobalah online!

Penjelasan

F                   # for N in [0 ... input-1]
 L                  # push range [1 ... input]
  N+                # add N to each
    I·¸«            # append input*2
        ˆ           # add to global list
         }          # end loop
          ·¸        # push [input*2]
            I>.×    # repeat it input+1 times
                ˆ   # add to global list
                    # implicitly output global list
Emigna
sumber
0

J, 29 byte

(}:@(][\1+i.@+:),]#+:),.>:#+:

ungolfed

(}:@(] [\ 1+i.@+:) , ]#+:) ,. >:#+:

penjelasan

(}:@(] [\ 1+i.@+:)                   NB. make the inner part of the matrix
          1+i.@+:                      NB. 1..2*n, where n is the input
    (] [\ 1+i.@+:)                     NB. fork: infixes (sliding window) of length n, over 1..2*n
(}:@                                   NB. remove last element
                   , ]#+:)           NB. add a row of 2*n to the end
                           ,. >:#+:  NB. add a column of 2*n to entire result above

Cobalah online!

Jonah
sumber
Heh, jawaban APL saya dan jawaban Anda memiliki jumlah byte yang sama! Bisakah Anda menambahkan penjelasan?
Zacharý
@ Zacharý, diperbarui. fwiw, ini mungkin bisa golf setidaknya sedikit lebih jauh oleh seseorang seperti saya, dan mungkin dengan tambahan 10+ byte oleh seorang ahli J.
Jonah
0

Sebenarnya , 23 byte

;;Rnkp@;r♀+@;τ;(♀q)@α@q

Cobalah online!

Penjelasan:

;;Rnkp@;r♀+@;τ;(♀q)@α@q
;;                       two copies of input
  R                      range(1, input+1)
   n                     copy input times
    kp@                  push stack to list, remove first element
       ;r                push range(input)
         ♀+              pairwise addition (add the value in the range to each value in the corresponding list)
           @;            duplicate input again
             τ;          input*2, duplicate that
               (♀q)      append input*2 to each list
                   @α@q  append a row of input*2
Mego
sumber
0

Clojure v1.8, 97 byte

#(conj(mapv(fn[i](conj(vec(range i(+ % i)))(* 2 %)))(range 1(inc %)))(vec(repeat(inc %)(* 2 %))))

Cobalah online!

Penjelasan

(range 1(inc %))                           Numbers from 1 to 'n'
(mapv ... (range 1(inc %)))                For each one of these numbers
(fn[i](conj(vec(range i(+ % i)))(* 2 %)))  Create the numbers from 'i' to (n+i-1), convert to vector and insert '2*n' to the vector
#(conj ... (vec(repeat(inc %)(* 2 %))))    Insert to the previous vector a vector of repeated '2*n's
Chris
sumber