বিলুপ্তি থেকে গিজ সংরক্ষণ করুন


13

আলেক্স এ হিসাবে পরিচিত প্রজাতির প্রজাতিগুলি cells৪ টি কোষ সমন্বিত ত্রিভুজাকার গ্রিডে বাস করার জন্য পরিচিত:

সেল
(এই সম্পর্কহীন প্রকল্প ইউলারের সমস্যা থেকে তোলা ছবি ))

আমরা সংখ্যার প্রতিটি কক্ষে লেবেল করব 0করার 63শীর্ষ সারিতে থেকে শুরু তারপর যে নীচের প্রতিটি সারিতে বাঁ দিক থেকে ডানদিকে চলন্ত। সুতরাং শীর্ষ কক্ষটি 0এবং নীচের ডানদিকে ঘরটি 63

প্রতিটি ঘরে তিনটি বর্ডার থাকে। আমরা প্রতিটি সীমানা ফর্মটিতে লেবেল করতে পারি a,bযেখানে এই সীমান্তটি ভাগ করে এমন ঘরগুলির সংখ্যা aএবং কোথায় b। উদাহরণ হিসেবে বলা যায়, সেল মধ্যে সীমান্ত 0এবং 2বলা হবে 0,2বা 2,0(এটা কোন ব্যাপার না কততম আপনি তাদের রাখা)।

গ্রিডের একেবারে প্রান্তে সীমানাগুলির জন্য লেবেলিং সিস্টেমটি আলাদা, কারণ গ্রিডের প্রান্তে থাকা কোষগুলির একটি সীমানা রয়েছে যা তারা অন্যান্য কোষের সাথে ভাগ করে না। যদি কোনও সীমানা কেবল একটি ঘরের অংশ হয় তবে আমরা চিঠিটি ব্যবহার করব X। উদাহরণ হিসেবে বলা যায়, সেল তিন সীমানা 0হয় 0,2, 0,Xএবং 0,X

কিছু কোষে গিজ থাকে । তবে এই গিজগুলি খারাপ শিয়ালদের দ্বারা হত্যা করা হবে (যা গ্রিডের সীমানার বাইরে থেকে আসে) যদি আপনি তাদের রক্ষা না করেন। এবং যদি সমস্ত গিজ মারা যায় তবে ব্রেইনস্টিল দুঃখ পাবে। সুতরাং আমরা এমন একটি প্রোগ্রাম লিখব যা শিয়ালদের হাত থেকে রক্ষার জন্য গিজের চারপাশে বেড়া তৈরি করে। গিজ একটি বেড়া একটি সম্পূর্ণরূপে সংযুক্ত বহুভুজ মধ্যে থাকা উচিত । আমাদের বেড়ার বাজেটটি বেশ কম তাই সম্ভাব্য বেড় সংখ্যাটি ব্যবহার করুন।

ইনপুট বিবরণ

সংখ্যার একটি তালিকা, কমা থেকে স্বতন্ত্র, 0করতে 63, এমন কক্ষগুলিকে বাড়িয়ে ধারণ উপস্থাপন করে। উদাহরণ:

6,12

আউটপুট বিবরণ

সাফল্যের সাথে গিজ রক্ষার জন্য সীমানাগুলির একটি তালিকা রয়েছে যাতে বেড়াগুলি তাদের তৈরি করা উচিত। এটি সম্ভব বেড়াগুলির মধ্যে ক্ষুদ্রতম সংখ্যা। উদাহরণ:

5,6 6,7 11,12 12,13 

"বেড়া সম্পূর্ণরূপে সংযুক্ত বহুভুজের মধ্যে গিজের উপস্থিতি থাকা উচিত।" সমস্ত গিজ অবশ্যই একই বহুভুজতে বাস করতে পারে, বা একাধিক (বা 0) বহুভুজ থাকতে পারে?
শুক্রবার

@ ফেয়ারসাম সমস্ত গিজ একই প্যাভালগনে বাস করা উচিত। আমি এটিকে পরিষ্কার করার জন্য প্রশ্নটি সম্পাদনা করেছি।
এএমবিতে

@ কাটিয়া বহুভুজের স্ব-ছেদ বা শূন্য-প্রস্থের বিভাগ থাকতে পারে? একটি ঘন্টাঘড়ি আকৃতির মত চিন্তা করুন।
orlp

@orlp একটি শূন্য প্রস্থের বিভাগটি কী?
সোমরস

2
@orlp বহুভুজের শূন্য প্রস্থের বিভাগ থাকা উচিত নয়।
সোমরস

উত্তর:


10

সি #, 530 বাইট

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

এটি বরং দীর্ঘ ... এবং এর সাথে অনেক বেশি এক্স / ওয়াই / জেড পুনরাবৃত্তি রয়েছে, তবে আমি এ পর্যন্ত এটিকে বোধগম্য কিছুতে কমিয়ে আনতে পারিনি, এবং ২৪ ঘন্টার মধ্যে একটি পরীক্ষা করলাম, আগামীকালই ফিরে আসতে পারে।

using Q=System.Console;class P{static void Main(){int q=9,w=0,e=9,r=0,t=9,u=0,i=0,x=0,y=0,z=0,p=0;System.Action V=()=>{z=(int)System.Math.Sqrt(i);p=(x=i-z*z)%2;x/=2;y=(++z*z--+~i)/2;},W=()=>{Q.Write(i+","+(x<0|y++<0|z>7?"X":""+(z*z+2*x+1-p))+" ");};foreach(var g in Q.ReadLine().Split(',')){i=int.Parse(g);V();q=q>x?x:q;w=w<x?x:w;e=e>y?y:e;r=r<y?y:r;t=t>z?z:t;u=u<z?z:u;}for(i=64;i-->0;){V();if(!(x<q|x>w|y<e|y>r|z<t|z>u))if(p>0){if(y==r)W();if(x++==w)W();x--;if(z--==t)W();}else{if(y--==e)W();if(x--==q)W();x++;if(z++==u)W();}}}}

এই চিত্রটি কী চলছে তা সর্বাধিক ব্যাখ্যা করে।

গ্রিডটি x / y / z / (p) হিসাবে বর্ণিত, উদাহরণ সমাধান দেখায়

এটি শনাক্ত করুন যেহেতু আমাদের 0-প্রস্থের বিভাগ থাকতে পারে না, একটি "ষড়ভুজ" সর্বদা সস্তার আকার হতে চলেছে (এবং গিজকে সর্বাধিক স্থান দেওয়ার সুবিধা রয়েছে)।

প্রোগ্রামটি প্রথমে সমস্ত ইনপুট সেল সূচকগুলিকে এক্স / ওয়াই / জেড সমন্বয়গুলিতে অনুবাদ করে এবং প্রতিটি x / y / z এর সর্বনিম্ন / সর্বোচ্চ সন্ধান করে কাজ করে।

z = floor(root(i))
x = floor((i - z^2) / 2)
y = floor((z+1)^2 - i - 1) / 2)
p = (i - z^2) % 2

এরপরে, এটি প্রতিটি ঘর সূচকটি অতিক্রম করে এবং এটি বর্ণিত 'ষড়ভুজ' বাউন্ডে ফিট করে কিনা তা পরীক্ষা করে দেখছি। যদি এটি হয় তবে এটি সীমানার চরম প্রান্তগুলির কোনও (যেমন x = xmin, বা y = ymax) এর উপর রয়েছে কিনা তা পরীক্ষা করে এবং এটি প্রাসঙ্গিক প্রান্তগুলি যুক্ত করে। এটি এর পাশের প্রান্তের সূচিটি তৈরি করতে হবে। এক্স এবং জেড এর জন্য, আমরা কেবল তাদের চাই / ইনক্রিমেন্ট / হ্রাস, এবং তারপরে নিম্নলিখিত সূত্রটি ব্যবহার করুন:

i = z^2 + 2*x + (1-p)

লক্ষ্য করুন যে "সমতা" সর্বদা পরিবর্তিত হয়, এবং যে y জড়িত না। Y এর জন্য আমাদের কোনও পরিবর্তন করতে হবে না, তবে কোডটি কিছুটা গণ্ডগোলের কারণ পরবর্তী পাশের ঘরটি একটি "এক্স" হওয়া উচিত কিনা তা সনাক্ত করার জন্য এটি "ত্রিভুজ" সীমা পরীক্ষা করতে হবে।

উদাহরণ সমাধান (তিনটি কোণ থেকে গিজযুক্ত সেলগুলি):

Input
2,50,62

Output
62,63 61,X 59,X 57,X 55,X 53,X 51,X 50,49 48,X 36,X 35,X 25,X 24,X 16,X 15,X 9,X 8,X 4,X 3,X 2,0 1,X 

মন্তব্য সহ টিডিয়ার কোড:

using Q=System.Console;

class P
{
    static void Main()
    {
        int q=9,w=0,e=9,r=0,t=9,u=0, // min/max x/y/z/ (init min high, and max low)
        i=0, // index of cell we are looking at
        x=0,y=0,z=0,p=0; // x,y,z dimension

        System.Action V=()=>
            { // translates the index into x/y/z/p
                z=(int)System.Math.Sqrt(i);
                p=(x=i-z*z)%2; // 'parity'
                x/=2; // see p assignment
                y=(++z*z--+~i)/2; // ~i == -i - 1
            },
            W=()=>
            { // writes out the edge of i, and the cell described by x/z/inverse of p   (the inversion of p handles y +/-)
                Q.Write(i+","+ // write out the edge
                        (x<0|y++<0|z>7?"X":""+(z*z+2*x+1-p)) // either X (if we go out of 'trianlge' bounds), or we translate x/z/inverse of p into an index
                        +" "); // leaves a trailing space (as shown in example output)
            };

        foreach(var g in Q.ReadLine().Split(',')) // for each cell with geese
        {
            i=int.Parse(g); // grab index of cell
            V(); // compute x/y/z/p
            q=q>x?x:q; // sort out mins/maxes
            w=w<x?x:w;
            e=e>y?y:e;
            r=r<y?y:r;
            t=t>z?z:t;
            u=u<z?z:u;

            // code like the above suggests a solution with a couple of arrays would be better...
            // I've not had success with that yet, but maybe in a couple of days I will try again
        }

        for(i=64;i-->0;) // for each cell
        {
            V(); // compute x/y/z/p
            if(!(x<q|x>w|y<e|y>r|z<t|z>u)) // if we are inside the 'hex' bounds
                if(p>0)
                { // x max, y max, z min
                    // these checks check that we are on the extremes of the 'hex' bounds,
                    // and set up the appropriate vars for W calls to put the edges in
                    // must do y first, because W modifies it for us (saves 2 bytes in the next block)
                    if(y==r) // don't need the ++ (can't go out of 'trianlge' bounds)
                        W();
                    if(x++==w)
                        W();
                    x--;
                    if(z--==t)
                        W();
                    //z++; not used again
                }
                else
                { // x min, y min, z max
                    if(y--==e) // do need the -- (used for 'trianlge' bounds checking)
                        W();
                    // y is reset in W, as such
                    if(x--==q)
                        W();
                    x++;
                    if(z++==u)
                        W();
                    //z--; not used again
                }
        }
    }
}

আপনি এটি দিয়ে একটি বাইট সংরক্ষণ করতে পারেন using System;
LegionMammal978

@ লিজিওনম্যামাল ৯78৮ আসলে সে দুটি অর্জন করে .. তিনি কেবল এটি Q.Writ এবং Q.ReadLine এর জন্য ব্যবহার করেন। সেগুলি, তার সাথে এখন তাঁর ব্যবহারের বিবৃতিটি using Q=System.Console;Q.Write();Q.ReadLine()(45 বাইট) বনাম আপনার পরামর্শ using System;Console.Write();Console.ReadLine()(47 বাইট)।
কেদে

এছাড়াও, আপনি না অযথা আরম্ভের দ্বারা 10 বাইট ড্রপ করতে পারেন i, x, y, z, এবং p0 থেকে
LegionMammal978

আপনি কি নিশ্চিত? আমি এটি চেষ্টা করেছি এবং এটি একটি অ-বরাদ্দযোগ্য বৈকল্পিক ব্যবহারের জন্য ত্রুটি দিচ্ছে।
কেদে

@ ভিওজ- কোন পরিবর্তনশীল? টীকাগুলি সংস্করণে কোন লাইন?
LegionMammal978
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.