벤 다이어그램 생성기 골프


26

벤 다이어그램 생성기 골프

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

John Venn의 180 번째 생일 을 올바르게 축하하기 위해 오늘 과제는 Venn Diagram 을 출력하는 프로그램을 만드는 것입니다 !

입력:

양의 정수 N(0부터 상기 도면에 나타나는 번호의 범위를 정의한다 N)과 양의 정수 3 개 세트.

산출:

0 내지 모든 정수를 표시하는 3 세트의 벤 다이어그램 N과도의 적절한 영역에이를 표시하여 세트의 관계 이것과 비슷한 .

노트

  1. stdin값을 얻으려면 (또는 귀하의 언어와 동등한 것이 무엇이든) 사용하십시오 .
  2. 세트의 입력 형식을 정의 할 수 있습니다 N(쉼표, 슬래시 또는 가장 적합한 것으로 구분).
  3. 집합에 나타나지 않지만 지정된 범위 내에있는 숫자는 영역 안에있는 것이 아니라 다이어그램에 나타나야합니다.
  4. 세트의 이름을 지정할 필요는 없습니다.
  5. 출력은 드로잉 또는 아트 아트가 될 수 있습니다.
  6. 경계를 명확하게 구분할 수있는 한 다이어그램의 모양은 모호 할 수 있습니다 (예를 들어 ASCII 아트를 선택한 경우 교차 경계에 + (또는 유사한)를 사용해야 함).
  7. 이 영역은 음영 처리 될 필요는 없지만 음영 처리 될 필요는 없습니다.
  8. 벤 다이어그램을 생성하는 내장 함수 또는 타사 라이브러리는 허용되지 않습니다.
  9. 표준 허점이 적용됩니다 .

이것은 이므로 가장 짧은 코드 (바이트)가 이깁니다.


임의의 입력 크기에 맞게 솔루션을 확장해야한다는 메모를 추가 한 것 같습니다. 현재는 그중 소수만이 그렇게합니다 (ASCII 만 말할 수있는 한). 컨테스트가 시작된 후 규칙을 변경하는 것을 좋아하지 않지만이 요구 사항이 없으면 누군가가 각 세트의 한 문자에 대해서만 작동하는 간단한 레이아웃으로 규칙을 남용 할 수 있습니다 (내가 한 경우 코드 크기를 줄였습니다) 1/3 정도).
Martin Ender

@ MartinBüttner 네, 일부는 꽤 나쁩니다. 그러나 지금 7 가지 답변이 있다는 메모를 추가하는 것은 나쁜 생각처럼 보입니다. 메모를 추가하고 모든 사람의 게시물에 댓글을 달아 다이어그램이 X까지 잘 확장되어야한다는 것을 알 수 있습니까?
William Barbosa

제한을 설정하면 여전히 해당 제한을 하드 코딩 할 수 있습니다. 적절한 스케일링이 실제로 가장 어려운 부분이라고 생각합니다. 따라서 그대로 두거나 임의의 크기를 처리해야한다고 변경하십시오 (입력 크기를 제한하지 않았기 때문에 기술적으로도 변경되지 않습니다). .
마틴 엔더

@Ryan 나는 출력 섹션에 "다이어그램의 적절한 영역에 그것들을 표시함으로써"라고 언급합니다. 말했다 절은 5 개 이상의 요소가있는 경우 일부 답변 (당신 포함)은 무효입니다 내 생각 때문에, 제대로 안쪽 부분을 표시하지 않습니다
윌리엄 바르보사

관련 xkcd : xkcd.com/1810
sergiol

답변:


8

매스 매 티카 (343) (264)

언 골프

m=Input[]; data=Input[];


(* The circles to represent set boundaries *)
{R1,R2,R3}=Circle[#,5]&/@{{-2,8.5},{2,8.5},{0,5}};

(*converts  {1,0,1} to base 10, ie, the number 5.
bool[x_]:=FromDigits[Boole[x],2]

(* determines the region in which each number from 0 to `m` resides *)
encode[num_]:=bool[Table[MemberQ[data[[k]],num],{k,3}]]

(*Centroid of each region; the first is a location for numbers in none of the three sets *)
points={{7,4},{0,2},{4,10},{3,6},{-4,10},{-3,6},{0,11},{0,7}}

(* Plots the venn diagram with numbers in regions *)
Graphics[{
Text@@@({#[[1]],points[[#[[2]]+1]]}&/@({#[[All,1]],#[[1,2]]}&/@GatherBy[{#,encode[#]}&/@Range[0,m],Last])),
Opacity[.1],R1,R2,R3
}]

가정 10에 대한 입력 된 m{{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}용 입력 된 d,

새로운 벤 다이어그램


골프 264

모든 계산이 Graphics함수 자체 내에서 수행 될 수 있다는 것에 놀랐습니다 . 입력을 제외하고는 하나의 라이너입니다.

m=Input[];d=Input[]
Graphics@{Text@@@({#[[1]],{{7,4},{0,2},{4,10},{3,6},{-4,10},{-3,6},{0,11},{0,7}}[[#[[2]]+1]]}&/@({#[[All,1]],#[[1,2]]}&/@GatherBy[{#,FromDigits[Boole[Table[d[[k]]~MemberQ~#,{k,3}]],2]}&/@Range[0,m],Last])),Circle[#,5]&/@{{-2,8.5},{2,8.5},{0,5}}}

원 모양의 경우 +1 나는 그들이 회색으로 너무 좋아 보인다는 것에 놀랐습니다. 그러나 숫자의 산란은 이상합니다. RandomSample위치를 선택하는 데 사용 하고 있습니까?
Level River St

불투명도가 10 %이므로 회색이 작동합니다. RandomSample을 사용하여 위치를 지정했습니다. 위치가 선택되면 추가 선택을 위해 후보 세트에서 제거됩니다. 나는 다른 방법으로 놀았습니다 (예 : 하위 지역의 중심을 사용하지만 결과는 마음에 들지 않았습니다). BTW, 나는 당신의 라벨 맞춤 방법을 좋아합니다.
DavidC

문자를 저장하기 위해로 전환 Circles하여 회색 디스크가 사라졌습니다. 절약의 대부분은 한 지역의 모든 구성원이 해당 지역의 중심에 그려져 있다는 사실에서 비롯됩니다.
DavidC

45

루비 654 590 566 542 505 바이트

재미있었습니다. ASCII를 사용했습니다. 가능한 모든 조합을 아직 테스트 할 수 없었기 때문에 결함이있는 테스트 사례를 발견하면 알려주십시오.

require'set'
u=(0..gets.to_i).to_set
a,b,c=eval(gets).map &:to_set
i=' '
m,M,n,N,o,O,p,P,q,Q,r,R,s,S=[a-b-c,b-a-c,c-a-b,a&b-c,b&c-a,a&c-b,a&b&c].map{|u|[t=u.to_a*i,t.size]}.flatten
H,V,X=?─,?│,?┼
puts'┌'+H*(A=[1+M+[P,S].max,1+R].max)+?┐+(u-a-b-c).to_a*i,V+i*M+?┌+(b=H*(T=-M+U=A-1)+X+H*(B=[N,Q].max))+?┐,V+m+V+p+i*(T-P)+V+n+i*(B-N)+V,'│┌'+H*(K=M-1)+X+b+X+H*(C=[O-B-1,0].max)+?┐,(v=V*2+i*K)+V+s+i*(T-S)+V+q+i*(B-Q)+V+i*C+V,v+?└+b+?┘+i*C+V,V*2+r+i*(U-R)+V+o+i*(-O+D=B+C+1)+V,'└┼'+H*U+?┘+i*D+V,' └'+H*(A+D)+?┘

STDIN의 입력은 다음 형식으로 예상됩니다.

10
[[1,2,3,4,5,9],[1,2,3,6,8],[7,2,9]]

그런 다음이 아름다움으로 당신을 보상합니다

┌───────┐0 10
│   ┌───┼───┐
│4 5│1 3│6 8│
│┌──┼───┼───┼┐
││  │2  │   ││
││  └───┼───┘│
││9     │7   │
└┼──────┘    │
 └───────────┘

나는 ungolfed 버전을 추가하기 위해 귀찮게 할 수 있다고 생각하지 않습니다. 더 읽기 쉬운 버전 은 편집 히스토리에서 원본 버전을 살펴보십시오 .

이것은 설정 경계를 덜 빡빡하게하거나 심지어 그래픽 경계와 같이 고정 된 상태로 유지함으로써 확실히 더 골프화 될 수 있지만, 골프를 칠 때에도 멋지게 보이고 "적절하게"수행되는 것을 선호합니다.


오늘의 모자에 도달하지 않았다면 당신은이 대답에 오늘 무슨 동정 10K 클럽에 도달 할 것
윌리엄 바르보사

@WilliamBarbosa 어쩌면 내일 필요한 공감대를 줄 것입니다. ;)
Martin Ender

멋진 벤 다이어그램입니다. 나는 다이어그램의 모양이 모든 공감대의 주된 이유라고 생각합니다. 더 큰 세트는 어떻게 되나요? 나는 그것이 같은 높이를 유지하고 더 넓고 넓어 질 것이라고 추측하고 있습니까?
Level River St

@steveverrill 네 맞습니다. 8 개의 하위 세트 각각은 올바른 위치에 공백으로 구분 된 목록으로 인쇄됩니다. 경계는 항상 같은 모양이며 각 섹션의 너비는 모든 것을 안에 넣을 수있는 최소값으로 결정됩니다. 물론, 각 부분 집합을 대략 정사각형으로 유지하기 위해 줄 바꿈을 계산하면 더 좋아 보일 수 있지만 다시 이것은 결국 코드 골프입니다.;). 또한 줄 간격을 추가하지 않고도 훨씬 더 좋아 보입니다
Martin Ender

1
작은 각도의 문자를보고 APL 또는 무언가라고 생각하여 이중 테이크를 수행했습니다. :)
hoosierEE

15

BBC BASIC, 243 ASCII 문자 (토큰 파일 크기 211 바이트)

http://www.bbcbasic.co.uk/bbcwin/bbcwin.html 에서 에뮬레이터를 다운로드 하십시오.

골프

  INPUT"N",n
  DIMs(n+1)
  FORi=0TO2PRINT"S";i
  REPEATINPUTx:s(x)=s(x)+2^i:UNTILx>n
  NEXTMODE4r=360CIRCLE460,r,r
  CIRCLE640,664,r
  CIRCLE820,r,r
  FORi=0TO7FORx=0TOn:IFs(x)=i PRINT;x
  NEXTREADa
  VDU28,a+1792;a+5;
  NEXT
  DATA19,4873,2572,4893,2586,5907,3091,34

BBC Basic은 제거 할 수있는 줄 바꿈 / 공백에 대해 매우 임의적입니다. 불필요한 줄 바꿈을 없애는 것 외에도 ungolfed 버전에는없는 또 다른 트릭이 있습니다. 처음이 아닌 플로팅 루프의 끝 부분에 뷰포트를 지정합니다 (아래 설명이 ungolfed 주석 참조). 즉, 세트 외부의 요소가 왼쪽 상단에 플롯되고 커서가 프로그램 끝 오른쪽 상단의 뷰포트에 갇 힙니다. 그 이유는를 제거하기위한 것 VDU26입니다.

언 골프

사용자가 숫자 N + 1을 입력하면 각 숫자 집합이 종료됩니다 (약간의 이례적인 선택은 배열의 범위를 벗어난 쓰기로 인한 오류를 피하기위한 것입니다). 그러면 텍스트 모드에서 그래픽 모드로 변경됩니다. 벤 다이어그램을 그립니다.

입력 데이터는 표시 될 각 값에 대해 하나의 셀인 배열에 저장됩니다. 데이터는 3 비트 값으로 저장된다 : 1 Set0 + 2 Set1과 + 4 전원 연산자 대신 사용되도록 Set2를는 제 BBC 염기성의 범위는 0의 수를 더 시프트 연산자가없는주는 : 2^i대신 1<<i에 예를 들어 C.

원을 플로팅 한 후, 외부 루프는 8 개의 영역 각각을 통과하여 필요한 좌표로 이동합니다 (데이터 테이블에 따라). 내부 루프는 해당 영역의 모든 숫자를 인쇄합니다. 정렬.)

  INPUT"N",n                                 :REM create an array called s() with range 0..n+1
  DIMs(n+1)
  FORi=0TO2
    PRINT"S";i                               :REM prompt the user for data for set 0, set 1 and set 2.
    REPEATINPUTx:s(x)=s(x)+2^i:UNTILx>n      :REM input numbers and store as a bit table. Repeat until user enters n+1.
  NEXT
  MODE4                                      :REM change to graphics mode.
  r=360
  CIRCLE460,r,r                              :REM plot a circle at x,y,r.
  CIRCLE640,664,r                            :REM for the bottom two circles y=r.
  CIRCLE820,r,r
  FORi=0TO7                                  :REM for each region of the venn diagram
    READa                                    :REM read a 2 byte value for the  coordinates of the top left corner of a text viewport from the DATA statement: x+256y
    VDU28,a+1792;a+5;                        :REM create a 5x7 viewport (limits each region to 7 numbers.) 1792=7*256
    FORx=0TOn:IFs(x)=i PRINT;x               :REM print all numbers in the array belonging to that region
    NEXT
  NEXT
  VDU26                                      :REM Restore the viewport to the whole screen, to ensure the command prompt does not mess up the display at the end of the program.
  DATA34,19,4873,2572,4893,2586,5907,3091

일반적인 입력 및 출력의 몽타주 (ungolfed 버전)

골프 버전에서 세트 밖의 숫자 위치는 명령 프롬프트와 교환됩니다 >.

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


이것은 임의로 큰 입력에 작동합니까?
Martin Ender

@ MartinBüttner 원칙적으로 그렇습니다. 알고리즘이 할 수는 있지만 디스플레이에서 다운 할 수 있습니다 (다른 솔루션의 문제 일 가능성이 있습니다). 프로그램이 각 영역이 스크롤되기 전에 7 개의 숫자로 제한되어 있다고 암시합니다 ( 줄 바꿈이 끔찍하다고 생각할 때 숫자는 세로 열에 있습니다.) 사용중인 에뮬레이터는 훨씬 더 높은 화면 해상도를 처리 할 수 ​​있지만 "정확한"BBC 마이크로 스크린 모드 중 하나를 사용했습니다. 누군가 이것을 이것을 Java로 이식한다면, 다이어그램을 읽을 수있는 인간의 능력 만이 실제 한계입니다.
Level River St

아, 그래, 원이 입력 크기에 적응할 지 궁금해했다 ... 물론 터미널이 줄을 감싸면 큰 입력에 대해 솔루션을 읽을 수 없지만 스크롤 막대로 표시되는 한 입력을 처리 할 수있다. 크기.
Martin Ender

2
이것이 자바로 포팅 되더라도 더 많은 텍스트를 위해 원을 더 크게하려면 코드를 추가해야합니다
Sparr

14

자바 스크립트 1235

http://jsfiddle.net/44a4L/7/

구글 크롬 v36에서 테스트되었습니다.

변수는 upper, set1, set2 및 set3에 입력됩니다.

업데이트 : 이제 입력 크기에 따라 자동으로 크기가 조정됩니다.

function t(e,t){z.getElementById(e).innerHTML+=" "+t}z=document;s=200+upper*20;z.body.innerHTML+="<style>#m{width:"+s+"px;height:"+s+"px;}div{position:absolute;text-align:center;border-radius:50%;}#s1{left:calc(15% + 15px);top:30px;bottom:30%;right:calc(15% + 15px);background-color:rgba(255,0,0,0.4);padding:10%;}#s2{left:30px;bottom:30px;top:30%;right:30%;background-color:rgba(0,255,0,0.4);padding-right:40%;padding-top:30%;}#s3{right:30px;bottom:30px;top:30%;left:30%;background-color:rgba(0,0,255,0.4);padding-left:40%;padding-top:30%;}#s123{left:40%;top:40%;right:40%;bottom:40%;}#s12{left:20%;top:35%;right:65%;bottom:50%;}#s13{right:20%;top:35%;left:65%;bottom:50%;}#s23{left:40%;right:40%;bottom:15%;top:70%;}</style><div id=m><div id=s1 class=s></div><div id=s2 class=s></div><div id=s3 class=s></div><div id=s123 class=v></div><div id=s12 class=v></div><div id=s13 class=v></div><div id=s23 class=v></div></div>";for(i=0;i<=upper;i++){i1=i2=i3=false;if(set1.indexOf(i)!=-1)i1=true;if(set2.indexOf(i)!=-1)i2=true;if(set3.indexOf(i)!=-1)i3=true;if(i1&&i2&&i3)t("s123",i);else if(i1&&i2)t("s12",i);else if(i1&&i3)t("s13",i);else if(i2&&i3)t("s23",i);else if(i1)t("s1",i);else if(i2)t("s2",i);else if(i3)t("s3",i);else t("m",i)}

샘플 출력 :

벤


꽤 좋은! 나는 그것을 더 꽉 쥐고 , jsfiddle.net/44a4L/2를 볼 수 있었다 - "t"함수, CSS와 body.innerHTML을 보라. 그래도 같은 논리입니다. 나는 아직도 압착 될 수 있다고 확신합니다.
Nenotlep

이것은 지금까지 가장 아름다운 것입니다, 그것은 잘 확장되지 않는 것이 유감입니다. 가장 안쪽 영역 안에있는 세 가지 요소가 깨집니다. 어떻게 든 확장 할 계획입니까?
William Barbosa

@WilliamBarbosa 스케일링이 구현되었습니다
rdans

2
화려한! 매우 훌륭한! 훌륭합니다! (SE가 간결함을 싫어하기 때문에 하나 이상의 최상급을 사용해야했습니다.)
Scott Leadley

4

파이썬-603

import re
n,a,b,c=eval(input())
h=set(range(n+1))-a-b-c
g=a&b&c
d,e,f=a&b-g,b&c-g,a&c-g
l,m=set(a),set(b)
a-=b|c
b-=l|c
c-=l|m
for t in'abcdefgh':exec("%s=' '.join(map(str,%s))"%(2*(t,)))
l=len
x,y,z=max(l(a),l(f)+2,3),l(max(d,g)),max(l(b),l(e)+2,l(c)-l(f+g)-2,3)
j=[0]*4
for t in'abcdefg':exec("%s=%s.ljust([x,z,x+y+z-2,y,z-2,x-2,y][ord('%s')-97])+'|'"%(3*(t,)))
s='\d| '
w=re.sub
for r in (1,3):q=r//2;j[r]=['','| '][q]+'|'+[a+d+b,f+g+e][q]+['',' |'][q];j[r-1]=w('\|','+',w(s,'-',j[r]))
j[0]+=h
o=j[2]
j[2]='| +'+j[2][3:-3]+'+ |'
p='  |'+c
q='  '+w('\|','+',w(s,'-',p))[2:]
for l in j+[o,p,q]:print(l)

입력은 N 다음에 세 세트가 쉼표로 구분됩니다 (예 :) 8, {1,2,4}, {2,3,4,5}, {4,6,8}. 다음과 같이 ACSII 아트 세트를 출력합니다.

+---+-+---+0 7
|1  | |3 5|
| +-+-+-+ |
| |2|4| | |
+-+-+-+-+-+
  |6 8  |
  +-----+

하하, 5 분 안에 거의 동일한 두 가지 솔루션. (챌린지가 게시 된 후 3 시간 ...)
Martin Ender

1
참고 번호 6을 참조하십시오. 모서리와 경계는 "+"와 같은 다른 문자 여야합니다.
William Barbosa

4

HTML + JavaScript (E6) 752 761

입력 형식 : 최대 set1 set2 set3 (각 세트는 쉼표로 구분 된 숫자 목록)

예 : 10 1,2,3,4,5,9 1,2,3,6,8 7,2,9

스크린 샷

예 2:30 2,4,6,8,10,12,14,16,18,30 3,6,9,12,15,18,21,30 5,10,15,20,25,30

크롬 스크린 샷

HTML 렌더링 덕분에 모든 섹션의 크기가 자동으로 조정됩니다.

<html><body><script>
i=prompt().split(' ');
r=",,,,,,,, class=',></i>".split(c=',')
for (j=-1;j++<i[0];r[h]+=j+' ')for(h=k=0;++k<4;)if((c+i[k]+c).search(c+j+c)+1)h+=k+(k>2);
document.write(
"<style>div{1row}p{position:relative;text-align:center;padding:7;1cell}i{position:absolute;top:0;3:0;4:0;left:0}.a{2top-left5b{2top-45c{23-left5d{23-45x{6880,9.y{680,89.z{60,889</style>"
.replace(/\d/g,x=>'09display:table-9border-9bottom9right9-radius:60px}.9background:rgba(930px9255,9.3)}'.split(9)[x])
+"<div><p8x a'/><p8x'>1</p><p><i8y a'9<i8x b'93</p><p8y'>2</p><p8y b'/></div><div><p8x c'/><p8z a'><i8x'95</p><p8z'><i8x d'9<i8y c'97</p><p8z b'><i8y'96</p><p8y d'/></div><div><p/><p8z c'/><p8z'>4</p><p8z d'/></div>0"
.replace(/\d/g,x=>r[x]))
</script></body></html>

Javascript E5 버전 은 Chrome 및 MSIE 10 (아마도 9)에서 작동

<html><body><script>
i=prompt().split(' ');
r=",,,,,,,, class=',></i>".split(c=',')
for (j=-1;j++<i[0];r[h]+=j+' ')for(h=k=0;++k<4;)if((c+i[k]+c).search(c+j+c)+1)h+=k+(k>2);
document.write(
"<style>div{1row}p{position:relative;text-align:center;padding:7;1cell}i{position:absolute;top:0;3:0;4:0;left:0}.a{2top-left5b{2top-45c{23-left5d{23-45x{6880,9.y{680,89.z{60,889</style>"
.replace(/\d/g,function(x){return '09display:table-9border-9bottom9right9-radius:60px}.9background:rgba(930px9255,9.3)}'.split(9)[x]})
+"<div><p8x a'/><p8x'>1</p><p><i8y a'9<i8x b'93</p><p8y'>2</p><p8y b'/></div><div><p8x c'/><p8z a'><i8x'95</p><p8z'><i8x d'9<i8y c'97</p><p8z b'><i8y'96</p><p8y d'/></div><div><p/><p8z c'/><p8z'>4</p><p8z d'/></div>0"
.replace(/\d/g,function(x){return r[x]}))
</script></body></html>

골프가 아닌

<html>
<style>
div {   display:table-row; }
p {
    position: relative;
    text-align: center;
    padding: 30px;
    display: table-cell;
}
i {
    position: absolute;
    top:0;bottom:0;right:0;left:0;
}
.a { border-top-left-radius: 60px; }
.b { border-top-right-radius: 60px; }
.c { border-bottom-left-radius: 60px; }
.d { border-bottom-right-radius: 60px; }
.x { background: rgba(255,255,0,.3) }
.y { background: rgba(255,0,255,.3) }
.z { background: rgba(0,255,255,.3) }
</style>
<body>
<div>
<p class='x a'/><p class='x'><b id='b1'></b></p><p><i class='y a'></i><i class='x b'></i><b id='b3'></b></p><p class='y'><b id='b2'></b></p><p class='y b'/>
</div>    
<div>
<p class='x c'/><p class='z a'><i class='x'></i><b id='b5'></b></p><p class='z'><i class='x d'></i><i class='y c'></i><b id='b7'></b></p><p class='z b'><i class='y'></i><b id='b6'></b></p><p class='y d'/>
</div>        
<div>
<p/><p class='z c'/><p class='z'><b id='b4'></b></p><p class='z d'/>
</div>    
<b id='b0'></b>    
<script>
i=prompt().split(' ')
r=',,,,,,,'.split(c=',')
for (j=-1; j++<i[0];)
{
    for(h = k = 0; ++k < 4;)
    {
    if( (c+i[k]+c).search(c+j+c) >= 0)
      h += k + (k>2); // bit mask 1 or 2 or 4
  }
  r[h] += j + ' ';
}        
for (j = 0; j < 8; j++)
    document.getElementById('b'+j).innerHTML=r[j]
</script>
</html>

3

파이썬 3-353

# 353 bytes, input format like: 6 1,2,3 2,3,4 1,3,4
import sys
from turtle import*
_,n,*q=sys.argv
n=set(range(int(n)))
a,b,c=map(set,map(eval,q))
for x,y in(0,0),(-115,-185),(115,-185):goto(x,y),pd(),circle(200),up()
for x,y,s in(200,331,n-a-b-c),(-101,278,a-b-c),(-254,-49,b-a-c),(95,-49,c-a-b),(-172,164,a&b-c),(58,164,a&c-b),(-49,-39,b&c-a),(-49,52,a&b&c):goto(x,y),write(s or'',font=None)
ht()
done()

다른 사람이 어렸을 때 로고를 가지고 놀았습니까?

견본: python3 turtletest.py 15 1,2,3,4,5,9,10,12 1,3,4,6,7,9 1,2,7,8,9

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


글꼴 / 원이 임의로 큰 입력으로 확장됩니까?
Sparr

아뇨, 아직도 저것에 대해 생각하고 있습니다.
Jason S

@JasonS 아직도 생각하고 있습니까?
Jonathan Frech

3

388b 346b 488b

이것은 다른 항목과 유사한 출력을가집니다.

@a=split($",<>);
$n=pop @a;
@a=map[split(',')],@a;
for$i(0..2){$b{$_}+=1<<$i foreach@{$a[$i]}}
push@{$c[$b{$_}]},$_ for(0..$n);
$l|=length($d[$_]=join($",@{$c[$_]}))for(0..$n);
print$h=(("+-"."-"x$l)x3)."+
";
sub j{sprintf"% ".(sprintf"%ds",$l+($_[0]<4)+($_[0]==7)),$d[$_[0]]}
sub r{join('|',map{j($_)}@_)}
$h=~s/\+-/|+/;
$h=~s/-\+$/+|/;
print "|".r(1,3,2)."|
".$h;
$h=~s/[|+]{2}/++/g;
print "||".r(5,7,6)."||
".$h;
$h=~s/\+\+/ +/;
$h=~s/\+\+/+ /;
$h=~s/-\+-/---/g;
$l=$l*3+3;print " |".j(4)."|
",$h,$d[0]

테스트 실행 및 출력 :

# echo "1,2,3,7,13 2,3,8,11,13,6,9 3,4,5,11,12,13,14 15" | perl venn.pl ;echo
+----------------+----------------+----------------+
|             1 7|               2|           6 8 9|
|+---------------+----------------+---------------+|
||               |            3 13|             11||
++---------------+----------------+---------------++
 |                                       4 5 12 14|
 +------------------------------------------------+ 

흠, 나는 당신이 입력을 보지 않으면 레이아웃이 실제로 모호하지 않다는 것을 확신하지 못한다.
Martin Ender

맞습니다, 이것은 충분하지 않습니다
William Barbosa

확인 @WilliamBarbosa, 나는 그것이 faubiguy의 항목처럼 보이게했다
Sparr

2

T-SQL 2095

@N은 N을 포함하는 int라고 가정합니다. @A, @B 및 @C는 세 개의 숫자 세트를 포함하는 테이블이라고 가정합니다. 골프를 너무 많이하지 않았다.

DECLARE @D INT=@N,@E INT=0,@F CHAR='/',@G CHAR='\',@H CHAR='-',@I CHAR='|',@J CHAR='+'DECLARE @ TABLE(Z INT,Y INT,X INT,W INT,V INT,U INT,T INT,S INT)INSERT INTO @(Z)SELECT A.P FROM @A A JOIN @B B ON A.P=B.P JOIN @C C ON A.P=C.P INSERT INTO @(Y)SELECT A.P FROM @A A JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL INSERT INTO @(X)SELECT C.P FROM @C C JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL INSERT INTO @(W)SELECT B.P FROM @B B JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL INSERT INTO @(V)SELECT A.P FROM @A A LEFT JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL AND B.P IS NULL INSERT INTO @(U)SELECT C.P FROM @C C LEFT JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL AND A.P IS NULL INSERT INTO @(T)SELECT B.P FROM @B B LEFT JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL AND C.P IS NULL WHILE @N>=0BEGIN INSERT INTO @(S)SELECT @N WHERE @N NOT IN(SELECT*FROM @A UNION SELECT*FROM @B UNION SELECT*FROM @C)SET @N-=1 END DECLARE @Z TABLE(A CHAR(5),B CHAR(5),C CHAR(5),D CHAR(5),E CHAR(5),F CHAR(5),G CHAR(5),H CHAR(5))INSERT INTO @Z SELECT @F,@H,@F,@H,@G,@H,@G,''WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT V FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT X FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT U FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT S FROM @)),'')SET @E+=1 END INSERT INTO @Z SELECT @F,@H,@J,@H,@G,'',@I,''SET @E=0WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Y FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Z FROM @)),''),@I,'',@I,''SET @E+=1 END INSERT INTO @Z SELECT @G,@H,@J,@H,@F,'',@I,''SET @E=0WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT T FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT W FROM @)),''),@I,'',@I,''SET @E+=1 END INSERT INTO @Z SELECT @G,@H,@G,@H,@F,@H,@F,''SELECT*FROM @Z

덜 골프 버전 :

--finding the sets
DECLARE @D INT=@N,@E INT=0,@F CHAR='/',@G CHAR='\',@H CHAR='-',@I CHAR='|',@J CHAR='+'
DECLARE @ TABLE(Z INT,Y INT,X INT,W INT,V INT,U INT,T INT,S INT)
INSERT INTO @(Z)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P JOIN @C C ON A.P=C.P 
INSERT INTO @(Y)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL 
INSERT INTO @(X)
SELECT C.P FROM @C C JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL 
INSERT INTO @(W)
SELECT B.P FROM @B B JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL 
INSERT INTO @(V)
SELECT A.P FROM @A A LEFT JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL AND B.P IS NULL 
INSERT INTO @(U)
SELECT C.P FROM @C C LEFT JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL AND A.P IS NULL 
INSERT INTO @(T)
SELECT B.P FROM @B B LEFT JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL AND C.P IS NULL 
WHILE @N>=0
BEGIN 
    INSERT INTO @(S)
    SELECT @N WHERE @N NOT IN(SELECT*FROM @A UNION SELECT*FROM @B UNION SELECT*FROM @C)
    SET @N-=1 
END

--displaying the venn diagram
DECLARE @Z TABLE(A CHAR(5),B CHAR(5),C CHAR(5),D CHAR(5),E CHAR(5),F CHAR(5),G CHAR(5),H CHAR(5))
INSERT INTO @Z 
SELECT @F,@H,@F,@H,@G,@H,@G,''
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT V FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT X FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT U FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT S FROM @)),'')
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @F,@H,@J,@H,@G,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Y FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Z FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@J,@H,@F,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT T FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT W FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@G,@H,@F,@H,@F,''
SELECT*FROM @Z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.