Idealne kwadraty bez granic

16

Biorąc pod uwagę n=m^2, zwraca listę liczb całkowitych, które nie graniczą z m x msiatką liczb całkowitych od 1 to n.

Przykłady

n = 1 (m = 1)

Krata:

[1]

Powrót:

[]

n = 4 (m = 2)

Krata:

[1,2]
[3,4]

Powrót:

[]

n = 9 (m = 3)

Krata:

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

Powrót:

[5]

n = 16 (m = 4)

Krata:

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

Powrót:

[6,7,10,11]

Dla wyższych wartości m, to odpowiedź robi wielką wizualizację.


Zasady:

  • Możesz wziąć jeden mlub n(gdzie n = m*m).
    • Jeśli biorąc w nwas mogą mieć niezdefiniowane zachowanie tam gdzie nie istnieje mdla n(np 15).
    • n > 0, m > 0: Obie muszą być liczbami całkowitymi.
  • Dane wyjściowe mogą być w postaci tablicy 1D / 2D, macierzy lub białych znaków
  • Dane wyjściowe muszą być uporządkowane od najmniejszej do największej.
    • Jeśli dane wyjściowe mają postać macierzy, oznacza to, że musi być tak, jak w siatce.
  • To jest , wygrana o najniższej liczbie bajtów.
Urna Magicznej Ośmiornicy
źródło
Całkowity błąd z mojej strony, źle go odczytałem.
DevelopingDeveloper
3
@ DevelopingDeveloper hej człowieku, gdybym miał za każdym razem monetę, mógłbym kupić piwo lub dwa.
Magic Octopus Urn
Jeśli wynik jest generowany jako tablica 2D, czy wynik może zawierać pojedynczą pustą tablicę?
Kudłaty

Odpowiedzi:

6

Oktawa , 31 bajtów

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

Zwraca macierz.

Wypróbuj online!

Steadybox
źródło
2
Ładny! Nigdy wcześniej nie spotkałem się z tą vec2matfunkcją.
Tom Carpenter
6

Oktawa , 26 bajtów

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

Kod definiuje anonimową funkcję, która wprowadza mi wyprowadza (prawdopodobnie pusty) wektor kolumny.

Wypróbuj online!

Wyjaśnienie

@(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
źródło
5

Galaretka , 8 bajtów

’Ṗ×+€ṖḊ€

Monadyczny link pobierający mi zwracający listę list (wewnętrzne rzędy).

Wypróbuj online!

W jaki sposób?

’Ṗ×+€ṖḊ€ - 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
źródło
Nie miałeś ochoty zrobić Pythona;)?
Magic Octopus Urn
4

Pure Bash, 49

Nudna odpowiedź:

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

Wypróbuj online .


Lub interesująca odpowiedź dla 52:

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

Wypróbuj online .

Cyfrowa trauma
źródło
4

Haskell , 31 bajtów

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

Wypróbuj online!

Wersja matematyczna:

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

: P

całkowicie ludzki
źródło
Poczekaj, to nie jest poprawne, f(5)powinno być7,8,9,12,13,14,17,18,19
Magic Octopus Urn
Czekaj, ups jestem głupcem.
całkowicie ludzki,
4

R , 44 43 32 bajtów

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

Wypróbuj online!

Zwraca wektor.

Giuseppe
źródło
Czysty format wyjściowy, czy to domyślnie sposób wyświetlania macierzy w R?
Magic Octopus Urn
1
Tak, to jest printfunkcja dla matrix.
Giuseppe,
1
Możesz pominąć drugi mw matrix(1:m^2,m,m,T):matrix(1:m^2,m,,T)
JAD
@JAD tak, oczywiście. Dzięki.
Giuseppe,
Fajne, co sądzisz o używaniu scan ()? Możesz zapisać 2 bajty. Wypróbuj online!
Robert Hacken,
3

Galaretka , 8 bajtów

sƽḊṖ$⁺€

Wypróbuj online!

Erik the Outgolfer
źródło
Używanie mjednego też może zrobić ²s⁸ḊṖ$⁺€. (Opublikowałem też inną malternatywną metodę.)
Jonathan Allan
@JonathanAllan Już to odkryłem, ale nie ma tam zapisywania bajtów, nie można usunąć :(
Erik the Outgolfer
3

Proton , 28 bajtów

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

Wypróbuj online!

Przyjmuje m jako dane wejściowe.

W jaki sposób?

Filtruje liczby całkowite w [k, k 2 -k), które po podzieleniu przez k dają resztę wyższą niż 1 . Zapewnia to obcinanie obu końców, ponieważ pierwszy daje 0, a ostatni 1 . Gwarantowane jest również zwrócenie wyższej wartości dla dowolnej poprawnej liczby całkowitej, ponieważ są one następujące po sobie.

Pan Xcoder
źródło
2

05AB1E , 9 bajtów

LItä¦¨ε¦¨

Wypróbuj online!

Pan Xcoder
źródło
LItä¦¨ε¦¨jest w porządku, wyjściem może być tablica 2D.
Magic Octopus Urn
Och, powinienem był lepiej przeczytać specyfikację. Dzięki za heads-up!
Pan Xcoder,
2

Python 2 , 44 bajty

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

Wypróbuj online!

Obiecuję, że dziś jest to moja ostatnia odpowiedź (na to wyzwanie). Przyjmuje m jako dane wejściowe.

Pan Xcoder
źródło
2

Rubinowy , 32 bajty

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

Pobiera m, zwraca tablicę jednowymiarową.

Wypróbuj online!

Przywróć Monikę - notmaynard
źródło
2

MATL , 8 bajtów

:G\1>&*f

Dane wejściowe to m. Dane wyjściowe to liczby w porządku rosnącym.

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe 4jako przykład.

:     % 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
źródło
2

Partia, 85 bajtów

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

Nie mogę łatwo zapętlać od 2do, m-1więc zapętlam od 3do mi dostosowuję obliczenia.

Neil
źródło
2

Japt, 12 bajtów

Tak długo grałem w ekstrakcję elementów, że zabrakło mi czasu na grę w golfa. Dopiero teraz zauważam, że nzamiast tego możemy wziąć jako dane wejściowe, więc mogę coś tam zapisać. Do ponownego odwiedzenia ...

òUnU²)òU m¤c

Spróbuj


Wyjaśnienie

                 :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]
Kudłaty
źródło
2

J , 23 19 bajtów

-4 bajty dzięki FrownyFrog!

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

Wypróbuj online!

Mój oryginalny olution:

J , 23 bajty

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

Pobiera n jako dane wejściowe, zwraca macierz

Jak to działa

1+i. - generuje listę 1..n

-@%: - znajduje pierwiastek kwadratowy z n i neguje go (m)

]\ - tworzy tabelę (macierz) mxm z listy

^:2 - wykonaj dwa razy następujące czynności:

|:@}:@}. - upuść pierwszy rząd, następnie upuść ostatni rząd, a następnie transponuj

[: - zakryj widelec

Wypróbuj online!

Galen Iwanow
źródło
1}:@}.-@%:}.@}:\1+i.
FrownyFrog,
1
Nie,1 1}:@}.-@%:}:\1+i.
FrownyFrog,
@FrownyFrog - Fajnie, dziękuję! Nie wiedziałem o liście pozostawionej argument}.
Galen Iwanow
2

Łuska , 9 bajtów

‼ȯTthS↑CN

Wypróbuj online!

Wyjaśnienie

‼ȯ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
źródło
2

Japt , 14 bajtów

²õ òU ÅkJ ®ÅkJ

Pobiera mjako dane wejściowe

Wyjaśnienie

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

Wypróbuj online!


Rozwiązanie, które zajmuje nrównież 14 bajtów:

õ òU¬ ÅkJ ®ÅkJ

Wypróbuj online!

Oliver
źródło
2

TI-BASIC, 44 43 bajty (tokenizowane)

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

Wersja do odczytu:

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

Niestety konieczne było ręczne drukowanie pustych list, ponieważ TI-BASIC normalnie na to nie pozwala. Jeśli mpodano więcej niż dwa, kod można by zmniejszyć do zaledwie 29 bajtów .

fakedad
źródło
1

Czerwony , 63 62 bajtów

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

Wypróbuj online!

Jest to czerwony port całkowicie ludzkiego rozwiązania Haskell / Mr. Xcoder Python 2

Galen Iwanow
źródło
1

Pyt , 13 bajtów

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

Port galaretki Jonathana Allana

Wyjaśnienie:

                    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

Wypróbuj online!

mudkip201
źródło
1

Python, 111 bajtów

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
źródło
1

Java 8 , 241 183 170 162 160 132 122 bajtów

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

Wypróbuj online!

Java sprawia, że ​​jest bardzo trudny (dużo bajtów), gdy trzeba stworzyć tablicę nieco „nieznanego” rozmiaru.

  • -8 bajtów dzięki Magic Octopus Urn
  • -28 bajtów dzięki Mr. Xcoder
  • -10 bajtów dzięki Kevin Cruijssen
DevelopingDeveloper
źródło
1
Tak, tak, Java jest ostra do gry w golfa. Ale oczywiście jesteś w tym dobry. Człowieku, musisz sprawdzić ten język, który nazywa Groovysię w skrócie Java.
Magic Octopus Urn
2
132 bajty poprzez usunięcie dodatkowego warunku z instrukcji if i różne sztuczki.
Pan Xcoder,
1
122 bajtów ciągłe @ Mr.Xcoder jest w wersji 132-bajtowy powyżej łączenie int, zmieniające ||się |i usuwanie wsporniki pojedynczej linii, jeśli ciało.
Kevin Cruijssen
1
101 bajtów
ceilingcat