Venn Şeması Üreticisi Golf


26

Venn Şeması Üreticisi Golf

görüntü tanımını buraya girin

John Venn'in 180. doğum gününü doğru bir şekilde kutlamak için bugün göreviniz bir Venn Diyagramı çıkaran bir program oluşturmak olacak !

Giriş:

Pozitif bir tam sayı N(sıfır kaynaktan için şemada görülen sayı aralığı tanımlayacak N) ve pozitif tamsayılar üç set.

Çıktı:

0'dan tüme tamsayıları gösteren 3 Nkümeli bir Venn şeması ve kümelerin ilişkilerini, şemaya uygun bölgelerde göstererek, bunlara benzer .

notlar

  1. stdinDeğerleri elde etmek için kullanın (veya dilinizin karşılığı ne olursa olsun).
  2. Setler için ve için giriş biçimini tanımlayabilirsiniz N(virgülle, eğik çizgiyle veya sizin için en iyi olanı kullanarak ayırın).
  3. Kümelerin hiçbirinde görünmeyen ancak belirtilen aralıkta olan sayılar, yalnızca herhangi bir bölgenin içinde değil, diyagramda görünmelidir.
  4. Setlerin adlandırılmasına gerek yok.
  5. Çıktı bir çizim ya da ilginç olabilir.
  6. Diyagram, sınırlar açıkça ayırt edilebildiği sürece herhangi bir şekle sahip olabilir (eğer ASCII sanatını seçtiyseniz, örneğin sınırları geçmek için + (veya benzeri) kullanılması şarttır).
  7. Bölgeler gölgelendirilebilir fakat gölgelenmesi gerekmez.
  8. Venn Şemaları oluşturan tüm yerleşik işlevler veya üçüncü taraf kitaplıklara izin verilmez.
  9. Standart boşluklar uygulanır .

Bu , yani bayt cinsinden en kısa kod kazanır.


Çözümlerin isteğe bağlı giriş boyutları için ölçeklendirilmesi gerektiğine dair bir not eklemelisiniz gibi görünüyor. Şu anda sadece birkaçı bunu yapıyor (sadece ASCII olanları söyleyebildiğim kadarıyla). Yarışma başladıktan sonra kuralları değiştirmekten hoşlanmıyorum, ancak bu şart olmadan, birisi muhtemelen her sette yalnızca bir karakter için çalışan basit bir düzenle kötüye kullanabilir (eğer bunu yaparsam büyük olasılıkla kod boyutunu kestim) üçüncü ya da öylesine).
Martin Ender

@ MartinBüttner Evet, bazıları çok kötü ölçekli. Ancak şimdi 7 cevap olduğuna dair bir not eklemek kötü bir fikir gibi görünüyor. Notu eklemeli ve diyagramın X'e kadar ölçeklenmesi gerektiğini bildirmek için herkesin gönderisine yorum yapmalı mıdır?
William Barbosa

Bir limit belirlemek hala bu limiti zor kodlamaya izin verecektir. Bence uygun ölçeklendirme aslında mücadelenin en zor kısmı. Öyleyse ya olduğu gibi bırakın ya da rasgele ayarlanmış boyutlarla başa çıkması gerektiğini söyleyin (teknik olarak bir değişiklik bile olmaz, çünkü girdi boyutlarını sınırlamadınız, isteğe bağlı girdi boyutlarının yine de varsayılması gerektiğini düşünüyorum) .
Martin Ender

@Ryan Çıktı bölümündeki "diyagramın uygun bölgelerinde göstererek" ifadesini verdiğimi not edin. Bazı cevaplar (sizinkiler dahil), eğer söz konusu bölüm 5'ten fazla element içeriyorsa, en içteki bölümü doğru göstermez, bu yüzden geçersiz olduğunu düşünüyorum
William Barbosa

İlgili xkcd: xkcd.com/1810
sergiol

Yanıtlar:


8

Mathematica 343 264

UnGolfed

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
}]

Varsayarsak 10için giriş oldu mve {{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}giriş oldu d,

yeni venn şeması


Golf 264

Hesaplamanın tümünün Graphicsfonksiyonun içinde yapılabilmesine şaşırdım . Girişler hariç, bir astardır.

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}}}

Çevrelerin görünümü için +1. Gri renklerinde çok iyi görünmelerine şaşırdım. Sayıların saçılması yine de garip. RandomSampleKonumu seçmek için mi kullanıyorsun ?
Seviye Nehri St

Gri, opasite% 10 olduğu için çalışıyor. Konumu seçmek için RandomSample kullanıldı. Bir yer seçildikten sonra, ek seçimler için aday grubundan çıkarılır. Diğer yöntemlerle oynadım (örneğin, bir alt bölgenin centroidini kullanarak, ancak sonuçları beğenmedim). BTW, etiket takma yaklaşımınızı beğendim.
DavidC,

Karakterleri kaydetmek için, üzerine geçtim Circles, böylece gri diskler kayboldu. Tasarrufların çoğu, bir bölgenin tüm üyelerinin o bölgenin merkezinde yer almasından kaynaklanıyor.
DavidC

45

Ruby, 654 590 566 542 505 bayt

Bu komikti. ASCII kullandım. Her olası kombinasyonu henüz test edemedim, bu yüzden bir sorunlu test durumu bulursanız, lütfen bana bildirin.

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'de girişi aşağıdaki formatta bekler

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

Ve sonra sizi bu güzellik ile ödüllendirecek

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

Yıpranmış bir sürüm eklemek için canımı sıkabileceğimi sanmıyorum. Biraz daha okunabilir bir sürüm için lütfen düzenleme geçmişindeki orijinal sürüme bir bakın .

Set sınırları daha az sıkı hale getirilerek veya hatta bazı grafiksellerin yaptığı gibi sabit tutularak bu kesinlikle daha fazla golf oynayabilir, ancak ben bunun güzel görünmesini ve golfe rağmen "düzgün" yapılmasını tercih ederim.


Bugünün sınırına ulaşmasaydın, bugün 10K kulübüne bu cevapla
William Barbosa

@WilliamBarbosa Belki bana yarınki gerekli oylamaları verir. ;)
Martin Ender

Güzel görünümlü bir Venn şeması. Diyagramın görünüşünün, tüm olumlu düşüncelerinizin temel nedeni olduğunu tahmin ediyorum. Daha büyük setler için ne olur? Sanırım aynı yükseklikte kalıyor ve daha da genişliyor?
Seviye River St

@steveverrill evet, tam olarak. 8 alt grubun her biri doğru konumda boşlukla ayrılmış bir liste olarak yazdırılır. Sınırlar her zaman aynı şekildedir ve her bölümün genişliği, içerideki her şeye sığabilecek en küçük miktar olarak belirlenir. Elbette, her bir alt kümeyi kabaca kare tutmak için satır sonu hesapladıysam daha güzel görünebilir, ama sonra yine de bu kod golf; ayrıca satırlar arasında ek boşluk bırakmadan daha da iyi görünüyor
Martin Ender

1
Küçük açılı karakterleri gördüm ve APL ya da başka bir şey olduğunu düşünerek iki kez çekti. :)
hoosierEE

15

BBC BASIC, 243 ASCII karakter (tokenlenmiş dosya boyutu 211 bayt)

Emülatörü http://www.bbcbasic.co.uk/bbcwin/bbcwin.html adresinden indirin.

golfed

  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, hangi yeni satırları / boşlukları kaldırabileceğiniz konusunda çok keyfidir. Gereksiz yeni satırları çıkarmanın dışında, burada eski sürümde olmayan başka bir numara var: Başlangıç ​​noktasında değil, çizim döngüsünün sonundaki görünüm alanını (eski sürümlerde aşağıdaki açıklamalara bakınız) atadım. Bu, setin dışındaki öğelerin sol üstte çizildiği ve imlecin programın sonunda sağ üstte bulunan bir görünüm alanında yakalandığı anlamına gelir. Bunun nedeni ortadan kaldırmaktır VDU26.

Ungolfed

Her sayı kümesi, N + 1 sayısını giren kullanıcı tarafından sonlandırılır (biraz sıradışı bir seçimdir, bu, bir dizi aralığının dışına yazmaya çalışmaktan kaynaklanan hataları önlemek içindir.) Daha sonra bir metin modundan grafik moduna geçer. ve Venn şemasını çizer.

Giriş verileri, görüntülenecek her değer için bir hücre olan bir dizide saklanır. Veriler, bir 3-bit değeri olarak kaydedilir: 1 Set0 için + 2 Ayar 1 + 4 elektrik operatör yerine kullanılır, böylece Set 2, 7. BBC basic, aralık 0 bir dizi herhangi bir kayma operatörü olan vermek için: 2^iyerine 1<<iiçinde Örneğin c.

Daireleri çizdikten sonra, bir dış halka, sekiz bölgenin her birinden geçer, istenen koordinatlara hareket eder (bir veri tablosuna göre.) Bir iç döngü, o bölgedeki tüm sayıları (ilgili 3 bitlik değere sahip olanlar) yazdırır. dizi.)

  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

Tipik giriş ve çıkışların montajı (eski sürüm)

Golf versiyonunda, setlerin dışındaki sayıların pozisyonları komut istemiyle değiştirilir >.

görüntü tanımını buraya girin


Bu keyfi olarak büyük girdiler için çalışıyor mu?
Martin Ender

@ MartinBüttner prensipte evet algoritması yapabilir, ancak ekran aşağı indirmesine izin verir (diğer çözümlerde sorun yaşanması muhtemeldir.) Programda, her bölgenin kaymaya başlamadan önce 7 sayı ile sınırlandırıldığına işaret ediyorum () sayıları dikey bir sütunda sanıyordum, sanırım korkunç görünecekmiş gibi görünüyor.) Kullandığım emülatör daha yüksek ekran çözünürlüklerini kaldırabilir, ancak oldukça sınırlayıcı olan "otantik" BBC mikro ekran modlarından birine girdim. Birisi bunu Java'ya aktarırsa, tek pratik sınır, şemayı okumadaki insan yeteneği olacaktır.
Seviye Nehri St

Evet, çevrelerin giriş boyutuna uyum sağlayıp sağlamadığını merak ediyorum ... tabii ki terminaliniz çizgileri sayarsa çözümüm de büyük girdiler için okunamaz hale gelir, ancak kaydırma çubukları ile görüntülendiği sürece herhangi bir girişi kaldırabilir boyut.
Martin Ender

2
Bu, java'ya taşınmış olsa bile, daha fazla metin için çevreleri daha büyük hale getirmek için kod eklemelisiniz
Sparr

14

Javascript 1235

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

Google chrome v36'da test edilmiştir.

Girdi, üst, set1, set2 ve set3 değişkenlerinde alınır.

Güncelleme: Şimdi girişin büyüklüğüne bağlı olarak otomatik ölçeklendirir.

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)}

Örnek çıktı:

Venn


Bayağı güzel! Biraz daha sıkmayı başardım , bkz. Jsfiddle.net/44a4L/2 - "t" fonksiyonuna, CSS'ye ve body.innerHTML'ye bakın. Yine de aynı mantık. Eminim hala sıkılabilir.
Nenotlep

Bu şimdiye kadarki en güzel olanı, iyi ölçeklenememesi üzücü. En içteki bölgedeki üç element kırılmasını sağlar. Bir şekilde ölçeklendirmeyi planlıyor musun?
William Barbosa,

@WilliamBarbosa ölçeklendirme şimdi uygulanmaktadır
saat 21

2
Muhteşem! Çarpıcı! Muhteşem! (SE üstünlüğünden nefret ettiği için birden fazla üstünlük kullanmak zorunda kaldı.)
Scott Leadley

4

Python - 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)

Girdiyi N ve ardından virgülle ayrılmış (örneğin 8, {1,2,4}, {2,3,4,5}, {4,6,8}) üç takım izler . ACSII sanatında aşağıdaki gibi bir küme çıktılar:

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

Haha, 5 dakika içinde neredeyse iki özdeş çözüm. (Meydan okumanın yayınlanmasından 3 saat sonra ...)
Martin Ender

1
Lütfen not 6'ya bakınız. Kenarlarınız ve geçiş sınırlarınız "+" gibi farklı bir karakter olmalıdır.
William Barbosa,

4

HTML + JavaScript (E6) 752 761

Giriş formatı: maks set1 set2 set3 (her set virgülle ayrılmış bir numara listesidir)

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

Ekran görüntüsü

Örnek 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

Chrome Ekran Görüntüsü

Html renderleme sayesinde tüm bölümlerin otomatik büyüklüğü.

<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 sürümü Chrome ve MSIE 10'da çalışır (belki 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>

Değil (yani) golf

<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

Python 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()

Logo ile çocukken oynayan başka biri var mı?

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

görüntü tanımını buraya girin


yazı tipi / daireler keyfi büyük girdiler için ölçeklenir mi?
Sparr

Hayır, hala bunu düşünüyorum.
Jason S

@ JasonS Hala düşünüyor mu?
Jonathan Frech

3

perl 388b 346b 488b

Bunun başka bir girişe benzer bir çıktısı var:

@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]

Test çalıştırması ve çıkışı:

# 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|
 +------------------------------------------------+ 

Hm, girişi görmediyseniz, mizanpajın gerçekten belirgin olduğundan emin değilim.
Martin Ender

Haklısın, bu yeterli değil.
William Barbosa

@WilliamBarbosa tamam, faubiguy'un girişi gibi görünmesini sağladım
Sparr

2

T-SQL 2095

@N, N içeren bir int'dir. Varsayım @A, @B ve @C, üç sayı grubunu içeren tablolardır. Çok fazla golf oynamaya çalışmadım.

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

Daha az golf oyunu:

--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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.