包含-除外の視覚化


11

包含-除外を使用すると、他の値のいくつかを知っているセット間のいくつかの結合および交差のサイズを計算できます。私はそれを正確に説明しませんが、あなたの課題は、ベン図で包含/除外を視覚化することです。

私はいいから、円ではなく長方形を使うことになります。

任意の妥当な形式(4タプルのリスト、ペアのペアのリスト、ペアのリストなど)で、左上隅と右下隅の座標で示される長方形のリストが表示されます。すべての座標が負ではなく、言語の(合理的な)数値範囲内であると想定できます(128未満の場合はそれを指定してください)。左を含むか左を排他的にするか、右を含むか右を含むかを選択できます。選択した形式に関係なく、すべての長方形が少なくとも1x1であると想定できます。

次に、k選択する空白文字以外の単一の文字を使用して、画面上の各長方形(ASCIIキャンバス)を描画します。

ただし、2つの長方形が重複する場合は常に、重複する領域が別の非空白文字l != kで描画され、選択する必要があります。

3つの長方形が重なるときはいつでも、重なり合う領域はで描画され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軸が下に伸びていますか?
user202729

@ user202729テストケースでは、はい(実際はあいまい)ですが、一貫している限りどちらでも使用できます
-HyperNeutrino

@dzaimaうん。[...]
HyperNeutrino

1
@JoKingはい、入力形式をより柔軟にします。これは古いチャレンジであり、チャレンジライティングにまだあまり慣れていないことに
気付きました

1
@JoKing実際には、4つの組み合わせのいずれかを許可します。
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

これは位置に依存しないコードで、RAMのどこかに配置し、で呼び出す正しい開始アドレスを使用します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行しかないため、妥当な範囲はx値の場合は[0-40]に、y値の場合は[0-25]に制限されます。他の値を使用すると、予測できない動作が発生します。


分解リストのコメント:

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Σλ

オンラインでお試しください!リンクは、コードの詳細バージョンです。@ASCIIのみがCharcoalのバグを修正すると、6バイト短くなります。スペースで区切られた座標のリストの改行で終わるリストとして入力を受け取ります。説明:

WS«

空白行に達するまで、入力の各行をループします。

≔I⪪ι ι

行を座標のリストに分割します。

F…§ι⁰§ι²«

すべてのX座標をループします。

Jκ§ι¹

列の先頭にジャンプします。

UM

それぞれにマップ...

KD⁻§ι³§ι¹↓

...列内のすべてのセル...

§10Σλ

...新しい値は0、含まれている場合1、そうでない場合1です。編集:これを書いてすぐに、炭は1バイトを節約するためにここで動作する¬ように動作を変更しましたI¬Σλ


:| 最大I混乱の何かをしたtio.run/...
ASCIIのみ

回避策の@ASCIIのみのバグ- \n代わりに印刷できると思います
ニール



2

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

オンラインでお試しください!

コードは、x1が列で、yが行であるx1 y1 x2 y2タプルとして配置されたstdinとして入力を読み取ります。オーバーラップレベルに1と2を使用しています。1は偶数レベルを表します。

user2390246のおかげで7バイト節約されました。


1
これをゴルフで打つためのいくつかのアイデア:1.マトリックスxを変換する必要はありますか?2. 3の代わりにnrow(またはncol変換されdim(x)[1]ない場合)を使用i=y>0します。一度だけ使用するので、定義する必要はありません。
user2390246

4.マトリックスを-1に初期化してから、とを使用y=y%%2y[y<0]=" "ます。
user2390246

ありがとうございました。提案1と2を含めました。提案3と4は機能しません。理由は次のとおりです。i= y> 0は、モジュラスを適用する前にレベルを保存するために使用され、モジュラスは符号を保持しません。ただし、これにより、0 = FALSEという暗黙のR規則を使用し、2バイトを節約するというアイデアが得られました。:)
NofP

2

らく、54バイト

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

オンラインでお試しください!

入力を包括的座標としての座標のフラットリストとしてx1,y1,x2,y2,x1,y1,x2,y2...受け取ります。つまり、kbeing 1およびlbeing を含む文字のリストとして出力し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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.