Çizim 3B Ağlar - Arşimet Katıları


12

Kesip katlandığında kağıt veya karttan 3d şekiller oluşturmanıza izin veren 3d ağlar için bir zayıflığım var. Görev basit, 13 Arşimet katıları için ağlar çizen mümkün olan en kısa programı yazdı. Çıktı, herhangi bir mantıklı biçimde (png, jpg) bir resim dosyası olmalıdır.

On üç şekil de http://en.wikipedia.org/wiki/Archimedean_solid adresinde ve oradan alınan aşağıdaki tabloda açıklanmıştır .

resim açıklamasını buraya girin

Girdi: 1 ile 13 arasında bir tam sayı. Şekillerin yukarıdaki tabloda olduğu gibi numaralandırıldığını varsayalım, böylece "kesilmiş tetrahedron" 1 numara ve "snub dodecahedron" 13 numara olur.

Çıktı: Bu şekle ilişkin ağı içeren bir görüntü dosyası. Sadece iç çizgileri içeren anahat tamam. Renklerle doldurmaya gerek yok

Beğendiğiniz herhangi bir programlama dilini ve özellikle bu yarışma için hazırlanmamış herhangi bir kütüphaneyi kullanabilirsiniz. Ancak her ikisi de çevrimiçi olarak (her iki anlamda) serbestçe kullanılabilir olmalıdır.

Tam bir hafta içinde en az karakter içeren cevabı kabul edeceğim. Yanıtlar her geldiklerinde kabul edilecektir.

(Hayır) Henüz kazanan. Ne yazık ki geçerli bir giriş yok. Belki çok zor?


Belki zaman sınırını tamamen ortadan kaldırırsınız? Ya birileri bundan bir yıl sonra bulursa. Denememelerini ister misin? ... Önce Platoniği yapmak, beklemek, sonra zor olanı yapmak daha iyi olabilirdi. Faizi bölmüş olabilirsiniz. Şahsen benim için (bunların hepsi ekstrapolasyon), iki benzer olanı gördüğümde, ondan çekildim, ikisine de gerçekten bakacak ve her ikisini de nasıl çözeceğimizi planlayacak zamanım olmadığını hissettim. Ve bunu başka bir şekilde yapmak istemem .... Öte yandan, buradaki diğerleri Part-2 zorluklarında zorluk çekti. Minsky Kayıt Makinesi'ne bakınız. Belki sen değilsin.
luser droog

@luserdroog Teşekkürler. Soru düzenlendi. Belki de ilgili soruya cevabı e-postayla seven birçok kişinin e-postayla gönderdiğimi eklemeliyim! FWIW.
felipa

Yapmanın zor olduğunu düşünmüyorum , ancak golf oynamak için birkaç saat düşünmek ve deney yapmak gerekiyor çünkü her çokyüzlü için birçok olası ağ var ve eşit derecede iyi sıkıştırılmıyorlar.
Peter Taylor

Yanıtlar:


9

Java, 1552

import java.awt.*;import java.awt.image.*;import java.io.*;import javax.imageio.*;class
A{public static void main(String[]x)throws
Exception{String[]a={"33623368356:356;66","33413341334535463547354735473444","33823382338:3586338>358>358>358?88","66456:466:466845684668466766","334144453546354635474746464646464647354634463446344744","88456:466:466:4668458<468<468<468:456846684668466788","33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444","33513351335233593554335433593554335935543359355433593559355835593559355935593455","33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::","66566:576:57696869576969586969586:586969576969586857685868586766","334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755","::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::","333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};BufferedImage
m=new BufferedImage(1300,1300,1);Graphics2D g=m.createGraphics();g.translate(500,500);String
s=a[Integer.valueOf(x[0])-1];int f=1,i=0,n,t;while(i<s.length()){n=s.charAt(i++)-48;t=s.charAt(i++);while(t-->48){g.drawLine(0,0,20,0);g.translate(20,0);g.rotate(f*Math.PI*2/n);}f=-f;}ImageIO.write(m,"png",new File("o.png"));}}

Ungolfed:

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class A {
    static int f = 1;
    static Graphics2D g;

    static void fixtrans() {
        double[] m = new double[6];
        g.getTransform().getMatrix(m);
        for (int i = 0; i < 6; ++i) {
            if (Math.abs(m[i] - Math.round(m[i])) < 1e-5) {
                m[i] = Math.round(m[i]);
            }
        }
        g.setTransform(new AffineTransform(m));
    }

    static void d(String s) {
        for (int i = 0; i < s.length();) {
            int n = s.charAt(i++) - '0';
            int t = s.charAt(i++) - '0';
            for (int j = 0; j < t; ++j) {
                g.drawLine(0, 0, 20, 0);
                g.translate(20, 0);
                g.rotate(f * Math.PI * 2 / n);
                fixtrans(); // optional, straightens some lines
            }
            f = -f;
        }
    }

    public static void main(String[] args) throws Exception {
        String[] a = {
                "33623368356:356;66",
                "33413341334535463547354735473444",
                "33823382338:3586338>358>358>358?88",
                "66456:466:466845684668466766",
                "334144453546354635474746464646464647354634463446344744",
                "88456:466:466:4668458<468<468<468:456846684668466788",
                "33343535353231333535313133353447353434353534313133353447353545343535313133353447353545343444",
                "33513351335233593554335433593554335935543359355433593559355835593559355935593455",
                "33:233:233:433:B35:833:833:B35:833:B35:833:B35:833:B35:B35:833:B35:B35:B35:B35:C::",
                "66566:576:57696869576969586969586:586969576969586857685868586766",
                "334155453546354635463547594658465846584658473546354634463546344635463446354634463547584657465746574657473546344634463446344755",
                "::456:466:466:466:466845:@46:@46:@46:@46:>4568466:4668466:4668466:4668466:4668466845:>46:>46:>46:>46:<45684668466846684667::",
// bad          "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353531333459343434355935323335345935323335345935323335345935323335345935353455"
                "333531333434343132333434353531313335343434323232323334343435353231333133343556343434313233323335345935353532313331313132333233353535343557343133343556343434355934353535593432333234355935323335345935323335345935323335345935343459313334353455"};

        BufferedImage img = new BufferedImage(1300, 1300, BufferedImage.TYPE_INT_RGB);
        g = img.createGraphics();
        g.translate(500, 500);
        d(a[Integer.parseInt(args[0]) - 1]);
        String f = args[0] + ".png";
        ImageIO.write(img, "png", new File(f));
    }
}

Sonuçlar (kırpılmış, olumsuzlanmış, birleştirilmiş ve ölçeklendirilmiş):

Sonuçlar

Şekiller oldukça sıradışı :) ama söyleyebildiğim kadar doğru (herhangi bir hata bulursanız bana bildirin). Bir DFS'de yüz grafiği ve kesme döngüleri yapılarak (ayrı bir programda) oluşturuldu.

Bu python ve kaplumbağa kullanarak çok daha golf olabilir eminim.

Düzenleme: ayy, son dava biraz kesişen oldu. Kodu (elle) düzelttim, işte güncellenen görüntü:

13 düzeltildi


Elle düzeltme, kodun yine de kendi kendine bir kesişim çıkardığı anlamına mı geliyor? Bunu geçerli bir cevap olmaktan ayıran tek şey bu mu?
trichoplax

@githubphagocyte Hala kendi kendine bir kavşak çıkarsa, bir düzeltme olmazdı. Bu geçerli bir cevap.
aditsu çıkmak SE çünkü EVIL

Bu işaretlendi çünkü yardım merkezimizdeki kurallardan birini ihlal ediyor : Zorluklara yönelik tüm çözümler [...] kullanımdaki kazanma kriterleri için ciddi bir yarışmacı olmalıdır. Örneğin, bir kod golf yarışmasına giriş golf oynamak zorundadır.
Dennis

@Dennis şimdi daha iyi, bay. polis? : p
aditsu SE KÖTÜ çünkü çıkın


6

Mathematica

Rekabet dışı, özgür bir dil değil

f[n_] := PolyhedronData[Sort[PolyhedronData["Archimedean", 
                                             {"FaceCount", "StandardName"}]][[n, 2]],  "NetImage"]

Kullanımı:

f /@ Range@13

Mathematica grafikleri

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.