Dibujo de redes 3d - sólidos de Archimedean

12

Tengo una debilidad por las redes 3D que, cuando se recortan y se pliegan, le permiten hacer formas 3D de papel o tarjeta. La tarea es simple, escrita el programa más corto posible que dibuja redes para los 13 sólidos de Archimedean. El resultado debe ser un archivo de imagen en cualquier formato sensible (png, jpg).

Las trece formas se describen en http://en.wikipedia.org/wiki/Archimedean_solid y en la siguiente tabla tomada desde allí.

ingrese la descripción de la imagen aquí

Entrada: Un número entero del 1 al 13. Suponga que las formas están numeradas exactamente como en la tabla anterior, de modo que el "tetraedro truncado" es el número 1 y el "dodecaedro de desaire" es el número 13.

Salida: un archivo de imagen que contiene la red para esa forma. Solo el esquema que incluye las líneas internas está bien. No es necesario rellenarlo con colores.

Puedes usar cualquier lenguaje de programación que te guste, así como cualquier biblioteca que no haya sido creada especialmente para esta competencia. Sin embargo, ambos deberían estar disponibles gratuitamente (en ambos sentidos) en línea.

Aceptaré la respuesta con el menor número de caracteres en exactamente una semana. Se aceptarán respuestas cuando lleguen.

(No) Ganador todavía. Lamentablemente no hay participantes válidos. Tal vez es demasiado difícil?

felipa
fuente
¿Quizás eliminar el límite de tiempo por completo? ¿Qué pasa si alguien encuentra esto dentro de un año? ¿Quieres que no lo intenten? ... Podría haber sido mejor hacer el platónico primero, espera, luego el difícil. Es posible que haya dividido el interés. Para mí personalmente (todo esto es una extrapolación), cuando vi dos similares, me retiré de allí, sintiendo que no tenía tiempo para mirar realmente a ambos y planear cómo resolverlos. Y no quisiera hacerlo de otra manera ... Por otro lado, otros aquí han tenido dificultades con los desafíos de la Parte 2. Vea los Minsky Register Machine. Tal vez no eres tú.
luser droog
@luserdroog Gracias. Pregunta editada. ¡Tal vez debería agregar que he enviado por correo electrónico la respuesta a la pregunta relacionada con muchas personas que lo aman! FWIW
felipa
No creo que sea difícil de hacer , pero para jugar al golf requiere varias horas de reflexión y experimentación porque hay muchas redes posibles para cada poliedro y no se comprimirán igual de bien.
Peter Taylor

Respuestas:

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

Sin golf:

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

Resultados (recortado, negado, unido y escalado):

resultados

Las formas son bastante inusuales :) pero correctas hasta donde puedo decir (avíseme si encuentra algún error). Se generaron (en un programa separado) construyendo el gráfico de la cara y cortando ciclos en un DFS.

Estoy seguro de que esto se puede jugar mucho más, por ejemplo, con pitón y tortuga.

Editar: oops, el último caso fue un poco auto-intersectado. Arreglé el código (a mano), aquí está la imagen actualizada:

13 corregido

aditsu renunció porque SE es MALO
fuente
¿La corrección a mano significa que el código aún genera una auto intersección? ¿Es eso lo único que separa esto de ser una respuesta válida?
trichoplax
@githubphagocyte Si todavía produjera una auto-intersección, no sería una solución. Esta es una respuesta válida.
Aditsu se retiró porque SE es MAL
Esto se ha marcado porque viola una de las reglas de nuestro centro de ayuda : todas las soluciones a los desafíos deben ser un [...] competidor serio para los criterios ganadores en uso. Por ejemplo, una entrada a un concurso de golf de código debe ser golfizada.
Dennis
@Dennis mejor ahora, señor. ¿policía? : p
aditsu renunció porque SE es MAL
6

Mathematica

Fuera de competencia, no es un idioma libre

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

Uso:

f /@ Range@13

Gráficos de Mathematica

Dr. belisario
fuente