Створіть матрицю контрольної дошки


26

Візьміть додаткове ціле число n як вхідне та виведіть матрицю n-by-n checkboard, що складається з 1 та 0 .

У верхній лівій цифрі завжди має бути 1 .

Тестові приклади:

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

Формати введення та виведення необов’язкові. Виводиться матриця як список списків.


Чи добре список рядків?
xnor

Так, це нормально.
Стюі Гріффін


2
Ваші приклади показують пробіли між номерами в одному рядку, чи потрібно це, щоб виглядати більше як квадрат?
BradC

@BradC це не потрібно. Перший підхід тут справедливий.
Стюі Гріффін

Відповіді:


12

Желе , 4 байти

52 секунди!

+€ḶḂ

Спробуйте в Інтернеті!


7
"52 секунди!" наче я до цього не звик ...
Ерік Аутгольфер

5
У вас буде, начебто, звуковий сигнал, ви носите цілодобово для нових викликів у сфері PPCG?
Magic Octopus Urn

@carusocomputing Тим, хто має швидше підключення до Інтернету, зазвичай є щасливчики, які виграють.
Ерік Аутгольфер

9

MATL , 5 байт

:otYT

Спробуйте в MATL онлайн!

Пояснення

Розглянемо вклад 4як приклад.

:    % 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 байт

ÆÇ+X v

Перевірте це в Інтернеті! (Використовує -Qпрапор для легшої візуалізації)

Пояснення

 Æ   Ç   +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

Цікава річ, що vце не вбудований "ділиться на 2". Натомість це вбудований "подільний на X". Однак, на відміну від більшості мов для гольфу, функції Japt не мають фіксованої суворості (вони можуть приймати будь-яку кількість правильних аргументів). Коли вам дано 0 правильних аргументів, vпередбачається, що ви хотіли 2, і так діє точно так, як це було дано 2замість нічого.



7

Haskell , 50 41 39 38 байт

Завдяки nimi та xnor за те, що вони допомагають голити загалом 9 10 байт

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

По черзі, на ще один байт:

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

або:

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

Можливо, неоптимальний, але чистий, прямолінійний підхід.


concat.repeatє cycle: n!l=take n$cycle l. Якщо ви йдете pointfree він зберігає ще один байт: (!)=(.cycle).take.
німі

Прекрасна! Я знав, що для цього є вбудований, але не міг запам'ятати ім’я для життя мене
Julian Wolf

Я збирався запропонувати f n|r<-take n.cycle=r[r"10",r"01"]чи подібне. але, схоже, Haskell підказує неправильний тип r? Це працює з явним набором тексту f n|r<-take n.cycle::[a]->[a]=r[r"10",r"01"].
xnor


1
@zbw Я думав, що це так, але використання NoMonomorphismRestrictionне допомогло. Також не Rank2Typesчи RankNTypes. Ви знаєте, що там відбувається?
xnor



4

JavaScript ES6, 55 54 51 46 байт

Збережено 1 байт завдяки @Neil

Збережено 2 байти завдяки @Arnauld

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

Спробуйте в Інтернеті!

Це виводиться у вигляді масиву масивів. Діапазони JavaScript досить неприємні, але я використовую, [...Array(n)]що створює масив розмірівn


Поки що байт коротший, щоб використовувати параметри індексу:n=>[...Array(n)].map((_,i,a)=>a.map((_,j)=>(i+j+1)%2))
Ніл

@Neil так, я ніколи не думав використовувати третій параметр у карті, дякую!
Пуховик

@Arnauld дякую! що надихнуло мене зберегти ще 5 байт!
Пуховик

4

Сітківка , 33 30 байт

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

Спробуйте в Інтернеті! Пояснення: Перший етап перетворює вхід в одинаковий за допомогою 1s (зручно!), А другий етап перетворює значення в квадрат. Третій етап інвертує чергування бітів у кожному рядку, тоді як останній етап інвертує біти на альтернативних рядках. Редагувати: збережено 3 байти завдяки @MartinEnder.


$`1$'просто $_.
Мартін Ендер

@MartinEnder Ах, я незнайомий $_, дякую!
Ніл

3

MATL , 7 байт

:t!+2\~

Спробуйте в Інтернеті!

Пояснення:

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

Примітка. Я почав вирішувати це в MATL після того, як опублікував виклик.


Рівнозначно і коротше::&+o~
Луїс Мендо

1
Ще вчу :-) Я оновлю завтра. Мені сподобався і ваш інший підхід :-)
Стюі Гріффін

1
Це я теж придумав. І ей, ви використовуєте лише чистий набір інструкцій MATL, а не ті Yпримхливі модифіковані інструкції, які @LuisMendo використовує.
Санчіз

@Sanchises Пескі, так ? :-P
Луїс Мендо

3

Брахілог , 15 байт

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

Спробуйте в Інтернеті!

Пояснення

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 байт

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

Так, правильний інструмент для роботи.


3

05AB1E , 9 7 байт

-2 байти завдяки Еміньї

LDÈD_‚è

Спробуйте в Інтернеті!

Пояснення

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

Ви можете вирізати, »як вихід списків списків добре, і ви також можете видалити s.
Емінья

@Emigna Так, дякую!
kalsowerus

Пояснення трохи не має значення.
Ерік Аутгольфер

3

Java (OpenJDK 8) , 80 77 байт

-3 байти завдяки Kevin Cruijssen

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

Спробуйте в Інтернеті!

О, дивись, напіврозумна відповідь на довжину Java, з великою кількістю веселих операторів.

лямбда, який приймає int і повертає String. Працює, використовуючи номер рядка та номер стовпця, використовуючи / та%, щоб визначити, яке значення воно повинно бути, мод 2;

Безголівки:

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

Ви можете видалити простір, щоб зберегти байт. Проблема констатує, що вихідний формат є гнучким. О, і ви можете зберегти ще два байти, змінивши (i++/j+i%j)%2його, i++/j+i%j&1щоб ці дужки не знадобилися. Що робить загальний 1 байт коротшим, ніж моє вкладене рішення для циклу ( n->{String r="";for(int i=0,j;i++<n;r+="\n")for(j=0;j<n;r+=j+++i&1);return r;}), тому +1 від мене. :)
Кевін Круїссен

@KevinCruijssen Так, я все ще чекав відповіді в просторі. Я не замислювався над тим, що має перевагу над% та & 1 ==% 2
PunPun1000

2

Вугілля деревне, 8 байт

UON10¶01

Спробуйте в Інтернеті! Пояснення: Це приблизно перекладається на наступний багатослівний код (на жаль, девербосифікатор наразі додає непотрібний роздільник):

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





2

R , 38 37 байт

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

Спробуйте в Інтернеті!

-1 байт завдяки Джузеппе

Скористається правилами утилізації R, по-перше, при створенні матриці, по-друге, додаючи 0: (n-1) до цієї матриці.


Ви можете скинути байт, позбувшись tі замість цього побудувавши матрицю byrow=T, тобто(matrix(1:n,n,n,T)+1:n-1)%%2
Джузеппе

1
outer(1:n,1:n-1,"+")%%2досить на кілька байт коротше :)
JAD

2

Swi-Prolog, 142 байти.

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).

Спробуйте в Інтернеті - http://swish.swi-prolog.org/p/BuabBPrw.pl

Він виводить вкладений список, тому правила кажуть:

  • t() є перемикачем, воно робить 0 -> 1 і 1 -> 0.
  • r() досягає успіху в окремому рядку, що є рекурсивною перевіркою рядка, що це альтернативні і нулі.
  • f()рекурсивно перевіряє всі рядки, чи є вони правильної довжини, чи є вони дійсними рядками r()і що кожен рядок починається з різної 0/1.
  • c(N,C) говорить, що C - дійсна шашка розміру N, якщо кількість рядків (вкладених списків) дорівнює N, а помічник f - успішний.

Випробування: введіть тут опис зображення


2

C, 69 67 63 байт

Дякуємо @Kevin Cruijssen за збереження двох байтів та @ceilingcat за збереження чотирьох байтів!

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

Спробуйте в Інтернеті!


Ви можете видалити пробіл у printf("%d ", оскільки це ще один дійсний метод виводу.
Conor O'Brien

@ ConorO'Brien Так, спасибі
Steadybox

Ви можете зберегти два байта, змінивши (j+++i)%2для , j+++i&1щоб видалити ці дужки.
Kevin Cruijssen

@ceilingcat Дякую!
Steadybox

1

QBIC , 19 байт

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

Пояснення

[:|         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 байт + вхід

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

Спробуйте в Інтернеті! (вхід для 4)

Одинарний вхід в 1s, 95 байт + вхід

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

Спробуйте в Інтернеті! (вхід для 8)

Як це працює?

  • Vі Dє гольф \/і //відповідно.

  • /*/k#/і /&1/k#&//&|//розділити вхід на еквівалент'k#'*len(input())

  • /#k//k#//&k/k&//\/k/k\//перемістити всі ks до /r/S/блоку

  • Ss просто використовуються для прокладки випадків, коли ks приходять після /s, щоб вони не переміщалися в інше місце, а Ss потім видалялися

  • #s потім перетворюються на r\ns

  • Рядок ks перетворюється на змінний 1010...рядок

  • В r\ns перетворені в 1010...\nс

  • Кожна пара 1010...\n1010\nперетворена на1010...\01010...;\n

  • Або 0;чи 1;будуть обрізані (бо 01010...рядок занадто довго 1)


1

Математика, 28 байт

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

Чиста функція, яка приймає додаткове ціле число як вхід і повертає 2D масив. Використовує періодичну функцію cos² (πx / 2) для генерування 1s і 0s.

Для трохи веселіше, як щодо 32-байтового рішення

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

який використовує місця розташування тривіальних нулів zeta функції Рімана.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.