सरलीकृत ट्रेन सेट


27

कई अलग-अलग प्रकार के ट्रेन सेट मौजूद हैं, जो कि ब्रियो जैसे लकड़ी के पटरियों से लेकर वास्तविक ट्रेनों के पूर्णतया डिजिटल नियंत्रण के लिए उपयुक्त छोटे धातु प्रतिकृतियां हैं, लेकिन इन सभी के लिए एक ट्रैक की आवश्यकता होती है, जो आदर्श रूप से आपके कई टुकड़ों का उपयोग कर सके।

इसलिए, आपका कार्य यह निर्धारित करना है कि उपलब्ध टुकड़ों के इनपुट को देखते हुए, सभी तत्वों का उपयोग करके एक पूर्ण बंद सर्किट का निर्माण करना संभव है या नहीं, और यदि संभव हो तो अधिकतम संभव सर्किट से कितने टुकड़े छोड़ दिए जाएंगे।

चूंकि यह एक सरलीकृत ट्रेन सेट है, केवल 3 तत्व हैं: बड़ा वक्र, थोड़ा वक्र, और सीधा। ये सभी एक वर्ग ग्रिड पर आधारित हैं:

चौकोर ग्रिड जिसमें बड़ा कर्व और थोड़ा कर्व दिखाया गया है

  • "बिग कर्व" एक 90 डिग्री कॉर्नर है, जिसमें प्रत्येक आयाम में 2 यूनिट शामिल हैं
  • "लिटिल कर्व" एक 90 डिग्री का कोना है, जो प्रत्येक दिशा में एक इकाई को कवर करता है
  • "स्ट्रेट" एक सीधा तत्व है, 1 यूनिट लंबा

इसका मतलब है कि न्यूनतम सर्किट संभव 4 छोटे वक्रों से बना है - यह एक सर्कल है, त्रिज्या 1 इकाई का। विभिन्न अंडाकार बनाने के लिए सीधे तत्वों के जोड़े जोड़कर इसे बढ़ाया जा सकता है। अधिक घटता जोड़कर या वक्र के प्रकारों को मिलाकर अन्य सर्किट संभव हैं।

इस ट्रेन सेट में पटरियों को पार करने के लिए कोई जंक्शन, या विधियां शामिल नहीं हैं, इसलिए यह दो तत्वों के लिए किसी अन्य तत्व (कोई वाई संरचनाओं) के एक ही छोर से जुड़ने के लिए या एक दूसरे को पार करने के लिए मान्य नहीं है (कोई एक्स फॉर्मेशन नहीं) । इसके अतिरिक्त, यह एक ट्रेन सेट है, इसलिए कोई भी गठन जो किसी ट्रेन को पास करने की अनुमति नहीं देता है, मान्य नहीं है: उदाहरणों में 90 डिग्री कोणों पर स्ट्रैटन बैठक (हमेशा लंबवत पट्टियों के बीच एक वक्र होना चाहिए) और 90 डिग्री कोण पर बैठकें शामिल हैं (घटता प्रवाह होना चाहिए)।

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

इनपुट

या तो तीन पूर्णांकों की एक सरणी, सभी से अधिक या 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 स्ट्रैट्स के लिए स्वैप किया जा सकता है, लेकिन ऐसा नहीं है कि इससे सर्किट खुद को काटना होगा
  • ट्रेन सेट को भी आदर्श बनाया गया है - ट्रैक तत्व दिखाए गए चौड़ाई को लेते हैं, इसलिए यह कुछ मामलों में, बिना किसी इंटरसेक्शन के एकल ग्रिड वर्ग से गुजरने के लिए मान्य है। ग्रिड केवल तत्व आयामों को परिभाषित करता है। विशेष रूप से, दो बड़े वक्रों को रखा जा सकता है ताकि उदाहरण आरेख के शीर्ष बाईं ओर ग्रिड वर्ग भी बाएं से ऊपर की ओर चल रहे एक और बड़े वक्र के नीचे दाएं वर्ग हो (चित्र के साथ एक दाएं से नीचे चल रहा है)
  • एक छोटा वक्र एक बड़े वक्र (नीचे दायां ग्रिड वर्ग ऊपर) के नीचे खाली जगह में फिट हो सकता है। एक दूसरा बड़ा वक्र भी उस स्थान का उपयोग कर सकता है, एक को पार किया और एक को पहले से नीचे कर दिया
  • एक छोटा वक्र एक बड़े ग्रिड के बाहर एक ही ग्रिड स्थान पर फिट नहीं हो सकता है - ज्यादातर क्योंकि इससे कनेक्ट करने का कोई तरीका नहीं है जो अवैध रूप से प्रतिच्छेद नहीं करता है

तो के लिए उत्पादन [5,0,0]या [0,5,0]होगा 1। क्या वो सही है? क्या आप इस तरह के परीक्षण का मामला जोड़ सकते हैं?
अरनुलद १५'१

@arnauld हाँ, यह सही है। हमेशा सबसे लंबे समय तक संभव सर्किट के निर्माण के बाद तत्वों की शेष संख्या होनी चाहिए।
मैथ्यू

क्या आप इस बात की पुष्टि कर सकते हैं कि यह[8,0,0] ग्रिड के केंद्र में दो 2x2 तत्वों के अतिव्यापी होने के लिए एक समाधान है ?
Arnauld

हाँ, यह उस परीक्षण मामले के लिए अपेक्षित समाधान है।
मैथ्यू

मैं स्पष्ट नहीं हूं कि आत्म-चौराहे कैसे काम करते हैं। क्या जो अनुमति है और जो निषिद्ध है उसे परिभाषित करने में अधिक स्पष्ट हो सकता है?
गेहूं जादूगर

जवाबों:


9

[जावास्क्रिप्ट (Node.js)], 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)};

इसे ऑनलाइन आज़माएं!

नोट: इनपुट वास्तव में शुरुआत में परिवर्तनशील क्ष है। [२,६,४] भी काफी समय लगेगा क्योंकि यह अनुकूलन के बिना एक क्रूर बल समाधान है।

मैंने वास्तव में ऐसा किया था क्योंकि इसका उत्तर एक वर्ष से अधिक समय में नहीं दिया गया था और अगर यह संभव था तो मैं बहुत ही उत्सुक था।


मूल कोड:

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.

क्षमा करें यदि लिखने को पढ़ना मुश्किल है तो मुझे यह समझाने की आदत नहीं है कि मेरा कोड कैसे काम करता है।

पीएस I ने वास्तव में नक्शे को एक अंक में खींचने के लिए कुछ कार्य किए हैं, लेकिन निश्चित रूप से कम से कम कुछ स्थान बचाने के लिए उन्हें हटा दिया गया था।


मैं प्रभावित हूँ - मैं इस पर आशा छोड़ देना चाहूँगा! एक लेखन में रुचि होगी
मैथ्यू

@ मैथ्यू मैं देखूंगा जब मुझे एक लिखने का समय मिलेगा। यह वास्तव में थोड़ा समय लग सकता है। लेकिन हाँ, आम तौर पर ये मेरे पसंदीदा प्रकार की पहेलियाँ हैं। यहां तक ​​कि अगर यह कम नहीं है, तो यह साबित करना मजेदार है।
सेरिक

@ मट्टू ने लिखा।
Cieric

क्या कोई ऐसा कारण है जिसके कारण आपने इसका उपयोग p[a.n]-=1करना चुना p[a.n]--?
जोनाथन फ्रीच

इस qतरह की शुरुआत करना एक अनुमत इनपुट विधि नहीं है । ज्यादातर, या तो इसे एक फ़ंक्शन तर्क बनाते हैं या इसे स्टड से पढ़ते हैं।
48 अर्जन जोहान्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.