Cuadrados perfectos sin fronteras


16

Dado n=m^2, devuelve una lista de enteros que no bordean la m x mcuadrícula de enteros 1 to n.

Ejemplos

n = 1 (m = 1)

Cuadrícula:

[1]

Regreso:

[]

n = 4 (m = 2)

Cuadrícula:

[1,2]
[3,4]

Regreso:

[]

n = 9 (m = 3)

Cuadrícula:

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

Regreso:

[5]

n = 16 (m = 4)

Cuadrícula:

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

Regreso:

[6,7,10,11]

Para valores más altos de m, esta respuesta hace una gran visualización.


Reglas:

  • Puede tomar cualquiera mo n(donde n = m*m).
    • Si se toma en nque se les permite tener un comportamiento indefinido donde no existe mpara n(por ejemplo, 15).
    • n > 0, m > 0: Ambos deben ser valores enteros.
  • La salida puede ser como una matriz 1D / 2D, matriz o espacio en blanco delimitado
  • La salida debe estar en orden de menor a mayor.
    • Si sale como una matriz, esto significa que debe ser como sería en la cuadrícula.
  • Este es el , el menor recuento de bytes gana.

Fallo completo de mi parte, lo leí incorrectamente.
DevelopingDeveloper

3
@DevelopingDeveloper oye hombre, si tuviera un centavo por cada vez que lo hiciera, podría comprar una cerveza o dos.
Urna de pulpo mágico

Si sale como una matriz 2D, ¿se puede incluir una única matriz vacía en el resultado?
Shaggy

Respuestas:




6

Octava , 26 bytes

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

El código define una función anónima que ingresa m y emite un vector de columna (posiblemente vacío).

Pruébalo en línea!

Explicación

@(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

Jalea , 8 bytes

’Ṗ×+€ṖḊ€

Un enlace monádico que toma my devuelve una lista de listas (las filas internas).

Pruébalo en línea!

¿Cómo?

’Ṗ×+€ṖḊ€ - 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]]

No tenía ganas de hacer el pitón uno;)?
Urna de pulpo mágico



4

R , 44 43 32 bytes

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

Pruébalo en línea!

Devuelve un vector.


Formato de salida ordenado, ¿es así por defecto cómo se genera una matriz en R?
Urna de pulpo mágico

1
Sí, esa es la printfunción para a matrix.
Giuseppe

1
Puede omitir el segundo men matrix(1:m^2,m,m,T):matrix(1:m^2,m,,T)
JAD

@ JAD sí, por supuesto. Gracias.
Giuseppe

Buena, ¿qué opinas sobre el uso de scan ()? Puede guardar 2 bytes. Pruébalo en línea!
Robert Hacken


3

Protón , 28 bytes

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

Pruébalo en línea!

Toma m como entrada.

¿Cómo?

Filtra los enteros en [k, k 2 -k) que, cuando se dividen entre k , producen un resto superior a 1 . Esto asegura que ambos extremos estén recortados, porque el primero produce 0 y el último produce 1 . También se garantiza que devolverá un valor más alto para cualquier número entero válido, ya que son consecutivos.







2

MATL , 8 bytes

:G\1>&*f

Entrada es m. La salida es los números en orden creciente.

Pruébalo en línea!

Explicación

Considere la entrada 4como un ejemplo.

:     % 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

Lote, 85 bytes.

@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(

No puedo pasar fácilmente de 2a, m-1así que hago un ciclo de 3a my me ajusto en el cálculo.




2

Japt, 12 bytes

Pasé tanto tiempo jugando al golf en la extracción de elementos que me quedé sin tiempo para jugar golf en la generación de matrices. También ahora solo me doy cuenta de que podemos tomar ncomo entrada en su lugar, así que puedo guardar algo allí. Para ser revisado ...

òUnU²)òU m¤c

Intentalo


Explicación

                 :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 bytes

-4 bytes gracias a FrownyFrog!

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

Pruébalo en línea!

Mi solución original:

J , 23 bytes

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

Toma n como entrada, devuelve una matriz

Cómo funciona

1+i. - genera una lista 1..n

-@%: - encuentra la raíz cuadrada de n y la niega (m)

]\ - hace una tabla (matriz) mxm de la lista

^:2 - haga lo siguiente dos veces:

|:@}:@}. - suelte la primera fila, luego suelte la última fila, luego transponga

[: - tapa el tenedor

Pruébalo en línea!


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

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

@FrownyFrog - ¡Genial, gracias! No sabía sobre el argumento de la lista izquierda de}.
Galen Ivanov

2

Casco , 9 bytes

‼ȯTthS↑CN

Pruébalo en línea!

Explicación

‼ȯ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 bytes

²õ òU ÅkJ ®ÅkJ

Toma mcomo entrada

Explicación

 ²õ ò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     

Pruébalo en línea!


La solución que toma ntambién es de 14 bytes:

õ òU¬ ÅkJ ®ÅkJ

Pruébalo en línea!


2

TI-BASIC, 44 43 bytes (tokenizado)

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

Versión legible:

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

Desafortunadamente, fue necesario imprimir listas vacías manualmente, ya que TI-BASIC normalmente no lo permite. Si mse dieran más de dos, el código podría reducirse a solo 29 bytes .



1

Rojo , 63 62 bytes

f: func[n][repeat i(n - 2 * n)[if(a: n + i)// n > 1[print a]]]

Pruébalo en línea!

Este es un puerto rojo de la solución Python 2 de Haskell / Mr. Xcoder del totalmente humano



1

Pyt , 13 bytes

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

Puerto de Jonathan Allan's Jelly respuesta

Explicación:

                    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

Pruébalo en línea!


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

Pruébalo en línea!

Java lo hace muy difícil (muchos bytes) cuando tiene que crear una matriz de tamaño algo "desconocido".

  • -8 bytes gracias a Magic Octopus Urn
  • -28 bytes gracias al Sr. Xcoder
  • -10 bytes gracias a Kevin Cruijssen

1
Además, sí, Java es difícil para el golf de código. Pero obviamente eres bueno en eso. Hombre, debes revisar este lenguaje llamado Groovybásicamente Java.
Urna mágica de pulpo

2
132 bytes eliminando una condición adicional de la instrucción if y varios trucos.
Sr. Xcoder

1
122 bytes que continúan con la versión de 132 bytes de @ Mr.Xcoder anterior combinando int, cambiando ||a |y eliminando los corchetes del if-body de una sola línea.
Kevin Cruijssen

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.