リトルチャンドラーは悲しい。彼を元気づけるために彼に雲を引きます


57

リトルチャンドラーは悲しい。彼を元気づけるために彼に雲を引きます。
注:クラウドを描画しても、実際に彼を元気づけることはありません。

円は、3組として定義できます。(x,y,r)ここxで、デカルト平面上の円のx位置、デカルト平面上の円yのy位置、およびr円の半径です。xそしてy負でもよいです。r常にポジティブです。入力は、スペースで区切られた3タプルの形式の円のリストです。例えば:

3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8

3,1,1手段「に中心点を有する円3,11つの半径を有する。3,2,1.5手段」に中心点を有する円3,21.5半径を有します。

入力のこれらの円をすべてグラフに描画すると、次のようになります(わかりやすくするためにグリッド線とラベルを含めましたが、これらは必須ではありません)。

グラフ

すべての円が凝集していることに注目してください。つまり、それらはすべて互いに重なり合っており、1つの大きなグループを形成し、残りの部分から分離された小さな円のグループはありません。入力は凝集性が保証されています。

ここで、これらの円によって形成される「境界線」の周りを移動する線を描き、他の線は一切ないとします。これは、すべての円によって形成されるシルエットの境界線を描くようなものです。結果のクラウドは次のようになります。

雲

そのため、このクラウドは、境界を形成する入力内の円の円弧のみを描画することで形成され、単一の形状になります。言い換えると、クラウドは、別の円内にないアークを描くことによって形成されます。プログラムは、上記で説明した形式で入力を受け取り、結果のクラウドを表示する画像を出力します。雲の全体的な形状は正確でなければなりませんが、スケール、色、線の太さ、頂点の見え方はあなた次第です。クラウドが表示されている必要があるため、「このプログラムは白い背景に白い雲を描画する」、「このプログラムは無限に小さなスケールで雲を描画する」、「このプログラムは0の雲を描画する」また、境界線の色は塗りつぶしまたは背景の色と異なる必要があることに注意してください。

もう一つの例。入力:

1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7

出力:

cloud2

クラウドに「穴」がある場合は、穴も描画する必要があります。入力:

0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4 

出力:

cloud3

重要なルールは次のとおりです。プログラムは境界を形成する線のみを描画する必要があります。つまり、単純に円を完全に描画してから、白い塗りでわずかに小さい円を描画することはできません。このメソッドはまだ境界を形成しない線を描画するため、後でそれらを覆うだけです。ルールの目的は、「円を描いてから、白い塗りで円をもう一度描く」実装、またはそれに類似したものを防ぐことでした。答えは、実際に描画する前に描画する場所を実際に計算することです。

これはコードゴルフであるため、最短の文字数が優先されます。


13
客観的な勝利基準(および最初の段落)を持つグラフィック出力の質問に対して+1。
デニス14

2
線を引いて後で消去するかどうかはどうすればわかりますか?上記の行を内部ビットマップにレンダリングしても問題ありませんか?そうでない場合、ベクトルとビットマップ表現の間の境界線はどこですか?はいの場合、なぜプライマリキャンバスで同じことをさせないのですか(ダブルバッファーであることがわかっているため、ユーザーが一時行を見ることができません)。
ジョン・ドヴォルザーク

1
@ JanDvorak @ JanDvorakルールの目的は、「円を描いてから、白い塗りつぶしで円を描く」実装、またはそれに似たものを防ぐことでした。答えは、実際に描画する前に描画する場所を実際に計算することです。より明確にするために編集します。
アブサン14

15
この質問は、Cloud to Butt(chrome.google.com/webstore/detail/cloud-to-butt-plus/…)がインストールされている場合に絶対におかしくなります。
アーティセイドール

9
@SomeKittens「クラウドに「穴」がある場合、穴も描画する必要があります」で失くしました。
アーティセイドール14

回答:


25

Mathematicaの177 126 121 119

ディスク領域による解決:数学者のアプローチ

ロジックは

  • リージョン1(R1)、円(内部なし)を作成します。
  • リージョン2(R2)、ディスク(円の境界なし)を作成します。
  • リージョン3を作成します(R3 = R1-R2)。
  • -

領域推論

これはまさに以下で取られるアプローチです。上記の3つの図を作成しました。

input = "3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8";
circles = ((x - #)^2 + (y - #2)^2 == #3^2) & @@@ 
     ToExpression[#~StringSplit~","] &@(StringSplit@input);
R1 = ImplicitRegion[Or @@ circles, {x, y}];
r1 = RegionPlot[R1, PlotLabel -> "R1: circles containing borders", 
   AspectRatio -> 1, PlotRange -> {{-1, 5}, {-1, 5}}];

innerDisks = ((x - #)^2 + (y - #2)^2 < #3^2) & @@@ 
     ToExpression[#~StringSplit~","] &@(StringSplit@input);
R2 = ImplicitRegion[Or @@ innerDisks, {x, y}];
r2 = RegionPlot[R2, PlotLabel -> "R2: disks within circle borders", 
   AspectRatio -> 1, PlotRange -> {{-1, 5}, {-1, 5}}];
R3 = RegionDifference[R1, R2]
r3 = RegionPlot[R3, PlotLabel -> "R3 = R1-R2", AspectRatio -> 1, 
   PlotRange -> {{-1, 5}, {-1, 5}}];
GraphicsGrid[{{r1, r2, r3}}, ImageSize -> 600]

暗黙的領域#1は円の結合です。暗黙の領域#2は、円内にあるディスクの結合です。彼らの違いは国境です。

RegionDifference [
ImplicitRegion [(-3 + x)^ 2 +(-1 + y)^ 2 == 1 || (-3 + x)^ 2 +(-2 + y)^ 2 == 2.25 || (-1 + x)^ 2 +(-2 + y)^ 2 == 0.49 || (-0.9 + x)^ 2 +(-1.2 + y)^ 2 == 1.44 || (-1 + x)^ 2 + y ^ 2 == 0.64、{x、y}]、
ImplicitRegion [(-3 + x)^ 2 +(-1 + y)^ 2 <1 || (-3 + x)^ 2 +(-2 + y)^ 2 <2.25 || (-1 + x)^ 2 +(-2 + y)^ 2 <0.49 || (-0.9 + x)^ 2 +(-1.2 + y)^ 2 <1.44 || (-1 + x)^ 2 + y ^ 2 <0.64、{x、y}]]


ディスク領域による解決:エンジニアのアプローチ(119文字)

次の例では、ディスク領域の結合を取り、その領域を離散化し、境界を見つけます。図の点は、ドローネメッシュの間隔を区切っています。以下の離散化された領域を表示して、関心のある境界(雲の輪郭)を提供するオブジェクトを強調表示します。

s = StringSplit;RegionBoundary@DiscretizeRegion[RegionUnion[Disk[{#, #2}, #3] &@@@
ToExpression[#~s~","] &@(s@InputString[])]]

「3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8」

領域の境界は離散化されています。

reg1


エッジの検出による解決:写真家のアプローチ-121文字

エッジ検出

ディスクを黒で描画し、画像をラスタライズし、エッジを検出し、黒と白を反転します。

s=StringSplit;ColorNegate@EdgeDetect@Rasterize@Graphics[Disk[{#,#2},#3]&@@@
((ToExpression/@s[#,","])&/@s[InputString[]])]

5バイトRegionBoundary@DiscretizeRegion@RegionUnion[{#,#2}~Disk~#3&@@@ToExpression[#~s~","]&@s@InputString[s=StringSplit]]
マーティンエンダー14

潜在的にs=StringSplitプロンプトの内部?もう一度前に移動してみてください。現在のバージョンよりも短くする必要があります。
マーティンエンダー14

27

T-SQL 235 234 229 212 171 73バイト

これは、SQL Server 2012+の空間機能を利用します。SSMS(SQL Server Management Studio)で実行すると、空間結果ペインが生成されます。 入力は変数@iからのものです。入力をテーブルから取得できる場合は、さらに減らすことができます。

テーブル入力が許可されるようになりました。

SELECT Geometry::UnionAggregate(Geometry::Point(X,Y,0).STBuffer(R))FROM A

以前のソリューションは以下に残しました。

DECLARE @ VARCHAR(999)='WITH a AS(SELECT *FROM(VALUES('+REPLACE(@i,' ','),(')+'))A(X,Y,R))SELECT Geometry::UnionAggregate(Geometry::Point(X,Y,0).STBuffer(R))FROM a'EXEC(@)

編集:、浮遊スペースを削除し黒字し、サブクエリ

171:テーブルの作成をCTEに、@ sを@に置き換えました。

ここに画像の説明を入力してください

動的SQLの内訳

DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7' -- Input
DECLARE @ VARCHAR(999) = '
WITH a AS(                                       --CTE to produce rows of x,y,r 
    SELECT *FROM(VALUES('+
        REPLACE(@i,' ','),(')                    --Format @i to a value set
        +'))A(X,Y,R)
)
SELECT Geometry::UnionAggregate(                 --Aggregate Buffered Points
    Geometry::Point(X,Y,0).STBuffer(R)           --Create point and buffer
    )               
FROM a                                           --from the table variable
'
EXEC(@)                                          --Execute Dynamic sql

次のようなエラーが表示されます'A' has fewer columns than were specified in the column list
ジェサンファフォン14

@JesanFafon入力変数@iが正しく設定されていることを確認してください。DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7'。残念ながら、現時点ではテストできず、SQLfiddleは2012
。– MickyT 14

SQLジオメトリ関数での素晴らしい仕事。良いニュースです!既存のテーブルによる入力が明示的に許可されるようになりました。テーブルの作成と作成は、バイトカウントに含める必要はありません。
BradC

私はいくつかのキャラクターをゴルフしました。リンクは結果を生成しません。ただし、ms-sqlサーバー管理スタジオでは機能します。スクリプトはこちら、お楽しみください。気軽に使用してください
t-clausen.dk

@ t-clausen.dkはそのことに感謝しますが、更新する予定なので、テーブル入力を許可するように変更します。私はバックアップこれを浚渫する予定が...いませんでした
MickyT

23

Mathematica、175 158 149バイト

s=StringSplit;l=ToExpression[#~s~","]&@s@InputString[];RegionPlot[Or@@(Norm@{x-#,y-#2}<#3&@@@l),{x,m=Min@(k={{##}-#3,{##}+#3}&@@@l),M=Max@k},{y,m,M}]

サンドボックスでの議論から、このアプローチは有効であると想定されていたことが覚えていますが、ルールの新しい文言にどのように対応するかは完全にはわかりません。

基本的に、クラウド内のすべてのポイントに対してtrueであり、クラウド外のすべてのポイントに対してfalseである論理条件を作成しています。私はそれを供給してRegionPlot、それから式がTrue存在するすべてのポイントの領域とその周りの輪郭をレンダリングします。

ここに画像の説明を入力してください

ゴルフをしていない:

s = StringSplit;
l = ToExpression[#~s~","] &@s@InputString[];
RegionPlot[
 Or @@ (Norm@{x - #, y - #2} < #3 & @@@ l), 
 {x, m = Min@(k = {{##} - #3, {##} + #3} & @@@ l), M = Max@k},
 {y, m, M}
]

1
ImplicitRegionプロットに適切なxおよびy値を自動的に見つけます。122文字:s = StringSplit; RegionPlot@ ImplicitRegion[ Or @@ (((x - #)^2 + (y - #2)^2 < #3^2) & @@@ (ToExpression[#~s~","] &@(s@InputString[]))), {x, y}]
DavidC 14

@DavidCarraher残念ながら、これは画像のアスペクト比を歪めます。(ただし、これらのすべてのリージョン関数を知っている-使用したものも-私はRegionPlotこれまで見てきました。)
マーティンエンダー14

おそらくすでに,AspectRatio-> 1コードが149バイトに戻っていることに気付いたでしょう。
DavidC 14

2
私ですか、それともこの画像はAndroidのMarvin the Paranoid Androidのように見えますか?
パコゴメス14

16

Pythonの3.3(183 177 164 160バイト)

B=list(map(eval,input().split()))
print("".join(" ## "[sum(any(r*r>(x-d%80/4+10)**2+(y+d//80/4-10)**2for
x,y,r in B)for d in[i,i+1,i+80])]for i in range(6400)))

80文字幅のコンソールが必要です。これはWindowsのデフォルトです。コンソールのフォントが正方形の場合に最適です。以下は、いくつかのテスト入力からの抜粋です。

元の:

           ########
          ##       #
         ##         #
     #####          #
    ##   #          #
   ##               #
  ##                #
 ##                 #
 #                  #
 #                 ##
  #               ##
  #       ##      #
   #      # #    ##
   #      #  #####
   #      #
    #    ##
     #  ##
      ###

別の:

    ########
  ###       ##
 ##           #
 #            #
##             #
#              #
#              #
#              #
#              #
#               ##
#                 #
 #                 ##
 #                   ######
  #                        #
   ##      ###             #
     #    ## #             #
     #    #  #             #
      #  ## ##             #
       ###  #             ##
            #       #######
            #      ##
            #      #
             #    ##
              #####

穴:

                              ############
                            ###           ##
                          ###               ##
                         ##                   #
                  ########                     #######
                ###                                   ##
              ###                                       ##
             ##                                           #
            ##                                             #
           ##                                               #
          ##                                                 #
         ##                                                   #
        ##                                                     #
       ##                                                       #
      ##                                                         #
      #                                                          #
     ##                                                           #
     #                                                            #
    ##                                                             #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
   ##                                                               #
  ##                                                                 #
  #                                                                  #
 ##                                                                   #
 #                                                                    #
##                                                                     #
#                                 ####                                 #
#                                ##   #                                #
#                               ##     #                               #
#                              ##       #                              #
#                              #        #                              #
#                              #        #                              #
#                               #      ##                              #
#                                #    ##                               #
#                                 #  ##                                #
#                                  ###                                 #
 #                                                                    ##
 #                                                                    #
  #                                                                  ##
  #                                                                  #
   #                                                                ##
    #                                                              ##
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
     #                                                            ##
     #                                                            #
      #                                                          ##
      #                                                          #
       #                                                        ##
        #                                                      ##
         #                                                    ##
          #                                                  ##
           #                                                ##
            #                                              ##
             #                                            ##
              #                                          ##
               ##                                      ###
                 ##                                  ###
                   #######                    ########
                          #                  ##
                           ##              ###
                             ##          ###
                               ###########

1
これが唯一のアスキーアートソリューションであることが大好きです。
vmrob 14

インポートなし...印象的!
リチャードグリーン14

15

Python- 253 249 215 199

これは素晴らしい形状ライブラリの広告であり、そのジオメトリ操作により、重なり合う円(=バッファリングされたポイント)の結合のアウトラインを描画することにより、ソリューションを簡単に記述できます。

from pylab import*
from shapely.geometry import*
c=Point()
for s in raw_input().split():
 x,y,r=eval(s)
 c=c.union(Point(x,y).buffer(r))
plot(*c.exterior.xy)
for i in c.interiors:
 plot(*i.xy)
show()

出力:

三雲

編集:

  • 249は:置き換えsys.argv[1:]によりraw_input().split()省エネ、import sys
  • 215:k={'color':'k'}高級品を削除し、次のものに置き換えましsavefigshow
  • 199:に置き換えられましmap(float,s.split(','))eval(s)

11

Python – 535

import math as m
import matplotlib.pyplot as l
c = "3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8"
a = [[float(y) for y in x.split(",")] for x in c.split(" ")]
for a2 in a:
    for x in xrange(0,200):
        q=x*m.pi/100.0
        p=(a2[0]+m.sin(q)*a2[2], a2[1]+m.cos(q)*a2[2])
        cc = []
        for z in a:            
            if z != a2:               
                if ((z[0] - p[0]) ** 2 + (z[1] - p[1]) ** 2 ) < (z[2] ** 2) :
                    cc.append(z)
        if not cc: 
            l.scatter(p[0],p[1])
l.show()

2
これには、たとえば、from math import*スペースを削除したり、1文字の変数名のみを使用したり、リストの内包表記(例:)を使用したりすることで、さらにゴルフを掘り下げる可能性がありますcc=[z for z in a if z!=a2 and (z[0]…)]Pythonでのゴルフヒントもご覧ください
Wrzlprmft 14

の代わりに1文字の変数名を使用して、一部の文字を保存できますa2
ProgramFOX 14

ありがとうwrzl ...今夜はゴルフを始めます(今は他にもやることがありますが、地面に棒を入れたいと思っています)
リチャードグリーン14

1
@ProgramFOXはい...これは働いていたバージョンだったと私はデバッグすることができること...それを短い今夜を取得します...
リチャード・グリーン

3
@JamesWilliamsあなたがバトンを取りたいなら...してください..私はコードを保護していません!! (元のクレジットを認める限り)自由にそれをあなた自身のエントリとして追加してください
リチャードグリーン14

9

Python – 296 249 231 223 212

from pylab import*
a=map(eval,raw_input().split())
for x,y,r in a:
 for i in range(200):
  q=i*pi/100;p=x+r*sin(q);t=y+r*cos(q);[z for z in a if z!=(x,y,r)and(z[0]-p)**2+(z[1]-t)**2<z[2]**2]or scatter(p,t)
show()

元のソリューションの功績は@ richard-green(許可が与えられました)でしたが、少し削り取ったところです。


7
よくそれは...私の票を取得します
リチャード・グリーン

1
pylab代わりにインポートすることで、さらに保存できる場合がありmatplotlib.pyplotます。
ojdo 14

私が使用している場合、モバイル上で現在@odjo from pylab import *私はまだ呼び出すことができるであろうshow()と、scatter()すべての参照なし?
ジェームズウィリアムズ14

1
@JamesWilliams確認済み!Pylabは多くのMATLABのような関数を含む名前空間汚染者です:
ojdo 14

[eval(i)for i in raw_input().split()]Python eval1,2,3タプルに変わるときに使用することでこれを短縮できます。もちろん、をに変更する[x,y,r]必要もあり(x,y,r)ます。
KSab 14

7

JavaScript(E6)+ HTML 322

JSFiddle

各円は約100個の小さな円弧に分割され、各円弧はその中間点が他の円の内側にない場合に描画されます。

<canvas id='c'/>
<script>
t=c.getContext("2d"),z=99,c.width=c.height=400,
l=prompt().split(' ').map(c=>c.split(',').map(v=>40*v)),
l.map(c=>{
  for(i=z;--i+z;)
    s=4/z,r=c[2],x=c[0]+r*Math.cos(a=i*s),y=c[1]+r*Math.sin(a),
    t.beginPath(),
    l.some(q=>c!=q&(d=x-q[0],e=y-q[1],d*d+e*e<q[2]*q[2]))||t.arc(z+c[0],z+c[1],r,a-s,a+s),
    t.stroke()
})
</script>

7

Python 274バイト

これは、stdinからの入力を受け取り、ディスプレイ上のすべてのポイントをチェックし、ピクセルを1つずつ描画します。正確には効率的ではありませんが、すべてのルールに従います。

c=[eval(s)for s in raw_input().split()]
import pygame
S=pygame.display.set_mode((500,500))
S.fill([255]*3)
for p in((x,y)for x in range(500)for y in range(500)if 0<min((((x-250)/25.-a)**2+((y-250)/25.-b)**2)**.5-r for(a,b,r)in c)<.1):S.set_at(p,[0]*3)
pygame.display.update()

描画が完了するとすぐにpygameの表示が終了することに注意してください。回答の一部としてそれを含めるべきかどうかはわかりませんでしたが、表示するraw_inputには最後に投げるか、小さなループを追加することができますOSが応答しないなどの不平を言うのを止めたい:

alive = True
while alive:
    pygame.display.update()
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            alive = False

サンプル画像:

1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7, 1,2,0.7 ここに画像の説明を入力してください

0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4 ここに画像の説明を入力してください


3
@ edc65あなたが何を意味するのかよくわかりません。正確に行うのは、円の外側の0から0.1ユニット(0から2.5ピクセル)のピクセルを塗りつぶすことです。描画する正しい円弧を数学的に見つける必要があると言っていますか?質問を読んだことから、それが私にとって制限であるとは思われませんでした。
KSab 14

4

Perl-430

@e=map{[map{int($_*32)}split',']}(split' ',<>);for$g(@e){for(0..3){($a[$_]>($q=$$g[$_&1]+(($_>>1)*2-1)*$$g[2]))^($_>>1)&&($a[$_]=$q)}}for(2,3){$a[$_]-=$a[$_-2]-1}for(@e){($x,$y,$r)=@$_;$x-=$a[0];$y-=$a[1];for$k($x-$r..$x+$r){for$l($y-$r..$y+$r){$i=(int(sqrt(($x-$k)**2+($y-$l)**2)+0.5)<=>$r)-1;$f[$l][$k]=($j=$f[$l][$k])<-1||$i<-1?-2:$i||$j;}}}print"P1
$a[2] $a[3]
".join("
",map{join' ',map{$_+1?0:1}@$_,('0')x($a[2]-@$_)}@f)."
"

pbmファイルをstdoutに書き込みます。

テスト画像(pngに変換):

2番目のテスト画像(pngに変換)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.