Ідеальні квадрати без кордонів


16

Дано n=m^2, поверніть список цілих чисел, які не межують із m x mсіткою цілих чисел 1 to n.

Приклади

n = 1 (m = 1)

Сітка:

[1]

Повернення:

[]

n = 4 (m = 2)

Сітка:

[1,2]
[3,4]

Повернення:

[]

n = 9 (m = 3)

Сітка:

[1,2,3]
[4,5,6]
[7,8,9]

Повернення:

[5]

n = 16 (m = 4)

Сітка:

[ 1, 2, 3, 4]
[ 5, 6, 7, 8]
[ 9,10,11,12]
[13,14,15,16]

Повернення:

[6,7,10,11]

Для більш високих значень m, цей відповідь робить велику візуалізацію.


Правила:

  • Ви можете взяти будь-який mабо n(де n = m*m).
    • Якщо брати в nвас можуть не мати невизначений поведінка , де існує не mдля n(EG 15).
    • n > 0, m > 0: Обоє повинні бути цілими значеннями.
  • Вихід може бути у вигляді 1D / 2D масиву, матриці або пробілів з обмеженим пробілом
  • Вихід повинен бути в порядку від найменшого до найбільшого.
    • Якщо виводити як матрицю, це означає, що вона повинна бути такою, якою вона була б у сітці.
  • Це , виграє найменший байт.

Повна помилка в моєму кінці, я прочитав її неправильно.
DevelopingDeveloper

3
@DevelopingDeveloper Ей, людина, якби я мав лайк щоразу, коли робив це, я міг би купити пиво-два.
Чарівний восьминіг Урна

Якщо виводиться як двовимірний масив, чи може в результаті бути включений один порожній масив?
Кудлатий

Відповіді:




6

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

@(m)find((t=[0:m-2 0])'*t)

Код визначає анонімну функцію, яка вводить m і виводить (можливо, порожній) вектор стовпця.

Спробуйте в Інтернеті!

Пояснення

@(m)                          % Define anonymous function of m
          t=[0:m-2 0]         % Build row vector [0 1 2 ... m-2 0] and assign it
                              % to variable t
         (           )'       % Complex-conjugate transpose into a column vector
                       *t     % Matrix-multiply that column vector times the row
                              % vector t. This gives an m×m matrix with zeros in
                              % the border and nonzeros in the other entries.
    find(                )    % Linear indices of nonzero entries. The result is
                              % in increasing order

5

Желе , 8 байт

’Ṗ×+€ṖḊ€

Монадійне посилання, що приймає mта повертає список списків (внутрішні рядки).

Спробуйте в Інтернеті!

Як?

’Ṗ×+€ṖḊ€ - Link m                    e.g. 5
’        - decrement                      4
 Ṗ       - pop (implicit range of input)  [1,2,3]
  ×      - multiply by m                  [5,10,15]
     Ṗ   - pop m                          [1,2,3,4]
   +€    - add €ach                       [[6,7,8,9],[11,12,13,14],[16,17,18,19]]
      Ḋ€ - dequeue €ach                   [[7,8,9],[12,13,14],[17,18,19]]

Не відчував, як робити пітон;)?
Чарівний восьминіг Урна



4

R , 44 43 32 байт

function(n)(x=n:(n^2-n))[x%%n>1]

Спробуйте в Інтернеті!

Повертає вектор.


Охайний вихідний формат, це за замовчуванням як матриця виводиться в R?
Magic Octopus Urn

1
Так, це printфункція для matrix.
Джузеппе

1
Ви можете опустити другий mу matrix(1:m^2,m,m,T):matrix(1:m^2,m,,T)
JAD

@JAD так, звичайно. Спасибі.
Джузеппе

Гарний, що ви думаєте про використання scan ()? Ви можете зберегти 2 байти. Спробуйте в Інтернеті!
Роберт Хакен

3

Желе , 8 байт

sƽḊṖ$⁺€

Спробуйте в Інтернеті!


Використовуючи mодин, можна також зробити ²s⁸ḊṖ$⁺€. (Я також розмістив ще один mальтернативний метод.)
Джонатан Аллан

@JonathanAllan Вже виявив, що, але не зберігаючи байтів там, ви не зможете видалити :(
Ерік Outgolfer

3

Протон , 28 байт

k=>filter(u=>1<u%k,k..k*~-k)

Спробуйте в Інтернеті!

Приймає m як вхідний.

Як?

Фільтрує цілі числа в [k, k 2 -k), які, поділяючись на k , дають залишок вище 1 . Це забезпечує обрізання обох кінців, оскільки перший дає 0, а останній - 1 . Також гарантується повернення більш високого значення для будь-якого дійсного цілого числа, оскільки вони є послідовними.







2

MATL , 8 байт

:G\1>&*f

Введення є m. Вихід - це числа в порядку зростання.

Спробуйте в Інтернеті!

Пояснення

Розглянемо вклад 4як приклад.

:     % Implicit input: m. Push range [1 2 ... m-1 m]
      % STACK: [1 2 3 4]
G\    % Modulo m, element-wise
      % STACK: [1 2 3 0]
1>    % Greater than 1, element-wise.
      % STACK: [0 1 1 0]
&*    % Matrix of pair-wise products
      % STACK: [0 0 0 0;
                0 1 1 0;
                0 1 1 0;
                0 0 0 0]
f     % Column vector of linear indices of nonzeros. Implicit display
      % STACK: [ 6;
                 7;
                10;
                11]


2

Пакет, 85 байт

@for /l %%i in (3,1,%1)do @for /l %%j in (3,1,%1)do @cmd/cset/a(%%i-2)*%1+%%j-1&echo(

Я не можу легко перетворити цикл на 2на, m-1тому я переходжу 3до mта налаштовую в обчисленні.




2

Japt, 12 байт

Я витратив так довго на гольф, щоб видобути елементи, що мені не вистачило часу на те, щоб пограти в покоління масиву. Я також лише зараз помічаю, що nзамість цього ми можемо взяти вклад, щоб я міг щось там зберегти. Потрібно переглянути ...

òUnU²)òU m¤c

Спробуй це


Пояснення

                 :Implicit input of integer U=m     :e.g., 4
   U²            :U squared                         :16
 Un              :Minus U                           :12
ò                :Range [U,U**2-U]                  :[4,5,6,7,8,9,10,11,12]
      òU         :Partitions of length U            :[[4,5,6,7],[8,9,10,11],[12]]
         m       :Map
          ¤      :  Remove first 2 elements         :[[6,7],[10,11],[]]
           c     :Flatten                           :[6,7,10,11]

2

J , 23 19 байт

-4 байти завдяки FrownyFrog!

1 1}:@}.-@%:}:\1+i.

Спробуйте в Інтернеті!

Моє оригінальне масло:

J , 23 байти

[:|:@}:@}.^:2-@%:]\1+i.

Приймає n як вхід, повертає матрицю

Як це працює

1+i. - формує список 1..n

-@%: - знаходить квадратний корінь n і заперечує його (m)

]\ - робить таблицю (матрицю) mxm зі списку

^:2 - зробіть наступне двічі:

|:@}:@}. - упустити перший рядок, потім випустити останній ряд, потім перенести

[: - кришка виделкою

Спробуйте в Інтернеті!


1}:@}.-@%:}.@}:\1+i.
FrownyFrog

1
Ні,1 1}:@}.-@%:}:\1+i.
FrownyFrog

@FrownyFrog - Класно, дякую! Я не знав про аргумент списку зліва}.
Гален Іванов

2

Лушпиння , 9 байт

‼ȯTthS↑CN

Спробуйте в Інтернеті!

Пояснення

‼ȯTthS↑CN  Implicit input, say m=4.
       CN  Cut the natural numbers by m: [[1,2,3,4],[5,6,7,8],[9,10,11,12],..
     S↑    Take first m lists: [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
‼ȯ         Do this twice:
    h       Remove last row,
   t        remove first row,
  T         transpose.
           Result is [[6,7],[10,11]]; print it implicitly.

2

Japt , 14 байт

²õ òU ÅkJ ®ÅkJ

Приймає mяк вхід

Пояснення

 ²õ òU ÅkJ ®ÅkJ                                      
                // U = input                         | 3
U²              // U squared                         | 9
  õ             // Range [1...U²]                    | [1,2,3,4,5,6,7,8,9]
    òU          // Cut into slices of U              | [[1,2,3],[4,5,6],[7,8,9]]
       Å        // Remove the first item             | [[4,5,6],[7,8,9]]
        kJ      // Remove the last item              | [[4,5,6]]
           ®    // Map:                              |
            ÅkJ //   Remove the first and last items | 5     

Спробуйте в Інтернеті!


Рішення, яке потрібно n, також становить 14 байт:

õ òU¬ ÅkJ ®ÅkJ

Спробуйте в Інтернеті!


2

TI-BASIC, 44 43 байт (токенізований)

DC 4D 3F CE 4D 6D 32 3F CF 3F DE 2A 08 09 3F D0 3F 4D 71 32 3F 23 4D 70 32 70 58 70 32 B1 58 83 72 11 2B 58 2B 30 2B 72 0D 71 31

Читаема версія:

:Input M
:If M≤2
:Then
:Disp "{}
:Else
:M-2
:seq(M+2+X+2int(X/Ans),X,0,Ans²-1

На жаль, потрібно було друкувати порожні списки вручну, оскільки TI-BASIC зазвичай цього не дозволяє. Якщо mвони отримали більше двох, код можна було б зменшити до всього 29 байт .





1

Піт , 13 байт

ĐĐ⁻⁻ř*⇹⁻⁻ř⁺ɐ+

Відповідь «Порт Джонатана Аллана»

Пояснення:

                    Implicit input (takes m)
ĐĐ                  Triplicate the input (push it on the stack two more times)
  ⁻⁻                Decrement top of stack twice
    ř               Push [1,2,...,m-2]
     *              Multiplies by m
      ⇹             Swaps top two items on stack
       ⁻⁻           Decrement (m-2 is now on top)
         ř          Push [1,2,...,m-2]
          ⁺         Increment each element by 1
           ɐ+       Add [2,3,...,m-1] to each element of [m,2m,...,m(m-2)]
                    Implicit print

Спробуйте в Інтернеті!


1

Python, 111 bytes

def f(s):
 r=[]
 for i in[i[1:-1]for i in[[(j*s)+i+1 for i in range(s)]for j in range(s)][1:-1]]:r+=i
 return r

1

Java 8, 241 183 170 162 160 132 122 bytes

j->{if(j<3)return new int[1];int e[]=new int[j*j-4*j+4],x=0,i=0;for(;++i<=j*j;)if(!(i<j|i>j*j-j|i%j<2))e[x++]=i;return e;}

Try it online!

Java makes it very tough(lots of bytes) when you have to create an array of somewhat "unknown" size.

  • -8 bytes thanks to Magic Octopus Urn
  • -28 bytes thanks to Mr. Xcoder
  • -10 bytes thanks to Kevin Cruijssen

1
Also, yes, Java is rough for code-golf. But you're obviously good at it. Man, you need to check out this language called Groovy it's basically shorthand Java.
Magic Octopus Urn

2
132 bytes by removing an extra condition from the if statement, and various tricks.
Mr. Xcoder

1
122 bytes continuing @Mr.Xcoder's 132-byte version above by combining the int, changing the || to |, and removing the brackets of the single-line if-body.
Kevin Cruijssen

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.