Bagaimana cara mencetak format di bawah ini dalam byte paling sedikit?


20

Tantangan ini terinspirasi oleh ini , pertanyaan sekarang dihapus.


Ambil bilangan bulat positif N sebagai input, dan output matriks dengan angka 1. .. N 2 yang mengikuti pola di bawah ini:

Isi baris pertama dengan 1 .. N lalu isi baris terakhir (nomor baris N ) dengan (N + 1) .. 2N , lalu isi baris kedua dengan (2N + 1) .. 3N dan lanjutkan sampai Anda telah mengisi semua baris.

Format output fleksibel, jadi daftar daftar dll diterima.

N = 1
1

N = 2
1  2
3  4

N = 3
1  2  3
7  8  9
4  5  6

N = 4
 1  2  3  4
 9 10 11 12
13 14 15 16
 5  6  7  8

N = 5
 1  2  3  4  5
11 12 13 14 15
21 22 23 24 25
16 17 18 19 20
 6  7  8  9 10

Aturan standar berlaku. Jawaban terpendek dalam byte di setiap bahasa menang. Penjelasan didorong seperti biasa.


Apakah entri diperbolehkan untuk diakhiri dengan kesalahan, selama kesalahan itu tidak dicetak ke STDOUT?
Sok

@ Oke ya, itu diizinkan secara default.
Martin Ender

1
Saya kira judulnya diambil dari pertanyaan yang dihapus, tetapi karena tidak terlalu dapat ditelusuri (untuk menemukan dupe, dll.), Dapatkah Anda mengubahnya menjadi yang lebih baik?
user202729

1
Karena "format output fleksibel", dapatkah saya menampilkan array satu dimensi dengan angka yang dipesan dari baris ke baris? (mis .:) 1 2 3 7 8 9 4 5 6Apakah format output fleksibel?
Olivier Grégoire

4
Solusi APL mungkin merupakan karakter tunggal dari huruf kuno Persia Tua.
Mark

Jawaban:


7

05AB1E , 13 8 byte

Disimpan 5 byte berkat Rod

nLô«āÉÏ

Cobalah online!

Penjelasan

n           # push input^2
 L          # push range [1 ... input^2]
  ô         # split into pieces each the size of the input
   «       # append the reverse of this 2D-list
     ā      # push range [1 ... len(list)]
      É     # check each element for oddness
       Ï    # keep only the elements in the 2D list which are true in this list

5

Ruby , 53 byte

->n{r=*1..n*n;n.times{|x|p r.slice!(r[x*=n]?x:-n,n)}}

Penjelasan:

Masukkan semua angka ke dalam array tunggal terlebih dahulu, kemudian iris array melewati garis untuk setiap iterasi. Setelah iterasi pertama (n / 2 + n% 2) tidak ada yang tersisa untuk dilewati, kemudian dapatkan semua garis yang tersisa mundur.

Cobalah online!



4

JavaScript, 68 byte

Sunting 3 byte yang disimpan, dibuat oleh @ user71546

Pertama coba, ikuti rute yang jelas: hitung dari 1 dan isi larik dari kedua sisi, dari luar ke dalam

n=>(v=0,q=[...Array(n)]).map((_,i)=>q[i&1?--n:i/2]=q.map(_=>++v))&&q

Uji

var F=
n=>(v=0,q=[...Array(n)]).map((_,i)=>q[i&1?--n:i/2]=q.map(_=>++v))&&q

function test() {
  var n=+N.value;
  O.innerHTML = '<tr><td>'
  +F(n).map(r=>r.join('</td><td>')).join('</td></tr><tr><td>')
  +'</td></tr>'
}

test()
#O { margin: 1em }
td { text-align: right }
<input id=N type=number min=1 value=5 oninput='test()'>
<table id=O>



1
@ user71546 sekarang 68
edc65

3

Haskell , 62 byte

(0#)
m#n|m>=n^2=[]|k<-m+n=[m+1..k]:(k+n)#n++[[k+1..k+n]|k<n^2]

Cobalah online! Output adalah daftar daftar, misalnya (0#) 3hasil [[1,2,3],[7,8,9],[4,5,6]].


3

> <> , 51 + 3 = 54 47 byte

:&v
?!\1-:&:&*}}r:
 ~\
!~>1+::n&:&%:a84*@@?$~o?

Cobalah online!

Input diharapkan di atas tumpukan saat program mulai menggunakan -vbendera. Output terdiri dari angka-angka yang tidak sejajar yang dipisahkan oleh spasi tunggal, dan setiap baris dipisahkan oleh satu baris baru. Contoh output untuk N=5:

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

... diikuti oleh satu baris baru. Program berakhir dengan kesalahan ( something smells fishy...), tetapi itu ada di STDERR dan bukan STDOUT.

Penjelasan:

Baris pertama hanya menyimpan salinan Ndalam register.

Baris kedua membangun offset untuk setiap baris output dengan mengurangi 1 dari N, mengalikannya dengan N, memutarnya ke bagian bawah tumpukan dan kemudian membalikkan seluruh tumpukan. Ketika jumlah di atas tumpukan mencapai 0, tumpukan akan terlihat seperti ini (contoh menggunakan N=5):

5 15 20 10 0 0

Baris ketiga membuang duplikat 0dari atas tumpukan.

Baris keempat menambah bagian atas tumpukan dan mengeluarkan salinannya. Ini kemudian diambil mod N, dan ini digunakan untuk memutuskan apakah spasi atau baris baru harus dicetak, dan jika bagian atas tumpukan harus dibuang - jika nomor terakhir yang dicetak x, maka x mod N == 0menunjukkan bahwa akhir dari baris keluaran telah tercapai. . Eksekusi berakhir ketika 1+dieksekusi di tumpukan kosong, melempar kesalahan terminasi.

Versi sebelumnya

Ini secara eksplisit memeriksa tumpukan kosong untuk mengakhiri eksekusi, dan saya juga memasukkan 3 byte untuk -vpenggunaan flag.

:&v
?!\1-:&:&*}}r:
 ~\
!;>1+::n&:&%:a84*@@?$~o?!~l?

Cobalah online!


Menurut meta ini , kami tidak lagi menambahkan flag ke byte byte sehingga cukup bahwa Anda menentukan flag yang digunakan.
Emigna

@Emigna O_O syukurlah untuk itu! Terima kasih atas perhatiannya
Sok


2

Java (OpenJDK 9) , 101 byte

n->{int x[][]=new int[n][n],i=0,j;for(;i<n;i++)for(j=0;j<n;)x[i%2<1?i/2:n+~i/2][j]=++j+i*n;return x;}

Cobalah online!

Kredit


1
Anda dapat menyimpan tiga byte dengan mengubah posisi j++: 102 byte
Kevin Cruijssen

1
Dan byte lain berubah n-i/2-1menjadi n+~i/2 101 byte
Kevin Cruijssen

@KevinCruijssen Terima kasih! Saya entah bagaimana memposting versi mentah, bukan yang sepenuhnya golf. Kesalahan saya, masalah pertama ditangani, tetapi bukan yang kedua. Tapi Anda yang menulisnya, jadi kredit untuk Anda ;-)
Olivier Grégoire

Catatan: jika entah bagaimana array satu dimensi diterima,n->{int i=n*n,x[]=new int[i],r;for(;i-->0;x[(r%2<1?r/2:n+~r/2)*n+i%n]=i+1)r=i/n;return x;}
Olivier Grégoire

2

JavaScript (ES6), 69 68 byte

n=>[...Array(n)].map((_,i,a,j=((i*=2)<n?i:n+n+~i)*n)=>a.map(_=>++j))

Ya sudah kalah sebelum saya bisa mempostingnya tapi ini dia. Sunting: Disimpan 1 byte berkat @KevinCruijssen.


n+n-i-1bisa n+n+~idengan -1 byte, jadi Anda harus menjawab dengan jari JavaScript lainnya. :)
Kevin Cruijssen

@KevinCruijssen Cemerlang terima kasih!
Neil

2

Jelly , 10 byte

²ss2Ṛj@/Fs

Cobalah online!

Bagaimana itu bekerja

²ss2Ṛj@/Fs  Main link. Argument: n

²           Square; yield n².
 s          Split; promote n² to [1, ..., n²] and split it into chuks of length n.
  s2        Split 2; generate all non-overlapping pairs of chunks.
            If n is odd, this leaves a singleton array at the end.
    Ṛ       Reverse the order.
     j@/    Reduce by join with reversed arguments.
            In each step, this places the first and second element of the next pair
            at the top and bottom of the accumulator.
        Fs  Flatten and split to restore the matrix shape.

2

Stax , 10 byte

│æ╘▐⌡r▌═∟Y

Jalankan dan debug secara online

Representasi ascii yang sesuai dari program yang sama adalah 12 karakter.

JRx/r{]+rFmJ

Begini cara kerjanya.

JR              range [1 .. x^2] where x=input
  x/            split into subarrays of size x
    r           reverse
     {   F      for each subarray, execute block
      ]+r       concat array, and reverse result
          m     for each row, output ...
           J        each subarray joined by spaces


2

R , 70 59 47 byte

function(n)matrix(1:n^2,n,,T)[c(1:n,n:1)*!0:1,]

Cobalah online!

Terimakasih untuk Robin Ryder untuk golf 4 byte, yang kemudian saya mainkan lebih lanjut.

Mengembalikan matriks; membangun matrixurutan, misalnya [[1 2 3] [4 5 6] [7 8 9]], kemudian mengatur ulang baris.


66 byte dengan menghindari rbind.
Robin Ryder

@RobinRyder 59 byte - di ponsel jadi saya akan mengeditnya nanti
Giuseppe

1

Python 2 , 72 68 63 byte

-4 byte terima kasih kepada Neil

def f(n):w=zip(*[iter(range(1,n*n+1))]*n);print(w+w[::-1])[::2]

Cobalah online!


Saya berasumsi Anda dapat menyimpan 4 byte dengan menghilangkan xvariabel perantara ?
Neil

1

Oktaf , 102 byte

n=input('');A=B=vec2mat(1:n*n,n);i=j=0;do
B(++i,:)=A(++j,:);if++j<n
B(n-i+1,:)=A(j,:);end;until j>=n
B

Cobalah online!


Bagus! Saya tidak tahu Octave punya untilperintah. Dan saya tidak tahu tentang vec2mat:( Sayangnya panjangnya sama: A=B=vec2mat(1:(n=input(''))*n,n):(
Stewie Griffin

while j++<npanjangnya juga persis sama ... Sudahkah Anda mencoba berbagai opsi atau hanya kebetulan?
Stewie Griffin

@StewieGriffin Dalam hal ini whileloop adalah panjang yang sama, saya mencoba keduanya. Namun, sering do ... untilsatu byte lebih pendek dari while ... end.
Steadybox

1

C (gcc) , 110 byte

i,c,t,b;f(a,n)int*a;{for(b=n-1;i<n*n;t++,b--){for(c=0;c<n;)a[t*n+c++]=++i;for(c=0;c<n&i<n*n;)a[b*n+c++]=++i;}}

Cobalah online!

Mengisi array dengan bergantian antara 2 indeks untuk baris: satu indeks mulai dari atas dan satu mulai dari bawah. Indeks baris atas dimulai pada 0 dan bertambah setiap 2 baris; indeks baris bawah dimulai pada n-1 dan dikurangi setiap 2 baris.

Tidak Terkumpul:

void f(int* a, int n)
{
    //i = value to be written [1,n]; c = column index; t = top row index; b = bottom row index
    for(int i=1, c=0, t=0, b=n-1;
        i <= n*n; //when i = n*n, we have written all the values and we're done
        t++, b--) //t increments every 2 rows, b decrements every 2 rows
    {
        //write out 2 rows per loop

        //first row: fill out row at t
        for(c=0; c<n; c++, i++)
            a[t*n+c]=i;

        //second row: fill out row at b
        //this step will be skipped on the final loop for odd values of n, hence the (i<=n*n) test
        for(c=0; c<n && i<=n*n; c++, i++) 
            a[b*n+c]=i;
    }
}

1

C ++ + Rentang V3 , 159 byte

#include<range/v3/all.hpp>
using namespace ranges::view;

[](int n){auto r=iota(1,n*n+1)|chunk(n);return concat(r|stride(2),r|reverse|drop(n%2)|stride(2));}

Langsung di Wandbox

Tidak menghitung 2 baris baru setelah using namespace range::view; mereka hanya di sana untuk memisahkan impor dari lambda.

Fakta yang agak menarik: solusi ini tidak membuat alokasi tumpukan. Ini memecahkan masalah di O(1)luar angkasa.


Penjelasan:

  1. iota(1, n*n+1) -> [1 ... n*n]
  2. chunk(n): setiap nelemen bersama, jadi[1 ... n] [n+1 ... 2*n] ...
  3. Sebut itu r
  4. r | stride(2): ambil setiap elemen lainnya: [1 ... n] [2*n+1...] ...
  5. menggabungkannya dengan:
  6. r | reverse | drop(n % 2): mundur, lalu turunkan [1 ... n]istilah jika nganjil (akan ada jumlah ganjil baris dan kami hanya ingin mencetak istilah pertama sekali). Sepertinya saya seharusnya bisa melakukannya r | reverse | take, tetapi itu tidak berhasil karena suatu alasan.
  7. stride(2)lagi, ambil setiap elemen lainnya. Kali ini terbalik.

Lebih mudah dibaca, dan dapat diuji:

#include <range/v3/all.hpp>
using namespace ranges::view;

auto f(int n)
{
    auto rows = iota(1, n * n + 1)
        | chunk(n);
    return concat(
        rows | stride(2),
        rows
            | reverse
            | drop(n % 2)
            | stride(2));
}

#include <iostream>
int main(int argc, char** argv)
{
    std::cout << "N = " << argc << '\n';
    auto res = f(argc);

    for (auto const& row : res | bounded) {
        for (auto const& elem : row | bounded) {
            std::cout << elem << ' ';
        }
        std::cout << '\n';
    }
}

O (log (n)) untuk menyimpan input, jika diukur dalam kompleksitas bit.
user202729

@ user202729 Tidak yakin apa yang Anda maksud. Apakah Anda mengatakan bahwa untuk int n, saya perlu log(n)bit untuk menyimpan input? Tapi itu inputnya, dan kita berurusan dengan di intmana sizeof(int) == 4(kebanyakan sistem), jadi itu adalah jumlah byte yang konstan yang digunakan terlepas dari inputnya.
Justin



0

C (gcc) 80 78

Saya melihat sekarang solusi ini salah

i;f(n){for(i=0;i++<n*n;printf("\n%3d"+!!(~-i%n),i>n?n+(i+n>n*n?i%n?:n:i):i));}

Cobalah online!


0

C (gcc) , 36 + 8 + 61 = 105 byte

kompilasi dengan -Dp=printf("%d ",i),i++%n;);puts("") -Dq=i,n)

f(q{g(1,i);}g(q{for(;p;i<n*n&&h(q;}h(q{for(n+i<n*n&&g(n+q;p;}

Cobalah online!

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.