İçerme-Dışlama Görselleştir


11

İçerme-Dışlama, bazı diğer değerlerin bazılarını bilerek kümeler arasındaki bazı birliklerin ve kavşakların boyutlarını hesaplamanızı sağlar. Tam olarak açıklamayacağım, ancak zorluğunuz bir Venn Diyagramına dahil olma-dışlama görselleştirmek.

Çünkü iyiyim, daire değil dikdörtgen kullanacaksın.

Herhangi bir makul biçimde (4 tupl listesi, çift çifti listesi, çift listesi, vb.) Sol üst ve sağ alt köşe koordinatları ile gösterilen dikdörtgenlerin bir listesi verilecektir. Tüm koordinatların negatif olmadığını ve dilinizin (makul) sayı aralığında olduğunu varsayabilirsiniz (lütfen 128'den küçükse ne olduğunu belirtin). Sola dahil veya sola özel ve sağa dahil veya sağa özel olmayı seçebilirsiniz. Seçtiğiniz biçimden bağımsız olarak, tüm dikdörtgenlerin en az 1x1 olduğunu varsayabilirsiniz.

Ardından, ekrandaki her bir dikdörtgeni (ASCII tuvali) kseçmeniz gereken tek boşluk olmayan bir karakter kullanarak çizmeniz gerekir.

Bununla birlikte, iki dikdörtgen üst üste geldiğinde, üst üste binen alan başka bir boşluk olmayan karakterle l != k, ayrıca sizin seçiminizle çizilecektir .

Her üç dikdörtgen üst üste çakışan alanı ile çizilmelidir kve, kaplama dikdörtgen bir tek sayı için k, ve bir çift sayı l.

Arka plan tek boşluklar ( 0x20) olmalıdır.

Test Durumları ( 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


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

notlar

  • Öncü boşluklar ve yeni satırlar (minimum koordinat yoksa oluşur 0, 0) mevcut olmalıdır
  • Sondaki boşluklara ve yeni satırlara makul ölçüde izin verilir (yani 100000000 yeni satır gibi izlemeyin, bu sadece sinir bozucu)
  • x ve y eksenleri her iki yöne de bakabilir, ancak tutarlı olmanız ve hangisini belirtmeniz gerekir (varsayılan x-sağ ve y-aşağı)
  • koordinatlar 0-, 1- veya 2- indekslenebilir.

Referans Proton Uygulaması

Bu , bu yüzden amaç en kısa koda sahip olmaktır. Mutlu golf!


x ekseni sağa, y ekseni sol üst köşeden aşağıya doğru uzanıyor mu?
user202729

@ user202729 Test durumlarında, evet (aslında belirsiz) ancak tutarlı olduğunuz sürece kullanabilirsiniz
HyperNeutrino

@dzaima Yup. [...]
HyperNeutrino

1
@ Evet evet, giriş formatını daha esnek hale getireceğim. bunun eski bir meydan okuma olduğunu fark ettim ve henüz meydan okumaya çok aşina
değildim

1
@JoKing Aslında dört kombinasyondan herhangi birine izin vereceğim.
HyperNeutrino

Yanıtlar:


4

6502 makine kodu rutini (C64), 57 bayt

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

Bu konumdan bağımsız bir koddur, RAM'de bir yere koyun ve onu çağıran doğru başlangıç ​​adresini kullanın sys.

Çevrimiçi demo (başlangıç ​​adresi$C000/49152).

Kullanımı: sys<startaddress>,<x1>,<y1>,<x2>,<y2>[,<x1>,<y1>,<x2>,<y2>[,...]]

Misal: sys49152,0,0,9,9,1,1,10,10,2,2,11,11

Makul sayı aralıklarında: Bu 8 bitlik makinedeki doğal aralık [0-255] 'dir ve program bunu parametre olarak kabul eder. Ancak C64 ekranında yalnızca 40 sütun ve 25 satır vardır, bu nedenle makul aralığı x değerleri için [0-40] ve y değerleri için [0-25] ile sınırlar. Diğer değerlerin kullanılması öngörülemeyen davranışlara sahip olacaktır.


yorumlu sökme listesi:

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

Python 2 , 218 192 189 185 158 154 147 bayt

def f(l):_,_,a,b=map(range,map(max,zip(*l)));print'\n'.join(''.join((' '+'#.'*len(l))[sum((x<=i<X)*(y<=j<Y)for x,y,X,Y in l)]for i in a)for j in b)

Çevrimiçi deneyin!


3

Kömür , 40 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. @ ASCII sadece Kömürdeki bir hatayı düzelttikten sonra 6 bayt daha kısa olacaktır . Girdiyi boşlukla ayrılmış koordinatların yeni satır sonlandırılmış listesi olarak alır. Açıklama:

WS«

Boş bir satıra ulaşılana kadar her giriş satırının üzerinden geçin.

≔I⪪ι ι

Çizgiyi bir koordinatlar listesine ayırın.

F…§ι⁰§ι²«

Tüm X koordinatlarının üzerinden geçin.

Jκ§ι¹

Sütunun üst kısmına atlayın.

UM

Harita üzerinde ...

KD⁻§ι³§ι¹↓

... sütundaki tüm hücreler ...

§10Σλ

... yeni değer, 0içerdikleri 1takdirde olur 1. Düzenleme: Bunu yazdıktan kısa bir süre sonra, Kömür davranışını değiştirdi, ¬böylece I¬Σλburada 1 bayt kaydetmek için çalışıyor.


: | yukarı ı karmaşa şey yaptı tio.run/...
ASCII yalnızca

@ Sadece ASCII benim geçici çözüm - Ben \nbunun yerine sanırım yazdırabilirsiniz ...
Neil

2

Python 2 , 181 bayt

l=input()
_,_,x,y=map(max,zip(*l))
m=eval(`[[32]*x]*y`)
for v,w,x,y in l:
 for i in range(v,x):
	for j in range(w,y):
	 m[i][j]=max(m[i][j]^1,34)
for n in m:print''.join(map(chr,n))

Çevrimiçi deneyin!


2

C (gcc) , 205 bayt

x[999][999];a;b;c;d;j;k;l;m;n;main(i){for(;scanf("%d %d %d %d",&a,&b,&c,&d)>3;m=d>m?d:m,n=c>n?c:n)for(i=b;i<d;++i)for(j=a;j<c;++j)x[i][j]=x[i][j]^2|1;for(;k<n||++l<(k=0,puts(""),m);putchar(x[l][k++]+32));}

Çevrimiçi deneyin!


2

R , 196 189 bayt

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='')

Çevrimiçi deneyin!

Kod, girişi x1 y1 x2 y2 grubu olarak düzenlenmiş stdin olarak okur; burada x, sütundur ve y, satırdır. Çakışma seviyeleri için 1 ve 2 kullanıyorum, burada 1 eşit bir seviyeyi temsil ediyor.

User2390246 sayesinde 7 bayt kaydedildi.


1
Bunu golf oynamak için birkaç fikir: 1. x matrisinizi dönüştürmenize gerek var mı? 2. 3 yerine nrow(veya ncoldönüştürülmemişse) kullanın. Yalnızca bir kez kullandığınız gibi dim(x)[1]tanımlamanız gerekmez i=y>0.
user2390246

4. initialism matris -1 ve sadece kullanımı y=y%%2ve y[y<0]=" ".
user2390246

Teşekkür ederim. Öneri 1 ve 2'yi dahil ettim. Öneriler 3 ve 4 işe yaramaz çünkü: = i> y> 0, modülü uygulamadan önce seviyeleri saklamak için kullanılır ve modül, işaret koruması olmamalıdır. Ancak, bu bana 0 = FALSE örtük R kuralını kullanma ve iki ekstra bayt kaydetme fikrini verdi. :)
NofP

2

Raku , 54 bayt

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

Çevrimiçi deneyin!

Girdiyi kapsayıcı koordinatlar olarak düz bir koordinat listesi olarak alır, yani varlık ve varlık x1,y1,x2,y2,x1,y1,x2,y2...karakterlerinin listesi olarak çıktılar .k1l0

Açıklama:

{                                                    }  # 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

Jöle , 43 bayt

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

Çevrimiçi deneyin!

açıklama

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