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.

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

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]]

Hatten Sie keine Lust auf Python;)?
Magic Octopus Urn



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.


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

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.







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]


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.




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]

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!


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.

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!


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 .





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!


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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.