Codegolf - Но Разве Это Искусство?

  • Автор темы Smitn1989
  • Обновлено
  • 21, Oct 2024
  • #1

Но разве это искусство? это эсоланг, созданный аис523, где одним шагом является разбиение программы на ортогонально соединенные «плитки»:

1000
1010
0001

Каждая отдельная буква показывает другую плитку. Интересно, программы в разделе «Но разве это искусство?» полагайтесь только на ориентацию самих плиток, а не на их размещение. Это означает, что приведенная выше программа функционально эквивалентна

1000
0010
0110

Но это не эквивалентно

1111111110
0111111101
1000010000
0010001110
0110011011
0100100010
0100011001

Или

1111111110
0111111101
1000010000
0010001110
0110011011
0100100010
0100011001

Вам нужно взять две двоичные прямоугольные матрицы: \$A\$ и \$B\$. Каждая матрица будет иметь ноль или более «плиток», состоящих из

1
0
1
s that are orthogonally connected to zero or more other
10
01
с. Затем вы должны вывести два различных непротиворечивых значения, которые указывают, эквивалентны ли плитки в \$A\$ и \$B\$ согласно определению эквивалентных сеток But Is It Art?.

Например,

000000
000000
000000
000000
000000
000000
000000
000000

Эквивалентны. Если вы его не видите, попробуйте заменить

010010
011111
110001
010001
010111
101101
110001
111111
s with letters, similar to above, to form groups of differently lettered tiles:

11111011011
01100000100
10101010010
10101001001

Вы можете предположить, что матрицы всегда будут прямоугольными и будут содержать только

11111
01100
00100
10101
10010
01101
10010
10001
00110
and
110000101
000000000
011011101
101101011
010110111
111101010
010100011
. Они никогда не будут пустыми, но не обязательно содержат
0110111
0011010
0101101
1111010
0101001
0000011
0100111
0000010
1101011
, or to be the same dimensions.

Вы можете использовать эти матрицы как строки, разделенные новой строкой, с нецифровым разделителем, не являющимся символом новой строки; 2D вложенные массивы; строковое представление матрицы; или любое разумное представление двоичной матрицы. Вы можете принять входные данные в виде двух списков целых чисел, преобразованных из двоичных чисел, представляющих строки (поэтому пример

1111100101
0111000111
0011111101
1010000010
1101010111
0111001010
1000111100
1100001010
1101001000
above would be
1101110
1010010
0101110
1100000
1010100
0010101
1000101
1001110
0000110
1101011
)

Это так, поэтому побеждает самый короткий код в байтах

Тестовые случаи

А Б результат
 
 
 
 
 
 [56, 402, 286, 705, 512] 
A ЛОЖЬ
1 0 истинный
1 A = B = 0000AAA000 BB0000DD 0BB00A00A0 B00AAA00 0B000AAAA0 00C0A00A C0DD00000E E0C0AAAA C000000000 истинный
1 A = B = 0000111000 11000011 0110010010 10011100 0100011110 00101001 1011000001 10101111 1000000000 ЛОЖЬ
1 1 истинный
DDD A DDD AA CC ABBBB CC AB B BBB A B B AA CC A CC A истинный
CC A CC A BBBB AA B B A A BBBB A B B AA CC A CC ЛОЖЬ

#код-гольф #код-гольф #задача принятия решения #двоичная матрица #сопоставление с образцом

Smitn1989


Рег
12 Mar, 2016

Тем
70

Постов
192

Баллов
562
  • 26, Oct 2024
  • #2

Дж, 80 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 »⁼⊟υ⊟υ
 

Попробуйте онлайн!

Скорее прямолинейный подход.

  • ⊞υθ prepend a 0-line, so the first "tile" found is always the 0s
  • »≔⟦⟧θW⁻ζθF№ζ⌊κ⊞θ⌊κ every 1 gets a unique index
»⊞ζEε⟦⁻﹪λη﹪⌊εη÷⁻λ⌊εη⟧
  • 1 shift the board into the 4 directions, and reduce to the highest index. So each group tile will have the same index, e.g.:
¿§θμ⊞εμ
  • F⁺λ⟦η¹±¹±η⟧ the coordinates of all the points §≔θλ⁰
  • 1 flatten both lists and group the coordinates by the indices
  • ≔⟦⌕θ¹⟧εFε« normalize each group to WΣθ« :
  • ≔⟦⟧ζ drop the first group (the 0s) and sort the rest
  • »Fη⊞θ⁰ are the results for both inputs equal?
 

Solntse


Рег
14 Apr, 2006

Тем
72

Постов
215

Баллов
625
  • 26, Oct 2024
  • #3

МАТЛ, 44 43 42 39 байт

≔⁺θI⪪⁺κ0¹θ

Входные данные: две матрицы (числовые двумерные массивы), используя ≔⊕Lκη as row seperator.

Выход: ≔⟦⟧θWS« for falsy, F²« за правдивость.

Попробуйте онлайн! Или проверить все тестовые случаи.

Как это работает

- ||answer||

Дж, 41 40 байт

F²«≔⟦⟧θWS«≔⊕Lκη≔⁺θI⪪⁺κ0¹θ»Fη⊞θ⁰≔⟦⟧ζWΣθ«≔⟦⌕θ¹⟧εF嫧≔θλ⁰F⁺λ⟦η¹±¹±η⟧¿§θμ⊞εμ»⊞ζEε⟦⁻﹪λη﹪⌊εη÷⁻λ⌊εη⟧»≔⟦⟧θW⁻ζθF№ζ⌊κ⊞θ⌊κ⊞υθ»⁼⊟υ⊟υ

Попробуйте онлайн!

-1 спасибо xash

Этот подход J настолько отличался, что я подумал, что он заслуживает отдельного ответа.

Мы принимаем входные данные в виде списков комплексных чисел, представляющих их координаты.

идея

  1. Создайте матрицу смежности точек, используя «расстояние <= 1» в качестве критерия «смежности».
  2. Матрица умножается сама на себя до фиксированной точки. Теперь строки представляют группы. Строки с одинаковой сигнатурой единиц являются элементами одной группы, поэтому мы берем уникальные строки.
  3. Используйте их как маски, чтобы выделить фактические точки каждой группы.
  4. Для каждого из них создайте «таблицу вычитания» каждого элемента группы со всеми остальными. Это даст уникальную подпись пространственной структуры группы, которая не зависит от ее расположения в сетке.
  5. Отсортируйте эти таблицы.
  6. Проверьте, совпадают ли два последних результата.
 

Aprelskiy


Рег
07 Jul, 2010

Тем
69

Постов
180

Баллов
565
  • 26, Oct 2024
  • #4

Желе, 30 байт

\()

Попробуйте онлайн!

Принимает ввод в виде списка координат (с индексом 1) (хотя это не имеет особого значения).

-2 байта благодаря caird coinheringaahing
-1 байт благодаря Нику Кеннеди

Это одно из самых забавных испытаний, которые я решал в Jelly за последнее время. Спасибо за вызов :)

function() ||answer||

JavaScript (ES10), 160 145 байт

Сэкономлено 15 байт благодаря @tsh

Ожидает две двоичные матрицы как function(a,b){ # matrices a and b G=function(m){ # define function G taking a matrix m (same format as a,b) x=seq(l=nrow(m)) # init x = 1...nrow of m for(i in x){ # for i in 1...nrow of m D=as.matrix(dist(m))[i,] # compute D=euclidean distance of row i of m from all the other rows x[D<=1]=min(x[D<=1]) # replace all vals of x where D<=1 with the min value of x where D<=1 } # (now x contains an equal value for each group of connected tiles) B=by(m,x,function(d){ # for each group of connected tiles d (a sub-matrix of m) R=Map(rank,d)) # compute the rank of each vector of coordinates x and y toString(R) # concat the result into one string } # (now B = list of string for each group of tiles) toString(sort(B)) # sort B and concat into one string } # G(a)==G(b) # if G(a) == G(b) then they have the same connected tiles pattern } # . Returns a Boolean value.

function(a,b,`+`=function(m,`?`=toString,x=seq(l=nrow(m))){for(i in x)x[K]=min(x[K<-as.matrix(dist(m))[i,]<=1]);?sort(by(m,x,function(d)?Map(rank,d)))})+a==+b

Попробуйте онлайн!

 

A299792458


Рег
15 Oct, 2006

Тем
69

Постов
210

Баллов
605
  • 26, Oct 2024
  • #5

Р, 158 байт

a=>b=>(g=m=>m.map((r,Y)=>r.map((v,X)=>(h=(x,y,w=m[y])=>w&&w[x]?[[-1,w[x]=0,1,2].map(d=>d+h(x+d%2,y+--d%2))]:[])(X,Y))).flat(2).sort()+3)(a)==g(b)

Попробуйте онлайн!

Функция, принимающая две матрицы, имеющие два столбца x,y с координатами 1 и возвращающая ИСТИНА/ЛОЖЬ.
Порядок координат должен быть одинаковым в двух матрицах (например, обе отсортированы по столбцу, а затем по строке).

Объяснение:

(a)(b)

Примечание:

мы используем +þ2ŒRBU¤ẎQfðƬṪṢ Helper link; given a list containing coordinates ^ on the left and the list of filled coordinates ^ on the right, breadth-first fill from those ^ coordinates (initially accepts a singleton list ^ with the starting coordinate) +þ Outer product table on addition between each coordinate and 2ŒRBU¤ (As a nilad) 2ŒR [-2, -1, 0, 1, 2] B Binary; [[-1, 0], [-1], [0], [1], [1, 0]] U Vectorizing reverse; [[0, -1], [-1], [0], [1], [0, 1]] We now have the neighbors of each starting point Ẏ Tighten / flatten once, since outer product table gives a 2D list Q Remove duplicates f Filter to only keep cells that are part of the whole grid itself ðƬ Take that entire previous part and keep running it until ^ the results are no longer unique (i.e. we have filled ^ the whole block) (keeps intermediate values) Ṫ Keep the last of these Ṣ And sort it W祀`Q1ị_Ɗ€Ṣ)E Main Link; accepts a list of two matrices ) For each of the matrices ` With this list as the left and right arguments € For each coordinate Wç¥ Wrap the coordinate into a singleton list and call the helper ^ link on that with the list of coordinates on the right Q Remove any duplicates Ɗ€ For each shape 1ị Get the first coordinate _ Subtract each coordinate Ṣ Sort it E Are the two results equal? keyword 3 times, with the new syntax +þ2ŒRBU¤ẎQfðƬṪṢ W祀`Q1ị_Ɗ€Ṣ)E в R 4.1.0+ мы можем сэкономить 21 байт, но, к сожалению, этого нет на TIO (пока).

 

PooldTypeJell94


Рег
25 Oct, 2024

Тем
72

Постов
199

Баллов
569
  • 26, Oct 2024
  • #6

Древесный уголь, 151 120 байт

-:&([:/:~]-/~@#~&~.[:+./ .*^:_~1>:|@-/~)

Попробуйте онлайн! Ссылка на подробную версию кода. Выводит логическое значение Charcoal, т.е. , % Do twice i % Input: matrix 4&1ZI % Label connected components formed by the value 1, using 4-connectivity. % In the n-th component, 1 is replaced n XK % Copy this label matrix into clipboard K Xz! % Nonzeros as a row vector. Gives a vector containing the values 1, 2, % ..., N, where N is the number of connected components and each value % is repeated as many times as the size of that component " % For each n in that vector. Because of the above mentioned repetitions, % several iterations will give the same result. This is inefficient but % harmless K % Push label matrix @=&f % Push row and column indices of occurrences of n, as column vectors J*+! % Multiply by imaginary unit, add, transpose: combines the two column % vectors into a complex row vector which describes the connected % component with label n t1)- % Subtract first entry from the vector. This has the effect of % normalizing the *position* of each connected component ] % End N % Push current number of elements in the stack @- % Subtract 0 in the first iteration, or 1 in the second. The result is % the number of components of the latest input (in the second iteration % the bottom of the stack contains a result from the previous input) $Xh % Take that many elements from the stack and combine them into a cell % array. This cell array contains all row vectors of the components of % the latest input. Each component is repeated as many times as the % size of that component o % Convert into a matrix, right-padding with zeros if needed XS % Sort rows (atomically). This has the effect of normalizing the % *order* of the components ] % End X= % Are the two result matrices equal? Implicit display for equivalent, nothing if not. Explanation:

1

Обработайте две матрицы.

0

Начните читать матрицу в плоский массив.

;

Следите за шириной матрицы, включая запас прочности.

,i4&1ZIXKXz!"K@=&fJ*+!t1)-]N@-$XhoXS]X=

Добавьте текущую строку в массив, включая запас прочности.

-:&

Добавьте запас безопасности в нижнюю часть массива.

1/:~@}.

Начните собирать плитки.

0 0

Повторяйте, пока все плитки не будут найдены.

<@(-"1<./)

Начать поиск в ширину плитки, включающей крайний левый верхний угол. …/.~&(,/) .

0 0, 0 1, 0 2,. 1 0, …

Отметьте, что эта ячейка собрана.

(#:i.)@$

Проверьте все ортогонально соседние ячейки.

0 0 0 4 4 0 0 0 11 9 0 11

Если эта ячейка является [(*[:>./(0,(,-)=0 1)|.!.0])^:_ then collect this cell.

0 0 0 3 4 0 0 0 8 9 0 11

Преобразуйте положение всех элементов этого тайла обратно в координаты, затем вычтите координаты первого элемента тайла и сохраните результат в списке нормализованных тайлов. (Обратите внимание, что вычитание последовательно отклоняется на единицу для ячеек слева от первой ячейки, но поскольку оно последовательное, оно не влияет на сравнение между плитками.)

[*i.@$

Отсортируйте список нормализованных плиток.

&(0,])

Сохраните отсортированный список.

-:&(1/:~@}.(#:i.)@$<@(-"1<./)/.~&(,/)[(*[:>./(0,(,-)=0 1)|.!.0])^:_[*i.@$)&(0,])

Сравните два списка нормализованных плиток.

 

Mikusiek


Рег
26 Dec, 2006

Тем
49

Постов
207

Баллов
452
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно