Dessin de filets 3D - solides d'Archimède

12

J'ai un faible pour les filets 3D qui, une fois découpés et pliés, vous permettent de créer des formes 3D en papier ou en carte. La tâche est simple, écrit le programme le plus court possible qui dessine des filets pour les 13 solides d'Archimède. La sortie doit être un fichier image dans n'importe quel format sensible (png, jpg).

Les treize formes sont décrites sur http://en.wikipedia.org/wiki/Archimedean_solid et dans le tableau ci-dessous.

entrez la description de l'image ici

Entrée: Un entier de 1 à 13. Supposons que les formes sont numérotées exactement comme dans le tableau ci-dessus afin que le "tétraèdre tronqué" soit le numéro 1 et le "dodécaèdre tronqué" le numéro 13.

Sortie: un fichier image contenant le filet pour cette forme. Seul le contour, y compris les lignes internes, est OK. Il n'est pas nécessaire de le remplir de couleurs

Vous pouvez utiliser n'importe quel langage de programmation que vous aimez ainsi que n'importe quelle bibliothèque qui n'a pas été spécialement conçue pour ce concours. Les deux devraient cependant être disponibles gratuitement (dans les deux sens) en ligne.

J'accepterai la réponse avec le plus petit nombre de caractères dans exactement une semaine. Les réponses seront acceptées dès qu'elles arriveront.

(Non) Gagnant pour le moment. Malheureusement, aucun participant valide. C'est peut-être trop dur?

Felipa
la source
Peut-être supprimer complètement le délai? Et si quelqu'un le trouve dans un an. Voulez-vous qu'ils n'essayent pas? ... Il aurait peut-être été préférable de faire d'abord le platonicien, attendez, puis le dur. Vous avez peut-être divisé l'intérêt. Pour moi personnellement (tout cela est une extrapolation), quand j'en ai vu deux similaires, je m'en suis en quelque sorte retiré, sentant que je n'avais pas le temps de vraiment regarder les deux et de planifier comment les résoudre. Et je ne voudrais pas le faire autrement ... D'un autre côté, d'autres ici ont eu des difficultés avec les défis de la partie 2. Voir ceux de Minsky Register Machine. Ce n'est peut-être pas toi.
luser droog
@luserdroog Merci. Question modifiée. Je devrais peut-être ajouter que j'ai envoyé la réponse à la question connexe par courrier électronique auprès de nombreuses personnes qui l'adorent! FWIW.
felipa
Je ne pense pas que ce soit difficile à faire , mais pour jouer au golf, cela nécessite plusieurs heures de réflexion et d'expérimentation car il existe de nombreux filets possibles pour chaque polyèdre et ils ne se comprimeront pas aussi bien.
Peter Taylor

Réponses:

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

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

Résultats (rognés, annulés, joints et mis à l'échelle):

résultats

Les formes sont assez inhabituelles :) mais correctes pour autant que je sache (faites le moi savoir si vous trouvez des erreurs). Ils ont été générés (dans un programme séparé) en construisant le graphique de face et les cycles de coupe dans un DFS.

Je suis sûr que cela peut être joué beaucoup plus en utilisant par exemple le python et la tortue.

Edit: oups, le dernier cas se croisait un peu. J'ai corrigé le code (à la main), voici l'image mise à jour:

13 corrigé

aditsu quitte parce que SE est MAL
la source
La correction à la main signifie-t-elle que le code génère toujours une auto-intersection? Est-ce la seule chose qui sépare cela d'une réponse valable?
trichoplax
@githubphagocyte S'il émettait toujours une auto-intersection, ce ne serait pas une solution. Ceci est une réponse valable.
aditsu quitte car SE est EVIL
Cela a été signalé parce qu'il viole l'une des règles de notre centre d'aide : toutes les solutions aux défis devraient [...] être un candidat sérieux pour les critères gagnants utilisés. Par exemple, une entrée à un concours de golf à code doit être jouée.
Dennis
@Dennis mieux maintenant, mr. policier? : p
aditsu quitte car SE est EVIL
Bien mieux.
Dennis
6

Mathematica

Hors compétition, pas une langue libre

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

Usage:

f /@ Range@13

Graphiques Mathematica

Dr. belisarius
la source