Kenarlıksız Mükemmel Kareler


16

Verilen n=m^2bir tamsayı m x mızgarasını sınırlamayan bir tamsayı listesi döndürün 1 to n.

Örnekler

n = 1 (m = 1)

Kafes:

[1]

Dönüş:

[]

n = 4 (m = 2)

Kafes:

[1,2]
[3,4]

Dönüş:

[]

n = 9 (m = 3)

Kafes:

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

Dönüş:

[5]

n = 16 (m = 4)

Kafes:

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

Dönüş:

[6,7,10,11]

Yüksek değerler için m, bu cevabı büyük bir görselleştirme yapar.


Kurallar:

  • mVeya n(nereye n = m*m) girebilirsiniz .
    • Eğer niçeri girerseniz, (EG 15) miçin herhangi bir şeyin olmadığı yerlerde tanımlanmamış davranışa sahip olmanıza izin verilir n.
    • n > 0, m > 0: Her ikisi de tamsayı değerler olmalıdır.
  • Çıktı 1D / 2D dizi, matris veya boşlukla sınırlandırılmış olabilir
  • Çıktı en azdan en büyüğe doğru olmalıdır.
    • Bir matris olarak çıktı alınması, bunun kılavuzdaki gibi olması gerektiği anlamına gelir.
  • Bu , en düşük bayt sayısı kazanır.

Sonumda tam bir hata, yanlış okudum.
DevelopingDeveloper

3
@DevelopingDeveloper hey adam, eğer her seferinde bir nikel olsaydım bir iki bira alabilirdim.
Sihirli Ahtapot Urn

2B dizi olarak çıktı alıyorsanız, sonuca tek bir boş dizi eklenebilir mi?
Shaggy

Yanıtlar:




6

Oktav , 26 bayt

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

Kod, m(muhtemelen boş) bir sütun vektörü girip çıkaran anonim bir işlevi tanımlar .

Çevrimiçi deneyin!

açıklama

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

Jöle , 8 bayt

’Ṗ×+€ṖḊ€

mListe listesi (iç satırlar) alan ve döndüren monadik bir bağlantı .

Çevrimiçi deneyin!

Nasıl?

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

Python bir yapmak gibi hissetmedim;)?
Sihirli Ahtapot Urn



4

R , 44 43 32 bayt

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

Çevrimiçi deneyin!

Bir vektör döndürür.


Düzgün çıkış formatı, varsayılan olarak R'de bir matrisin nasıl çıktığıdır?
Sihirli Ahtapot Urn

1
Evet, bu printa matrix.
Giuseppe

1
Sen ikinci atlayabilirsiniz miçinde matrix(1:m^2,m,m,T):matrix(1:m^2,m,,T)
JAD

@JAD evet, elbette. Teşekkürler.
Giuseppe

Güzel olan, scan () kullanımı hakkında ne düşünüyorsun? 2 bayt tasarruf edebilirsiniz. Çevrimiçi deneyin!
Robert Hacken


3

Proton , 28 bayt

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

Çevrimiçi deneyin!

Alır m girdi olarak kullanılmaktadır.

Nasıl?

Tamsayıları Filtreler [k, k 2 -k) ile bölündüğü zaman, bu k , daha geri kalan daha yüksek verim 1 . Her iki ucu kesilmiş olduğu bu olmasını sağlar, çünkü ilk verimleri 0 ve sonuncusu verimleri 1 . Ayrıca, ardışık oldukları için herhangi bir geçerli tamsayı için daha yüksek bir değer döndürülmesi garanti edilir.







2

MATL , 8 bayt

:G\1>&*f

Girdi m. Çıktı, artan sıralamadaki rakamlardır.

Çevrimiçi deneyin!

açıklama

Girişi 4örnek olarak ele alalım.

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

Toplu, 85 bayt

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

Ben kolayca döngü olamaz 2için m-1gelen I böylece döngü 3için mve hesaplanmasında ayarlayın.




2

Japt, 12 bayt

Ben dizi nesil golf zaman tükenmeden unsurların çıkarılması golf geçirdi. Ayrıca şimdi ngirdi olarak alabileceğimizi fark ediyorum, böylece orada bir şeyler kaydedebilirim. Tekrar ziyaret edilecek ...

òUnU²)òU m¤c

Dene


açıklama

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

FrownyFrog sayesinde -4 bayt!

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

Çevrimiçi deneyin!

Orijinal olution'ım:

J , 23 bayt

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

N'yi girdi olarak alır, bir matris döndürür

Nasıl çalışır

1+i. - bir liste oluşturur 1..n

-@%: - n'nin karekökünü bulur ve reddeder (m)

]\ - listeden bir tablo (matris) mxm yapar

^:2 - aşağıdakileri iki kez yapın:

|:@}:@}. - ilk satırı bırakın, ardından son satırı bırakın, ardından

[: - çatalı kapat

Çevrimiçi deneyin!


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

1
Hayır,1 1}:@}.-@%:}:\1+i.
FrownyFrog

@FrownyFrog - Harika, teşekkürler! Liste sol argümanı hakkında bilmiyordum}.
Galen Ivanov

2

Kabuk , 9 bayt

‼ȯTthS↑CN

Çevrimiçi deneyin!

açıklama

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

²õ òU ÅkJ ®ÅkJ

Alır mgirdi olarak

açıklama

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

Çevrimiçi deneyin!


Alınan çözüm nde 14 bayttır:

õ òU¬ ÅkJ ®ÅkJ

Çevrimiçi deneyin!


2

TI-BASIC, 44 43 bayt (belirtilmiş)

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

Okunabilir sürüm:

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

Ne yazık ki, TI-BASIC normalde buna izin vermediği için boş listelerin manuel olarak yazdırılması gerekiyordu. İkiden mbüyük verilirse, kod sadece 29 bayta indirilebilir .





1

Pyt , 13 bayt

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

Jonathan Allan Limanı'nın cevabı

Açıklama:

                    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

Çevrimiçi deneyin!


1

Python, 111 bayt

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 bayt

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

Çevrimiçi deneyin!

Biraz "bilinmeyen" boyutta bir dizi oluşturmanız gerektiğinde Java bunu çok zorlaştırır (çok sayıda bayt).

  • Sihirli Ahtapot Urn sayesinde -8 bayt
  • Bay Xcoder sayesinde -28 bayt
  • Kevin Cruijssen sayesinde -10 bayt

1
Ayrıca, evet, Java kod golf için kaba. Ama bunda çok iyisin. Dostum, Groovytemelde kısaca Java olarak adlandırılan bu dili kontrol etmeniz gerekiyor .
Sihirli Ahtapot Urn

2
İf deyiminden fazladan bir koşul ve çeşitli hileler kaldırarak 132 bayt .
Bay Xcoder

1
122 bayt devam ediyor @ Mr.Xcoder'ın 132 baytlık versiyonunu birleştirerek int,|| için |, tek-hat halinde vücut kollarının kaldırılması.
Kevin Cruijssen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.