두 가지 색상의 겹치는 원


22

합리적인 입력 형식으로 다음 입력을받는 프로그램이나 함수를 작성하십시오.

  • 생성 할 이미지의 너비와 높이를 정의하는 두 개의 양의 정수 W와 H.

  • 이미지를 색칠하는 데 사용되는 두 가지 RGB 색상 C1 및 C2.

  • 이미지 평면에서 (r, x, y)반지름 r과 중심이 x, y있는 원을 정의 하는 양식의 3 튜플 목록입니다 . r양의 정수이고 x그리고 y어떤 정수입니다. 이미지의 왼쪽 위 픽셀은 0, 0x 축이 오른쪽으로 증가하고 y 축이 아래쪽으로 증가합니다.

C1과 C2로 채색 된 치수가 W x H 인 이미지를 출력하여 모든 겹치는 원으로 정의 된 두 개의 인접 영역이 동일한 색상이되도록합니다.

예를 들어 : 입력이

W = 300
H = 200
C1 = (255, 200, 0)
C2 = (128, 0, 255)
Circles = (25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)

원 경계는 다음과 같습니다.

예 1 원 경계

원으로 만든 이미지에는 6 개의 뚜렷하고 연속적인 영역이 있습니다. 각 영역에는 C1 (노란색) 또는 C2 (보라색)로 색상을 지정하여 인접한 두 영역이 같은 색이되지 않아야합니다.

이 작업을 수행하는 두 가지 방법이 있습니다. 유일한 차이점은 색상이 바뀌는 것입니다.

예 1 출력 1 예 1 출력 2

따라서이 두 이미지 중 하나는 예제 입력에 대해 유효한 출력입니다.

두 개의 노란색 영역이 서로 인접하기 때문에 이와 같은 것은 잘못된 출력입니다.

출력 이미지는 다음 지침을 따라야합니다.

  • C1 및 C2 외에, 검은 색 또는 흰색과 같은 제 3의 중성 색은 두께가 5 픽셀 이하인 한 원 경계에 사용될 수 있습니다. 위의 예에는 검은 색, 1 픽셀 두께의 경계가 있습니다.

  • 그러나 원 경계는 필요하지 않습니다. 지역은 서로 직접 인접 할 수 있습니다.

    예 1 출력 3 예 1 출력 4

    이 두 가지 모두 위의 예에 대한 다른 유효한 출력입니다.

  • 원 그리기 알고리즘 또는 그래픽 라이브러리가 제공하는 모든 것을 사용하여 원은 가능한 한 정확해야 합니다.

  • 일반적으로 픽셀 성능은 필요하지 않지만 입력 매개 변수의 크기가 동일하게 커지면 결과 이미지가 더욱 정확 해집니다.

  • 앤티 앨리어싱은 허용되지만 필수는 아닙니다.

  • 백그라운드의 눈금 선 또는 축 레이블 등은 허용되지 않습니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

더 많은 예

모두 서로 다른 원 세트로 이러한 입력을 사용합니다.

W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)

어떤 예에서나 색상은 서로 바뀔 수 있으며 유효합니다.

Circles =
A. empty list
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80) 

A. 예 A B. 예 B C. 예 C D. 전 D
E. 예 E F. 예 F G. 예 G H. 전 H
I. 예 전 J. 예 J K. 예 K L. 예 L

출력이이 모든 예제와 유사하게 작동하는지 확인하십시오.


예를 들어 C1은 1이고 C2는 0과 같이 ASCII로 출력 할 수 있습니까?
Matthew Roh

@MatthewRoh 아니요. 편리하지만 이미지가 필요하다는 것을 알고 있습니다.
Calvin 's Hobbies

1
그럼 내가 계산할 수있을 것 같아요tikz
Wheat Wizard

1
@MatthewRoh, netpbm 은이 사이트에서 일반적으로 사용되는 이미지 형식입니다.
Peter Taylor

2
@ 루이스 Ok. 이와 같은 작은 입력 변형 또는 y 축이 올라가는 것이 좋습니다.
Calvin 's Hobbies

답변:


14

Mathematica, 165 바이트

ContourPlot[Cos@Tr[Boole[Norm[{x,y}-#2]<#]Pi&@@@#4],{x,0,#},{y,0,#2},PlotPoints->5!,AspectRatio->Automatic,Frame->False,ContourShading->RGBColor@@@#3,Contours->{0}]&

폭, 높이 (정수 모두), 0과 1 사이의 순서가있는 3 배 숫자 쌍 (2 개의 RGB 색상 표시) 및 {r, {x, y}}반지름과 중심을 기록하는 양식 항목 목록의 네 가지 인수를 취하는 순수 함수 서클. 예를 들어, OP의 첫 번째 예는 arguments로 호출됩니다 [300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]. Mathematica에서 양의 y 축은 위쪽을 가리 킵니다.

Norm[{x,y}-#2]<#점이 주어진 원 안에 있는지 여부를 감지합니다. Boole[...]Pi변환이 TrueFalse에게 π0. 모든 입력 원에 대해 πs / 0을 계산 한 후 π의 배수를 Tr더하고 Cosπ의 배수도 1로, 홀수의 배수는 π에서 –1로 변환합니다. ContourPlot[...,Contours->{0}]그런 다음 값이 크거나 작은 지 여부에 따라 평면의 해당 영역을 두 가지 색상으로 채색합니다 0. AspectRatio->Automatic원을 원처럼 보이게합니다. PlotPoints->5!괜찮은 정확도를 제공합니다 ( 9!미래에 놀라운 그림을 원한다면 부스트하십시오 !); Frame->False축을 제거합니다. 및 ContourShading->RGBColor@@@#3윤곽의 입력 색상을 사용합니다.

첫 번째 색상 쌍이 있지만 샘플 원은 있지만 마지막 원 세트는 샘플 출력입니다.

샘플 출력


11

JavaScript / SVG / HTML5, 219 바이트

f=// for demo
(w,h,b,f,a)=>`<svg width=${w} height=${h}><rect width=${w} height=${h} fill=rgb(${b}) /><path fill=rgb(${f}) fill-rule=evenodd d=${a.map(([r,x,y])=>[`M`+x,y-r+`a`+r,r,0,0,0,0,r+r+`a`+r,r,0,0,0,0,-r-r]).join``} /></svg>`
;//demo
[[`A`, []],
 [`B`, [[13, 16, 20]]],
 [`C`, [[30, 16, 20]]],
 [`D`, [[200, 16, 20]]],
 [`E`, [[42, 50, 20]]],
 [`F`, [[42, 50, 20], [17, 40, 30]]],
 [`G`, [[42, 50, 20], [17, 20, 30]]],
 [`H`, [[42, 50, 20], [17, 10, 30], [10, 50, 30]]],
 [`I`, [[42, 50, 20], [17, 10, 30], [35, 50, 20]]],
 [`J`, [[18, 36, 40], [18, 63, 40], [18, 50, 20]]],
 [`K`, [[100, -10, -20], [60, 50, -10]]],
 [`L`, [[18, 36, 40], [18, 63, 40], [18, 50, 20], [14, 50, 20], [5, 50, 18], [20, 0, 0], [70, 22, 0], [10000, -9970, 0], [135, 100, -80]]]
 ].forEach(([c, a])=>document.write(`<nobr><tt>&nbsp;${c}.&nbsp;</tt>${f(100, 60, [255, 0, 0], [0, 0, 255], a)}</nobr><wbr>`));


10

BBC 기본, (120) 117 바이트

http://www.bbcbasic.co.uk/bbcwin/bbcwin.html 에서 통역사 다운로드

I.w,h,R,G,B,r,g,b:V.22,4,19;16,r,g,b,275;16,R EORr,G EORg,B EORb,24,0;0;w;h;16
5I.r,x,y:V.25,4,x;h-y;25,154,r;0;:G.5

BBC Basic에는 OR, AND, XOR 등 기본 논리 연산에 따라 래스터 그래픽을 그릴 수있는 다양한 색상 모드가 있습니다.

또한 팔레트 재 프로그래밍을 지원합니다. 예를 들어 여기서 2 컬러 이미지의 색상을 4096 컬러로 프로그래밍 할 수 있습니다. 여기에 사용 된 구현은 EOR 연산자가 필요하지 않은 원래 BBC 구현과는 (문서화되지 않은) 차이점이 있습니다.

언 골프

  INPUTw,h,R,G,B,r,g,b:                           :REM Input size and colours
  VDU22,4                                         :REM Change to MODE 4 (2 colours) as the default mode gives odd behaviour
  VDU19,0,16,r,g,b,19,1,16,R EORr,G EORg,B EORb   :REM Reprogram the colours to R,G,B and R^r,G^g,B^b
  VDU24,0;0;w;h;16                                :REM Setup a graphics viewport of the right size, and "clear" it to change background colour
5 INPUTr,x,y                                      :REM take input coordinates
  VDU25,4,x;h-y;                                  :REM move to x,y (h-y required as BBC BASIC y axis increases upward, reverse of spec)
  VDU25,154,r;0;                                  :REM draw circle in "logical inverse colour" of existing pixels (this implementation seems however to XOR with colour 1 instead)
  GOTO5                                           :REM repeat infinitely until user presses escape

일반적인 출력 화면

단위 10 배 / 픽셀 5 배로 확대 된 이미지 예 (BBC 기본은 1 픽셀 = 2 단위를 사용합니다.)

여기에 이미지 설명을 입력하십시오


10

MATL , 30 29 25 바이트

2ZG:i:!J*+2&!-|i<so2&!1YG

입력 형식 :

  • 0에서 255 사이의 값으로 구성된 매트릭스로서의 컬러 맵. 각 행은 색을 정의합니다.
  • H
  • 1 기반 중심 좌표의 열 벡터를 복소수 값으로 표시 ( x 는 실수 부, y 는 허수 부)
  • 반지름의 열 벡터.

MATL Online 에서 사용해보십시오 ! 또는 마지막 테스트 사례를 확인하십시오 . (인터프리터는 아직 실험 중입니다. 페이지를 새로 고침하고 작동하지 않으면 다시 시도해야 할 수도 있습니다).

설명

이 코드는 복소수를 사용하여 점 격자를 정의하고 거리를 계산하며 브로드 캐스트 에서 배열 연산을 많이 사용 합니다.

2ZG    % Implicitly input matrix of colors. Set as colormap
:      % Implicitly input W. Push [1 2 ... W]
i:     % Input H. Push [1 2 ... H]
!J*    % Transpose, multiply by 1i
+      % Add element-wise with broadcast. Gives H×W grid of points as
       % complex numbers, 1-based 
2&!    % Permute first dimension with the third. Gives a 1×W×H array
-|     % Implicitly input center coordinates. Subtract grid from them,
       % element-wise with broadcast. Gives a C×H×W array, where C is the
       % number of circles
i      % Input column vector of circle radii
<      % Less than, element-wise with broadcast
so     % Sum along first dimension, modulo 2. Gives a 1×W×H array
2&!    % Permute first dimension with the third. Gives a a H×W array
1YG    % Display as scaled image

2
나는 그 바이트를 구하라! : D
Greg Martin

1
@GregMartin 당신이 맞아요. 4 바이트를 절약 할 수있는 사람은 우아함을 걱정합니다! :-) 완료
Luis Mendo

1
@LuisMendo 코드 골프가 더 나빠질수록 짧아집니다. ;)
Kevin Cruijssen

6

파이썬 사용 pypng , (140) 138 바이트

import png
f=lambda W,H,c,d,C:png.from_array([[[c,d][sum(abs(x-X+1j*(y-Y))<r for r,x,y in C)%2]for X in range(W)]for Y in range(H)],'RGB')

사용법 예 :

W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
Circles = (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
f(W, H, C1, C2, Circles).save('test.png')

2 바이트를 절약 한 xnor에게 감사합니다.


코드 골프에 오신 것을 환영합니다! 점이 원 안에 있는지 확인하려면 복잡한 규범을 사용하는 것이 좋습니다 abs(x-X+1j*(y-Y))<r.
xnor

3

수학 (비경쟁)

(idk PPCG에서 LaTeX를 수행하는 방법, LaTeX to png 도구 사용)

설명

다중 원 방정식 ( (x-a)^2+(y-b)^2-r^2)> = 0 의 곱은 이 질문에 필요한 그래프를 만듭니다. 방정식에서, n어레이의 크기이고, (x, y or r)_k는 IS k번째 (x, y, or r)요소.

(0,0,2),(2,2,2)

(감사합니다 WolframAlpha)

(WolframAlpha의 불평등 그림)

WolframAlpha의 Get / Run 방정식

스크립트 얻기 : 완료

스크립트 실행 : 아직 완료되지 않은

이제 Mathematica와 함께 작동하게하십시오 ...


이것이 유효한지 궁금합니다.
Matthew Roh

해당 입력에 대해 원하는 형식으로 출력을 플롯 할 기존의 특정 통역사를 나열해야합니다. 그렇게하면 바이트를 계산할 수 있습니다. 현재 문제는 해석기에 연결되지 않기 때문에 방정식을 표현하기위한 특정 형식에 연결되어 있지 않으므로 표기법이 비공식적이고 객관적으로 계산하는 것이 불가능하다는 것입니다. 방정식 그래프를 플로팅하기위한 많은 프로그램이 있으므로, 간결한 입력 형식을 가진 그래프를 찾는 것이 좋습니다.

@ ais523 오. WolframAlpha와 함께 작동하도록 노력하겠습니다.
Matthew Roh

1

파이썬 2.X, 166 158

import re;def f(W,H,c,d,C):print'P3',W,H,255,re.sub('[^0-9]',' ',repr([[d,c][sum([abs(x-X+1j*(y-Y))<r for r,x,y in C])%2]for Y in range(H)for X in range(W)]))

이 함수는 표준 출력에서 ​​PPM 파일을 생성합니다.

예:

W = 300
H = 200
C1 = (255, 200, 0)
C2 = (128, 0, 255)
Circles = [(25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)]

f(W, H, C1, C2, Circles)

예


1

공통 리스프 + Quicklisp + ZPNG 260 + 20 = 280 자

이것은 내가 CL에서 작성한 가장 넓은 코드 중 일부이며, 코드 골프를하지 않는 경우 훨씬 쉽게 읽을 수 있도록 구조를 변경했을 것입니다 ...

전주곡 (20 자)

(ql:quickload 'zpng)

골프 (260 문자)

(lambda(w h g b c)(make-instance'zpng:png :image-data(coerce(loop :for j :below h :nconc(loop :for i :below w :append(if(evenp(count t(mapcar(lambda(c)(<(abs(complex(-(cadr c)i)(-(caddr c)j)))(car c)))c)))g b)))'(array(unsigned-byte 8)(*))):width w :height h))

언 골프 드 :

(defun을 사용하여 가독성을 위해 테스트 및 더 긴 변수 이름 허용)

(defun mk-png (width height color1 color2 circles)
  (make-instance 'zpng:png
                 :image-data (coerce (loop :for j :below height
                                           :nconc (loop :for i :below width
                                                        :append (if (evenp (count t (mapcar (lambda (circ)
                                                                                              (< (abs (complex (- (cadr circ) i) (- (caddr circ) j)))
                                                                                                 (car circ)))
                                                                                            circles)))
                                                                    color1 color2)))
                                     '(array (unsigned-byte 8) (*)))
                 :width width
                 :height height))

사용법 예 :

(let ((png (mk-png 300 200 '(255 200 0) '(128 0 255) '((25 50 80) (40 80 120) (300 -100 6) (17 253 162)))))
  (zpng:write-png png #p"path/to/file.png"))

설명

(lambda (circ)
   (< (abs (complex (- (cadr circ) i) (- (caddr circ) j)))
      (car circ)))

점 (i, j)이 주어진 원 circ 내에있는 경우 true를 반환합니다. 유클리드 거리는 (i, j)에서 circ의 중심까지의 벡터를 나타내는 복소수의 절대 값을 취하여 계산됩니다.

(evenp (count t (mapcar ___
                         circles)))

해당 기능을 원 목록에 매핑하고 주어진 점 (i, j)이 짝수 원 안에 있는지 확인하십시오.

(if ____
     color1 color2)

해당 테스트에 따라 색상을 선택하십시오.

(loop :for j :below height
       :nconc (loop :for i :below width
                    :append ____))

이미지의 각 (i, j)를 반복하고 결과 목록을 함께 추가하여 모든 RGB 바이트의 일반 목록을 수집하십시오.

(coerce ____
         '(array (unsigned-byte 8) (*)))

해당 바이트 목록을 적절한 바이트 배열로 변환하여 zpng가 올바르게 처리 할 수 ​​있도록합니다.

(make-instance 'zpng:png
                :image-data ____
                :width width
                :height height)

png 객체를 만듭니다.

(defun mk-png (width height color1 color2 circles)
   ___)

너비, 높이, 두 가지 색상 및 원 목록을 가져 와서 만든 png 객체를 반환하는 함수를 만듭니다.


0

자바 스크립트 (ES6), 224 바이트

JS + SVG 솔루션을 보았지만 캔버스 기반 솔루션을 만들어야했습니다. ;-) 이것은 캔버스 요소를 반환하는 함수입니다. 기존 캔버스 요소를 제공 할 수있는 경우 40 바이트를 제거하십시오.

같은 전화 f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])

let f =
(w,h,a,c,O=document.createElement`canvas`)=>{O.width=w;O.height=h;C=O.getContext`2d`;for(y=0;y<h;y++)for(x=0;x<w;x++)C.fillStyle=`rgb(${a[c.filter(([R,X,Y])=>(X-x)**2+(Y-y)**2<R**2).length%2]})`,C.fillRect(x,y,1,1);return O}

let tests = A.innerHTML.match(/.+/g);
A.innerHTML = "";
for (let i of tests) {
  let p = document.createElement("span");
  p.innerHTML = "<br>" + i.slice(0, 3);
  p.style["font-family"] = "monospace";
  A.append(p);
  A.append(f(100, 60, [[255,0,0], [0,0,255]],
    eval(`[${ i.slice(3).replace(/\(/g, "[").replace(/\)/g, "]") }]`)
  ));
}
<div id=A>
A. 
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
</div>

출력 예 :

두 개의 원


0

Löve2D , 353 바이트.

o=love.graphics
a=arg
w,h,r,g,b,R,G,B=...c={}for i=9,#a,3 do
c[#c+1]={a[i],a[i+1],a[i+2]}end
C=o.newCanvas(w,h)o.setCanvas(C)o.clear(R,G,B)for k,v in pairs(c)do
o.stencil(function()o.circle("fill",v[2],v[3],v[1],9^3)end,"invert",1,true)end
o.setStencilTest("greater",0)o.setColor(r,g,b)o.rectangle("fill",0,0,w,h)local
C:newImageData():encode("png","c")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.