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.
Urna de pulpo mágico
fuente
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 , 31 bytes

@(m)vec2mat(1:m*m,m--)(2:m,2:m)

Devuelve una matriz.

Pruébalo en línea!

Steadybox
fuente
2
¡Agradable! Nunca me he encontrado con la vec2matfunción antes.
Tom Carpenter
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
Luis Mendo
fuente
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]]
Jonathan Allan
fuente
No tenía ganas de hacer el pitón uno;)?
Urna de pulpo mágico
4

Pure Bash, 49

La aburrida respuesta:

for((i=$1;i++<$1*$1-$1;));{ ((i%$1>1))&&echo $i;}

Pruébalo en línea .


O la respuesta interesante para 52:

(($1>2))&&eval echo \$[$1*{1..$[$1-2]}+{2..$[$1-1]}]

Pruébalo en línea .

Trauma digital
fuente
4

Haskell , 31 bytes

f m=[i|i<-[m..m*m-m],mod i m>1]

Pruébalo en línea!

Versión matemática:

f(m) = {i : i  (m, m² - m), i mod m < 1}

:PAG

totalmente humano
fuente
Espera, esto no es válido, f(5)debería ser7,8,9,12,13,14,17,18,19
Urna mágica del pulpo
Espera, oops, soy un idiota.
totalmente humano
4

R , 44 43 32 bytes

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

Pruébalo en línea!

Devuelve un vector.

Giuseppe
fuente
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

Jalea , 8 bytes

sƽḊṖ$⁺€

Pruébalo en línea!

Erik el Outgolfer
fuente
Usar muno también podría hacerlo ²s⁸ḊṖ$⁺€. (También he publicado otro mmétodo alternativo)
Jonathan Allan
@JonathanAllan Ya lo descubrió, pero sin guardar ningún byte allí, no puede eliminar el :(
Erik the Outgolfer
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.

Sr. Xcoder
fuente
2

05AB1E , 9 bytes

LItä¦¨ε¦¨

Pruébalo en línea!

Sr. Xcoder
fuente
LItä¦¨ε¦¨está bien, la salida puede ser una matriz 2D.
Urna mágica de pulpo
Oh, debería haber leído mejor las especificaciones. ¡Gracias por el aviso!
Sr. Xcoder
2

Python 2 , 44 bytes

lambda t:[k for k in range(t,~-t*t)if k%t>1]

Pruébalo en línea!

Prometo que esta es mi última respuesta (a este desafío) hoy. Toma m como entrada.

Sr. Xcoder
fuente
2

Ruby , 32 bytes

->m{(m..m*m-m).reject{|e|e%m<2}}

Toma m , devuelve una matriz unidimensional.

Pruébalo en línea!

Restablecer a Monica - notmaynard
fuente
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]
Luis Mendo
fuente
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.

Neil
fuente
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]
Lanudo
fuente
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!

Galen Ivanov
fuente
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.
Zgarb
fuente
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!

Oliver
fuente
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 .

fakedad
fuente
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

Galen Ivanov
fuente
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!

mudkip201
fuente
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
sonrad10
fuente
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
Desarrollador en desarrollo
fuente
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
1
101 bytes
ceilingcat