Tạo một dấu phần trăm


24

Đưa ra một số nguyên n ≥ 1, sản lượng một đại diện 2D của một ký hiệu phần trăm của chiều rộng n . Việc xây dựng diễn ra như sau:

  1. Tạo một n bởi n ma trận (hoặc danh sách liệt kê) đầy zero.
  2. Chèn những cái ở góc trên bên trái và dưới cùng bên phải.
  3. Đặt những cái trên đường chéo từ dưới cùng bên trái sang trên cùng bên phải.

Đối với đầu vào n = 4, cấu trúc này sẽ trông như sau:

1. 4x4 matrix of 0s
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2. 1s in TL and BR corners
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 1
3. 1s across BL-TR diagonal
1 0 0 1
0 0 1 0
0 1 0 0
1 0 0 1

Đây là một , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.

tôi sử dụng một ma trận của 1s và 0s, nhưng nó cũng có thể chấp nhận sử dụng một chuỗi của bất kỳ nhân vật phi khoảng trắng và không gian. Vì vậy, ví dụ trên có thể giống như:

#  #
  # 
 #  
#  #

hoặc là

#     #
    #
  # 
#     #

Các trường hợp thử nghiệm

n
output

1
1

2
1 1
1 1

3
1 0 1
0 1 0
1 0 1

4
1 0 0 1
0 0 1 0
0 1 0 0
1 0 0 1

10
1 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 1

Lưu ý cuối cùng

Thêm một lời giải thích sẽ được đánh giá rất cao.


Các giải pháp của chúng tôi có thể được lập chỉ mục 0 không?
Kritixi Lithos

5
@Cowsquack Tôi sẽ nói không. Bạn đang nhận được chiều rộng, không phải là một chỉ mục.
Conor O'Brien

Chúng tôi có thể xuất ra một danh sách các danh sách?
xnor

@xnor Có; danh sách các danh sách và ma trận là đồng nghĩa trong bài viết của tôi. Tôi sẽ thêm câu hỏi đó vào câu hỏi
Conor O'Brien

Lưu ý rằng đây là '1'+'0'*(n-2)với khoảng trắng được chèn
CalculatorFeline

Câu trả lời:


8

Thạch , 6 byte

²Rm’Ṭs

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

²Rm’Ṭs  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
   ’    Decrement; yield n-1.
  m     Modular; yield every (n-1)-th element of the range, staring with the first.
    Ṭ   Untruth; yield a Boolean array with 1's at the specified indices.
     s  Split the resulting array into chunks of length n, creating a matrix.

Ngoài ra, ²Ḷ%’¬shoặc+þ%’=2
Sản phẩm ETH

²Ḷọ’srất gần ...
Dennis

Nếu chỉ có liên kết "x 1 byte chia hết cho y" ...
Sản phẩm ETH

@ETHproductions Có ḍ@nhưng đó là hai byte.
Erik the Outgolfer 21/07/17

Và tôi nghĩ rằng mình thật thông minh với ⁼þµ+1¦Ṫṁ³UG... cho đến khi một ²giải pháp Dennis -s Something xuất hiện.
Erik the Outgolfer 21/07/17


7

V , 15 byte

Àé ÀÄ|r#L.|ò.kl

Hãy thử trực tuyến!

Giải trình

Àé<space>        " Argument times insert a space
ÀÄ               " Argument times duplicate this line
                 " This gives an arg-by-arg matrix of spaces
                 "  and brings the cursor to the end of the first line
|r#              " Go to the beginning of this line and replace the first character with #
L.               " Go to the end of this matrix (bottom-right corner) and replace that character with a #
|                " Go to the beginning of the last line
ò                " Recursively do:
 .               "  Repeat the last action, r#, replace the character under the cursor with #
 kl              "  Go 1 up and 1 right


5

GNU APL, 17 15 byte

{1=⍵∨⍵⍵⍴1=⍳⍵-1}

Đây là một ngày kỳ lạ ... GNU thực sự đã đánh bại Dyalog APL ... woah.

TIO không hỗ trợ GNU APL ...

Giải thích (đầu vào là ):

1=⍳⍵-1 - 1 followed by ⍵-2 0's
⍵⍵⍴    - fit into a square
⍵∨     - gcd ⍵ (0 gcd n = n)
1=     - test each element for equality with 1


Có ... lấy cái đó.
Zacharý

Không thể tin rằng tôi thực sự đã phải phá bỏ GNU APL cũ của mình, wow.
Zacharý

Và lấy nó !!
Zacharý

Ôi, tôi sẽ lấy cảm hứng từ 1=⍵∨và thực hiện nó trong giải pháp của mình
Kritixi Lithos

5

Python 2 , 46 byte

lambda n:zip(*[iter(`10L**n`[:-3]*-~n+'1')]*n)

Hãy thử trực tuyến!

Đầu ra như

[('1', '0', '0', '1'), ('0', '0', '1', '0'), ('0', '1', '0', '0'), ('1', '0', '0', '1')]

Python 2 , 48 byte

lambda n:zip(*[iter([1]+(n*[0]+[1])[2:]*-~n)]*n)

Hãy thử trực tuyến!

Đầu ra như

[(1, 0, 0, 1), (0, 0, 1, 0), (0, 1, 0, 0), (1, 0, 0, 1)]

Python 3 , 48 byte

lambda n:('%d'*n+'\n')*n%(1,*(*[0]*n,1)[2:]*-~n)

Hãy thử trực tuyến!

Một cách tiếp cận thay thế chuỗi khá khác nhau trong Python 3. Các kết quả như:

1001
0010
0100
1001

Bạn không thể làm 10L 10?
Zacharý

@ Zacharý Tôi đang dựa vào việc luôn luôn có một Lkết thúc để tôi có thể cắt cùng một số lượng ký tự khỏi phần cuối của số lượng lớn và số nhỏ.
xnor

Ồ, xin lỗi, tôi nhầm tưởng bạn chỉ sử dụng nó làm số. Tôi không bao giờ biết 1010Lkhác biệt.
Zacharý

4

Thạch , 9 byte

=þ¹UF1Q¦s

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

=þ¹UF1Q¦s  Main link. Argument: n

  ¹        Identity; yield n.
=þ         Equals table; compare each i in [1, ..., n] with each j in [1, ..., n].
           This yields the n×n identity matrix.
   U       Upend; reverse each row.
    F      Flatten the matrix.
       ¦   Sparse application:
      Q        Unique; yield the unique elements of the constructed array, i.e.,
               [1] if n = 1 and [0, 1] if n > 1.
     1         Yield 1.
           This replaces the elements at indices 0 (last) and 1 (first) with 1.
        s  Split the resulting array into chunks of length n.

4

APL (Dyalog) , 18 byte

{⍵=1:⍵⋄⍵ ⍵⍴1=⍳⍵-1}

Hãy thử trực tuyến!

Làm cho công việc này cho đầu vào 1 đã thêm 6 byte.

Nhìn vào testcase 4, chúng ta thấy đầu ra là

1 0 0 1
0 0 1 0
0 1 0 0
1 0 0 1

Điều này về cơ bản là 1 0 0 lặp đi lặp lại trong suốt ma trận. Nói cách khác, hình 1 0 0 trong ma trận 4 nhân 4. Vì vậy, trong giải pháp này, trước tiên chúng ta tạo vectơ này với 1 và dấu 0 bằng cách sử dụng 1=⍳⍵-1và sau đó định hình nó bằng cách sử dụng ⍵ ⍵⍴. Nhưng cái nút này cho đầu vào 1, vì vậy chúng ta cần tạo một điều kiện và đạt được 6 byte ...

{⍵=1:⍵⋄⍵ ⍵⍴1=⍳⍵-1}    The right argument is 
 ⍵=1:⍵                 If  is 1 return itself
                      Otherwise
 ⍳⍵-1                   Create a range 1 .. ⍵-1
 1=                     Equals 1; 1 0 0 {⍵-2 0's} ...
 ⍵ ⍵⍴                   Shape in a ⍵-by-⍵ matrix

4

Haskell , 55 byte

Lúc đầu, cách tiếp cận của tôi là tạo đệ quy ma trận danh tính được chuyển đổi, nhưng sau đó sửa dòng đầu tiên và dòng cuối cùng yêu cầu một số phân biệt trường hợp xấu / dài. Vì vậy, tôi đã tìm một cách khác để tạo ra ma trận danh tính, đó là cách tôi tìm thấy ý tưởng này .

f n=[[sum[1|x+y`elem`[2,n+1,2*n]]|y<-[1..n]]|x<-[1..n]]

Hãy thử trực tuyến!

Giải trình

[[x+y|y<-[1..n]]|x<-[1..n]]

tạo ma trận này (cho n=4):

[2,3,4,5]
[3,4,5,6]
[4,5,6,7]
[5,6,7,8]

Như bạn có thể thấy phần tử trên cùng bên trái là 2(nói chung), tất cả các phần tử đường chéo là 5(nói chung n+1) và phần tử dưới cùng bên phải là 8(nói chung 2*n). Vì vậy, tất cả những gì chúng ta cần làm là kiểm tra xem có phải x+ylà một yếu tố của [2,n+1,2*n].


4

R , 54 42 byte

-12 byte nhờ Jarko Dubbeldam

n=scan();m=diag(n)[,n:1];m[1,1]=m[n,n]=1;m

trả về một ma trận; đọc từ stdin. tạo một ma trận danh tính diag(n), lật nó từ trên xuống dưới [,n:1], đặt trên cùng bên trái và dưới cùng bên phải 1, sau đó ghi vào console ( '') với chiều rộng n.

Hãy thử trực tuyến!


Bạn được phép xuất ra một ma trận, vì vậy bạn có thể lưu một vài byte bằng cách biến nó thành một hàm ( pryr::f).
JAD

@JarkoDubbeldam Tôi có thể, nhưng sau đó tôi nghĩ rằng tôi phải thay đổi ngôn ngữ để R+pryrtôi coi đó là một ngôn ngữ riêng biệt; bạn được tự do gửi nó! Sau đó, bạn có thể sử dụng ý tưởng từ câu trả lời của Cows quack mà tôi nghĩ sẽ còn ngắn hơn thế này trong bối cảnh đó (1-liner).
Giuseppe

Hmm, tôi không chắc chắn nơi để vẽ đường thẳng thành thật. Bạn sẽ xem xét bất kỳ thư viện sử dụng một ngôn ngữ khác nhau?
JAD

1
Ngoài ra, việc sử dụng function(n)có thể vẫn còn ngắn hơn
JAD

1
Nó ngắn hơn so với triển khai oneliner mà bạn đã tham chiếu:function(n)matrix(rep(c(1,rep(0,n-2)),n+1),n,n)
JAD

4

MATL , 7 byte

XyPl5L(

Hãy thử nó tại MATL Online!

Giải trình

Tạo ma trận danh tính ( Xy), lật theo chiều dọc ( P), write ( () giá trị 1 ( l) cho các mục nhập đầu tiên và cuối cùng ( 5L), là trên cùng bên trái và dưới cùng bên phải.


4

APL Dyalog, 12 11 10 byte

,⍨⍴×,2↓⊢↑×

Dùng thử trực tuyến

-1 byte nhờ lstefano.

Làm sao?

,⍨⍴×,2↓⊢↑×
       ⊢↑× - argument-length extension of the sign of the argument (1)
     2↓    - Drop the first two elements
   ×,      - Prepend a one
,⍨⍴        - Shape into a square array with dimensions of input x input

Tôi thực sự không nghĩ rằng điều này có thể được chơi golf nữa ... wow.
Zacharý

Nó có thể: ,⍨⍴×,2↓⊢↑×(10 byte). Tôi muốn thêm: đừng sử dụng quá nhiều lần đi lại ... :-P
lstefano


Bạn phải đùa tôi, wow. Lạm dụng tốt đẹp của dấu hiệu.
Zacharý

3

C # (.NET Core) , 121 91 88 byte

-30 byte vì cách cũ là ngu ngốc.

-3 byte bằng cách di chuyển xung quanh việc khởi tạo biến

n=>{int i=0,k=n-1;int[,]b=new int[n,n];b[0,0]=b[k,k]=1;for(;i<n;)b[i++,k--]=1;return b;}

Hãy thử trực tuyến!

Vòng lặp lặp xuống mảng để điền vào 1's. Trả về một mảng 1 và 0.


Khai báo bnhư varđể lưu một số byte.
TheLethalCoder


3

Than , 14 12 7 byte

-5 byte nhờ Neil !

↗N⸿/‖O↘

Hãy thử trực tuyến!


Tôi không nghĩ điều này có thể ngắn hơn nữa ...
Erik the Outgolfer 21/07/17

1
Chà, đầu tiên tôi cắt nó ra Nν◨/ν←↙ν‖O↘, nhưng sau đó tôi nghĩ ra ↗N⸿/‖O↘!
Neil

@Neil Wow, tôi thậm chí không biết những gì ⸿. Nó có thiết lập lại vị trí ban đầu không?
notjagan

Không, ⸿giống như ở chỗ nó di chuyển xuống một hàng nhưng nó luôn đi đến cột 0 (được đo bằng ) thay vì cột ở đầu chuỗi, vì vậy, ví dụ như J⁵¦⁵⸿vậy J⁰¦⁶.
Neil

3

C ++, 144 byte

#include<string>
#define S std::string
S p(int n){S r;for(int i=0;i<n;++i){r+=S(n,32);r[r.size()-1-i]=35;r+=10;}r[0]=r[r.size()-2]=35;return r;}

Nó tận dụng sự khác biệt một byte giữa '#' và 35


Chính xác thì mã của bạn tận dụng sự khác biệt một byte giữa '#'35?
Zacharý

@ Zacharý Có vẻ như đó là trong IDE của tôi x)
HatsuPulumKun

2

Toán học, 72 byte

(s=Table[0,#,#];s[[1,1]]=s[[#,#]]=1;Table[s[[#+1-i,i]]=1,{i,#}];Grid@s)&

đầu vào

[5]

đầu ra

1 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
1 0 0 0 1


1
Vấn đề không yêu cầu bạn in / hiển thị nó, vì vậy bạn có thể thay thế Grid@sbằng sđể tiết kiệm 5 byte.
Đánh dấu S.


2

PowerShell , 67 byte

param($n)0..--$n|%{-join(("1"+"0"*(($n-1),0)[!$n])*3)[$_..($_+$n)]}

Hãy thử trực tuyến!

Đưa đầu vào $nvà các vòng lặp từ 0đến --$n(nghĩa là $ngiảm trước). Mỗi lần lặp, chúng ta xây dựng một chuỗi 1theo sau bởi $n-1 0s, sau đó nhân số 3lần đó (ví dụ: 100010001000cho đầu vào của 5). Sau đó, chúng tôi lập chỉ mục vào đó trên cơ sở luân phiên bắt đầu từ 0đến 0 + $n. Những ký tự này được -joined thành một chuỗi, được để lại trên đường ống. Đầu ra là ẩn.


(NB - Điều này yêu cầu thêm 9 byte để xử lý trường hợp đặc biệt n=1. Dưới đây là mã 58 byte nếu chúng tôi đảm bảo n>1)

param($n)0..--$n|%{-join(("1"+"0"*($n-1))*3)[$_..($_+$n)]}

2

Dyalog APL v16, 23 byte

{(1@(1 1)(⍵ ⍵))⌽∘.=⍨⍳⍵}

Hãy thử trực tuyến!

Giải trình:

{(1@(1 1)(⍵ ⍵))⌽∘.=⍨⍳⍵} -(input ⍵) 
                ∘.=⍨⍳⍵  - identity matrix with size ⍵×⍵
               ⌽        - flip that
 (1@(1 1)(⍵ ⍵))         - place 1 into the corners using the v16 operator @ (At)

2

Lua, 117 byte

m=arg[1]+0 for y=m,1,-1 do s=""for x=1,m do s=s..((x==1 and y==m or x==m and y==1 or x==y)and"#"or" ")end print(s)end

Thử nó

Mã khá đơn giản. Nó đặt m thành đối số đầu tiên, sau đó thêm 0 vào nó để chuyển đổi nó thành một số, sau đó lặp lại cho tọa độ Y, chuyển tiếp qua tọa độ X và sẽ đặt # if x == y hoặc nếu đó là các góc khác.

Chương trình này không bao giờ sử dụng từ khóa "nếu".



2

Japt , 12 byte

²ovUÉ hT1 òU

Trả về một mảng / ma trận 2D.

Hãy thử trực tuyến! sử dụng -Qcờ để hiển thị đầu ra có định dạng mảng.

Giải trình

²ovUÉ hT1 òU

Ngụ ý: U= số nguyên đầu vào

²o

Square U( ²), tạo mảng [0, U*U)( o) và ánh xạ từng mục bằng ...

vUÉ

1nếu nó chia hết ( v) bởi U-1( ), thì khác 0.

hT1

Đặt mục ( h) tại chỉ mục 0 ( T) thành 1.

òU

Chia mảng thành các lát ( ò) có độ dài U.


Tôi không nghĩ rằng bạn thực sự cần hT1, vì 0về mặt kỹ thuật đã chia hết Ucho mọi người U. Ngoài ra, công việc tuyệt vời :-)
ETHproductions 21/07/17

@ETHproductions Điều đó đã được thêm vào để đối phó với đầu vào của 1. Không có nó, nó trả về[[0]] vì dường như số 0 không chia hết cho số không.
Justin Mariner

À, dang nó. Tôi không biết mình có nên sửa nó không ...
ETHproductions 21/07/17

2

PHP, 53 byte

for(;$i<$l*$l;)echo($i++%($l-1)?0:1).($i%$l?'':"\n");

Độ dài của cạnh của ma trận là $l. Mã này có Thông báo PHP và thậm chí Cảnh báo PHP để chia cho 0 khi $l=0, nhưng thực hiện công việc!


Có vẻ như bạn mong đợi đầu vào sẽ được lưu trữ trong một biến được xác định trước (-> $l). Thật không may, đây không phảimột trong những cách được chấp nhận của chúng tôi để lấy đầu vào . Trong bài đăng meta được liên kết, bạn sẽ tìm thấy các lựa chọn thay thế, ví dụ: sử dụng các đối số dòng lệnh như được thấy trong câu trả lời của ricdesi .
nimi

hoàn thành và đánh gôn: while($i**.5<$n=$argn)echo$i++%~-$n?0:1,"\n"[$i%$n];hoặc while($i**.5<$n=$argn)echo+!($i++%~-$n),"\n"[$i%$n];(52 byte mỗi cái)
Titus

Cần <?ngay từ đầu.
manassehkatz-Phục hồi lại


2

Ruby, 47 byte

->n{([1]+[0]*(n-2)).cycle.each_slice(n).take n}

Nó trả về một mảng các mảng.

Mã này khá đơn giản.

  • Nó tạo ra một n-1mảng với 1phần tử đầu tiên và phần còn lại chứa 0s (vd [1, 0, 0, 0])
  • Nó lặp lại
  • Nó có ncác nphần tử

Hãy thử trực tuyến!



2

Python 3, 97 byte

def f(n):
    m=[[0+(j==n-i-1)for j in range(n)]for i in range(n)]
    m[0][0]=1
    m[-1]=m[0]
    return m

Giải trình

m=[[0+(j==n-i-1)for j in range(n)]for i in range(n)]

Đây là một sự hiểu biết danh sách, 0+(j==n-i-1)là một cách ngắn hơn để chuyển đổi j==n-i-1thành một int (trái ngược với intchức năng) và sau đó m[-1]=m[0]ngắn hơn so với việc tạo dưới cùng bên phải 1, vì các hàng trên cùng và dưới cùng là giống hệt nhau.


2

Forth, 273 (không có ý kiến) 170 (golfed-ish)

: % 2 base ! cr dup 1- 1 swap lshift 1 or . cr 2 over 2 - dup 0< 0= if
0 ?do 2dup s>d rot <# 0 ?do # loop #> type cr 2*  loop
1 or . else drop drop then cr drop decimal ;

(Phiên bản 273 để làm rõ phiên bản nhận xét :)

: newbase
 base @ swap base ! ;
: 0u.r
 swap s>d rot <# 0 ?do # loop #> type ;
: frame
 1- 1 swap lshift 1 or ;
: %
 2 newbase swap
 cr dup frame . cr
 2 over 2 -
 dup 0< 0= if
  0 ?do
   2dup swap 0u.r cr
   2* 
  loop
  1 or .
 else
  drop drop
 then
cr
drop base ! ;

(Lưu ý rằng, vì khoảng trắng là dấu phân cách chính trong Forth, việc loại bỏ mọi lợi nhuận vận chuyển sẽ không có gì khác biệt. Tất nhiên, thụt lề là có.)

(Đã bình luận :)

( Uses bit array, max 64 width on AMD64 with gforth. )

( Could shave an extra thirty or so bytes by not restoring )
( the numeric base, )
( and a few more by pulling frame and 0u.r into the definition. )

: newbase ( n -- oldbase )  ( swap base with n )
 base @ swap base ! ;

: 0u.r ( u width -- )  ( unsigned numeric output, no leading zero suppression )
 swap s>d rot <# 0 ?do # loop #> type ;

: frame ( n -- f )  ( frame )
 1- 1 swap lshift 1 or ;

: %  ( n -- )  ( Make the % sign )
 2 newbase swap ( Use binary output. )
 cr dup frame . cr ( Frame the first line. )
 2 over 2 -
 dup 0< 0= if ( Are we already done? )
  0 ?do ( Loop doesn't do the first or last. )
   2dup swap 0u.r cr ( Zero fill, right justify. )
   2* 
  loop
  1 or . ( Put the second frame out. )
 else
  drop drop
 then
cr
drop base ! ;

(Ví dụ thực hiện :)

1 % 
1 

 ok
2 % 
11 
11 
 ok
3 % 
101 
010
101 
 ok
10 % 
1000000001 
0000000010
0000000100
0000001000
0000010000
0000100000
0001000000
0010000000
0100000000
1000000001 
 ok
40 % 
1000000000000000000000000000000000000001 
0000000000000000000000000000000000000010
0000000000000000000000000000000000000100
0000000000000000000000000000000000001000
0000000000000000000000000000000000010000
0000000000000000000000000000000000100000
0000000000000000000000000000000001000000
0000000000000000000000000000000010000000
0000000000000000000000000000000100000000
0000000000000000000000000000001000000000
0000000000000000000000000000010000000000
0000000000000000000000000000100000000000
0000000000000000000000000001000000000000
0000000000000000000000000010000000000000
0000000000000000000000000100000000000000
0000000000000000000000001000000000000000
0000000000000000000000010000000000000000
0000000000000000000000100000000000000000
0000000000000000000001000000000000000000
0000000000000000000010000000000000000000
0000000000000000000100000000000000000000
0000000000000000001000000000000000000000
0000000000000000010000000000000000000000
0000000000000000100000000000000000000000
0000000000000001000000000000000000000000
0000000000000010000000000000000000000000
0000000000000100000000000000000000000000
0000000000001000000000000000000000000000
0000000000010000000000000000000000000000
0000000000100000000000000000000000000000
0000000001000000000000000000000000000000
0000000010000000000000000000000000000000
0000000100000000000000000000000000000000
0000001000000000000000000000000000000000
0000010000000000000000000000000000000000
0000100000000000000000000000000000000000
0001000000000000000000000000000000000000
0010000000000000000000000000000000000000
0100000000000000000000000000000000000000
1000000000000000000000000000000000000001 
 ok

(Lưu ý cuối cùng: hoạt động nhỏ hơn một chút so với độ rộng bit của trình thông dịch Forth. Tôi đã chạy ở trên trên gforth, AMD64. Một Forth 16 bit cổ đại sẽ chỉ rộng 15 bit và cần sửa đổi một chút.)


Nếu bạn muốn có mã nhận xét trong câu trả lời của mình thì tốt, nhưng bạn cũng cần mã được đánh golf ở đâu đó.
Pavel

@Phoenix Cảm ơn. Làm xong.
Joel Rees

2

C # (.NET Core) , 65 byte

w=>{var l=new int[w*w];for(int i=0;i<w*w;i+=w-1)l[i]=1;return l;}

Hãy thử trực tuyến!

Thuật toán khác biệt đáng kể so với câu trả lời C # khác, vì vậy tôi quyết định đăng riêng nó thay vì cải tiến. Lấy cảm hứng từ câu trả lời Jelly được đánh giá hàng đầu thực sự, tôi đã làm một cái gì đó hơi nhỏ gọn trước đây. Đầu ra là một mảng tuyến tính, do đó sẽ yêu cầu một số logic để bọc nó thành 2D bên ngoài phương thức nguyên trạng. Một phiên bản thay thế yêu cầu 6 byte bổ sung để xuất thành một mảng 2D thực sự:

w=>{var l=new int[w,w];for(int i=0;i<w*w;i+=w-1)l[i/w,i%w]=1;return l;}

Tôi cũng có một phiên bản không cạnh tranh thú vị.

using System.Linq;w=>new int[w*w].Select((_,i)=>i%(w-1)<1)

Điều này kết thúc với đầu ra gần như đúng, dẫn đến kết quả là IEnumerable<bool>đúng / sai thay vì 1/0 và đó là cấu trúc tuyến tính chứ không phải 2D, và mặc dù không cần thiết cho dòng mã chính xác đó, using System.Collections.Genericlà cần thiết để làm bất cứ điều gì hữu ích với đầu ra. Như tôi đã nói, nó rất gần với giá trị nhưng không hoàn toàn.


Đối với lần thứ hai sử dụng một ternary như trong ?1:0các tác phẩm và tôi tin rằng một mảng kết quả sẽ ổn. Các bộ sưu tập sử dụng cũng không cần thiết cho mã đó.
TheLethalCoder

Đối với người đầu tiên, sẽ thiết lập w*w thành một biến và di chuyển intkhai báo ra khỏi vòng lặp có giúp bạn tiết kiệm được gì không?
TheLethalCoder

@TheLethalCoder Thay thế hai trường hợp w*wbằng một biến ký tự đơn sẽ tiết kiệm 4 byte, di chuyểnint i=0 ngoài vòng lặp đòi hỏi một dấu chấm phẩy có giá 1 byte, sau đó thêm ,s=w*wvào khai báo tốn 6 byte, vì vậy nó thực sự tạo ra +3 byte.
Kamil Drakari

Bạn nên sử dụng số byte của giải pháp biểu diễn 2D đầy đủ. Mảng được trả về bởi giải pháp ngắn hơn ít nhất sẽ cần bao gồm một số loại dấu phân cách để hợp lệ.
Jakob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.