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.


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:



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


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

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


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.


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 .


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.

@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}]&

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&lebih pendek 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+"]";}

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!


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.


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!


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



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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.