Perfekte Quadrate ohne Grenzen

16

Geben Sie n=m^2eine Liste von Ganzzahlen zurück, die nicht an das m x mGitter von Ganzzahlen angrenzen 1 to n.

Beispiele

n = 1 (m = 1)

Gitter:

[1]

Rückkehr:

[]

n = 4 (m = 2)

Gitter:

[1,2]
[3,4]

Rückkehr:

[]

n = 9 (m = 3)

Gitter:

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

Rückkehr:

[5]

n = 16 (m = 4)

Gitter:

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

Rückkehr:

[6,7,10,11]

Für höhere Werte von mist diese Antwort eine großartige Visualisierung.


Regeln:

  • Sie können entweder moder n(wo n = m*m) aufnehmen.
    • Wenn nSie aufnehmen, dürfen Sie undefiniertes Verhalten haben, wenn es kein mfür gibt n(EG 15).
    • n > 0, m > 0: Beide müssen ganzzahlige Werte sein.
  • Die Ausgabe kann als 1D / 2D-Array, Matrix oder Leerzeichen erfolgen
  • Die Ausgabe muss in der Reihenfolge vom kleinsten zum größten erfolgen.
    • Wenn als Matrix ausgegeben wird, bedeutet dies, dass es so sein muss, wie es im Raster wäre.
  • Dies ist , die niedrigste Anzahl an Bytes gewinnt.
Magische Kraken-Urne
quelle
Völliger Fehler an meinem Ende, ich habe ihn falsch gelesen.
DevelopingDeveloper
3
@DevelopingDeveloper Hey Mann, wenn ich für jedes Mal ein Nickle hätte, könnte ich mir ein oder zwei Bier kaufen.
Magic Octopus Urn
Kann bei der Ausgabe als 2D-Array ein einzelnes leeres Array in das Ergebnis einbezogen werden?
Shaggy

Antworten:

6

Oktave , 31 Bytes

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

Gibt eine Matrix zurück.

Probieren Sie es online!

Steadybox
quelle
2
Nett! Ich bin noch nie auf die vec2matFunktion gestoßen.
Tom Carpenter
6

Oktave , 26 Bytes

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

Der Code definiert eine anonyme Funktion, die eingibt m einen (möglicherweise leeren) Spaltenvektor und ausgibt.

Probieren Sie es online!

Erläuterung

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

Gelee , 8 Bytes

’Ṗ×+€ṖḊ€

Ein monadischer Link, mder eine Liste von Listen (die inneren Zeilen) aufnimmt und zurückgibt.

Probieren Sie es online!

Wie?

’Ṗ×+€ṖḊ€ - 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
quelle
Hatten Sie keine Lust auf Python;)?
Magic Octopus Urn
4

Haskell , 31 Bytes

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

Probieren Sie es online!

Mathematische Version:

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

: P

total menschlich
quelle
Warten Sie, dies ist nicht gültig, f(5)sollte sein7,8,9,12,13,14,17,18,19
Magic Octopus Urn
Warten Sie, ich bin ein Idiot.
Totalhuman
4

R , 44 43 32 Bytes

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

Probieren Sie es online!

Gibt einen Vektor zurück.

Giuseppe
quelle
Ordentliches Ausgabeformat, wird standardmäßig eine Matrix in R ausgegeben?
Magic Octopus Urn
1
Ja, das ist die printFunktion für a matrix.
Giuseppe
1
Sie können die Sekunde weglassen min matrix(1:m^2,m,m,T):matrix(1:m^2,m,,T)
JAD
@JAD ja natürlich. Vielen Dank.
Giuseppe
Schön, was denkst du über scan ()? Sie könnten 2 Bytes sparen. Probieren Sie es online!
Robert Hacken
3

Gelee , 8 Bytes

sƽḊṖ$⁺€

Probieren Sie es online!

Erik der Outgolfer
quelle
Mit meinem könnte man ²s⁸ḊṖ$⁺€auch. (Ich habe auch eine andere malternative Methode veröffentlicht.)
Jonathan Allan
@ JonathanAllan bereits entdeckt, aber kein Byte dort speichern, können Sie nicht entfernen :(
Erik the Outgolfer
3

Proton , 28 Bytes

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

Probieren Sie es online!

Nimmt m als Eingabe.

Wie?

Filtert die ganzen Zahlen in [k, k 2 - k ) , die, wenn sie durch k dividiert werden , einen Rest ergeben, der höher als 1 ist . Dadurch wird sichergestellt , dass beide Ende werden abgeschnitten, weil die ersten Ausbeuten 0 und die letzte Ausbeute 1 . Es wird auch garantiert, dass für jede gültige Ganzzahl ein höherer Wert zurückgegeben wird, da sie aufeinanderfolgend sind.

Mr. Xcoder
quelle
2

05AB1E , 9 Bytes

LItä¦¨ε¦¨

Probieren Sie es online!

Mr. Xcoder
quelle
LItä¦¨ε¦¨Ist dies in Ordnung, kann die Ausgabe ein 2D-Array sein.
Magic Octopus Urn
Oh, ich hätte die Spezifikation besser lesen sollen. Danke für die Warnung!
Mr. Xcoder
2

Python 2 , 44 Bytes

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

Probieren Sie es online!

Ich verspreche, dass dies heute meine letzte Antwort (auf diese Herausforderung) ist. Nimmt m als Eingabe.

Mr. Xcoder
quelle
2

Ruby , 32 Bytes

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

Nimmt m , gibt ein eindimensionales Array zurück.

Probieren Sie es online!

Setzen Sie Monica wieder ein - notmaynard
quelle
2

MATL , 8 Bytes

:G\1>&*f

Eingabe ist m . Die Ausgabe erfolgt in aufsteigender Reihenfolge.

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 4als Beispiel.

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

Batch, 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(

Ich kann nicht so einfach von 2bis durchlaufen , m-1also gehe ich von 3bis durch mund passe die Berechnung an.

Neil
quelle
2

Japt, 12 Bytes

Ich habe so lange mit der Gewinnung von Elementen verbracht, dass mir die Zeit für das Golfen der Array-Generation ausgegangen ist. Mir ist auch erst jetzt aufgefallen, dass wir stattdessen nals Eingabe nehmen können, damit ich dort möglicherweise etwas speichern kann. Wiederbesucht zu werden ...

òUnU²)òU m¤c

Versuch es


Erläuterung

                 :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]
Zottelig
quelle
2

J , 23 19 Bytes

-4 Bytes dank FrownyFrog!

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

Probieren Sie es online!

Meine ursprüngliche Lösung:

J , 23 Bytes

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

Nimmt n als Eingabe und gibt eine Matrix zurück

Wie es funktioniert

1+i. - erzeugt eine Liste 1..n.

-@%: - findet die Quadratwurzel von n und negiert sie (m)

]\ - Erstellt eine Tabelle (Matrix) mxm aus der Liste

^:2 - Machen Sie zweimal Folgendes:

|:@}:@}. - Lasse die erste Reihe fallen, dann die letzte Reihe und transponiere dann

[: - Gabel verschließen

Probieren Sie es online!

Galen Ivanov
quelle
1}:@}.-@%:}.@}:\1+i.
FrownyFrog
1
Nein,1 1}:@}.-@%:}:\1+i.
FrownyFrog
@FrownyFrog - Cool, danke! Ich wusste nicht über die Liste links Argument}.
Galen Ivanov
2

Schale , 9 Bytes

‼ȯTthS↑CN

Probieren Sie es online!

Erläuterung

‼ȯ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
quelle
2

Japt , 14 Bytes

²õ òU ÅkJ ®ÅkJ

Nimmt mals Eingabe

Erläuterung

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

Probieren Sie es online!


Die Lösung, die es braucht n wird ist ebenfalls 14 Bytes:

õ òU¬ ÅkJ ®ÅkJ

Probieren Sie es online!

Oliver
quelle
2

TI-BASIC, 44 43 Bytes (tokenisiert)

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

Lesbare Version:

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

Leere Listen mussten leider manuell ausgedruckt werden, da TI-BASIC dies normalerweise nicht zulässt. Wenn mmehr als zwei angegeben werden, kann der Code auf nur 29 Byte reduziert werden .

Fakedad
quelle
1

Rot , 63 62 Bytes

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

Probieren Sie es online!

Dies ist eine rote Portierung der Python 2-Lösung von Haskell / Mr. Xcoder

Galen Ivanov
quelle
1

Pyt , 13 Bytes

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

Port of Jonathan Allans Gelee Antwort

Erläuterung:

                    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

Probieren Sie es online!

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

Probieren Sie es online!

Java macht es sehr schwierig (viele Bytes), ein Array von etwas "unbekannter" Größe zu erstellen.

  • -8 Bytes dank Magic Octopus Urn
  • -28 Bytes dank Mr. Xcoder
  • -10 Bytes dank Kevin Cruijssen
Entwicklungsentwickler
quelle
1
Ja, Java ist auch hart für Code-Golf. Aber du bist offensichtlich gut darin. Mann, Sie müssen sich diese Sprache ansehen Groovy, die als Abkürzung für Java bezeichnet wird.
Magic Octopus Urn
2
132 Bytes durch Entfernen einer zusätzlichen Bedingung aus der if-Anweisung und verschiedener Tricks.
Mr. Xcoder
1
122 Bytes Fortsetzung @ Mr.Xcoders 132-Byte-Version oben durch Kombinieren von int, Ändern von ||in |und Entfernen der Klammern des einzeiligen if-Körpers.
Kevin Cruijssen
1
101 Bytes
Ceilingcat