ASCIIアートベン図


8

重複する要素を含まない二つのリストを考えるab、二つのリストを出力ASCII-アートベン図間のクロスオーバーを見つけます。ベン図は、単純化のために従来の円の四角形バージョンを使用します。

与えられた:

a = [1, 11, 'Fox', 'Bear', 333, 'Bee']
b = ['1', 333, 'Bee', 'SchwiftyFive', 4]

出力(ベン図が正しい限り、順序は100%任意です):

+-----+----+-------------+
|11   |333 |SchwiftyFive |
|Fox  |Bee |4            |
|Bear |1   |             |
+-----+----+-------------+

プログラムは、実装に応じて検討する'1' == 1'1' != 1、検討します。また、すべてを文字列として扱い、文字列の入力のみを受け入れるように選択することもできます。


与えられた:

a=[]
b=[1,2,3]

出力(2つの空の部分にまだ右パッドスペースがあることに注意してください):

+-+-+--+
| | |1 |
| | |2 |
| | |3 |
+-+-+--+

与えられた:

a=[1]
b=[1]

出力:

+-+--+-+
| |1 | |
+-+--+-+

ルール

  • ベン図の要素は左揃えで配置され、最大長のエントリに1を加えた値が埋め込まれます。
  • ベン図のサブセクション内の要素の順序は任意です。
  • ベン図のコーナー(が|出会う場所-)は、で表す必要があります+
  • a.join(b).length() > 0両方が空の場合は、何でも実行できることが保証されます。
    • 安倍リンカーンの写真を印刷しても構いません。
  • これは、およびです。

ボーナス

Charcoalはこのようなボックスを自然にレンダリングしますが、全体のセット理論の一部...それがどれほどうまく機能するかはわかりません。質問にバウンティを追加する前に、最短の木炭提出の+100バウンティ(質問から2日)。


3
個人的に'1' == 1は、サポートできるというのは少し伸びすぎると
思い

@KritixiLithosは十分に公平です。チャレンジの仕様を更新して、始めた人に害を与えないようにしました。これで、文字列と整数の比較をどのように機能させるかを選択できます。どちらの選択も等しく有効な送信です。
マジックタコの

1
入力に文字列のみが含まれると想定できますか?
ロッド


1
@ L3viathan 1つのモバイル編集と投稿が終了しました。
マジックタコの壷

回答:



2

PHP> = 7.1、287バイト

<?for([$a,$b]=$_GET,$x=max(($m=array_map)(count,$r=[($d=array_diff)($a,$b),array_intersect($a,$b),$d($b,$a)]));$n<3;$n++)for(sort($r[+$n]),$i=-1;$i<=$x;$i++){$o[$i].="|+"[$b=$i<0||$i==$x].str_pad($b?"":$r[+$n][$i],max($m(strlen,$r[+$n]))+1," -"[$b]).("|+"[$b][$n<2]);}echo join("
",$o);

オンライン版

拡張

for([$a,$b]=$_GET, # store input arrays in shorter variables
$x=max(($m=array_map)(count,   # get maximum of 
$r=[($d=array_diff)($a,$b),array_intersect($a,$b),$d($b,$a)])); #the set array
$n<3;$n++)
  for(sort($r[+$n]),$i=-1;$i<=$x;$i++){ # sort array to remove keys
    $o[$i].="|+"[$b=$i<0||$i==$x].   # concat line $b boolean for first and last line beginning char 
    str_pad($b?"":$r[+$n][$i]   # string of item in array if not first or last line
    ,max($m(strlen,$r[+$n]))+1  # fill till maximum length of items in array
    ," -"[$b]) # with char depends on first/last line or item line
    .("|+"[$b][$n<2]); # make end of string if last array is reach
}
echo join("   
",$o); #Output

2

チャコール106 89 87バイト:

A⟦⟧ςA⟦⟧λA⟦⟧ρA⟦⟧τWS⊞ςιWS⊞⎇№ςιτριFς⊞⎇№τι⟦⟧λιF⟦λτρ⟧«Fι«↓Pκ»MLι↑←A⁺⌈EιLκ³ζURζ⁺⌈⟦LλLτLρ⟧²Mζ→

オンラインでお試しください!リンクは説明の目的で詳細コードへのリンクであり-sl、同等のネイティブCharcoalコードを表示するオプションがあることに注意してください。各セットの後に空白行がある改行で区切られた文字列として入力を受け取ります。

編集:@ASCIIのみのおかげで11バイトが節約されました。前のバージョンでは、最初のセットの最後の単語が2番目のセットになく、最初の列が最も高かったため、実際にはバグがありました。2つのMoveコマンドを最適化することで2バイトを節約しました(これにより、開発者はこれを自動的に実行しますが、結果のコードは常に有効であるため、答えはまだ競合しています)。

編集:私はMultiprint複数行出力での作業に慣れていなかったと思いますが、現在はそうであり、現在のCharcoalがu変数を空のリストに事前初期化するため、それを使用すると6バイト、さらに4バイト節約できます:オンラインで試してください!


ああ、あなたは、カーソルを移動せずに使用を印刷したい場合はMultiprint
ASCIIのみの

さて、95バイト、非冗長形式の区切り文字を削除するには、カンマ/セミコロンを削除することを忘れないでください(後で修正されます)、またMap(申し訳ありませんが、できるだけ早く文書化されます)が存在する
ASCIIのみ

@ASCIIのみです。まあ、私はいつかマルチプリントを試したと思います。そのため、なぜそれを機能させることができなかったのかわかりません。また、のおかげでMap、答えをさらに最適化するのに役立ちました。最後に、私はCharcoalがthis なしでを使用できるようにすることもあると思います
ニール

なしの方向は意図的なものです(ただし、常に変数付きの方向が印刷されていることを忘れないでください)
ASCIIのみ

1
Move了解しました。これで、Dennisがより適切な分解を引き出すのを待つだけで済みます(不要なセパレーターが削除されるため、必要に応じてコンマを追加できるようになります)
ASCIIのみ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.