Візуалізуйте включення-виключення


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-право та y- вниз)
  • координати можуть бути 0-, 1- або 2- індексованими.

Довідкова реалізація протонів

Це , тому мета - мати найкоротший код. Щасливого гольфу!


Вісь x поширюється вправо, а вісь y поширюється вниз від лівого верхнього кута?
користувач202729

@ user202729 У тестових випадках, так (насправді неоднозначно), але ви можете використовувати їх до тих пір, поки ви послідовні
HyperNeutrino

@dzaima Yup [...]
HyperNeutrino

1
@JoKing так, я зроблю формат введення більш гнучким. зрозумів, що це давнє завдання, і я ще не надто знайомий із написанням викликів
HyperNeutrino

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 виправляє помилку у вугіллі . Приймає введення як новий, закінчений рядком список пробілів, розділених пробілом. Пояснення:

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. Чи є необхідність перетворити матрицю x? 2. Використовуйте nrow(або ncolякщо не трансформується) замість dim(x)[1]3. Не потрібно визначати, i=y>0як ви використовуєте лише один раз.
користувач2390246

4. Ініціалізуйте матрицю до -1, а потім просто використовуйте y=y%%2і y[y<0]=" ".
користувач2390246

Дякую. Я включив пропозиції 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.