লেগো গিয়ার ট্রেন


13

লেগো গিয়ার অনুপাত দ্বারা অনুপ্রাণিত হয়ে কীথ র্যান্ডাল।

আমিও, এমন একটি দৈত্য লেগো রোবট নির্মাণের পরিকল্পনা করছি যা শেষ পর্যন্ত পূর্বে উল্লিখিত প্রতিযোগিতায় অন্যান্য রোবটদের ধ্বংস করতে সক্ষম হবে। * রোবটটি নির্মাণের প্রক্রিয়াতে, আমি সংযোগের জন্য প্রচুর গিয়ার ট্রেন ব্যবহার করব রোবট বিভিন্ন অংশ। আমি চাই আপনি আমাকে সবচেয়ে সংক্ষিপ্ত প্রোগ্রামটি লিখুন যা আমাকে এমন জটিল কাজের জন্য প্রয়োজনীয় জটিল গিয়ার ট্রেনগুলি তৈরি করতে সহায়তা করবে। আমি অবশ্যই অবশ্যই রেডিয়ি 1, 2, 3 এবং 5 স্বেচ্ছাসেবী-লেগো-ইউনিট সহ গিয়ারগুলি ব্যবহার করব।

গিয়ার ট্রেনের প্রতিটি গিয়ারের 2 ডি গ্রিডে একটি নির্দিষ্ট পূর্ণসংখ্যা সমন্বয় থাকে। প্রথম গিয়ারটি (0,0) এ অবস্থিত এবং চূড়ান্ত গিয়ারটি অ-নেতিবাচক স্থানাঙ্কে অবস্থিত। প্রথম এবং শেষ গিয়ারগুলির অবস্থান এবং আকার ইনপুট হিসাবে সরবরাহ করা হবে, আপনার প্রোগ্রামটি অবশ্যই গিয়ারগুলি শূন্যস্থান পূরণ করতে কোথায় যেতে হবে তা অবশ্যই জানিয়ে দিতে হবে।

অতিরিক্তভাবে, আপনার প্রোগ্রামটি অবশ্যই গিয়ার ট্রেনে ন্যূনতম সম্ভাব্য গিয়ারগুলি ব্যবহার করতে পারে use কম গিয়ারস / ট্রেন = আরও ট্রেন ** = ধ্বংসের আরও বড় এবং আরও ভাল রোবট।

ইনপুটটিতে একটি লাইন থাকবে:

X,Y,B,A

এক্স এবং ওয়াই চূড়ান্ত গিয়ারের স্থানাঙ্ক। প্রথম গিয়ারটি সর্বদা (0,0) এ অবস্থিত। বি এবং এ যথাক্রমে চূড়ান্ত এবং প্রাথমিক গিয়ার্সের রেডিয়ি i কিছু অসুবিধা যুক্ত করার জন্য, আপনাকে নিশ্চিত করতে হবে আউটপুট গিয়ারটি সঠিক দিকের দিকে ঘোরে। যদি এ এবং বি এর একই চিহ্ন থাকে তবে আউটপুট গিয়ারটি একই দিকে ঘোরানো দরকার এবং একটি বিজোড় সংখ্যক গিয়ার অবশ্যই ব্যবহার করা উচিত। যদি তাদের বিপরীত লক্ষণ থাকে তবে একটি সমান সংখ্যক গিয়ার ব্যবহার করা দরকার।

আউটপুট প্রতি লাইনে একটি গিয়ার এক্স অবস্থান একটি তালিকা ওয়াই অবস্থান, এবং প্রতিটি অতিরিক্ত গিয়ার ব্যাসার্ধ, হওয়া উচিত। যদি একাধিক ন্যূনতম-গিয়ার সমাধান থাকে তবে আপনার পছন্দের কেবল একটি মুদ্রণ করুন। আউটপুটে গিয়ার্সের ক্রমটি কোনও ব্যাপার নয়।

উদাহরণ (আরও সমতুল্য সমাধানগুলি হতে পারে):

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!

উপরোক্ত উদাহরণগুলির সমাধান এখানে, ভিজ্যুয়ালাইজড:

এখানে চিত্র বর্ণনা লিখুন

যতদূর আমি জানি, দুটি ইনপুট গিয়ারগুলি ওভারল্যাপ করে না দেওয়া বা সরাসরি সংযোগ না করা কোনও সমস্যা অসম্ভব। আপনি এটি মোকাবেলা করতে হবে না।

এটি কোড গল্ফ, সংক্ষিপ্ত উত্তর জয়।


* ভবিষ্যতের কোন, কেউ?

**চো চো!!


আমার এটি হবে যাতে প্রাথমিক এবং চূড়ান্ত উভয়টিই নেতিবাচক হতে পারে।
wizzwizz4

9
ফির লেগো গিয়ার ট্রেন চ্যালেঞ্জটিতে আপনাকে স্বাগতম। স্যান্ডবক্সে 4 বছর পরে, আশা করি এটির ওজনের মূল্য হবে।
একটি স্প্যাগেটো

@ wizzwizz4 পরিবর্তন করেছেন।
PhiNotPi

এটি কি সত্যিই 4 বছরের জন্য স্যান্ডবক্সে ছিল?
Rɪᴋᴇʀ

@ রিকারডাব আরও 3/3 টির মতো পছন্দ করুন।
PhiNotPi

উত্তর:


1

সি #, 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, এসটিডিআউট থেকে আউটপুট গ্রহণ করে। আউটপুট হ'ল শেষ থেকে শুরু পর্যন্ত গিয়ারগুলি। ব্যবহার:

একটি সাধারণ প্রস্থের প্রথম অনুসন্ধান সম্পাদন করে, যা 4-গিয়ার সমস্যাটি এক সেকেন্ডেরও কম সময়ে সমাধান করে। ব্রাঞ্চিং ফ্যাক্টরটি আসলে এত বড় নয়, সুতরাং এটি বেশিরভাগের জন্য ভাল হওয়া উচিত (সত্যিকার অর্থে এটি পরীক্ষা করা হয় না)। দুঃখজনকভাবে এটি লিনক ব্যবহার করে।

Q(একটি অর্থাত্ স্ট্রিং সব অনুমতি গিয়ার সংযোগের একটি টেবিল r=3এবং একটি সাথে সংযোগ r=1যদি dx=4এবং dy=0) এক পাদ, যা অন্যদের এটি আবর্তিত হয়। 3 বাইট প্রতি সেট dx, dyএকটি আইনি সংযোগের জন্য, এবং ব্যাসার্ধ তথ্য। (অফসেট হিসাবে পছন্দটি খুব ইচ্ছাকৃত ছিল : আরোপিত ASCII চরিত্রগুলির জন্য দুর্দান্ত সম্পত্তি অনুসন্ধান করার চেয়ে মরিয়া চেষ্টা করার পরিবর্তে একবারে দুর্দান্ত বৈশিষ্ট্যগুলির জন্য একটি ASCII চরিত্র চয়ন করা মজাদার ছিল।

আমি সম্ভবত ইনপুট পড়ার জন্য আরও ভাল কাজ করতে পারি, তবে আমার এখনও ভাগ্য হয়নি, অন্তত নয় কারণ লিঙ্কের জন্য একটি তালিকা প্রয়োজনের জন্য প্রদান করা হয়েছিল। আমি ঘোরানো কোডটি দেখেও খুব হতাশ, আমার মনে হয় এটি যথেষ্ট কম বাইটে করা যেতে পারে।

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
                        }));
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.