Bir dama tahtası matrisi oluşturun


26

Girdi olarak n pozitif bir tamsayı alın ve 1 ile 0'dan oluşan bir n-by- checkerboard matrisini çıktılayın .

Sol üst hane her zaman 1 olmalıdır .

Test durumları:

n = 1
1

n = 2
1 0
0 1

n = 3
1 0 1
0 1 0
1 0 1

n = 4
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

Giriş ve çıkış formatları isteğe bağlıdır. Matrisin bir liste listesi olarak çıkarılması kabul edilir.


Dizelerin listesi iyi mi?
xnor

Evet herşey yolunda.
Stewie Griffin


2
Örnekleriniz aynı satırdaki sayılar arasındaki boşlukları gösteriyor, daha çok kare gibi görünmek için gerekli mi?
BradC

@ Brac bu gerekli değil. Birinci yaklaşım burada geçerlidir.
Stewie Griffin

Yanıtlar:



9

MATL , 5 bayt

:otYT

MATL online olarak deneyin !

açıklama

4Bir örnek olarak girişi düşünün .

:    % Implicit input, n. Push range [1 2 ... n]
     %   STACK: [1 2 3 4]
o    % Parity, element-wise
     %   STACK: [1 0 1 0]
t    % Duplicate
     %   STACK: [1 0 1 0], [1 0 1 0]
YT   % Toeplitz matrix with two inputs. Implicit display
     %   STACK: [1 0 1 0;
     %           0 1 0 1;
     %           1 0 1 0;
     5           0 1 0 1]

7

Japt , 6 bayt

ÆÇ+X v

Çevrimiçi test edin! ( -QDaha kolay görselleştirme için bayrak kullanır )

açıklama

 Æ   Ç   +X v
UoX{UoZ{Z+X v}}  // Ungolfed
                 // Implicit: U = input number
UoX{          }  // Create the range [0...U), and map each item X to
    UoZ{     }   //   create the range [0...U), and map each item Z to
        Z+X      //     Z + X
            v    //     is divisible by 2.
                 // Implicit: output result of last expression

Nota ilginç bir şey olması volduğunu değil yerleşik bir "2 ile bölünebilir". Bunun yerine, yerleşik bir "X tarafından bölünebilir". Ancak, çoğu golf dilinden farklı olarak, Japt’in işlevleri sabit bir etkinliğe sahip değildir (herhangi bir sayıda doğru argümanı kabul edebilirler). 0 doğru argüman verildiğinde, vistediğinizi varsayar 2ve 2hiçbir şey yerine verilen gibi davranır .



7

Haskell , 50 41 39 38 bayt

Toplam 9 10 bayt'ı tıraş etmeye yardımcı olduğu için nimi ve xnor sayesinde

f n=r[r"10",r"01"]where r=take n.cycle

Alternatif olarak, bir bayt daha fazlası için:

(!)=(.cycle).take
f n=n![n!"10",n!"01"]

veya:

r=flip take.cycle
f n=r[r"10"n,r"01"n]n

Muhtemelen yetersiz, ama temiz, basit bir yaklaşım.


concat.repeatolduğu cycle: n!l=take n$cycle l. Gidersen bir kere daha byte kaydeder pointfree: (!)=(.cycle).take.
nimi

Güzel! Bunun için bir yerleşik olduğunu biliyordum, ama hayatımın adını hatırlayamadım
Julian Wolf

Önereceğim f n|r<-take n.cycle=r[r"10",r"01"]ya da benzer. Fakat Haskell yanlış tipte sonuç veriyor gibi görünüyor r? Açık yazma ile çalışır f n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"].
xnor


1
@zbw Bu durum olduğunu düşündüm ama kullanmak NoMonomorphismRestrictionyardımcı olmadı. Yapmamış Rank2Typesya da RankNTypes. Orada neler olduğunu biliyor musun?
xnor

5

APL (Dyalog) , 8 bayt

~2|⍳∘.+⍳

Çevrimiçi deneyin!

açıklama

Argümanı çağıralım n.

⍳∘.+⍳

Bu bir matris oluşturur

1+1 1+2 1+2 .. 1+n
2+1 2+2 2+3 .. 2+n
...
n+1 n+2 n+3 .. n+n

Sonra 2|matrisin modulo 2'sini ~alır (vektörleşir), ardından sonucun NOT'unu alır.



4

JavaScript ES6, 55 54 51 46 bayt

@Neil sayesinde 1 bayt kaydedildi

@Arnauld sayesinde 2 bayt kaydedildi

n=>[...Array(n)].map((_,i,a)=>a.map(_=>++i&1))

Çevrimiçi deneyin!

Bu bir dizi dizisi olarak çıkar. JavaScript aralıkları oldukça garip ama [...Array(n)]boyutu bir dizi oluşturan kullanıyorumn


Dizin parametrelerini kullanmak için hala bir bayt daha kısa:n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
Neil

@Neil ha, haritadaki üçüncü parametreyi kullanmayı hiç düşünmedim, teşekkürler!
Downgoat

@Arnauld teşekkürler! Bu bana 5 bayt daha tasarruf etmem için ilham verdi!
Downgoat

4

Retina , 33 30 bayt

.+
$*
1
$_¶
11
10
T`10`01`¶.+¶

Çevrimiçi deneyin! Açıklama: İlk aşama 1s'yi (uygun şekilde!) Kullanarak girişi unary'e çevirirken, ikinci aşama değeri bir kareye çevirir. Üçüncü aşama, her satırdaki alternatif bitleri ters çevirirken, son aşama, alternatif satırlardaki bitleri ters çevirir. Düzenleme: @MartinEnder sayesinde 3 bayt kaydedildi.


$`1$'sadece $_.
Martin Ender

@MartinEnder Ah, ben aşina değilim $_, teşekkürler!
Neil

3

MATL , 7 bayt

:t!+2\~

Çevrimiçi deneyin!

Açıklama:

         % Implicit input (n)
:        % Range from 1-n, [1,2,3]
 t       % Duplicate, [1,2,3], [1,2,3]
  !      % Transpose, [1,2,3], [1;2;3]
   +     % Add        [2,3,4; 3,4,5; 4,5,6]
    2    % Push 2     [2,3,4; 3,4,5; 4,5,6], 2
     \   % Modulus    [0,1,0; 1,0,1; 0,1,0]
      ~  % Negate     [1,0,1; 0,1,0; 1,0,1]

Not: Mücadeleyi gönderdikten sonra bunu MATL'de çözmeye başladım .


Eşdeğer ve daha kısa::&+o~
Luis Mendo

1
Hala öğreniyorum :-) Yarın güncelleneceğim. Ben de diğer yaklaşımını sevdim :-)
Stewie Griffin

1
Ben de bununla geldim. Ve hey, sadece saf MATL komut setini kullanırsınız, sinir bozucu Ymodifiye edilmiş talimatlar @LuisMendo'nun kullandığı değil.
Sanchises

@ Pesch Pesky, ha ? :-P
Luis Mendo

3

Brachylog , 15 bayt

^₂⟦₁%₂ᵐ;?ḍ₎pᵐ.\

Çevrimiçi deneyin!

açıklama

Example Input: 4

^₂               Square:                            16
  ⟦₁             1-indexed Range:                   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
    %₂ᵐ          Map Mod 2:                         [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]
       ;?ḍ₎      Input-Chotomize:                   [[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]]
           pᵐ.   Map permute such that..
             .\  ..the output is its own transpose: [[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]]

3

Clojure, 36 bayt

#(take %(partition % 1(cycle[1 0])))

Yay, iş için doğru araç.


3

05AB1E , 9 7 bayt

Emigna sayesinde -2 bayt

LDÈD_‚è

Çevrimiçi deneyin!

açıklama

LDÈD_‚sè» Argument n
LD        Push list [1 .. n], duplicate
  ÈD      Map is_uneven, duplicate
    _     Negate boolean (0 -> 1, 1 -> 0)
     ‚    List of top two elements of stack
      è   For each i in [1 .. n], get element at i in above created list
          In 05AB1E the element at index 2 in [0, 1] is 0 again

»Listeler listesi çıktısını kesebilir tamam olur ve ayrıca kaldırabilirsiniz s.
Emigna

@Emigna Yep, teşekkürler!
kalsowerus

Açıklama biraz alakasız.
Outgolfer Erik

3

Java (OpenJDK 8) , 80 77 bayt

Kevin Cruijssen sayesinde -3 bayt

j->{String s="1";for(int i=1;i<j*j;s+=i++/j+i%j&1)s+=1>i%j?"\n":"";return s;}

Çevrimiçi deneyin!

Oh bak, yarı-makul uzunlukta bir java cevabı, eğlenceli operatörlerle dolu.

int alan ve bir String döndüren lambda. Hangi değeri olması gerektiğini belirlemek için / ve% kullanarak satır numarasını ve sütun numarasını kullanarak çalışır, mod 2;

Ungolfed:

j->{
    String s="1";
    for(int i=1; i<j*j; s+= i++/j + i%j&1 )
        s+= 1>i%j ? "\n" : "";
    return s;
}

Bir bayttan tasarruf etmek için alanı kaldırabilirsiniz. Zorluk, çıktı formatının esnek olduğunu belirtir. Oh, ve değiştirerek iki bayttan tasarruf edebilirsiniz (i++/j+i%j)%2, i++/j+i%j&1böylece bu paranteze ihtiyacınız olmaz. Bu da toplam 1 baytı iç içe for-loop çözümümden ( n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;}) daha kısa , benden +1 yapıyor. :)
Kevin Cruijssen

@KevinCruijssen Evet, hala uzayda bir cevap bekliyordum. % Ve% 1'den daha yüksek önceliği olduğunu düşünmedim ve% 1 ==% 2
PunPun1000

2

Kömür, 8 bayt

UON10¶01

Çevrimiçi deneyin! Açıklama: Bu kabaca aşağıdaki ayrıntılı kod anlamına gelir (ne yazık ki geliştirici şu anda gereksiz bir ayırıcı ekliyor):

Oblong(InputNumber(), "10\n01");





2

R , 38 37 bayt

n=scan();(matrix(1:n,n,n,T)+1:n-1)%%2

Çevrimiçi deneyin!

Giuseppe sayesinde -1 bayt

Öncelikle matris oluştururken, ikincisi de o matrise 0: (n-1) eklerken, R'nin geri dönüşüm kurallarından faydalanır.


Bir baytı bırakıp tmatrisi oluşturarak bırakabilirsiniz byrow=T, yani(matrix(1:n,n,n,T)+1:n-1)%%2
Giuseppe

1
outer(1:n,1:n-1,"+")%%2epeyce bir kaç bayt daha kısa :)
JAD

2

Swi-Prolog, 142 bayt.

t(0,1).
t(1,0).
r([],_).
r([H|T],H):-t(H,I),r(T,I).
f([],_,_).
f([H|T],N,B):-length(H,N),r(H,B),t(B,D),f(T,N,D).
c(N,C):-length(C,N),f(C,N,1).

Çevrimiçi deneyin - http://swish.swi-prolog.org/p/BuabBPrw.pl

İç içe geçmiş bir liste çıkarır, yani kurallar şöyle der:

  • t() bir geçiş, 0 -> 1 ve 1 -> 0 yapar.
  • r() tek tek bir satır için başarılı olur; bu, yalnızca alternatif olanların ve sıfırların olduğu bir satır aşağı doğru özyinelemeli bir denetimdir.
  • f()tüm satırları yinelemeli olarak doğru uzunlukta olduklarını, geçerli satır olduklarını r()ve her satırın farklı bir 0/1 ile başladığını kontrol eder.
  • c(N,C) satır sayısı (iç içe listeler) N ise ve yardımcı f başarılı olursa, C'nin N boyutunda geçerli bir dama tahtası olduğunu söyler.

Test Durumları: görüntü tanımını buraya girin


2

C, 69 67 63 bayt

İki byte tasarruf için @Kevin Cruijssen'e ve dört byte tasarruf için @ceilingcat'e teşekkürler!

i,j;f(n){for(i=n;i--;puts(""))for(j=n;j;)printf("%d",j--+i&1);}

Çevrimiçi deneyin!


İçindeki boşluğu kaldırabilirsiniz printf("%d ", çünkü bu geçerli bir çıktı yöntemidir.
Conor O'Brien,

@ ConorO'Brien Evet, teşekkürler.
Steadybox

Sen değiştirerek iki bayt kaydedebilirsiniz (j+++i)%2için j+++i&1bu parantez kaldırın.
Kevin Cruijssen

@ceilingcat Teşekkürler!
Steadybox

1

QBIC , 19 bayt

[:|?[b|?(a+c+1)%2';

açıklama

[:|         FOR a = 1 to b (b is read from cmd line)
?           PRINT - linsert a linebreak in the output
[b|         FOR c = 1 to b
?(a+c+1)%2  PRINT a=c=1 modulo 2 (giving us the 1's and 0's
';            PRINT is followed b a literal semi-colon, suppressing newlines and 
              tabs. Printing numbers in QBasic adds one space automatically.






1

/// , 87 bayt + giriş

/V/\\\///D/VV//*/k#D#k/k#D&k/k&DVk/k\D/SD/#/r
DSkk/10DSk/1D&/V#rV#0r;VV0;VVV1;V\D/r/S/&[unary input in asterisks]

Çevrimiçi deneyin! (4 için giriş)

Tekli giriş 1s, 95 bayt + giriş

/V/\\\///D/VV//&1/k#&D&|D/#k/k#D&k/k&DVk/k\D/SD/#/r
DSkk/10DSk/1D&/V#rV#0r;VV0;VVV1;V\D/r/S/&&[unary input in ones]|

Çevrimiçi deneyin!(8 için giriş)

Bu nasıl çalışıyor?

  • Vve sırasıyla Dgolf \/ve //.

  • /*/k#/ve /&1/k#&//&|//girişi,'k#'*len(input())

  • /#k//k#//&k/k&//\/k/k\//Tüm hareket kiçin s /r/S/blok

  • Ss sadece ks'den sonra gelen örnekleri doldurmak için kullanılır, /böylece başka bir yere taşınmazlar ve sonra Ss kaldırılır

  • #s sonra r\ns dönüşür

  • Dize ks alternatif haline getirilir 1010...dize

  • r\nS dönüşüyor1010...\n s

  • Her çift 1010...\n1010\ndönüşür1010...\01010...;\n

  • Ya kesilmiş 0;ya 1;da kesilmiş ( 01010...dize 1 ile çok uzun olduğu için)


1

Mathematica, 28 bayt

Cos[+##/2Pi]^2&~Array~{#,#}&

Girdi olarak pozitif bir tamsayı alarak ve 2B diziyi döndüren saf işlev. 1 ve 0'ları oluşturmak için cos² (π x / 2) periyodik fonksiyonunu kullanır.

Biraz daha eğlence için, 32 baytlık çözümü nasıl?

Sign@Zeta[1-+##]^2&~Array~{#,#}&

Riemann zeta fonksiyonunun önemsiz sıfırlarının yerlerini kullanır.

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.