Koch Kar Tanesi'nin Grafiksel Gösterimi


13

Koch Kar Tanesi Oluşturun

Koch kar tanesi, her biri için n, her iki tarafın ortasına başka bir eşdeğer noktanın eklendiği bir üçgendir : http://en.wikipedia.org/wiki/Koch_snowflake#Properties

Biz zaten bir vardı Koch kar tanesi meydan için n=4. Yeni zorluk ve ile narasında bir Koch kar tanesi çizmektir .110

kurallar

Kar taneleri programda veya dosyalarda sabit olarak kodlanamayabilir - programınız tarafından oluşturulmalıdır.

Programınız n1 ile 10 arasındaki tüm boyutları desteklemelidir .

Kenar sayısı kullanıcı tarafından std-in yoluyla girilmelidir.

Kar tanesinin grafik gösterimini ekrana yazdırmalısınız.

Örnek n1, 2, 3 ve 4'e sahip Koch Kar Taneleri (yalnızca netlik için yeşil çizgiler, bunları çoğaltmayın):

Koch Kar Taneleri

Beraberlik durumunda en fazla sayıda oy veren program kazanır (pop-yarışması).


Bunu anlamıyorum: "Pikselin nereye yerleştirileceğini hesaplamak için bir işlev kullanmalısınız. Programınızın bu amaçla yerleşik bir işlevi yoksa, puanınızı uygulamanızın maliyetini düşürebilirsiniz. " Hangi piksel?
xnor

@xnor Başlangıçta kar tanesi piksel / karakter bazında nasıl çizileceğini hesaplamaktı (meydan okuma aslında bir ASCII-sanat meydan okumasıydı). Çoğu insan muhtemelen sadece çizgiler kullanır, bu yüzden bunu kaldıracağım.

Kişi kar tanesinin tamamını doldurabilir mi?
xnor

Elbette. Bu yorumun daha uzun olması gerekiyor.

Öte yandan n=7, karta yeni eklenen üçgenleri bilgisayar ekranında göremezsiniz. Burada "en iyi çaba" var mı? Piksel tabanlı çözümler için minimum çözünürlük var mı?
xnor

Yanıtlar:


7

Mathematica 72

Region@Line@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]

n = 3

resim açıklamasını buraya girin

Alephalpha için teşekkürler.


İyi iş. İki karakterle golf yapın ve kazanın!

@ Hosch250 Güncellendi, Teşekkürler.
chyanog

AnglePathMathematica 10.1'de kullanabilirsiniz .
alephalpha

@chyaongGraphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
alephalpha

1
@alephalpha 73 karakter:ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
chyanog

15

MATLAB, 119 115

Olağandışı bir olayda, bu programın golf oynadıkça daha iyi çalıştığını gördüm. Birincisi, vektörleşme nedeniyle çok daha hızlı oldu. Şimdi, ~n:~kullanıcıya hangi miktarın girileceğini hatırlatan yararlı bir bilgi istemi görüntüler !

Yeni satırlar programın bir parçası değildir.

x=exp(i*pi/3);
o='~n:~';
P=x.^o;
for l=2:input(o);
P=[kron(P(1:end-1),~~o)+kron(diff(P)/3,[0 1 1+1/x 2]) 1];
end;
plot(P)

n = 9: n = 9

oeşittir isteğe bağlı bir dizge olup [0 2 4 0], modülo 6. e iπ / 3 , bu güçlere yükseltilmiş kompleks düzlemde bir eşkenar üçgenin köşelerini verir. Birincisi kron, her biri 4 kez çoğaltılan nokta listesinin bir kopyasını yapmak için kullanılır. ~~o4'lü vektör elde etmenin uygun yoludur. İkincisi diff(P), her ardışık nokta çifti arasındaki vektörü bulur. Bu vektörün katları (0, 1/3, (1 + e -iπ / 3 ) / 3 ve 2/3) eski noktaların her birine eklenir.


Uhm, bu kodun nasıl çalıştığını biraz daha açıklayabilir misiniz? Matlab'ı tanıdığımı sanıyordum ama bu ... delilik ?? =)
kusur

@flawr Birkaç not ekledim, bu işe yarar mı?
feersum

Çok teşekkür ederim! Bu dizi kötüye kullanım hilesini aklımda
tutacağım

9

T-SQL: 686 (biçimlendirme hariç)

SQL Server 2012+ için.

Bu asla bir yarışmacı olmayacak olsa da, bunu T-SQL'de yapabilir miyim diye görmek zorundaydım. İlk üç kenardan başlayıp sonra her kenardan tekrarlayan ve her seviye için 4 kenarla değiştirilen yaklaşıma gitti. Sonunda hepsini @i için belirtilen seviye için tek bir geometriye dönüştürmek

DECLARE @i INT=8,@ FLOAT=0,@l FLOAT=9;
WITH R AS(
    SELECT sX,sY,eX,eY,@l l,B,1i
    FROM(VALUES(@,@,@l,@,0),(@l,@,@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),-120),(@l/2,SQRT(@l*@l-(@l/2)*(@l/2)),@,@,-240))a(sX,sY,eX,eY,B)
    UNION ALL
    SELECT a.sX,a.sY,a.eX,a.eY,l/3,a.B,i+1
    FROM R 
        CROSS APPLY(VALUES(sX,sY,sX+(eX-sX)/3,sY+(eY-sY)/3,sX+((eX-sX)/3)*2,sY+((eY-sY)/3)*2))x(x1,y1,x2,y2,x3,y3)
        CROSS APPLY(VALUES(x2+((l/3)*SIN(RADIANS(B-210.))),y2+((l/3)*COS(RADIANS(B-210.)))))n(x4,y4)
        CROSS APPLY(VALUES(x1,y1,x2,y2,B),
            (x3,y3,eX,eY,B),
            (x2,y2,x4,y4,B+60),
            (x4,y4,x3,y3,B-60)
        )a(sX,sY,eX,eY,B)
WHERE @i>i)
SELECT Geometry::UnionAggregate(Geometry::Parse(CONCAT('LINESTRING(',sX,' ',sY,',',eX,' ',eY,')')))
FROM R 
WHERE i=@i

resim açıklamasını buraya girin resim açıklamasını buraya girin


T-SQL ile böyle bir sihirbazın elde edilebileceği hakkında hiçbir fikrim yoktu!
Harry Mustoe-Playfair

9

LOGO: 95

to w:c ifelse:c=1[fd 2 lt 60][w:c-1 w:c-1 lt 180 w:c-1 w:c-1]end
to k:c repeat 3[w:c rt 180]end

Fonksiyonu ktek seviye parametresiyle tanımlar .

Düzenle

Bu çevrimiçi editörde http://www.calormen.com/jslogo/k readword giriş için komut istemi ekleyebilirsiniz , ancak bir nedenle bu komut standart kısaltmayı desteklemez rw.

Aşağıdaki 102 karakterlik çözüm, soruda belirtildiği gibi standart girişle USBLogo'da çalışır. Ancak UCBLogo'nun bazı garip ayrıştırıcıları olduğundan kodun küçük değişikliklere ihtiyacı vardı. Bu gerektirir tove enddaha önce ayrı çizgiler ve uzayda olması :gereken ama diğer taraftan bir :isteğe bağlıdır.

to w c
ifelse c=1[fd 2 lt 60][w c-1 w c-1 lt 180 w c-1 w c-1]
end
to k c
repeat 3[w c rt 180]
end
k rw

LOGO'yu nasıl çalıştırıyorsunuz?
Beta Çürümesi

@BetaDecay Bunu kullandım: logo.twentygototen.org ama bu bulduğum ilk şeydi : calormen.com/jslogo USBLogo
nutki

8

BBC TEMEL, 179

REV 1

INPUTn
z=FNt(500,470,0,0,3^n/9)END
DEFFNt(x,y,i,j,a)
LINEx-36*a,y-21*a,x+36*a,y-a*21PLOT85,x,y+a*42IFa FORj=-1TO1FORi=-1TO1z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3)NEXTNEXT
=0

Daha önce olduğu gibi, ancak siyah ve beyaz, ungolfed (ancak aerodinamik) ve golf versiyonlarında. Bu şekilde yapılmasına rağmen, kazanan değil, n = 1 için özel bir tedaviye ihtiyaç duymaz.

  INPUTn
        REM call function and throw return value away to z
  z=FNt(500,470,0,0,3^n/9)
  END

        REM x,y=centre of triangle. a=scale.
        REM loop variables i,j are only passed in order to make them local, not global.
  DEFFNt(x,y,i,j,a)

        REM first draw a line at the bottom of the triangle. PLOT85 then draws a filled triangle,
        REM using the specified point (top of the triangle) and the last two points visited (those used to draw the line.)
  LINEx-36*a,y-21*a,x+36*a,y-21*a
  PLOT85,x,y+42*a

        REM if the absolute magnitude of a is sufficient to be truthy, recurse to the next level.
        REM j determines if the triangle will be upright, inverted or (if j=0) infinitely small.
        REM i loops through the three triangles of each orientation, from left to right.
  IFa FORj=-1TO1 FORi=-1TO1:z=FNt(x+24*a*i,y+j*14*a*(i*i*3-2),i,j,-j*a/3):NEXT:NEXT

        REM return 0
  =0

resim açıklamasını buraya girin

REV 0

OP'nin @xnor'a verdiği cevaba göre, kar taneleri ile dolu tamam. Bu cevap xnor'ın yorumundan ilham aldı. Renkler sadece eğlenmek ve nasıl inşa edildiğini göstermek içindir. Bir üçgen (bu durumda macenta) alın ve tabanın 6 üçgeninin 1 / 3'ü ile fazla çizin.

  INPUTn
  z=FNt(500,470,n,1,0,0)
  END

  DEFFNt(x,y,n,o,i,a)
  a=3^n/22
  GCOLn
  MOVEx-36*a,y-o*21*a
  MOVEx+36*a,y-o*21*a
  PLOT85,x,y+o*42*a
  IFn>1FORi=-1TO1:z=FNt(x+24*a*i,y+14*a*(i*i*3-2),n-1,-1,i,a):z=FNt(x+24*a*i,y-14*a*(i*i*3-2),n-1,1,i,a)NEXT
  =0

resim açıklamasını buraya girin


1
7 tanesi bir araya gelmiş gibi görünüyor.

@ hosch250 Gerçekten, silueti bir Koch kar tanesi olan yeni bir fraktalı "icat etmişim" gibi görünüyor ve macenta parçayı silerseniz 6 küçük Koch kar tanesi kaldı. Golfçü versiyon sadece düz bir siyah siluet olacak, ama ben de bu görüntüyü bırakacağım.
Level River St

BBC Basic veya BBC BASIC yazıyor musunuz? İkincisi için gidiyorum ama doğru olup olmadığını bilmiyorum ...
Beta Çürümesi

2
@BetaDecay BASIC, Yeni Başlayanlar İçin Çok Amaçlı Standart / Sembolik Talimat Kodunun bir arka metnidir. "Standart" bit çok değişken olduğu için tartışmalıdır. en.wikipedia.org/wiki/BASIC . BASIC'in çoğu çeşidi büyük harfli sürümü tercih eder, ancak Wikipedia sayfasına göre Visual Basic küçük harf tercih eder. Sanırım sevk edilen BBC BASIC büyük harfti. Bu sürümü bbcbasic.co.uk/bbcwin/bbcwin.html adresinde kullanıyorum . Web sitesinde ve IDE'de büyük harf, bu yüzden büyük harf sürümünün daha doğru olduğunu söyleyebilirim. Ama bunun çok önemli olduğunu düşünmüyorum.
Level River St

Ahh tamam, büyük versiyonu ile devam edeceğim
Beta Çürümesi

8

Mathematica - 177

r[x_, y_] := Sequence[x, RotationTransform[π/3, x]@y, y]
Graphics@Polygon@Nest[
 ReplaceList[#, {___, x_, y_, ___}  Sequence[x,r[2 x/3 + y/3, 2 y/3 + x/3], y]
  ] &, {{0, 0}, {.5, √3/2}, {1, 0}, {0, 0}}, Input[]]

resim açıklamasını buraya girin

Orta parçanın açısını değiştiren bonus klip

resim açıklamasını buraya girin


6

Python 3-139

Kaplumbağa grafik kütüphanesini kullanır.

from turtle import*
b=int(input())
a=eval(("FR"*3)+".replace('F','FLFRFLF')"*~-b)
for j in a:fd(9/b*("G">j));rt(60*(2-3*("Q">j))*("K"<j))])

Güzel. En fazla iki kod satırı ile şekil bulma dize tabanlı yaklaşımınızı seviyorum! Ama kontrol edemez "G">j, "Q"<jve kullanımı fd(9/b)3 bayt kaydetmek için? Dahası, ififadelerin, örneğin, ("G">j)argümanla çarpılmasını önleyebilir 9/bve hepsini bir satırın arkasına koyabilirsiniz for. Ah! Sonra hatta birleştirebilirsiniz rtve ltkullanma120*(...)-60*(...)
Falko

Bu, Koch kar tanesi girişini + 1 oluşturuyor gibi görünüyor. 1 girişi sadece yukarıdaki resimde gösterildiği gibi bir üçgen olmalıdır.

@Falko Tüm bu yardımlar için teşekkürler!
Beta Çürümesi

@ hosch250 Düzenlendi
Beta

Şimdi hiçbir şey çizmiyor ve 1 girişi 0 hatasıyla bir bölüm oluşturuyor.

4

Python 3, 117 bayt

from turtle import*
ht();n=int(input())-1
for c in eval("'101'.join("*n+"'0'*4"+")"*n):rt(60+180*(c<'1'));fd(99/3**n)

Yöntem:

  • Çözüm Python'un kaplumbağa grafiklerini kullanıyor.
  • n dır-dir input - 1
  • Dizeden başlayarak 0000, her bir karakterine 101 ntekrarlama hilesi ile tekrarlama ile katılırız (bunun için @xnor'a teşekkürler).
  • Son dizgideki her karakter için, karakter değerine ( 1veya 0) dayalı olarak 60 derece sağa veya 120 derece sola dönüyoruz ve sonra 99/3^nherkes için benzer bir boyutu garanti eden bir uzunluk ( ) ilerliyoruz n.
  • 0Dizedeki son işe yaramaz olacaktır, ancak ilk 0çizdiği çizgiyi yeniden çizer.

Örnek çıktı input = 3:

koch


2

R: 240 175

Çünkü kafamı R'nin etrafında döndürmeye çalışıyorum, işte başka bir versiyon. Bunu yapmanın çok daha iyi yolları vardır ve işaretçiler almaktan mutluluk duyuyorum. Yaptığım şey çok kıvrımlı görünüyor.

n=readline();d=c(0,-120,-240);c=1;while(c<n){c=c+1;e=c();for(i in 1:length(d)){e=c(e,d[i],d[i]+60,d[i]-60,d[i])};d=e};f=pi/180;plot(cumsum(sin(d*f)),cumsum(cos(d*f)),type="l")

resim açıklamasını buraya girin


2

Bilge fwom youw gwave ...

Bunu TURT kullanarak Befunge-98'de uygulamayı denemek isteyeceğimi biliyordum, ama nasıl gideceğimi bulamadım ve birkaç ay oturdum. Şimdi, sadece son zamanlarda, kendini değiştirmeden yapmanın bir yolunu buldum! Ve bu yüzden...

TURT parmak iziyle Befunge-98, 103

;v;"TRUT"4(02-&:0\:0\1P>:3+:4`!*;
>j$;space makes me cry;^
^>1-:01-\:0\:01-\:0
0>I@
^>6a*L
^>ca*R
^>fF

Öncelikle bazı uygulama ayrıntılarını önleyelim:

  • Bunu TURT (kaplumbağa grafik parmak izi) uygulaması görüntüyü bir SVG dosyasına "yazdır" yapan CCBI 2.1 kullanarak test ettim I. Bunu --turt-line=PATHCCBI'de komut argümanı olmadan çalıştırırsanız , varsayılan olarak CCBI_TURT.svg adlı bir dosya olarak ortaya çıkar. Bulabildiğim mevcut Funge tercümanları ile " kartanenin grafiksel bir sunumunu ekrana yazdırmak" için en yakın şey budur. Belki bir gün kaplumbağa için grafik bir ekrana sahip daha iyi bir tercüman olacak, ama şimdilik ...
  • CCBI'nin asmadan çalıştırabilmesi için sonunda bir satırsonu olmalıdır (bu karakter sayısına dahildir). Doğruyu biliyorum?

Temel olarak, bu, yığını bir çeşit geçici L-sistemi olarak kullanarak ve anında genişleterek çalışır. Her geçişte, yığındaki en üst sayı:

  • -2, sonra yazdırır ve durur;
  • -1, kaplumbağa saat yönünün tersine 60 derece döner;
  • 0, saat yönünde 120 derece döner;
  • 1, ileri doğru hareket eder (burada 15 piksel ile, ancak fson satırda değiştirerek değiştirebilirsiniz );
  • bazı n sayısı 2 veya daha büyükse, o zaman yığına genişletilir n-1, -1, n-1, 0, n-1, -1, n-1.

Çünkü n = 10bu işlem çok uzun zaman alır (sistemimde birkaç dakika) ve ortaya çıkan SVG'nin boyutu ~ 10MB'dir ve tarayıcıda görüntülendiğinde görünmezdir çünkü TURT kullanarak fırçanın boyutunu ayarlayamazsınız. Doğru eklentilere sahipseniz IrfanView düzgün çalışıyor gibi görünüyor. Ben SVG aşina değilim, bu yüzden (özellikle gerçekten büyük olduğunda) bu dosyaları görüntülemek için tercih edilen yöntemin ne olduğunu bilmiyorum.

Hey, en azından işe yarıyor - Befunge göz önüne alındığında, kendi başına minnettar olmak için bir şey.


1

Python 2, 127 bayt

from turtle import *
def L(l,d=input()-1):
 for x in[1,-2,1,0]:[L(l,d-1),rt(60*x)] if d>0 else fd(l)
for i in'lol':lt(120);L(9)

1
Burada 50.000'inci gönderi için teşekkürler.
Andrew
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.