সরলীকৃত ট্রেন সেট


27

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

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

যেহেতু এটি একটি সরলীকৃত ট্রেন সেট, এখানে কেবলমাত্র 3 টি উপাদান রয়েছে: বড় বক্ররেখা, সামান্য বক্ররেখা এবং সোজা। এগুলি সমস্ত বর্গ গ্রিডের উপর ভিত্তি করে:

স্কোয়ার গ্রিড বড় বক্ররেখা এবং সামান্য বাঁক দেখায়

  • "বড় কার্ভ" হ'ল 90 ডিগ্রি কোণে, প্রতিটি মাত্রায় 2 ইউনিট কভার করে
  • "লিটল কার্ভ" একটি 90 ডিগ্রি কোণে, প্রতিটি দিকের এক ইউনিটকে আচ্ছাদন করে
  • "স্ট্রেইট" হ'ল একটি সরল উপাদান, 1 ইউনিট দীর্ঘ

এর অর্থ হল যে সম্ভাব্য ন্যূনতম সার্কিটটি 4 টি ছোট বক্ররেখা দ্বারা গঠিত - এটি একটি বৃত্ত, ব্যাসার্ধ 1 ইউনিটের। বিভিন্ন ডিম্বাশয় গঠনে স্ট্রেট উপাদানগুলির জোড়া যুক্ত করে এটি বাড়ানো যেতে পারে। আরও বক্ররেখা যোগ করে বা বক্ররেখার প্রকারগুলি মিশ্রিত করে অন্যান্য সার্কিটগুলি সম্ভব।

এই ট্রেন সেটটিতে কোনও জংশন, বা ট্র্যাকগুলি অতিক্রম করার পদ্ধতি অন্তর্ভুক্ত নয়, সুতরাং দুটি উপাদানগুলির পক্ষে অন্য উপাদানটির একই প্রান্তে সংযুক্ত হওয়া (কোনও ওয়াই ফর্মেশন নয়) বৈধ নয় বা একে অপরের উপর দিয়ে যাওয়া (কোনও এক্স বিন্যাস নেই) । অতিরিক্তভাবে, এটি একটি ট্রেনের সেট, সুতরাং যে কোনও গঠন যা ট্রেনকে পাস করতে দেয় না তা বৈধ নয়: উদাহরণগুলির মধ্যে 90 ডিগ্রি কোণে স্ট্রেটস মিটিং অন্তর্ভুক্ত থাকে (সর্বদা লম্ব স্ট্রেটের মধ্যে একটি বক্ররেখা থাকতে হবে) এবং 90 ডিগ্রি কোণে বক্ররেখার মিলন অন্তর্ভুক্ত থাকে (বক্ররেখা প্রবাহিত করতে হবে)।

আপনি যতটা টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে তা ব্যবহার করতে চান, তাই আপনি সর্বদা এমন একটি সার্কিট বেছে নেবেন যাতে আরও বেশি বিট থাকে Finally ।

ইনপুট

হয় তিনটি পূর্ণসংখ্যার একটি অ্যারে, সমস্ত বৃহত্তর বক্ররেখা, সামান্য বক্ররেখা এবং উপলব্ধ স্ট্রেইটগুলির সংখ্যার সাথে সমান 0 এর চেয়ে বড় বা সমান, একই ক্রমে আপনার প্যারামিটারগুলিতে পাস হয়।

আউটপুট

প্রদত্ত উপাদানগুলির সর্বাধিক সম্ভাব্য সার্কিটটি নির্মিত হলে টুকরো টুকরো সংখ্যার সাথে সম্পর্কিত একটি সংখ্যা।

পরীক্ষার ডেটা

Minimal circuit using big curves
Input: [4,0,0]
Output: 0

Slightly more complicated circuit
Input: [3,1,2]
Output: 0

Incomplete circuit - can't join
Input: [3,0,0]
Output: 3

Incomplete circuit - can't join
Input: [3,1,1]
Output: 5

Circuit where big curves share a centre
Input: [2,2,0]
Output: 0

Bigger circuit
Input: [2,6,4]
Output: 0

Circuit where both concave and convex curves required
Input: [8,0,0] or [0,8,0]
Output: 0

Circuit with left over bit
Input: [5,0,0] or [0,5,0]
Output: 1

নোট

  • 2 স্ট্রেইট এবং সামান্য বক্ররেখা একটি বড় বাঁকের সমান, তবে আরও টুকরো ব্যবহার করুন, তাই পছন্দনীয় - কখনই এই সংমিশ্রণটি ছেড়ে যায় এমন কোনও পরিস্থিতি হওয়া উচিত নয়, যদি সার্কিটে কোনও বড় বাঁক থাকে
  • 4 টি ছোট ছোট রেখাচিত্র সাধারণত 4 স্ট্রেটের জন্য অদলবদল করা যায়, তবে এটি যদি না তবে এটি সার্কিটটিকে ছেদ করে
  • ট্রেনের সেটটিও আদর্শীকৃত - ট্র্যাক উপাদানগুলি দেখানো প্রস্থগুলি গ্রহণ করে, তাই কোনও কোনও ক্ষেত্রে ছেদগুলি ছাড়াই কোনও একক গ্রিড স্কোয়ারে প্রবেশ করানো বৈধ। গ্রিডটি কেবলমাত্র উপাদানগুলির মাত্রা নির্ধারণ করে। বিশেষত, দুটি বড় বক্ররেখা স্থাপন করা যেতে পারে যাতে উদাহরণ চিত্রের উপরের বামে গ্রিড বর্গক্ষেত্রটি বাম থেকে উপরের দিকে চালিত অন্য বড় বক্ররেখার নীচের ডান বর্গক্ষেত্র হতে পারে (চিত্রটি ডান থেকে নীচে চলমান দেখায়)
  • একটি ছোট বক্ররেখা একটি বৃহত বক্ররেখার (নীচে ডানদিকে গ্রিড বর্গক্ষেত্রের) নীচে খালি জায়গায় ফিট করতে পারে। দ্বিতীয় বড় বক্ররেখাও সেই স্থানটি ব্যবহার করতে পারে, প্রথম থেকে একটিকে অন্যদিকে সরানো হয়
  • একটি বৃহত বক্ররের বাইরের অংশের মতো একই গ্রিডে একটি ছোট বক্ররেখা ফিট করতে পারে না - বেশিরভাগ কারণ এটির সাথে সংযোগ করার কোনও উপায় নেই যা অবৈধভাবে ছেদ করে না doesn't

সুতরাং আউটপুট [5,0,0]বা জন্য [0,5,0]হবে 1। এটা কি ঠিক? আপনি যেমন একটি পরীক্ষা কেস যুক্ত করতে পারেন?
আরনাউল্ড

@ আর্নল্ড হ্যাঁ, এটা ঠিক। দীর্ঘতম সম্ভাব্য সার্কিট তৈরির পরে সর্বদা উপাদানগুলির অবশিষ্ট সংখ্যা হওয়া উচিত।
ম্যাথু

আপনি নিশ্চিত করছেন যে খুশি গেল এই জন্য একটি সমাধান পাওয়া যাবে [8,0,0], দুই 2x2 উপাদান গ্রিড কেন্দ্রে ওভারল্যাপিং সঙ্গে?
আর্নৌল্ড

হ্যাঁ, এটি সেই পরীক্ষার ক্ষেত্রে প্রত্যাশিত সমাধান।
ম্যাথু

স্ব-ছেদটি কীভাবে কাজ করে সে সম্পর্কে আমি পরিষ্কার নয়। কি অনুমোদিত এবং কোনটি নিষিদ্ধ তা সংজ্ঞায়িত করার ক্ষেত্রে আপনি আরও সুস্পষ্ট হতে পারেন?
গম উইজার্ড

উত্তর:


9

[জাভাস্ক্রিপ্ট (নোড.জেএস)], 1220 বাইট

f=r=>{var a=[{n:0,d:[[0,-1,"0000000101011"],[1,-1,"0011111111111"],[0,0,"0111101111111"],[1,0,"1100010000000"]],e:[2,-1,1]},{n:0,d:[[-1,-1,"1001111111111"],[0,-1,"0000010010110"],[-1,0,"0110000100000"],[0,0,"1101111011111"]],e:[-2,-1,3]},{n:1,d:[[0,0,"0011101111111"]],e:[1,0,1]},{n:1,d:[[0,0,"1001111011111"]],e:[-1,0,3]},{n:2,d:[[0,0,"1111101011111"]],e:[0,-1,0]}],e=r=>{var a=r.d,e=r.e,n=[];return a.forEach(r=>{var a=r[2];n.push([-r[1],r[0],""+a[10]+a[5]+a[0]+a[8]+a[3]+a[11]+a[6]+a[1]+a[9]+a[4]+a[12]+a[7]+a[2]])}),{d:n,e:[-e[1],e[0],e[2]]}};i=((r,a)=>{for(var n=0;n<r.d;n++,a=e(a));var p=!1;return a.d.forEach(a=>{var e=r[`${r.p.x+a[0]},${r.p.y+a[1]}`];void 0===e&&(e="00000000000000");for(var n="",d=0;d<13;d++)"1"===e[d]&&"1"===a[2][d]&&(p=!0),n+=e[d]===a[2][d]?e[d]:"1";r[`${r.p.x+a[0]},${r.p.y+a[1]}`]=n}),r.p.x+=a.e[0],r.p.y+=a.e[1],r.d=(r.d+a.e[2])%4,!p});var n=[],p=(r,e)=>{a.forEach(a=>{var d=Object.assign({},r);if(d.p=Object.assign({},r.p),!(e[a.n]<=0)&&i(d,a)){if(d.ps+=a.n,0==d.p.x&&0==d.p.y&&0==d.d)return void n.push(d);var s=Object.assign([],e);s[a.n]-=1,p(d,s)}})};p({p:{x:0,y:0},d:0,ps:""},Object.assign([],r));var d=0;n.forEach(r=>{r.ps.length>d&&(d=r.ps.length)}),console.log(r[0]+r[1]+r[2]-d)};

এটি অনলাইন চেষ্টা করুন!

দ্রষ্টব্য: ইনপুটটি আসলে শুরুতে পরিবর্তনশীল q হয়। [2,6,4] এছাড়াও এটি বেশ কিছুটা সময় নেবে কারণ এটি অপ্টিমাইজেশন ছাড়াই একটি নিষ্ঠুর শক্তি সমাধান।

আমি আসলে এটি করেছি কারণ এটির এক বছরেরও বেশি উত্তর দেওয়া হয়নি এবং সম্ভব হলে আমি কেবল কৌতুহলী ছিলাম।


আসল কোড:

var q = [4, 2, 4];
var t = [
    {
        n: 0,
        d: [
            [0, -1, "0000000101011"],
            [1, -1, "0011111111111"],
            [0, 0, "0111101111111"],
            [1, 0, "1100010000000"]
        ],
        e: [2, -1, 1],

    },
    {
        n: 0,
        d: [
            [-1, -1, "1001111111111"],
            [0, -1, "0000010010110"],
            [-1, 0, "0110000100000"],
            [0, 0, "1101111011111"]
        ],
        e: [-2, -1, 3]
    },
    {
        n: 1,
        d: [
            [0, 0, "0011101111111"]
        ],
        e: [1, 0, 1]
    },
    {
        n: 1,
        d: [
            [0, 0, "1001111011111"]
        ],
        e: [-1, 0, 3]
    },
    {
        n: 2,
        d: [
            [0, 0, "1111101011111"]
        ],
        e: [0, -1, 0]
    },
];

r = (p) => {
    var d = p.d; var e = p.e; var o = [];
    d.forEach(i => {
        var d = i[2];
        o.push([-i[1], i[0], "" + d[10] + d[5] + d[0] + d[8] + d[3] + d[11] + d[6] + d[1] + d[9] + d[4] + d[12] + d[7] + d[2]])
    });
    return { d: o, e: [-e[1], e[0], e[2]] };
};

i = (g, p) => {
    //console.log(g.p, g.d);
    for (var i = 0; i < g.d; i++ , p = r(p));
    var c = false;
    p.d.forEach(d => {
        var v = g[`${g.p.x + d[0]},${g.p.y + d[1]}`];
        if (v === undefined) v = "00000000000000";
        var o = "";
        for (var i = 0; i < 13; i++) {
            if (v[i] === '1' && d[2][i] === '1')
                c = true;
            o += (v[i] === d[2][i]) ? v[i] : '1';
        }
        //console.log(o);
        g[`${g.p.x + d[0]},${g.p.y + d[1]}`] = o;
    });
    g.p.x += p.e[0];
    g.p.y += p.e[1];
    g.d = (g.d + p.e[2]) % 4;
    return !c;
};

var l = [];
var re = (g, p) => {
    t.forEach(piece => {
        var gr = Object.assign({}, g);
        gr.p = Object.assign({}, g.p);
        if (p[piece.n] <= 0)
            return;
        if (i(gr, piece)) {
            gr.ps += piece.n;
            if (gr.p.x == 0 && gr.p.y == 0 && gr.d == 0) {
                l.push(gr);
                return;
            }
            var ti = Object.assign([], p);
            ti[piece.n] -= 1;
            re(gr, ti);
        }
    });
};
var gr = { p: { x: 0, y: 0 }, d: 0, ps: "" };
re(gr, Object.assign([], q));

var c = 0;
var lo = 0;
l.forEach(g => {
    if (g.ps.length > lo) {
        require("./draw.js")(g, `outs/out${c++}.png`)
        lo = g.ps.length;
    }
});

console.log(q[0] + q[1] + q[2] - lo);

প্রথমে আমার ব্যবহৃত টাইলগুলির গ্রাফিক অন্তর্ভুক্ত করা উচিত।

টাইলস ব্যবহৃত

The sections of this tile were given a number and
used for comparison and overlap handling later.

So there first thing is the array t at the start. 
This is a collection of track pieces that contain
    n[ame]: the index of the input array.
    d[ata]: the offset from the current tile and the Tile bit values.
    e[nd]: the relative offset and rotation that the piece provides.

function r[otate] ( p[iece] )
    this outputs a piece that is rotated by 90 degrees
    by rearranging the tile bits and the end offset

function i[nsert] ( g[rid], p[iece] )
    this modifies the passed in grid trying to place down each tile of the piece.
    if it hits a point where 2 tiles intersect it sets a flag c[ollision]
    it then adjusts the current p[osition] and and d[irection] stored in the grid.
    then it returns !c[ollision]

function re[peat] ( g[rid], p[eices] )
    this iterates across all nodes which
        creates a copy of the g[rid] as gr[id].
        checks if the piece is available if not continue
        if the peice is added without a collision
            add piece name to gr[id].ps[piece string];
            it checks if its back at the start
                add gr[id] to l[ist]
                return as no more pieces can be added without a collision.
            clone peices remove the used peice ti[nput]
            call re[peate] (gr[id], ti[nput])

call re[peate] with empty grid

search l[ist] for longest piece string
and output input added together minus the length of the longest string.

দুঃখিত যদি লেখাটি পড়া শক্ত হয় তবে আমার কোড কীভাবে কাজ করে তা বোঝাতে অভ্যস্ত নই।

পিএস আমি আসলে একটি পিএনজি-তে মানচিত্র আঁকার জন্য কয়েকটি ফাংশনও করেছি তবে অবশ্যই সেগুলি অপসারণ করা হয়েছিল কমপক্ষে কিছু জায়গা বাঁচাতে।


আমি মুগ্ধ - আমি এক ধরনের আশা ছেড়ে দেওয়া! একটি লেখার বিষয়ে আগ্রহী হবে
ম্যাথু

@ ম্যাথেজ আমি যখন লিখতে সময় পেলাম আমি তা দেখতে পাচ্ছি। এটি আসলে কিছুটা সময় নিতে পারে। তবে হ্যাঁ, সাধারণত এগুলি করা আমার প্রিয় ধরণের ধাঁধা। এটি সংক্ষিপ্ত না হলেও এটি সম্ভব তা প্রমাণ করা মজাদার।
সেরিক

@ ম্যাথিউ লিখেছেন।
সিয়েরিক

আপনি এর p[a.n]-=1পরিবর্তে ব্যবহার করার জন্য কেন কোনও কারণ আছে p[a.n]--?
জোনাথন ফ্রেচ

এর qমতো সূচনা করা কোনও অনুমোদিত ইনপুট পদ্ধতি নয় । সর্বাধিক সাধারণত, হয় এটি একটি ফাংশন আর্গুমেন্ট করুন বা স্ট্ডিন থেকে এটি পড়ুন।
janrjan জোহানসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.