Aşağıdaki formatı en az bayt ile nasıl yazdırabilirim?


20

Bu zorluk esinlenerek bu , şimdi silinmiş soruya.


Giriş olarak pozitif bir tamsayı N alın ve aşağıdaki deseni izleyen 1 .. N 2 sayılarıyla bir matris verin :

İlk satırı 1 .. N ile doldurun, ardından son satırı (satır numarası N ) (N + 1) .. 2N ile doldurun, ardından ikinci satırı (2N + 1) .. 3N ile doldurun ve dolana kadar devam edin tüm satırlar.

Çıktı biçimi esnektir, bu nedenle liste listesi vb. Kabul edilir.

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

Standart kurallar geçerlidir. Her dilde bayt cinsinden en kısa cevap kazanır. Açıklamalar her zaman olduğu gibi teşvik edilir.


Bu hata STDOUT'a yazdırılmadığı sürece girişlerin bir hata ile sonlanmasına izin veriliyor mu?
Sok

@ Evet, varsayılan olarak buna izin verilir.
Martin Ender

1
Sanırım başlık silinen sorudan alınır, ancak çok aranabilir olmadığından (dupe vb. Bulmak için), daha iyi bir soruya geçebilir misiniz?
user202729

1
"Çıktı formatı esnek" olduğundan, satırlar arası sıralı numaralarla tek boyutlu bir dizi çıktısı alabilir miyim? (ör .:) 1 2 3 7 8 9 4 5 6Çıktı biçimi bu kadar esnek mi?
Olivier Grégoire

4
APL çözümü muhtemelen Eski Farsça çiviyazısının tek bir karakteridir.
Mark

Yanıtlar:


7

05AB1E , 13 8 bayt

Rod sayesinde 5 bayt tasarruf edildi

nLô«āÉÏ

Çevrimiçi deneyin!

açıklama

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

Yakut , 53 bayt

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

Açıklama:

Önce tüm sayıları tek bir diziye koyun, ardından her yineleme için bir satırı atlayarak diziyi dilimleyin. İlk (n / 2 + n% 2) yinelemelerden sonra atlanacak hiçbir şey kalmaz, sonra kalan tüm satırları geriye doğru alır.

Çevrimiçi deneyin!



4

JavaScript, 68 bayt

Düzenleme 3 @ user71546 tarafından whetted, kaydedilmiş bayt

İlk olarak , açık rotayı takip edin: 1'den sayın ve diziyi her iki taraftan, dıştan içe doğru doldurun

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

Ölçek

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 Şimdi 68
edc65


3

> <> , 51 + 3 = 54 47 bayt

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

Çevrimiçi deneyin!

-vBayrağı kullanarak program başlangıcında yığının üstünde giriş beklenir . Çıktı, tek boşlukla ayrılmış hizalanmamış sayılardan oluşur ve her satır tek bir satırsonu ile ayrılır. Örnek çıktı 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

... ardından tek bir satırsonu. Program bir hata ( something smells fishy...) ile sona erer , ancak STDOUT yerine STDERR üzerindedir.

Açıklama:

İlk satır sadece bir kopyasını Nkayıt defterinde saklar .

İkinci satır, her bir çıkış satırı için ofseti 1'den çıkararak N, bunu çarparak N, yığının altına döndürerek ve ardından tüm yığını ters çevirerek oluşturur. Yığının üstündeki sayı 0'a ulaştığında, yığın şöyle görünmelidir (örnek kullanımlar N=5):

5 15 20 10 0 0

Üçüncü satır, kopyayı 0yığının üstünden atar .

Dördüncü satır yığının tepesini arttırır ve bir kopyasını çıkarır. Bu, daha sonra mod alınır N, ve bu da bir boşluk veya satır basılmalıdır karar vermek için kullanılır, ve yığının üst atılmalıdır - eğer basılan son sayı ise x, o zaman x mod N == 0bu çıkış olan uç ulaşıldığını gösterir . Yürütme 1+, boş bir yığın üzerinde yürütüldüğünde sonlandırma hatasını atarak sona erer.

Önceki versiyon

Bu açıkça yürütmeyi bitirmek için boş bir yığın için kontrol ve ben de -vbayrak kullanımı için 3 bayt dahil .

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

Çevrimiçi deneyin!


Bu metaya göre , bayt sayısına artık bayrak eklemiyoruz, bu nedenle bayrağın kullanıldığını belirtmeniz yeterli.
Emigna

@Emigna O_O bunun için çok şükür!
Sok


2

Java (OpenJDK 9) , 101 bayt

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

Çevrimiçi deneyin!

Kredi


1
Konumunu değiştirerek üç bayt kaydedebilirsiniz j++: 102 bytes
Kevin Cruijssen

1
Ve değişen başka bayt n-i/2-1için n+~i/2 101 bayt
Kevin Cruijssen

@KevinCruijssen Teşekkürler! Ben bir şekilde ham sürümünü yayınladım, tamamen golf olanı değil. Benim hatam, ilk sorun ele alındı, ama ikincisi değil. Ama sen onları yazdın, bu yüzden sana kredi ;-)
Olivier Grégoire

Not: bir şekilde tek boyutlu diziler kabul edilirse,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 bayt

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

Göndermeden önce çok iyi geçti ama yine de burada. Düzenleme: @KevinCruijssen sayesinde 1 bayt kaydedildi.


n+n-i-1olabilir n+n+~iböylece sonra tekrar ayak tırnağa diğer JavaScript cevap vardır için -1 byte. :)
Kevin Cruijssen

@KevinCruijssen Harika teşekkürler!
Neil

2

Jöle , 10 bayt

²ss2Ṛj@/Fs

Çevrimiçi deneyin!

Nasıl çalışır

²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 bayt

│æ╘▐⌡r▌═∟Y

Çevrimiçi çalıştırın ve hata ayıklayın

Aynı programın ilgili ascii temsili 12 karakterdir.

JRx/r{]+rFmJ

İşte böyle.

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 bayt

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

Çevrimiçi deneyin!

Robin Ryder için ben daha sonra golf 4 bayt golf için teşekkürler .

Bir matris döndürür; inşa matrixdizisi, örneğin, [[1 2 3] [4 5 6] [7 8 9]]daha sonra satır yeniden düzenler.


Kaçınarak 66 baytrbind .
Robin Ryder

@RobinRyder 59 bayt - mobil cihazda bu yüzden daha sonra değiştireceğim
Giuseppe

1

Python 2 , 72 68 63 bayt

Neil sayesinde -4 bayt

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

Çevrimiçi deneyin!


Ara xdeğişkeni ortadan kaldırarak 4 bayt tasarruf edebileceğinizi varsayıyorum ?
Neil

1

Oktav , 102 bayt

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

Çevrimiçi deneyin!


Güzel! Octave'nin bir untilemri olduğunu bilmiyordum.Ve bilmiyordum vec2mat:( Ne yazık ki aynı uzunluk: A=B=vec2mat(1:(n=input(''))*n,n):(
Stewie Griffin

while j++<naynı uzunluktadır ... Çeşitli seçenekleri denediniz mi yoksa bunlar sadece tesadüf mü?
Stewie Griffin

@StewieGriffin Bu durumda whiledöngü aynı uzunlukta, ben her iki şekilde denedim. Yine de genellikle do ... untilbir bayt daha kısadır while ... end.
Steadybox

1

C (gcc) , 110 bayt

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

Çevrimiçi deneyin!

Bir diziyi satırlar için 2 dizin arasında değiştirerek doldurur: bir dizin yukarıdan başlayıp bir dizin aşağıdan başlayarak. Üst sıra endeksi 0'dan başlar ve her 2 satırda bir artırılır; alt sıra endeksi n-1'de başlar ve her 2 satırda bir azaltılır.

Ungolfed:

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 ++ + Aralık V3 , 159 bayt

#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));}

Wandbox'ta Canlı

Sonrasındaki 2 yeni satırı saymamak using namespace range::view; ithalatı lambda'dan ayırmak için oradalar.

Hafif ilginç bir gerçek: bu çözüm herhangi bir yığın tahsisi yapmaz. O(1)Uzayda problemi çözer .


Açıklama:

  1. iota(1, n*n+1) -> [1 ... n*n]
  2. chunk(n): her nelement birlikte, yani[1 ... n] [n+1 ... 2*n] ...
  3. Ara r
  4. r | stride(2): diğer tüm öğeleri al: [1 ... n] [2*n+1...] ...
  5. bunu ile birleştirin:
  6. r | reverse | drop(n % 2): tersten, daha sonra [1 ... n]terimi ntekse yazın (tek sayıda satır olur ve yalnızca ilk terimi bir kez yazdırmak isteriz). Sadece yapabilmem gerekir gibi görünüyor r | reverse | take, ama bu bir sebepten dolayı işe yaramıyor.
  7. stride(2)tekrar, diğer tüm unsurları ele alalım. Bu sefer ters.

Daha okunabilir ve test edilebilir:

#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';
    }
}

Bit karmaşıklığı ölçülürse girişi saklamak için O (log (n)).
user202729

@ user202729 Ne demek istediğinizden emin değilim. Bir için int n, log(n)girdiyi saklamak için bitlere ihtiyacım var mı diyorsun ? Ama yine de bu girdi ve biz bir intyerde sizeof(int) == 4(çoğu sistem) ele alıyoruz , bu yüzden girdiden bağımsız olarak kullanılan sabit bayt sayısı.
Justin




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.