एक मेंढक सॉल्वर बनाओ


12

🐸🐸

9x9 ग्रिड पर सरलीकृत फ्रॉगर गेम के लिए इष्टतम समाधान खोजने के लिए आपको सबसे छोटा प्रोग्राम बनाना चाहिए।

पाठ्यक्रम के तत्व:

  • L- लॉग (लंबाई: 3-4)। जब आप एक लॉग पर आशा करते हैं, तो यह आपको इसके साथ ले जाता है।
  • V - वाहन (लंबाई: 1-2)
  • गति (1-2): पंक्ति के बाएं हाथ की ओर गति होगी जो पंक्ति में तत्वों को ले जाती है।
  • रिक्त स्थान: तत्वों के बीच हमेशा कम से कम दो स्थान होंगे।
  • दिशा: वाहन और लॉग दोनों वर्गों में, प्रत्येक लेन में आंदोलन की दिशा बाएं और दाएं के बीच वैकल्पिक होती है।

पाठ्यक्रम संरचना:

  • यदि यह पूंजी है, तो यह सही है; यदि यह लोअरकेस है, तो यह बाईं ओर जाता है। एक पंक्ति में सभी तत्व एक ही दिशा में जाते हैं। जैसे ही एक तत्व का हिस्सा स्क्रीन से बाहर जाता है, यह स्क्रीन के विपरीत तरफ दिखाई देगा।
  • पहली पंक्ति एक सुरक्षित क्षेत्र है। मेंढक शुरू होता है F, जो हमेशा एक ही स्थान पर होता है।
  • अगली 3 पंक्तियाँ वाहन वाली सड़कें हैं।
  • अगली पंक्ति एक सुरक्षित क्षेत्र है।
  • अगली 3 पंक्तियाँ लॉग्स के साथ पानी (स्पर्श पानी == मौत) हैं।
  • एक बार जब आप Wलेन जीत जाते हैं।
  • यदि मेंढक मर जाता है तो वह वापस चला जाता है F

खिलाड़ी नियंत्रण:

  • L - बाएं
  • R - सही
  • U - यूपी
  • D - नीचे
  • W - रुको

आपके हिलने के बाद, एक और फ्रेम पास होता है। (ध्यान दें कि फ्रेम आपके कदम के बाद गुजरता है, आपकी चाल के समान समय पर नहीं।) आपके कार्यक्रम को पात्रों के अनुक्रम के रूप में इष्टतम समाधान देना चाहिए URWUUL। यदि किसी कोर्स का कोई हल नहीं है, तो आपके प्रोग्राम का आउटपुट होना चाहिए N

उदाहरण: (जब से मैंने ये हाथ से किया है मुझे नहीं पता कि वे इष्टतम समाधान हैं।)

0WWWWWWWWW
1 एल एल    
2 एलएलएलएल   
2 एलएलएल   
0         
1 vv वी.वी. 
1 वी वी   
1 वी.वी.    
0 एफ    

उपाय: WUWUUURWUULWUU

0WWWWWWWWW
2 एल एल   
1 एलएलएल  
1 एल एल   
0         
2 वी.वी.    
1 वी.वी.     
2 वी.वी.    
0 एफ    

उपाय: WUWUWUUWUUWWUU

0WWWWWWWWW
2 एलएलएल  
2 एलएलएल   
1 एलएलएल  
0         
2 वी वी.वी. 
1 वीवी वीवी 
1 वी वी   
0 एफ    

उपाय: WWUUUURURRWWUUU

0WWWWWWWWW
2 एलएलएल   
2 एलएलएल   
1 एल एल   
0         
1 vv वी 
2 वीवीवी 
2 vvv 
0 एफ    

समाधान: N(पिछली पहली पंक्ति पाने का कोई तरीका नहीं।)

पाठ्यपुस्तक में पाठ्यक्रम को चिपकाकर और "लोड कोर्स" को आगे बढ़ाकर स्निपेट में इनका परीक्षण करें। फिर समाधान को "इनपुट" में पेस्ट करें और सबमिट पुश करें।

स्निपेट: परीक्षण के मामले बनाना कठिन है, इसलिए मैंने यह स्निपेट बनाया, जो आपको यह देखने देता है कि क्या आपका प्रोग्राम बेतरतीब ढंग से उत्पन्न पाठ्यक्रमों को हल कर सकता है। परीक्षण प्रयोजनों के लिए, आपको बस अपने इनपुट ( LRUWL...अनुभाग) के इनपुट को "इनपुट" अनुभाग में डालना होगा और सबमिट सबमिट करना होगा। पाठ्यक्रम को वापस मूल स्थिति में रीसेट करने के लिए इसे "रीसेट" पुश करें। अगर आपको कोई कीड़े मिले तो मुझे बताएं।

var timer;
var f_x, f_y;
var replaced;
var copy;
document.body.onkeyup = function(e) {
  var a = document.activeElement;
  if (a !== controls && a !== data) hop(e.keyCode);
};

function setup() {
  stop();
  var rows = game.children;
  rows[0].innerHTML = "0WWWWWWWWW";
  load(logs, "L");
  rows[2].innerHTML = "0         ";
  load(cars, "V");
  rows[4].innerHTML = "0    F    ";
  copy = game.innerHTML;
  save();

  f_x = 5;
  f_y = 9;
  replaced = " ";
}

function save() {
  data.value = "";
  for (var i = 1; i <= 9; i++) {
    data.value += getRow(i).textContent;
    if (i < 9) data.value += "\n";
  }
}

function extLoad() {
  stop();
  var rows = data.value.split("\n");
  replaced = " ";
  for (var i = 0; i < rows.length; i++) {
    var r = getRow(i + 1);
    r.innerHTML = rows[i].replace(/ /g, "&nbsp;");
    if (rows[i].indexOf("V") !== -1 || rows[i].indexOf("L") !== -1) r.className = "right";
    else if (rows[i].indexOf("v") !== -1 || rows[i].indexOf("l") !== -1) r.className = "left";
    var f = rows[i].indexOf("F");
    if (f !== -1) {
      f_y = i + 1;
      f_x = f;
    }
  }
  copy = game.innerHTML;
}


function reset() {
  stop();
  game.innerHTML = copy;
  f_x = 5;
  f_y = 9;
  replaced = " ";
}

function play() {
  if (!timer) {
    timer = setInterval(next, 1500);
  }
}

function stop() {
  if (timer) {
    clearInterval(timer);
    timer = null;
  }
}

function input(i) {
  var s = controls.value;
  if (i === 0) {
    stop();
    sub.disabled = true;
  }
  if (s[i] === "L") hop(65);
  else if (s[i] === "U") hop(87);
  else if (s[i] === "R") hop(68);
  else if (s[i] === "D") hop(83);
  next();
  if (i < s.length - 1) setTimeout(function() {
    input(i + 1);
  }, 750);
  else sub.disabled = false;
}

function load(part, code) {
  for (var r = 0; r < 3; r++) {
    var row = part.children[r];
    var s = "";
    var dir = r % 2;
    row.className = dir === 1 ? "right" : "left";
    s += Math.floor(Math.random() * 2) + 1;
    var end = 0;
    for (var c = 0; c < 9-end;) {
      var spaces = Math.min(9 - end - c , Math.floor(Math.random() * 2) + 2);
      if(c === 0 && end===0) {
        spaces = Math.floor(Math.random()*4);
        end = Math.max(0,2-spaces);
      }
      s += "&nbsp;".repeat(spaces);
      c += spaces;
      var type = "";
      var len = 0;
      var rand = Math.floor(Math.random() * 2);
      if (code === "L") {
        type = dir === 1 ? "L" : "l";
        len = rand + 3;
      } else {
        type = dir === 1 ? "V" : "v";
        len = rand + 1;
      }
      if (c + len > 9-end) continue;
      s += type.repeat(len);
      c += len;

    }
    row.innerHTML = s + "&nbsp;".repeat(end);
  }
}

function next() {
  move(logs);
  move(cars);
}

function move(part) {
  var rows = part.children;
  for (var i = 0; i < rows.length; i++) {
    var s = rows[i].textContent;
    var f = s.indexOf("F") !== -1;
    if (f) {
      replace(f_y, f_x, false);
      s = rows[i].textContent;
    }
    var speed = s[0];
    var stuff = s.substring(1);
    var v = vel(speed, rows[i].className);
    rows[i].textContent = s[0] + shift(stuff, speed, rows[i].className);
    if (f) {
      if (part === logs) {
        f_x += v;
        if (f_x < 1 || f_x > 9) {
          go(5 - f_x, f_y - 9);
          return;
        }
      }
      replace(f_y, f_x, true);
      s = rows[i].textContent.substring(1);
      var c = f_x + v;
      var t = "";
      if (c > 9) t = s.substring(f_x) + s.substring(0, c - 9);
      else if (c < 0) t = s.substring(0, f_x) + s.substring(9 + c);
      else t = v > 0 ? s.substring(f_x, c) : s.substring(c, f_x);
      if (t.indexOf("V") !== -1 || t.indexOf("v") !== -1) {
        go(5 - f_x, f_y - 9);
      }

    }



  }
}


function vel(mag, dir) {
  var d = dir === "right" ? 1 : -1;
  var m = parseInt(mag);
  return d * m;
}



function shift(s, n, d) {
  n = parseInt(n);
  for (var i = 0; i < n; i++) {
    if (d === "left") {
      s = s.substring(1) + s.substring(0, 1);
    } else {
      s = s.substring(s.length - 1) + s.substring(0, s.length - 1);
    }
  }
  return s;
}


function hop(k) {
  if (k === 65) go(-1, 0);
  else if (k === 87) go(0, 1);
  else if (k === 68) go(1, 0);
  else if (k === 83) go(0, -1);
}

function go(x, y) {


  replace(f_y, f_x, false);
  f_y -= y;
  f_x += x;
  replace(f_y, f_x, true);
  if (f_x < 1 || f_x > 9 || f_y > 9) {
    go(5 - f_x, f_y - 9);
    return;
  }



  if (f_y == 1) {
    alert("win!");
    go(5 - f_x, f_y - 9);
  }


}

function replace(y, x, f) {

  var row = getRow(y);
  if (!row) return false;

  var s = row.textContent;
  if (x < 1 || x >= s.length) return false;
  if (f) {
    replaced = s[x];
    if (replaced === "V" || replaced === "v" || (replaced.charCodeAt(0) === 160 && y < 5)) {
      go(5 - f_x, f_y - 9);

    } else {
      row.textContent = s.substring(0, x) + "F" + s.substring(x + 1);
    }
  } else {
    row.textContent = s.substring(0, x) + replaced + s.substring(x + 1);
  }

}

function getRow(y) {
  if (y < 1 || y > 9) return false;
  if (y === 1) return game.firstChild;
  if (y === 9) return game.lastChild;
  if (y > 5) return cars.children[y - 6];
  if (y < 5) return logs.children[y - 2];
  return game.children[2];
}
<body onload="setup()"><code id="game"><div></div><div id="logs"><div></div><div></div><div></div></div><div></div><div id="cars"><div></div><div></div><div></div></div><div></div></code>
  <input type="button" value="Step" onclick="next()" />
  <input type="button" value="Pause" onclick="stop()" />
  <input type="button" value="Play" onclick="play()" />
  <input type="button" value="Reset" onclick="reset()" />
  <input type="button" value="New Course" onclick="setup()" />
  <div>Controls: WASD</div>
  <div>Input:
    <input type="text" id="controls" />
    <input type="submit" onclick="input(0)" id="sub" />
  </div>
  <div>
    <textarea id="data" rows=9 cols=12></textarea>
    <input type="button" onclick="extLoad()" value="Load Course" />
    <input type="button" onclick="save()" value="Save Course" />
  </div>
</body>

कहा से शुरुवात करे:

सम्बंधित:

यह सभी देखें:


1
जो लोग उन्हें नहीं देख सकते हैं, उनके लिए पोस्ट के पहले दो अक्षर हैं यूनिकोड U + 1F438: मेंढक चेहरा
बिल्ली

6
समाधान:WWUUUURURRWWUUU -> च्वी प्लेग फ्रॉगर।
डिजिटल ट्रॉमा

3
@DigitalTrauma "Let the Wookie win" - C3PO, एक आर्केड मशीन के लिए।
FryAmTheEggman 22

इसके अलावा अगर मेंढक स्क्रीन के किनारे से टकराता है तो क्या होता है?
user81655

2
@ क्विंटोपिया लोअरकेस को छोड़ दिया जाता है, इसलिए वे बाएं जाते हैं।
जियोकालेव

जवाबों:


1

जावास्क्रिप्ट, 854 बाइट्स

function f(w){h=[];z=[];for(y=0;y<9;y++){l=w.split('\n')[y];r={s:parseInt(l[0]),d:1,e:[]};for(x=0;x<9;x++){c=l[1+x];if(c=='v'||c=='l')r.d=-1;r.e.push(c);}z.push(r);}h.push(z);h.push(z);for(g=2;g<40;g++){z=JSON.parse(JSON.stringify(z));for(y=0;y<9;y++){r=z[y];if(r.s>0&&(g%2==0||r.s==2)){i=0;t=0;if(r.d==-1){t=r.e[0];for(i=0;i<8;i++)r.e[i]=r.e[i+1];r.e[i]=t;}else{t=r.e[8];for(i=8;i>0;i--)r.e[i]=r.e[i-1];r.e[i]=t;}}}h.push(z);}j=15;k="";m(0,4,8,"","");return k==""?"N":k;function m(s,a,b,u,v){if(s<j){q={'U':[0,-1],'D':[0,1],'L':[-1,0],'R':[1,0]}[u];if(q)a+=q[0],b+=q[1];v+=u;if(!b){j=s;k=v;return;}if(s>0){for(i=0;i<3;i++){z=h[s*2+i-2];r=z[b];if(i&&(i==1||r.s==2)&&r.e[a].toUpperCase()=='L')a+=r.d;if(a<0||a>8||b>8)return;z=h[s*2+i-1];e=z[b].e;if(e[a].toUpperCase()=='V'||(b<4&&e[a].toUpperCase()!='L'))return;}}t="UWRLD";for(x in t)m(s+1,a,b,t[x],v);}}}

Ungolfed

function solve(input) {
    var grids = [];
    var maxgrid = 40;
    // load input
    var grid = [];
    var lines = input.split('\n');
    for (var y = 0; y < 9; y++) {
        var line = lines[y];
        var row = {
            speed: parseInt(line[0]),
            direction: 1,
            cells: []
        }
        for (var x = 0; x < 9; x++) {
            var c = line[1 + x];
            if (c == 'v' || c == 'l')
                row.direction = -1;
            row.cells.push(c);
        }
        grid.push(row);
    }
    grids.push(grid);
    grids.push(grid);
    // animate grids
    for (var g = 2; g < maxgrid; g++) {
        grid = JSON.parse(JSON.stringify(grid));
        for (var y = 0; y < 9; y++) {
            var row = grid[y];
            if (row.speed > 0 && (g % 2 == 0 || row.speed == 2)) {
                if (row.direction == -1) {
                    var i, temp = row.cells[0];
                    for (i = 0; i < 8; i++)
                        row.cells[i] = row.cells[i + 1];
                    row.cells[i] = temp;
                }
                else {
                    var i, temp = row.cells[8];
                    for (i = 8; i > 0; i--)
                        row.cells[i] = row.cells[i - 1];
                    row.cells[i] = temp;
                }
            }
        }
        grids.push(grid);
    }
    var best = 15;
    var best_moves = "";
    var forceExit = false;

    move(0, 4, 8, "", "");
    return best_moves == "" ? "N" : best_moves;

    function move(step, fx, fy, dir, moves) {
        if (step >= best)
            return "die";
        switch (dir) {
            case 'U':
                fy--;
                break;
            case 'D':
                fy++;
                break;
            case 'L':
                fx--;
                break;
            case 'R':
                fx++;
                break;
        }
        if (dir != '')
            moves += dir;
        if (fy == 0) {
            best = step;
            best_moves = moves;
            return "win";
        }
        if (step > 0) {
            for (var i = 0; i < 3; i++) {
                var grid = grids[step * 2 + i - 2];
                if (i > 0 && (i == 1 || row.speed == 2)) {
                    var row = grid[fy];
                    if (row.cells[fx].toUpperCase() == 'L')
                        fx += row.direction;
                }
                if (fx < 0 || fx > 8 || fy > 8)
                    return "die";
                var grid = grids[step * 2 + i - 1];
                var cells = grid[fy].cells;
                if (cells[fx].toUpperCase() == 'V')
                    return "die";
                if (fy < 4 && cells[fx].toUpperCase() != 'L')
                    return "die";
            }
        }
        move(step+1, fx, fy, 'U', moves);
        move(step+1, fx, fy, 'W', moves);
        move(step+1, fx, fy, 'R', moves)
        move(step+1, fx, fy, 'L', moves);
        move(step+1, fx, fy, 'D', moves)
    }
}

मैं चीजों को गति देने के लिए उदाहरण में केवल Up, Wait और Right के लिए परीक्षण कर रहा हूं:

JSFiddle


1
बहुत बढ़िया कि किसी ने आखिरकार ऐसा किया!
जियोकॉवेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.