Zeichnen von 3d-Netzen - archimedische Feststoffe

12

Ich habe eine Schwäche für 3D-Netze, die es Ihnen ermöglichen, 3D-Formen aus Papier oder Pappe herzustellen, wenn sie ausgeschnitten und gefaltet werden. Die Aufgabe ist einfach: Schreiben Sie das kürzeste Programm, mit dem Sie Netze für die 13 archimedischen Körper zeichnen können. Die Ausgabe sollte eine Bilddatei in jedem vernünftigen Format (PNG, JPG) sein.

Alle dreizehn Formen sind unter http://en.wikipedia.org/wiki/Archimedean_solid beschrieben und in der folgenden Tabelle aufgeführt.

Bildbeschreibung hier eingeben

Eingabe: Eine ganze Zahl von 1 bis 13. Angenommen, die Formen sind genau wie in der obigen Tabelle nummeriert, sodass der "abgeschnittene Tetraeder" die Nummer 1 und der "Snub-Dodekaeder" die Nummer 13 ist.

Ausgabe: Eine Bilddatei, die das Netz für diese Form enthält. Nur die Gliederung einschließlich der internen Leitungen ist in Ordnung. Es ist nicht notwendig, es mit Farben auszufüllen

Sie können jede Programmiersprache verwenden, die Sie mögen, sowie jede Bibliothek, die nicht speziell für diesen Wettbewerb erstellt wurde. Beide sollten jedoch (in beiden Sinnen) online frei verfügbar sein.

Ich werde die Antwort mit der geringsten Anzahl von Zeichen in genau einer Woche annehmen. Antworten werden immer dann entgegengenommen, wenn sie kommen.

(Nein) Gewinner noch. Leider keine gültigen Teilnehmer. Vielleicht ist es zu schwer?

felipa
quelle
Vielleicht die Frist ganz abschaffen? Was ist, wenn jemand dies in einem Jahr findet? Wollen Sie, dass sie es nicht versuchen? ... Wäre es besser gewesen, zuerst die platonische, dann die harte zu machen. Möglicherweise haben Sie das Interesse geteilt. Für mich persönlich (all das ist Extrapolation), als ich zwei ähnliche sah, zog ich mich irgendwie zurück, weil ich das Gefühl hatte, nicht die Zeit zu haben, mir beide wirklich anzuschauen und zu planen, wie man beide löst. Und ich würde es auch nicht anders machen wollen ... Andererseits hatten andere hier Probleme mit Teil-2-Herausforderungen. Siehe die Minsky Register Machine. Vielleicht bist du es nicht.
Luser Droog
@ Lauserdroog Danke. Frage bearbeitet. Ich sollte vielleicht hinzufügen, dass ich die Antwort auf die verwandte Frage um viele Leute, die es lieben, per E-Mail geschickt habe! FWIW.
Felipa
Ich denke, es ist nicht schwer zu tun , aber zum Golfen sind mehrere Stunden des Denkens und Experimentierens erforderlich, da es für jedes Polyeder viele mögliche Netze gibt, die sich nicht gleich gut komprimieren lassen.
Peter Taylor

Antworten:

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

Ergebnisse (beschnitten, negiert, verbunden und skaliert):

Ergebnisse

Die Formen sind ziemlich ungewöhnlich :) aber soweit ich das beurteilen kann, korrekt (lass es mich wissen, wenn du Fehler findest). Sie wurden (in einem separaten Programm) durch Erstellen des Flächendiagramms und der Schneidezyklen in einem DFS generiert.

Ich bin mir sicher, dass man mit Python und Turtle viel mehr Golf spielen kann.

Edit: oops, der letzte Fall hat sich ein bisschen selbst geschnitten. Ich habe den Code (von Hand) korrigiert, hier ist das aktualisierte Bild:

13 korrigiert

aditsu kündigen, weil SE böse ist
quelle
Bedeutet die manuelle Korrektur, dass der Code weiterhin eine Selbstüberschneidung ausgibt? Ist das das einzige, was dies von einer gültigen Antwort unterscheidet?
Trichoplax
@githubphagocyte Wenn es immer noch eine Selbstüberschneidung ausgeben würde, wäre es kein Fix. Dies ist eine gültige Antwort.
aditsu kündigte, weil SE ist EVIL
Dies wurde markiert, weil es gegen eine der Regeln in unserer Hilfe verstößt : Alle Lösungen für Herausforderungen sollten [...] ein ernstzunehmender Anwärter auf die verwendeten Gewinnkriterien sein. Beispielsweise muss eine Teilnahme an einem Codegolfwettbewerb golfen werden.
Dennis
@ Tennis jetzt besser, Herr. Polizist? : p
aditsu hat gekündigt, weil SE EVIL am
6

Mathematica

Außer Konkurrenz, keine freie Sprache

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

Verwendung:

f /@ Range@13

Mathematica-Grafiken

Dr. belisarius
quelle