Визуализировать включение-исключение


11

Включение-Исключение позволяет вычислять размеры некоторых объединений и пересечений между наборами, зная некоторые другие значения. Я не буду объяснять это точно, но ваша задача - визуализировать включение-исключение на диаграмме Венна.

Потому что я хороший, вы будете использовать прямоугольники, а не круги.

Вам будет предоставлен список прямоугольников, обозначенных координатами верхнего левого и нижнего правого углов в любом приемлемом формате (список из четырех кортежей, список пар, список пар и т. Д.). Вы можете предположить, что все координаты неотрицательны и находятся в пределах (разумного) диапазона номеров вашего языка (укажите, что это, если оно меньше 128). Вы можете выбрать включение слева или исключение слева и включение справа или исключение справа. Независимо от выбранного формата вы можете предположить, что все прямоугольники имеют размер не менее 1x1.

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

Однако всякий раз, когда два прямоугольника перекрываются, область перекрытия должна быть нарисована другим непробельным символом l != k, также вашим выбором.

Всякий раз, когда три прямоугольника перекрываются, область перекрытия должна быть нарисована с kи для нечетного числа охватывающих прямоугольников kи четного числа l.

Фон должен быть одним пробелом ( 0x20).

Тестовые случаи ( k = "#", l = ".")

0 0 9 9
1 1 10 10
2 2 11 11

#########  
#........# 
#.#######.#
#.#######.#
#.#######.#
#.#######.#
#.#######.#
#.#######.#
#.#######.#
 #........#
  #########

1 1 3 3
2 2 4 4


 ## 
 #.#
  ##

1 1 9 9
2 2 8 8
3 3 7 7


 ########
 #......#
 #.####.#
 #.####.#
 #.####.#
 #.####.#
 #......#
 ########

Заметки

  • 0, 0Должны присутствовать начальные пробелы и символы новой строки (которые появляются, если минимальная координата отсутствует )
  • Любые завершающие пробелы и переводы строк разрешены в разумных пределах (т. Е. Не трейлинг, как 100000000 переходов, это просто раздражает)
  • Оси x и y могут быть направлены в любую сторону, но вы должны быть последовательными и указать, какой (по умолчанию - x-right и y-down)
  • координаты могут быть 0-, 1- или 2-индексированными.

Реализация протонов

Это , поэтому цель - получить самый короткий код. Удачного игры в гольф!


Ось X простирается вправо, а ось Y простирается вниз от верхнего левого угла?
user202729

@ user202729 В тестовых случаях да (на самом деле неоднозначно), но вы можете использовать любой из них, если вы последовательны
HyperNeutrino

@dzaima Да. [...]
HyperNeutrino

1
@ JoKing Да, я сделаю формат ввода более гибким. понял, что это старый вызов, и я еще не слишком
разбирался в его

1
@JoKing На самом деле я позволю любую из четырех комбинаций.
HyperNeutrino

Ответы:


4

6502 подпрограммы машинного кода (C64), 57 байтов

20 44 E5 A0 03 84 FB 20 9B B7 A4 FB 96 22 C6 FB 10 F5 85 FC A6 24 20 F0 E9 A4
25 B1 D1 09 01 49 02 91 D1 C8 C4 23 D0 F3 E8 E4 22 D0 E9 A9 2C C5 FC F0 D0 A5
C6 F0 FC C6 C6 4C 44 E5

Это позиционно-независимый код, поместите его где-нибудь в ОЗУ и используйте правильный начальный адрес, вызывая его sys.

Демо онлайн (начальный адрес$C000/49152).

Использование: sys<startaddress>,<x1>,<y1>,<x2>,<y2>[,<x1>,<y1>,<x2>,<y2>[,...]]

Пример: sys49152,0,0,9,9,1,1,10,10,2,2,11,11

На разумных диапазонах чисел: естественный диапазон на этом 8-битном компьютере - [0-255], и программа примет это как параметры. Но экран C64 имеет только 40 столбцов и 25 строк, поэтому ограничивает разумный диапазон значениями [0-40] для значений x и [0-25] для значений y. Использование других значений будет иметь непредсказуемое поведение.


прокомментировал список разборки:

20 44 E5    JSR $E544           ; clear screen
 .mainloop:
A0 03       LDY #$03            ; index for reading coordinates
84 FB       STY $FB
 .inputrect:
20 9B B7    JSR $B79B           ; read 8bit value from parameter
A4 FB       LDY $FB
96 22       STX $22,Y           ; and store to $22-$25
C6 FB       DEC $FB
10 F5       BPL .inputrect      ; parameter reading loop
85 FC       STA $FC             ; store last character
A6 24       LDX $24             ; load y1
 .rowloop:
20 F0 E9    JSR $E9F0           ; get pointer to screen row in $d1/$d2
A4 25       LDY $25             ; load x1
 .colloop:
B1 D1       LDA ($D1),Y         ; load character at screen position
09 01       ORA #$01            ; set bit 0 ( -> '#')
49 02       EOR #$02            ; toggle bit 1 (toggle between '#' and '!' )
91 D1       STA ($D1),Y         ; store character at screen position
C8          INY                 ; next x
C4 23       CPY $23             ; equals x2?
D0 F3       BNE .colloop        ; no -> repeat
E8          INX                 ; next y
E4 22       CPX $22             ; equals y2?
D0 E9       BNE .rowloop        ; no -> repeat
A9 2C       LDA #$2C            ; load ','
C5 FC       CMP $FC             ; compare with last character from parsing
F0 D0       BEQ .mainloop       ; if ',', repeat reading coordinates
 .waitkey:
A5 C6       LDA $C6             ; load input buffer size
F0 FC       BEQ .waitkey        ; and repeat until non-empty
C6 C6       DEC $C6             ; set back to empty
4C 44 E5    JMP $E544           ; clear screen


3

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

WS«≔I⪪ι ιF…§ι⁰§ι²«Jκ§ι¹UMKD⁻§ι³§ι¹↓§10Σλ

Попробуйте онлайн! Ссылка на подробную версию кода. Будет на 6 байт короче, когда @ ASCII-only исправляет ошибку в Charcoal . Принимает ввод как завершенный новой строкой список разделенных пробелами списка координат. Объяснение:

WS«

Цикл по каждой строке ввода, пока не будет достигнута пустая строка.

≔I⪪ι ι

Разбейте линию на список координат.

F…§ι⁰§ι²«

Обведите все координаты X

Jκ§ι¹

Прыгайте в верхнюю часть колонны.

UM

Карта над каждым из ...

KD⁻§ι³§ι¹↓

... все ячейки в столбце ...

§10Σλ

... новое значение, 0если они содержат 1, в противном случае 1. Изменить: Вскоре после написания этого, Уголь изменил поведение ¬так, что I¬Σλработает здесь, чтобы сохранить 1 байт.



@ ASCII-только ошибка в моем обходном пути - я могу напечатать \nвместо этого, я думаю ...
Нил



2

R , 196 189 байт

m=matrix
x=m(scan(file("stdin")),4)
y=m(0,max(x[3,]),max(x[4,]))
n=ncol(x)
while(n){z=x[,n]  
i=z[1]:z[3]
j=z[2]:z[4]
y[i,j]=y[i,j]+1
n=n-1}
i=!y
y=y%%2+1
y[i]=' '
cat(rbind(y,'\n'),sep='')

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

Код читает входные данные как stdin, расположенные в виде кортежа x1 y1 x2 y2, где x - столбец, а y - строка. Я использую 1 и 2 для уровней перекрытия, где 1 представляет четный уровень.

Сохранено 7 байт благодаря пользователю 2390246.


1
Несколько идей для игры в гольф: 1. Есть ли необходимость трансформировать вашу матрицу х? 2. Используйте nrow(или, ncolесли не преобразовано) вместо dim(x)[1]3. Вам не нужно определять, i=y>0поскольку вы используете его только один раз.
user2390246

4. Инициализируйте матрицу -1, а затем просто используйте y=y%%2и y[y<0]=" ".
user2390246

Спасибо. Я включил предложения 1 и 2. Предложения 3 и 4 не сработают, потому что: i = y> 0 используется для хранения уровней до применения модуля, а модуль не должен сохранять знаки. Тем не менее, это дало мне идею использовать неявное соглашение R, что 0 = FALSE, и сохранить два дополнительных байта. :)
NofP

2

Раку , 54 байта

{my@a;{@a[$^a..$^b;$^c..$^d]X+^=1}for $_;@a >>~|>>' '}

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

Принимает входные данные в виде плоского списка координат в качестве включающих координат, то есть x1,y1,x2,y2,x1,y1,x2,y2...и выводит в виде списка списка символов с kбытием 1и lбытием 0.

Объяснение:

{                                                    }  # Anonymous codeblock
 my@a;    # Declare an array
      {                          }for $_;    # Loop over the input
       @a[                 ]   # Indexing into @a
          $^a..$^b             # The range of rows
                  ;$^c..$^d    # And the range of columns for each
                            X        # And for each cell
                             +^=1    # Set it to itself bitwise XOR'd with 1
                         # Cells not yet accessed are numerically zero
                                         @a >>~|>>' '   # Stringwise OR each cell with a space
                         # Cells not yet accessed are stringily empty         

1

Желе , 43 байта

+µ>2Ḥạ
ạ1ẋ$0ẋ⁸¤;µ/€«þ/µ€z0z€0Z€Zz€0Z€ç"/o⁶Y

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

объяснение

+µ>2Ḥạ                                Helper Link; combines final rectangles (0 is blank, 1 is covered, 2 is uncovered)
+                                     add the two values
 µ                                    (with the sum...)
  >2                                  check if it's greater than two
    Ḥ                                 double the result (2 if it's 3 or 4, 0 if it's 0, 1, or 2)
     ạ                                absolute difference (0 should take whatever the other thing's value is, 1+1 and 2+2 should give 2, 1+2 and 2+1 should give 1)
ạ1ẋ$0ẋ⁸¤;µ/€«þ/µ€z0z€0Z€Zz€0Z€ç"/o⁶Y  Main Link
               µ€                     For each rectangle stored as [[x1, x2], [y1, y2]]
         µ/€                          For each of [a, b] = [x1, x2] and [y1, y2], reduce it by (in other words, use a dyad on a size-2 list)
 1ẋ$                                  repeat [1]            times
ạ                                                abs(a - b)
        ;                             and append to
    0ẋ ¤                              [0] repeated   times
      ⁸                                            a
            «þ/                       and reduce by minimum outer product table (take the outer product table, by minimum, of the x results and the y results)
                                      [NOTE] At this point, we have a list of matrices with 0s as blanks and 1 as covered
                 z0z€0Z€Zz€0Z€        Make all of the matrices the same size:
                 z0                   zip, fill with 0 (all matrices are the same length, but not width, and now are lists of row-wise lists of rows)
                   z€0                zip each, fill with 0 (all rows are the same length within their row-wise lists, and are now lists of row-wise lists of columns)
                      Z€              zip each (flip rows back to lists of row-lists of rows)
                        Z             zip (flip back to matrices); however, if a matrix is smaller on both axes, its rows will not be the same length
                         z€0          zip each, fill with 0 (all rows in each matrix are the same length and the value is now a list of transposed matrices)
                            Z€        zip each (the value is now a list of matrices, all the same length, filled with 0 (empty space))
                              ç"/     reduce by (vectorized) the relation in the Helper Link (to combine all of the final values)
                                 o⁶   logical OR with " "; replace 0s with spaces
                                   Y  join with newlines (formatting)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.