लेगो गियर ट्रेन


13

कीथ रान्डेल द्वारा लेगो गियर अनुपात चुनौती से प्रेरित ।

मैं भी एक विशाल लेगो रोबोट बनाने की योजना बना रहा हूं, जो अंततः पहले से उल्लेखित प्रतियोगिता में अन्य रोबोटों को नष्ट करने में सक्षम होगा। * रोबोट के निर्माण की प्रक्रिया में, मैं कनेक्ट होने के लिए बहुत सारी गियर ट्रेनों का उपयोग करूंगा। रोबोट के विभिन्न भागों। मैं चाहता हूं कि आप मुझे सबसे छोटा प्रोग्राम लिखें, जो मुझे ऐसे जटिल काम के लिए आवश्यक जटिल गियर ट्रेनों के निर्माण में मदद करेगा। मैं, निश्चित रूप से, केवल 1, 2, 3 और 5 मनमानी-लेगो-इकाइयों के साथ गियर का उपयोग कर रहा हूं।

गियर ट्रेन के प्रत्येक गियर में 2 डी ग्रिड पर एक विशिष्ट पूर्णांक समन्वय होता है। पहला गियर (0,0) पर स्थित है और अंतिम गियर गैर-नकारात्मक निर्देशांक पर स्थित होगा। पहले और अंतिम गियर के स्थान और आकार को इनपुट के रूप में प्रदान किया जाएगा, आपके कार्यक्रम को यह बताना होगा कि गियर में क्या भरना है।

इसके अतिरिक्त, आपके कार्यक्रम को गियर ट्रेन में न्यूनतम संभव संख्या में गियर का उपयोग करना चाहिए । कम गियर / ट्रेन = अधिक ट्रेनें ** = विनाश का बड़ा और बेहतर रोबोट।

इनपुट में एक पंक्ति शामिल होगी:

X,Y,B,A

X और Y अंतिम गियर के निर्देशांक हैं। पहला गियर हमेशा (0,0) पर स्थित होता है। बी और ए क्रमशः अंतिम और प्रारंभिक गियर की त्रिज्या हैं। कुछ कठिनाई को जोड़ने के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि आउटपुट गियर सही दिशा में घूमता है। यदि ए और बी में एक ही संकेत है, तो आउटपुट गियर को उसी दिशा में घुमाने की जरूरत है, और एक विषम संख्या में गियर का उपयोग करना होगा। यदि उनके पास विपरीत संकेत हैं, तो एक समान संख्या में गियर का उपयोग करने की आवश्यकता है।

आउटपुट में एक्स लोकेशन, वाई लोकेशन और प्रत्येक अतिरिक्त गियर की रेडी, एक गियर प्रति लाइन की एक सूची होनी चाहिए। यदि कई न्यूनतम-गियर समाधान हैं, तो अपनी पसंद का केवल एक प्रिंट करें। आउटपुट में गियर का क्रम मायने नहीं रखता है।

उदाहरण (अधिक समतुल्य समाधान संभव हो सकते हैं):

in
4,0,1,1
out
2,0,1

in
7,7,-2,-2
out
4,3,3
OR
0,7,5
OR
the above reflected over y=x line

in
7,8,-1,2
out
7,0,5
7,6,1
OR
7,0,5
1,8,5

in
7,7,2,-2
out
4,-3,3
7,1,2
12,1,3
12,7,3
OR
any permutation of the above, or reflected over y=x line
Now you're thinking with gear trains!

यहां उपरोक्त उदाहरणों के समाधानों की कल्पना की गई है:

यहाँ छवि विवरण दर्ज करें

जहां तक ​​मुझे पता है, जब तक दो इनपुट गियर ओवरलैप या सीधे कनेक्ट नहीं होते हैं, तब तक कोई समस्या असंभव नहीं है। आपको इससे निपटना नहीं पड़ेगा।

यह कोड गोल्फ, सबसे छोटी उत्तर जीत है।


* भविष्य KOTH, कोई भी?

**चू चू!!


मेरे पास ऐसा होगा ताकि प्रारंभिक और अंतिम दोनों रेडी नेगेटिव हो सकें।
wizzwizz4

9
Phi के लेगो गियर ट्रेन चैलेंज में आपका स्वागत है। सैंडबॉक्स में 4 साल बाद, उम्मीद है कि यह वजन के लायक होगा।
एक स्पेगेटो

@ wizzwizz4 ने बदलाव किया।
PhiNotPi 16

क्या यह वास्तव में 4 साल के लिए सैंडबॉक्स में था?
R

@ रायरर 3 अधिक 1/3।
फीनोटपी

जवाबों:


2

सी #, 660 बाइट्स

using System.Linq;using System;class P{int p=1,x,y,r;P l;static void Main(){var Q="$&.$'7$(@$*R$'/$(8$)A'(A('A$+S$(0$)9'(9('9$*B$,T$*2$+;$,D$.V*,V,*V";var I=Console.ReadLine().Split(',').Select(int.Parse).ToList();int i=0,t,s=7,u,v,w,p=I[3]*I[2];for(var D=new[]{new P{r=Math.Abs(I[3]),l=new P{r=Math.Abs(I[2]),x=I[0],y=I[1],p=3}}}.ToList();i>=0;){P c=D[i++],l=c.l;for(;(l=l?.l)!=null&&(s=(t=c.x-l.x)*t+(t=c.y-l.y)*t-(t=c.r+l.r)*t)>0;);if(s==0&&l.p>2&p*c.p<0)for(i=-1;c.l.p<3;c=c.l)Console.WriteLine(c.x+","+c.y+","+c.r);for(t=0;s>0&t<66;t++)for(u=Q[t++]-36,v=Q[t++]-36,s=1;s++<5&Q[t]%9==c.r;w=u,u=v,v=-w,D.Add(new P{l=c,r=Q[t]/9-4,x=c.x+u,y=c.y+v,p=-c.p}));}}}

यह ऑनलाइन की कोशिश करो

ये बहुत मजेदार था !! पूरा कार्यक्रम, STDIN से इनपुट स्वीकार करता है, STDOUT को आउटपुट देता है। आउटपुट अंत से शुरू होने के क्रम में गियर है। उपयोग:

एक सरल चौड़ाई वाली पहली खोज करता है, जो एक सेकंड से भी कम समय में 4-गियर की समस्या को हल करती है। ब्रांचिंग फैक्टर वास्तव में इतना बड़ा नहीं है, इसलिए यह बहुत अधिक के लिए अच्छा होना चाहिए (वास्तव में इसका परीक्षण नहीं किया गया है)। अफसोस की बात है कि यह Linq का उपयोग करता है।

Q(एक IE स्ट्रिंग सब अनुमति गियर कनेक्शन की एक टेबल है r=3और एक से कनेक्ट r=1करता है, तो dx=4और dy=0) एक वृत्त का चतुर्थ भाग है, जो तब दूसरों को खोजने में घुमाया जाए। 3 बाइट्स के हर सेट है dx, dyएक कानूनी कनेक्शन के लिए, और त्रिज्या जानकारी। (एक ऑफसेट के रूप में चुनाव बहुत जानबूझकर किया गया था: यह एक बार के लिए अच्छा गुण के लिए एक एएससीआईआई चरित्र चुनने के लिए मज़ेदार था, बजाय लगाए एएससीआईआई पात्रों के लिए अच्छे गुणों को खोजने के लिए सख्त कोशिश करने के लिए।

मैं शायद इनपुट पढ़ने का एक बेहतर काम कर सकता हूं, लेकिन मेरे पास अभी तक कोई भाग्य नहीं है, कम से कम नहीं क्योंकि लिनेक को एक सूची की आवश्यकता के लिए भुगतान किया जाता है। मैं घुमाने के कोड से बहुत निराश हूं, मुझे ऐसा लगता है कि बहुत कम बाइट्स में ऐसा किया जा सकता है।

Qजनरेटर के साथ प्रारूपित और टिप्पणी कोड :

using System.Linq; // seems to pay today
using System;

class P
{
    static void GenQ()
    {
        int t, k = 0, m = 0;
        Func<P, P, int> C = (P c, P l) => (t = c.x - l.x) * t + (t = c.y - l.y) * t - (t = c.r + l.r) * t; // ==0 -> touching, <0 -> not touching, >0 -> overlap

        string str = "";

        string T(int i) => "" + (char)('$' + i); // $ is zero, '$' == 36, so we can mod and div by 9, and greater than " so we don't have to escape it

        foreach (int r in new[] { 1, 2, 3, 5 }) // at 0,0 (current gear)
            foreach (int s in new[] { 1, 2, 3, 5 }) // gear to place
                for (int i = 0; i <= r + s; i++) // x
                    for (int j = 1; j <= r + s; j++, m++) // y
                        if (C(new P { r = r }, new P { r = s, x = i, y = j }) == 0) // 
                        {
                            str += T(i) + T(j) + T(r + s * 9);
                            k++;
                        }

        System.Console.WriteLine("K : " + k);
        System.Console.WriteLine("M : " + m);
        System.Console.WriteLine(str);
        System.Console.ReadKey(true);
        return;
    }

    int p=1, // parity
        x, // x
        y, // y
        r; // radias (TODO: store radias^2 ?)
    P l; // previous in search list

    static void Main()
    {
        //GenQ();

        // '$' == 36 (4*9)
        // 3char blocks: x,y,r+9*s
        var Q="$&.$'7$(@$*R$'/$(8$)A'(A('A$+S$(0$)9'(9('9$*B$,T$*2$+;$,D$.V*,V,*V"; // quarter table

        // primative read ints
        var I=Console.ReadLine().Split(',').Select(int.Parse).ToList();

        int i=0, // position in Due
            t, // check differential cache, position in Q
            s=7, // check cache, rotation counter (>0)
            u, // rotation x
            v, // rotation y
            w, // rotation x cache
            p=I[3]*I[2]; // parity (>0 -> same, even ; <0 -> different, odd)

        // due (not point using a queue, the search space grows exponentially)
        for(var D=new[]{
                new P{r=Math.Abs(I[3]), // start (p==1)
                    l=new P{r=Math.Abs(I[2]),x=I[0],y=I[1],p=3} // terminal (detect with p==3)
                }}.ToList();
            i>=0;) // infinite number of configurations, no bounds, i is escape term
        {
            P c=D[i++], // current
                l=c.l; // check, initially the one before the previous (we know we are touching last already)

            // 'checks' c against l
            //Func<int>C=()=>(t=c.x-l.x)*t+(t=c.y-l.y)*t-(t=c.r+l.r)*t; // ==0 -> touching, >0 -> not touching, <0 -> overlap

            // check we arn't touching any before us (last thing we check is terminal)
            for(;(l=l?.l)!=null&& // for each before us (skipping the first one)
                (s=(t=c.x-l.x)*t+(t=c.y-l.y)*t-(t=c.r+l.r)*t)>0;); // check c against l and cache in s, ==0 -> touching, >0 -> not touching, <0 -> overlap

            if(s==0&& // touching last checked?
                l.p>2& // stopped on terminal?
                p*c.p<0) // correct parity? -> win
                for(i=-1; // escape
                    c.l.p<3;c=c.l) // for each that wasn't the first
                    Console.WriteLine(c.x+","+c.y+","+c.r);

            // enumerate possible additions, and queue them in due
            for(t=0;
                s>0& // not touching or overlapping anything (including terminal)
                t<66;t++) // 66 = Q.Length
                for(
                    u=Q[t++]-36, // '$'
                    v=Q[t++]-36,
                    s=1;s++<5& // rotate 4 times
                    Q[t]%9==c.r; // our raidus matches
                        w=u, // chache y value
                        u=v, // rotate
                        v=-w,
                        D.Add(new P // add
                        {
                            l=c,
                            r=Q[t]/9-4, // radius
                            x=c.x+u,
                            y=c.y+v,
                            p=-c.p // flip parity
                        }));
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.