Vị trí đường chéo đầu ra của tôi bình phương


18

Cho một số n, Xuất ra một danh sách theo thứ tự các chỉ số dựa trên 1 rơi vào một trong hai đường chéo của n*nma trận vuông.

Thí dụ:

Đối với đầu vào của 3:

Hình vuông sẽ là:

1 2 3
4 5 6
7 8 9

Bây giờ chúng tôi chọn tất cả các chỉ số được đại diện bởi \, /hoặc X( #hoặc các vị trí không đường chéo bị từ chối)

\ # /
# X #
/ # \

Đầu ra sẽ là:

[1,3,5,7,9]

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

1=>[1]
2=>[1,2,3,4]
3=>[1,3,5,7,9]
4=>[1,4,6,7,10,11,13,16]
5=>[1,5,7,9,13,17,19,21,25]

Sẽ không có câu trả lời được chấp nhận. Tôi muốn biết mã ngắn nhất cho mỗi ngôn ngữ.


1
Câu hỏi là yêu cầu các chỉ số (1 chỉ mục) của các ký tự \, / và X trong ảnh. Không phải là một câu hỏi tồi mỗi se, nhưng thiếu lời giải thích.
Arfie

Nếu bạn sẵn sàng cung cấp một lời giải thích ngắn gọn và rõ ràng về những gì bạn muốn, chúng tôi có thể sẽ mở lại điều này, vì đó không phải là một thách thức xấu. Đến bây giờ, nó vẫn chưa rõ ràng
Ông Xcoder

Tôi đã bỏ phiếu để mở lại, mặc dù bạn cũng có thể muốn di chuyển hình ảnh ascii ra khỏi khu vực ví dụ để tránh nhầm lẫn. Lúc đầu, tôi không chắc mình có phải sản xuất chúng không (nhưng tôi hiểu đầu ra mong muốn chỉ là danh sách các chỉ số)
Arfie

7
Liệu thứ tự có vấn đề?
Ông Xcoder

9
FWIW Tôi nghĩ rằng việc đặt hàng là không liên quan có thể làm cho các sân golf thú vị hơn ...
Jonathan Allan

Câu trả lời:



7

JavaScript (ES6), 48 byte

Xuất ra một danh sách các số nguyên được phân tách bằng dấu gạch ngang dưới dạng một chuỗi.

f=(n,k=n*n)=>--k?f(n,k)+(k%~-n&&k%-~n?'':~k):'1'

Định dạng và nhận xét

f = (n, k = n * n) => // given n and starting with k = n²
  --k ?               // decrement k; if it does not equal zero:
    f(n, k) + (       //   return the result of a recursive call followed by:
      k % ~-n &&      //     if both k % (n - 1) and
      k % -~n ?       //             k % (n + 1) are non-zero:
        ''            //       an empty string
      :               //     else:
        ~k            //       -(k + 1) (instantly coerced to a string)
    )                 //   end of iteration
  :                   // else:
    '1'               //   return '1' and stop recursion

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


Cách giải quyết tốt đẹp, sử dụng các dấu hiệu như dấu phân cách. Bạn có thể sử dụng bitwsie &để lưu một byte không?
Xù xì

@Shaggy Không, nó sẽ không hoạt động. Ví dụ: 4%34%5không có điểm chung 1 bit, nhưng cả hai đều khác không.
Arnauld

Yup, chỉ cần thử nghiệm với nó n=5và phát hiện ra rằng nó sẽ không hoạt động.
Xù xì

k%~-n&&k%-~nnên làm việc. lừa đẹp với dải phân cách!
Tít

@Titus Không phải là nó thực sự quan trọng khi chơi golf nhưng ... vâng, điều đó có thể dễ đọc hơn một chút . :-) (cập nhật)
Arnauld

7

R , 38 35 34 38 byte

3 byte được lưu khi tôi nhớ về sự tồn tại của whichhàm ..., 1 byte được lưu nhờ @Rift

d=diag(n<-scan());which(d|d[n:1,])

+4 byte cho đối số ec=Tkhi được gọi là chương trình đầy đủ bởisource()

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

Giải trình:

n<-scan()            # take input
d=diag(n);           # create an identity matrix (ones on diagonal, zeros elsewhere)
d|d[n:1,]            # coerce d to logical and combine (OR) with a flipped version
which([d|d[n:1,]])   # Find indices for T values in the logical expression above

1
-1 byted=diag(n<-scan());which(d|d[n:1,])
Rift

Khi chạy nó như một chương trình đầy đủ ( source) nó không in bất cứ thứ gì. Bạn phải gọi cat. Xem bài này trên meta .
JAD

@JarkoDubbeldam Hội chợ đủ rồi! Tôi đã luôn làm việc trên cơ sở rằng nó mang lại đầu ra hợp lệ trên TIO, chưa bao giờ thực sự xem xét các yêu cầu của việc trở thành một "chương trình đầy đủ".
dùng2390246

Mặc dù tôi không có kế hoạch quay lại và chỉnh sửa tất cả các câu trả lời cũ của mình để khắc phục điều này!
dùng2390246

Đó là một chút mơ hồ, bởi vì môi trường giao diện điều khiển của R và đoạn mã là cách sử dụng chính. Hãy chia sẻ những hiểu biết về chủ đề meta mà tôi đã liên kết. Nó đã không nhận được nhiều đầu vào.
JAD


5

Octave , 41 37 byte

Điều này cũng hoạt động trong MATLAB. Không có chức năng cụ thể Octave lén lút :)

@(x)unique([x:x-1:x^2-1;1:x+1:x*x+1])

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

Giải trình:

Thay vì tạo một ma trận vuông và tìm hai đường chéo, tôi nghĩ rằng tôi thay vì tính trực tiếp các đường chéo thay thế. Cái này ngắn hơn 17 byte! =)

@(x)                                   % Anonymous function that takes 'x' as input
    unique(...                   ...)  % unique gives the unique elements, sorted
           [x:x-1:x^2-1                % The anti-diagonal (is that the correct word?)
                       ;               % New row
                        1:x+1:x*x+1])  % The regular diagonal

Đây là những gì nó trông giống như, mà không unique:

ans =    
    6   11   16   21   26   31
    1    8   15   22   29   36

Vâng, tôi có lẽ nên lật thứ tự các đường chéo để làm cho nó thân thiện hơn với con người.


5

MATL , 6 byte

XytP+f

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

Giải trình

Cách tiếp cận tương tự như câu trả lời Octave của tôi.

Hãy xem xét đầu vào 3là một ví dụ.

Xy   % Implicit input. Identity matrix of that size
     % STACK: [1 0 0;
               0 1 0;
               0 0 1]
t    % Duplicate
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [1 0 0
               0 1 0
               0 0 1]
P    % Flip vertically
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [0 0 1
               0 1 0
               1 0 0]
+    % Add
     % STACK: [1 0 1
               0 2 0
               1 0 1]
f    % Linear indices of nonzero entries. Implicit display  
     % STACK:[1; 3; 5; 7; 9]

Lập chỉ mục tuyến tính là cột chính , dựa trên 1. Để biết thêm thông tin, xem đoạn dài 12 đoạn ở đây .


"Transpose" nghĩa là gì?
Erik the Outgolfer

@EriktheOutgolfer Xin lỗi, xấu của tôi. tlà trùng lặp, không chuyển vị. Ngoài ra, tôi đã thêm một ví dụ điển hình
Luis Mendo

Kinh ngạc! Nó sẽ đưa tôi hai vòng nếu tôi muốn thực hiện điều này.
mr5

@LuisMendo Tôi nghi ngờ như vậy, vì việc hoán đổi ma trận danh tính không có ý nghĩa gì ... hmm, tôi đã quản lý để lưu một byte bằng thuật toán của bạn.
Erik the Outgolfer


4

Octave, 68 54 byte

Cảm ơn @Stewie Griffin vì đã tiết kiệm 14 byte!

@(x)unique([diag(m=reshape(1:x^2,x,x)),diag(flip(m))])

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

MATLAB, 68 byte

x=input('');m=reshape([1:x*x],x,x);unique([diag(m) diag(flipud(m))])

Giải trình:

@(x)                               % Anonymous function
m=reshape([1:x*x],x,x);            % Create a vector from 1 to x^2 and
                                   % reshape it into an x*x matrix.
diag(m)                            % Find the values on the diagonal.
diag(flip(m))                      % Flip the matrix upside down and
                                   % find the values on the diagonal.
unique([])                         % Place the values from both diagonals
                                   % into a vector and remove duplicates.

@LuisMendo Cảm ơn, Jim yêu thích của tôi.
Steadybox

4

Toán học, 42 byte

Union@Flatten@Table[{i,#+1-i}+i#-#,{i,#}]&

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

@KellyLowder đánh gôn xuống ..

Toán học, 37 byte

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&

và @alephalpha đã ném đi cái bàn!

Toán học, 34 byte

Union@@Range[{1,#},#^2,{#+1,#-1}]&

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&ngắn hơn 5 byte
Kelly Lowder

Union@@Range[{1,#},#^2,{#+1,#-1}]&
alephalpha




2

C # (.NET Core) , 97 83 byte

f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}

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

Sự thay đổi ở đây dựa trên sự thay đổi giữa các số cần tìm. Hai sự thay đổi bắt đầu từ 0 là n-1n+1, vì vậy nếu n=5, những con số cho n-1sẽ 0,4,8,12,16,20n+1sẽ là 0,6,12,18,24. Kết hợp những điều này và đưa ra chỉ mục 1 (thay vì chỉ mục 0) 1,5,7,9,13,17,19,21,25. Độ lệch từ nđạt được bằng cách sử dụng phủ định bitwise (hoạt động bổ sung bitwise), trong đó~-n==n-1-~n==n+1.

Phiên bản cũ

f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}

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

Cách tiếp cận này sử dụng các chỉ số cột và hàng để xác định xem các số có nằm trên đường chéo hay không. i/nđưa ra chỉ số hàng vài%n đưa ra chỉ mục cột.

Chỉ trả về mảng số

Nếu chỉ xây dựng mảng số được coi là tính vào chi phí byte, thì có thể thực hiện các thao tác sau, dựa trên đề xuất của Dennis.Verweij ( using System.Linq;thêm 18 byte):

C # (.NET Core) , 66 + 18 = 84 byte

x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()

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


bạn có thể giảm mã bằng cách loại bỏ thêm &. Phần bổ sung &chỉ có để phá vỡ sự so sánh nếu đầu vào đầu tiên là MSDN
Dennis.Verweij

thực tế bạn có thể có 92 byte bằng cách sử dụng Linq Hãy thử trực tuyến!
Dennis.Verweij

@ Dennis.Verweij Neat, tôi không chắc mình có thể chuyển sang tiêu đề hoặc chân trang trong TIO bao nhiêu. Tôi sẽ có một cuộc chơi xung quanh với tôi.
Ayb4btu

bạn phải nhớ bao gồm 18 byte để tham chiếu đến linq (sử dụng System.Linq;) không may, nhưng cách thức hoạt động: S
Dennis.Verweij

À, được rồi Nhưng điều đó không cần thiết cho using System;? (Tôi cho rằng gói nó namespace System.Linqkhông hợp lệ?)
Ayb4btu

2

Javascript, 73 63 byte

phiên bản cũ

n=>[...Array(y=n*n).keys(),y].filter(x=>(--x/n|0)==x%n||(x/n|0)==n-x%n-1)

Đã lưu 10 byte nhờ @Shaggy

n=>[...Array(n*n)].map((_,y)=>y+1).filter(x=>!(--x%-~n&&x%~-n))

Lần đầu chơi golf! Ở đây hy vọng tôi đã không gây rối quá nhiều.


Chào mừng bạn đến với PPCG :) Một giải pháp tương tự với giải pháp tôi đang làm việc (chỉ có tôi là chỉ số 0). Bạn có thể lưu một số byte bằng cách sử dụng các filterchức năng sau trong hàm của mình : !(--x%(n+1)&&x%(n-1))và bằng cách tạo mảng của bạn như sau:[...Array(n*n+1).keys()]
Shaggy

@Shaggy Cảm ơn bạn! Tôi sẽ cố gắng cải thiện câu trả lời với đề xuất của bạn ngay khi tôi đi làm về!
Marco Lepore

Không có gì. Nhân tiện: " nó ngắn hơn một chút so với việc tạo [1...n*n]phạm vi vớiArray(n*n).fill().map((x,i)=>i+1) " - [...Array(n*n)].map((_,y)=>y+1)là một cách ngắn hơn để làm điều đó, để tham khảo trong tương lai.
Xù xì

Đã làm thêm một chút với nó và kết thúc với điều này với 56 byte:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy

@Shaggy Tôi đã thử phiên bản cuối cùng của bạn nhưng nó sẽ tạo ra số 0 thêm cho f (1) và f (2), nó hoạt động với phạm vi [1 ... n * n] vì vậy tôi đã sử dụng cách bạn chỉ cho tôi trong bình luận trước. Hoặc có thể tôi đã nhắn tin vào một ngày nào đó?
Marco Lepore


1

Perl 5 , 56 + 1 (-n) = 57 byte

!(($_+1+$_/$,)%$,&&$_%($,+1))&&say++$_ for 0..($,=$_)**2

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


Không nên `-n` là +3?
sergiol

1
Không. Dòng lệnh giả định là perl -e. Dòng lệnh cho ví dụ này sẽ là perl -ne. Đó là sự khác biệt của +1.
Xcali


1

Japt , 16 byte

Dường như không thể làm tốt hơn thế này nhưng tôi chắc chắn là có thể. Phải hy sinh 2 byte cho yêu cầu không cần thiết mà chúng tôi sử dụng lập chỉ mục 1.

²õ f@´XvUÉ ªXvUÄ

Kiểm tra nó



0

PHP, 56 54 + 1 byte

+1 byte cho -Rcờ

for(;$z**.5<$n=$argn;$z++)$z%-~$n&&$z%~-$n||print~+$z;

in số được chuẩn bị bởi dấu gạch ngang. Chạy như ống với -nRhoặc thử trực tuyến .

yêu cầu PHP 5.6 trở lên cho **toán tử.
Thêm một byte cho PHP cũ hơn: Thay thế ;$z**.5<$n=$argnbằng $z=$argn;$z<$n*$n.


0

Ruby, 45 byte

->n{(n*n).times{|i|i%-~n>0&&i%~-n>0||p(i+1)}}

Hoạt động nội bộ như không có chỉ mục. kiểm tra nếu imodulo n+1hoặc n-1là 0, nếu vậy in i+1.

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.