Как распечатать приведенный ниже формат с наименьшим количеством байтов?


20

Этот вызов вдохновлен этим , теперь удаленным вопросом.


Возьмите положительное целое число N в качестве входных данных и выведите матрицу с числами 1 .. N 2, которая соответствует шаблону ниже:

Заполните первый ряд 1 ... N, затем заполните последний ряд (номер N ) (N + 1) .. 2N , затем заполните второй ряд (2N + 1) .. 3N и продолжайте, пока не заполните все ряды.

Выходной формат гибкий, поэтому список списков и т. Д. Принимаются.

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

Стандартные правила применяются. Кратчайший ответ в байтах на каждом языке выигрывает. Пояснения приветствуются как всегда.


Разрешено ли прерывать записи с ошибкой, если эта ошибка не распечатывается в STDOUT?
Сок

@ Так что да, это разрешено по умолчанию.
Мартин Эндер

1
Я предполагаю, что название взято из удаленного вопроса, но так как он не очень доступен для поиска (для поиска дубликатов и т. Д.), Можете ли вы изменить его на лучший?
user202729

1
Поскольку «выходной формат гибкий», могу ли я вывести одномерный массив с номерами, упорядоченными от строки к строке? (ex:) 1 2 3 7 8 9 4 5 6Является ли формат вывода таким гибким?
Оливье Грегуар

4
Решение APL, вероятно, представляет собой единый символ древнеперсидской клинописи.
Марк

Ответы:


7

05AB1E , 13 8 байт

Сохранено 5 байтов благодаря Rod

nLô«āÉÏ

Попробуйте онлайн!

объяснение

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

Рубин , 53 байта

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

Объяснение:

Сначала поместите все числа в один массив, затем нарежьте массив, пропуская строку для каждой итерации. После первой (n / 2 + n% 2) итерации пропустить нечего, а затем вернуть все оставшиеся строки назад.

Попробуйте онлайн!



4

JavaScript, 68 байт

Редактировать 3 байта сохранено, переправлено @ user71546

Сначала попробуйте, следуя очевидному маршруту: считайте от 1 и заполните массив с обеих сторон, от внешнего к внутреннему

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

Тестовое задание

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 сейчас 68
edc65


3

> <> , 51 + 3 = 54 47 байт

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

Попробуйте онлайн!

Ожидается ввод в начало стека при запуске программы с использованием -vфлага. Вывод состоит из не выровненных чисел, разделенных пробелами, а каждая строка отделяется одной новой строкой. Пример вывода для 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

... сопровождаемый единственным переводом строки. Программа завершается с ошибкой ( something smells fishy...), но это на STDERR, а не на STDOUT.

Explaination:

Первая строка просто хранит копию Nв реестре.

Вторая строка строит смещение для каждой выходной строки, вычитая 1 из N, умножая это на N, поворачивая его к основанию стека и затем обращая вспять весь стек. Когда число на вершине стека достигает 0, стек должен выглядеть следующим образом (пример использует N=5):

5 15 20 10 0 0

Третья строка отбрасывает дубликат 0с вершины стека.

Четвертая строка увеличивает вершину стека и выдает его копию. Затем берется мод N, и он используется для определения того, следует ли печатать пробел или символ новой строки, и следует ли отбрасывать верхнюю часть стека - если последний напечатанный номер равен x, то это x mod N == 0означает, что достигнут конец этой выходной строки. , Выполнение завершается, когда 1+выполняется на пустом стеке, вызывая ошибку завершения.

Предыдущая версия

Это явно проверило наличие пустого стека для завершения выполнения, и я также включил 3 байта для -vиспользования флага.

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

Попробуйте онлайн!


В соответствии с этой мета , мы больше не добавляем флаги к числу байтов, поэтому достаточно указать, что этот флаг используется.
Emigna

@ Emigna O_O спасибо за это! Спасибо за хедз-ап
Sok


2

Java (OpenJDK 9) , 101 байт

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

Попробуйте онлайн!

кредиты


1
Вы можете сохранить три байта, изменив положение j++: 102 байта
Кевин Круйссен

1
И еще один байт, изменяющийся n-i/2-1на n+~i/2 101 байт
Кевин Круйссен

@KevinCruijssen Спасибо! Я как-то разместил сырую версию, а не полностью гольфовую. Моя ошибка, первый вопрос был решен, но не второй. Но вы их написали, так что кредиты вам ;-)
Оливье Грегуар

Примечание: если как-то принимаются одномерные массивы,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;}
Оливье Грегуар

2

JavaScript (ES6), 69 68 байт

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

Ну, это превзошло все ожидания, прежде чем я смог опубликовать это, но здесь это все равно. Редактировать: 1 байт сохранен благодаря @KevinCruijssen.


n+n-i-1может быть n+n+~iдля -1 байта, так что вы снова столкнулись с другим ответом JavaScript. :)
Кевин Круйссен

@KevinCruijssen Блестящее спасибо!
Нил

2

Желе , 10 байт

²ss2Ṛj@/Fs

Попробуйте онлайн!

Как это устроено

²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 байт

│æ╘▐⌡r▌═∟Y

Запустите и отладьте его онлайн

Соответствующее представление ascii той же программы составляет 12 символов.

JRx/r{]+rFmJ

Вот как это работает.

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 байт

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

Попробуйте онлайн!

Спасибо Робину Райдеру за 4-байтовый гольф, который я затем сыграл в гольф.

Возвращает матрицу; конструирует matrixв последовательности, например [[1 2 3] [4 5 6] [7 8 9]], затем переупорядочивает строки.


66 байтов , избегая rbind.
Робин Райдер

@RobinRyder 59 байт - на мобильном телефоне, поэтому я отредактирую это позже
Джузеппе


1

Октава , 102 байта

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

Попробуйте онлайн!


Ницца! Я не знал, что у Октавы была команда. untilИ я не знал о vec2mat:( К сожалению, такой же длины: A=B=vec2mat(1:(n=input(''))*n,n):(
Стьюи Гриффин,

while j++<nтоже точно такой же длины ... Вы пробовали разные варианты или это просто совпадения?
Стьюи Гриффин

@StewieGriffin В этом случае whileцикл одинаковой длины, я пробовал оба способа. Часто do ... untilна один байт короче, чем while ... end.
Steadybox

1

C (gcc) , 110 байтов

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

Попробуйте онлайн!

Заполняет массив, чередуя 2 индекса для строк: один индекс начинается сверху, а второй - снизу. Индекс верхней строки начинается с 0 и увеличивается каждые 2 строки; индекс нижней строки начинается с n-1 и уменьшается каждые 2 строки.

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 ++ + Диапазон V3 , 159 байт

#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

Не считая 2 новых строки после using namespace range::view; они просто существуют, чтобы отделить импорт от лямбды.

Мягко интересный факт: это решение не выделяет кучу. Это решает проблему в O(1)космосе.


Объяснение:

  1. iota(1, n*n+1) -> [1 ... n*n]
  2. chunk(n): все nэлементы вместе, так[1 ... n] [n+1 ... 2*n] ...
  3. Позвони r
  4. r | stride(2)взять любой другой элемент: [1 ... n] [2*n+1...] ...
  5. объединить это с:
  6. r | reverse | drop(n % 2): reverse, затем отбросить [1 ... n]термин if, если nон нечетный (будет нечетное количество строк, и мы хотим напечатать первый термин только один раз). Кажется, что я должен быть в состоянии просто сделать r | reverse | take, но это почему-то не работает.
  7. stride(2)снова возьмите все остальные элементы. На этот раз все наоборот.

Более читаемый и тестируемый:

#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)) для хранения ввода, если измеряется в битовой сложности.
user202729

@ user202729 Не уверены, что вы имеете в виду. Вы говорите, что для int n, мне нужны log(n)биты для хранения ввода? Но в любом случае это входные данные, и мы имеем дело с intwhere sizeof(int) == 4(большинством систем), так что это постоянное число байтов, используемых независимо от входных данных.
Джастин




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.