Output posisi diagonal saya kuadrat

18

Diberi nomor n, Keluaran daftar urutan indeks berbasis 1 jatuh di salah satu diagonal n*nmatriks kuadrat.

Contoh:

Untuk masukan dari 3:

Kuadrat tersebut harus:

1 2 3
4 5 6
7 8 9

Sekarang kami memilih semua indeks yang diwakili oleh \, /atau X( #atau posisi non-diagonal ditolak)

\ # /
# X #
/ # \

Outputnya adalah:

[1,3,5,7,9]

Kasus uji:

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]

Tidak akan ada jawaban yang diterima. Saya ingin tahu kode terpendek untuk setiap bahasa.

sergiol
sumber
1
Pertanyaannya adalah menanyakan indeks (1-diindeks) dari karakter \, / dan X pada gambar. Bukan pertanyaan yang buruk, tetapi kurang penjelasan.
Arfie
Jika Anda bersedia memberikan penjelasan singkat dan jelas tentang apa yang Anda inginkan, Kami mungkin akan membuka kembali ini, karena itu bukan tantangan yang buruk. Sampai sekarang, ini sangat tidak jelas
Tn. Xcoder
Saya telah memilih untuk membuka kembali, meskipun Anda mungkin juga ingin memindahkan gambar ascii dari area contoh untuk menghindari kebingungan. Pada awalnya saya tidak yakin apakah saya harus memproduksinya juga (tapi saya mengerti output yang diinginkan hanyalah daftar indeks)
Arfie
7
Apakah pesanan itu penting?
Tn. Xcoder
9
FWIW Saya pikir memiliki pesanan tidak relevan mungkin membuat golf lebih menarik ...
Jonathan Allan

Jawaban:

10

Oktaf , 28 byte

@(n)find((I=eye(n))+flip(I))

Fungsi anonim yang memasukkan angka dan menghasilkan vektor kolom angka.

Cobalah online!

Luis Mendo
sumber
2
Sangat sederhana ... :)
Stewie Griffin
7

JavaScript (ES6), 48 byte

Menghasilkan daftar bilangan bulat yang dipisahkan tanda hubung sebagai string.

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

Diformat dan dikomentari

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

Uji kasus

Arnauld
sumber
Penanganan yang bagus, menggunakan tanda-tanda sebagai pemisah. Bisakah Anda menggunakan bitwsie &untuk menyimpan byte?
Shaggy
@ Shaggy Tidak, itu tidak akan berhasil. Misalnya: 4%3dan 4%5tidak memiliki 1-bit yang sama, tetapi keduanya tidak nol.
Arnauld
Yup, baru saja mengujinya n=5dan menemukan bahwa itu tidak akan berhasil.
Shaggy
k%~-n&&k%-~nharus bekerja. trik yang bagus dengan pemisah!
Titus
@Titus Bukannya itu benar-benar penting ketika datang ke golf tapi ... ya, itu mungkin sedikit lebih mudah dibaca. :-) (diperbarui)
Arnauld
7

R , 38 35 34 38 byte

3 byte disimpan ketika saya ingat tentang keberadaan whichfungsi ..., 1 byte disimpan berkat @Rift

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

+4 byte untuk argumen ec=Tketika dipanggil sebagai program penuh olehsource()

Cobalah online!

Penjelasan:

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
pengguna2390246
sumber
1
-1 byted=diag(n<-scan());which(d|d[n:1,])
Rift
Saat menjalankan ini sebagai program lengkap ( source) ini tidak mencetak apa pun. Anda harus menelepon cat. Lihat posting ini di meta .
JAD
@JarkoDubbeldam Cukup adil! Saya selalu bekerja atas dasar bahwa itu memberikan hasil yang valid pada TIO, tidak pernah benar-benar mempertimbangkan persyaratan untuk menjadi "program penuh".
user2390246
Meskipun saya tidak berencana untuk kembali dan mengedit semua jawaban lama saya untuk memperbaikinya!
user2390246
Agak kabur, karena lingkungan konsol R dan cuplikan kode menjadi cara utama menggunakannya. Jangan ragu untuk berbagi wawasan tentang utas meta yang saya tautkan. Itu belum menerima semua input sebanyak itu.
JAD
6

Jelly , 8 byte

⁼þ`+Ṛ$ẎT

Cobalah online!

Menggunakan algoritma Luis Mendo pada jawaban MATL-nya.

Erik the Outgolfer
sumber
Mhm, saya cukup terkejut Anda tidak menggunakannya ŒD.
Tn. Xcoder
@ Mr.Xcoder ŒDmelakukan sesuatu yang sama sekali berbeda dari X dengan ukuran tertentu.
Erik the Outgolfer
5

Oktaf , 41 37 byte

Ini bekerja di MATLAB juga. Tidak ada fungsi spesifik Oktaf yang licik :)

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

Cobalah online!

Penjelasan:

Alih-alih membuat matriks persegi, dan menemukan dua diagonal, saya pikir saya lebih suka menghitung diagonal secara langsung. Ini lebih pendek 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

Ini seperti apa, tanpa unique:

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

Ya, saya mungkin harus membalik urutan diagonal untuk membuatnya lebih ramah manusia.

Stewie Griffin
sumber
5

MATL , 6 byte

XytP+f

Cobalah online!

Penjelasan

Pendekatan yang sama dengan jawaban Oktaf saya.

Pertimbangkan input 3sebagai contoh.

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]

Pengindeksan linear adalah kolom-utama , berbasis 1. Untuk informasi lebih lanjut, lihat cuplikan ke-12 di sini .

Luis Mendo
sumber
Apa yang dimaksud dengan "transpos"?
Erik the Outgolfer
@EriktheOutgolfer Maaf, saya buruk. tduplikat, bukan transpos. Juga, saya telah menambahkan contoh yang berhasil
Luis Mendo
Luar biasa! Butuh dua putaran jika saya ingin mencapai ini.
mr5
@LuisMendo Saya curiga demikian, karena mentransposisikan matriks identitas tidak masuk akal ... hmm, saya berhasil menyimpan satu byte dengan algoritme Anda.
Erik the Outgolfer
4

Oktaf, 68 54 byte

Terima kasih kepada @Stewie Griffin karena telah menghemat 14 byte!

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

Cobalah online!

MATLAB, 68 byte

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

Penjelasan:

@(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.
Steadybox
sumber
@LuisMendo Terima kasih, Jimi adalah favorit saya.
Steadybox
4

Mathematica, 42 byte

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

Cobalah online!

@KellyLowder memindahkannya ke ..

Mathematica, 37 byte

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

dan @alephalpha membuang meja!

Mathematica, 34 byte

Union@@Range[{1,#},#^2,{#+1,#-1}]&
J42161217
sumber
##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&lebih pendek 5 byte
Kelly Lowder
Union@@Range[{1,#},#^2,{#+1,#-1}]&
alephalpha
2

Proton , 41 byte

n=>[i+1for i:0..n*n if!(i%-~n)or!(i%~-n)]

Cobalah online!

Tuan Xcoder
sumber
2

MATL , 14 byte

U:GeGXytPY|*Xz

Cobalah online!

Cinaski
sumber
6 byte
Luis Mendo
Wow! Silakan kirim, akhirnya saya akan menghapus milik saya
Cinaski
1
Saya akan mempostingnya jika Anda tidak akan memasukkannya ke dalam jawaban Anda; tetapi tidak perlu menghapus milik Anda
Luis Mendo
2

C (gcc) , 65 58 byte

-7 byte terima kasih kepada Titus!

f(n,i){for(i=0;i<n*n;i++)i%-~n&&i%~-n||printf("%d ",i+1);}

Cobalah online!

scottinet
sumber
1
i%-~n&&i%~-n||printf("%d ",i+1)(-7 byte)
Titus
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+"]";}

Cobalah online!

Perubahan di sini didasarkan pada pergeseran antar angka untuk ditemukan. Dua shift mulai dari 0 adalah n-1dan n+1, jadi jika n=5, angka untuk n-1akan 0,4,8,12,16,20dan untuk n+1akan 0,6,12,18,24. Menggabungkan ini dan memberikan 1-pengindeksan (bukan pengindeksan 0) memberi 1,5,7,9,13,17,19,21,25. Offset dari ndicapai menggunakan negasi bitwise (operasi komplemen bitwise), di mana~-n==n-1 dan -~n==n+1.

Versi lama

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}]";}

Cobalah online!

Pendekatan ini menggunakan indeks kolom dan baris untuk menentukan apakah angka ada di diagonal. i/nmemberikan indeks baris, dan i%nmemberikan indeks kolom.

Hanya Mengembalikan Array Angka

Jika membangun hanya nomor array dianggap diperhitungkan terhadap biaya byte, maka berikut ini dapat dilakukan, berdasarkan saran Dennis.Verweij (using System.Linq; menambahkan 18 byte tambahan):

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

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

Cobalah online!

Ayb4btu
sumber
Anda dapat mengurangi kode dengan menyingkirkan tambahan &. Tambahan &ada di sana hanya untuk mematahkan perbandingan jika input pertama adalah MSDN
Dennis.Verweij
sebenarnya Anda dapat memiliki 92 byte dengan menggunakan Linq Cobalah online!
Dennis.Verweij
@ Dennis. Verweij Rapi, saya tidak yakin seberapa besar saya bisa beralih ke header atau footer di TIO. Saya akan bermain-main dengan milik saya.
Ayb4btu
Anda harus ingat untuk menyertakan 18 byte untuk referensi ke linq (menggunakan System.Linq;) yang tidak menguntungkan, tetapi cara kerjanya: S
Dennis.Verweij
Ah, baiklah. Tapi itu tidak perlu using System;? (Saya menganggap membungkusnya dalam namespace System.Linqtidak valid?)
Ayb4btu
2

Javascript, 73 63 byte

versi lama

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

Disimpan 10 byte berkat @Shaggy

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

Pertama kali bermain golf! di sini berharap aku tidak mengacaukannya terlalu buruk.

Marco Lepore
sumber
Selamat datang di PPCG :) Solusi serupa dengan yang saya kerjakan (hanya milik saya yang terindeks 0). Anda mungkin dapat menyimpan beberapa byte dengan menggunakan yang berikut ini di filterfungsi Anda : !(--x%(n+1)&&x%(n-1))dan dengan membuat array Anda seperti ini:[...Array(n*n+1).keys()]
Shaggy
@Shaggy Terima kasih! Saya akan mencoba meningkatkan jawabannya dengan saran Anda segera setelah saya pulang kerja!
Marco Lepore
Sama-sama. Omong-omong: " ini sedikit lebih pendek daripada membuat [1...n*n]rentang denganArray(n*n).fill().map((x,i)=>i+1) " - [...Array(n*n)].map((_,y)=>y+1)adalah cara yang lebih pendek untuk melakukan itu, untuk referensi di masa mendatang.
Shaggy
Melakukan sedikit lebih banyak dengan itu dan berakhir dengan ini selama 56 byte:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy
@ Shaggy Saya mencoba versi terakhir Anda tetapi akan menghasilkan nol ekstra untuk f (1) dan f (2), ia bekerja dengan rentang [1 ... n * n] jadi saya menggunakan cara Anda menunjukkan kepada saya di komentar sebelumnya. Atau mungkin aku mengacaukannya?
Marco Lepore
1

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

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

Cobalah online!

Xcali
sumber
Tidakkah seharusnya `-n` menjadi +3?
sergiol
1
Tidak. Baris perintah yang diasumsikan adalah perl -e. Baris perintah untuk contoh ini adalah perl -ne. Itu perbedaan +1.
Xcali
1

Japt , 16 byte

Sepertinya tidak bisa melakukan lebih baik dari ini tetapi saya yakin itu mungkin Harus mengorbankan 2 byte untuk persyaratan yang tidak perlu yang kami gunakan 1-pengindeksan.

²õ f@´XvUÉ ªXvUÄ

Menguji

Shaggy
sumber
0

PHP, 56 54 + 1 byte

+1 byte untuk -Rbendera

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

mencetak angka yang diawali dengan tanda hubung. Jalankan sebagai pipa dengan -nRatau coba online .

membutuhkan PHP 5.6 atau lebih baru untuk **operator.
Tambahkan satu byte untuk PHP yang lebih lama: Ganti ;$z**.5<$n=$argndengan $z=$argn;$z<$n*$n.

Titus
sumber
0

Ruby, 45 byte

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

Bekerja secara internal sebagai nol diindeks. memeriksa apakah imodulo n+1atau n-10, jika dicetak i+1.

Level River St
sumber