การวาดอวน 3d - ของแข็งอาร์คิมีดีน


12

ฉันมีจุดอ่อนสำหรับมุ้ง 3 มิติซึ่งเมื่อตัดออกและพับให้คุณสร้างรูปทรง 3 มิติจากกระดาษหรือการ์ด งานง่ายเขียนโปรแกรมที่สั้นที่สุดที่คุณสามารถวาดอวนสำหรับของแข็ง 13 อาร์คิมีดีน เอาต์พุตควรเป็นไฟล์รูปภาพในรูปแบบที่เหมาะสม (png, jpg)

รูปร่างทั้งสิบสามมีการอธิบายที่http://en.wikipedia.org/wiki/Archimedean_solidและในตารางต่อไปนี้นำมาจากที่นั่น

ป้อนคำอธิบายรูปภาพที่นี่

อินพุต:จำนวนเต็มตั้งแต่ 1 ถึง 13 สมมติว่ารูปร่างมีหมายเลขตามที่แสดงในตารางด้านบนเพื่อให้ "tetrahedron ที่ถูกตัดทอน" คือหมายเลข 1 และ "snub dodecahedron" คือหมายเลข 13

เอาท์พุท:ไฟล์ภาพที่มีตาข่ายสำหรับรูปร่างนั้น เพียงแค่โครงร่างรวมถึงเส้นภายในก็โอเค ไม่จำเป็นต้องเติมสีด้วย

คุณสามารถใช้ภาษาการเขียนโปรแกรมใด ๆ ที่คุณชอบเช่นเดียวกับห้องสมุดใด ๆ ที่ไม่ได้ทำขึ้นเป็นพิเศษสำหรับการแข่งขัน ทั้งสองควรพร้อมใช้งานได้อย่างอิสระ (ในความรู้สึกทั้งสอง) ออนไลน์

ฉันจะยอมรับคำตอบด้วยจำนวนตัวอักษรที่น้อยที่สุดในเวลาหนึ่งสัปดาห์ คำตอบจะได้รับการยอมรับเมื่อใดก็ตามที่พวกเขามา

(ยังไม่มี) ผู้ชนะ น่าเศร้าที่ไม่มีผู้เข้าร่วมที่ถูกต้อง บางทีมันยากเกินไป?


อาจจะไปด้วยขีด จำกัด เวลาทั้งหมดหรือไม่ เกิดอะไรขึ้นถ้าใครบางคนค้นพบสิ่งนี้ในอีกหนึ่งปีนับจากนี้ คุณต้องการให้พวกเขาไม่ลองหรือไม่ ... อาจเป็นการดีกว่าที่จะทำเพลโตโซนิคก่อนรอแล้วก็ยาก คุณอาจแบ่งดอกเบี้ย สำหรับฉันเป็นการส่วนตัว (ทั้งหมดนี้เป็นการคาดการณ์) เมื่อฉันเห็นสองสิ่งที่คล้ายกันฉันถอนตัวออกจากมันรู้สึกว่าฉันไม่มีเวลาที่จะดูทั้งสองและวางแผนวิธีแก้ปัญหาทั้งสองอย่างแท้จริง และฉันก็ไม่อยากจะทำอย่างอื่น .... ในทางกลับกันคนอื่น ๆ ที่นี่มีปัญหากับการท้าทายในส่วนที่ 2 ดูเครื่อง Minsky Register อาจไม่ใช่คุณ
luser droog

@luserdroog ขอบคุณ แก้ไขคำถามแล้ว ฉันควรจะเพิ่มว่าฉันได้ส่งคำตอบไปยังคำถามที่เกี่ยวข้องเกี่ยวกับผู้คนจำนวนมากที่รักมัน! FWIW
felipa

ฉันไม่คิดว่ามันยากที่จะทำแต่การเล่นกอล์ฟต้องใช้เวลาคิดและทดสอบเป็นเวลาหลายชั่วโมงเพราะมีตาข่ายหลายรูปแบบที่เป็นไปได้สำหรับแต่ละโพลีเฮดตรอน
Peter Taylor

คำตอบ:


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

ผลลัพธ์ (ถูกตัด, negated, เข้าร่วมและปรับขนาด):

ผล

รูปร่างค่อนข้างผิดปกติ :) แต่แก้ไขให้ถูกต้องที่สุดเท่าที่ฉันจะบอกได้ พวกเขาถูกสร้างขึ้น (ในโปรแกรมแยกต่างหาก) โดยสร้างกราฟหน้าและรอบการตัดใน DFS

ฉันแน่ใจว่าสิ่งนี้สามารถเล่นกอล์ฟได้มากขึ้นโดยใช้เช่นงูหลามและเต่า

แก้ไข:อุ๊ปส์กรณีสุดท้ายคือการตัดกันตัวเองเล็กน้อย ฉันแก้ไขรหัส (ด้วยมือ) นี่คือภาพที่อัปเดต:

13 ถูกแก้ไข


การแก้ไขด้วยมือหมายความว่าโค้ดยังคงส่งผลให้เกิดการแยกด้วยตนเองหรือไม่? นั่นเป็นสิ่งเดียวที่แยกสิ่งนี้ออกจากการเป็นคำตอบที่ถูกต้องหรือไม่?
trichoplax

@githubphagocyte หากยังคงแสดงจุดตัดด้วยตนเองมันจะไม่แก้ไข นี่คือคำตอบที่ถูกต้อง
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

สิ่งนี้ได้รับการตั้งค่าสถานะเนื่องจากละเมิดกฎข้อหนึ่งในศูนย์ช่วยเหลือของเรา : การแก้ปัญหาทั้งหมดควรเป็น [... ] เป็นคู่แข่งที่ร้ายแรงสำหรับเกณฑ์การชนะที่ใช้งาน ตัวอย่างเช่นรายการการแข่งขันกอล์ฟรหัสจะต้องมีการตีกอล์ฟ
Dennis

@Dennis ดีกว่าตอนนี้นาย ตำรวจ? : p
aditsu ออกจากเพราะ SE นั้นชั่วร้าย


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.