text: // MASTERMIND
  //
  // Converted from BASIC to Javascript by Oscar Toledo G. (nanochess)
  //
  
  function print(str)
  {
      document.getElementById("output").appendChild(document.createTextNode(str));
  }
  
  function input()
  {
      var input_element;
      var input_str;
  
      return new Promise(function (resolve) {
                         input_element = document.createElement("INPUT");
  
                         print("? ");
                         input_element.setAttribute("type", "text");
                         input_element.setAttribute("length", "50");
                         document.getElementById("output").appendChild(input_element);
                         input_element.focus();
                         input_str = undefined;
                         input_element.addEventListener("keydown", function (event) {
                                                        if (event.keyCode == 13) {
                                                        input_str = input_element.value;
                                                        document.getElementById("output").removeChild(input_element);
                                                        print(input_str);
                                                        print("\n");
                                                        resolve(input_str);
                                                        }
                                                        });
                         });
  }
  
  function tab(space)
  {
      var str = "";
      while (space-- > 0)
          str += " ";
      return str;
  }
  
  var p9;
  var c9;
  var b;
  var w;
  var f;
  var m;
  
  var qa;
  var sa;
  var ss;
  var as;
  var gs;
  var hs;
  
  function initialize_qa()
  {
      for (s = 1; s <= p9; s++)
          qa[s] = 0;
  }
  
  function increment_qa()
  {
      if (qa[1] <= 0) {
          // If zero, this is our firt increment: make all ones
          for (s = 1; s <= p9; s++)
              qa[s] = 1;
      } else {
          q = 1;
          while (1) {
              qa[q] = qa[q] + 1;
              if (qa[q] <= c9)
                  return;
              qa[q] = 1;
              q++;
          }
      }
  }
  
  function convert_qa()
  {
      for (s = 1; s <= p9; s++) {
          as[s] = ls.substr(qa[s] - 1, 1);
      }
  }
  
  function get_number()
  {
      b = 0;
      w = 0;
      f = 0;
      for (s = 1; s <= p9; s++) {
          if (gs[s] == as[s]) {
              b++;
              gs[s] = String.fromCharCode(f);
              as[s] = String.fromCharCode(f + 1);
              f += 2;
          } else {
              for (t = 1; t <= p9; t++) {
                  if (gs[s] == as[t] && gs[t] != as[t]) {
                      w++;
                      as[t] = String.fromCharCode(f);
                      gs[s] = String.fromCharCode(f + 1);
                      f += 2;
                      break;
                  }
              }
          }
      }
  }
  
  function convert_qa_hs()
  {
      for (s = 1; s <= p9; s++) {
          hs[s] = ls.substr(qa[s] - 1, 1);
      }
  }
  
  function copy_hs()
  {
      for (s = 1; s <= p9; s++) {
          gs[s] = hs[s];
      }
  }
  
  function board_printout()
  {
      print("\n");
      print("BOARD\n");
      print("MOVE     GUESS          BLACK     WHITE\n");
      for (z = 1; z <= m - 1; z++) {
          str = " " + z + " ";
          while (str.length < 9)
              str += " ";
          str += ss[z];
          while (str.length < 25)
              str += " ";
          str += sa[z][1];
          while (str.length < 35)
              str += " ";
          str += sa[z][2];
          print(str + "\n");
      }
      print("\n");
  }
  
  function quit()
  {
      print("QUITTER!  MY COMBINATION WAS: ");
      convert_qa();
      for (x = 1; x <= p9; x++) {
          print(as[x]);
      }
      print("\n");
      print("GOOD BYE\n");
  }
  
  function show_score()
  {
      print("SCORE:\n");
      show_points();
  }
  
  function show_points()
  {
      print("     COMPUTER " + c + "\n");
      print("     HUMAN    " + h + "\n");
      print("\n");
  }
  
  var color = ["BLACK", "WHITE", "RED", "GREEN",
               "ORANGE", "YELLOW", "PURPLE", "TAN"];
  
  // Main program
  async function main()
  {
      print(tab(30) + "MASTERMIND\n");
      print(tab(15) + "CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY\n");
      print("\n");
      print("\n");
      print("\n");
      //
      //  MASTERMIND II
      //  STEVE NORTH
      //  CREATIVE COMPUTING
      //  PO BOX 789-M MORRISTOWN NEW JERSEY 07960
      //
      //
      while (1) {
          print("NUMBER OF COLORS");
          c9 = parseInt(await input());
          if (c9 <= 8)
              break;
          print("NO MORE THAN 8, PLEASE!\n");
      }
      print("NUMBER OF POSITIONS");
      p9 = parseInt(await input());
      print("NUMBER OF ROUNDS");
      r9 = parseInt(await input());
      p = Math.pow(c9, p9);
      print("TOTAL POSSIBILITIES = " + p + "\n");
      h = 0;
      c = 0;
      qa = [];
      sa = [];
      ss = [];
      as = [];
      gs = [];
      ia = [];
      hs = [];
      ls = "BWRGOYPT";
      print("\n");
      print("\n");
      print("COLOR    LETTER\n");
      print("=====    ======\n");
      for (x = 1; x <= c9; x++) {
          str = color[x - 1];
          while (str.length < 13)
              str += " ";
          str += ls.substr(x - 1, 1);
          print(str + "\n");
      }
      print("\n");
      for (r = 1; r <= r9; r++) {
          print("\n");
          print("ROUND NUMBER " + r + " ----\n");
          print("\n");
          print("GUESS MY COMBINATION.\n");
          print("\n");
          // Get a combination
          a = Math.floor(p * Math.random() + 1);
          initialize_qa();
          for (x = 1; x <= a; x++) {
              increment_qa();
          }
          for (m = 1; m <= 10; m++) {
              while (1) {
                  print("MOVE # " + m + " GUESS ");
                  str = await input();
                  if (str == "BOARD") {
                      board_printout();
                  } else if (str == "QUIT") {
                      quit();
                      return;
                  } else if (str.length != p9) {
                      print("BAD NUMBER OF POSITIONS.\n");
                  } else {
                      // Unpack str into gs(1-p9)
                      for (x = 1; x <= p9; x++) {
                          y = ls.indexOf(str.substr(x - 1, 1));
                          if (y < 0) {
                              print("'" + str.substr(x - 1, 1) + "' IS UNRECOGNIZED.\n");
                              break;
                          }
                          gs[x] = str.substr(x - 1, 1);
                      }
                      if (x > p9)
                          break;
                  }
              }
              // Now we convert qa(1-p9) into as(1-p9) [ACTUAL GUESS]
              convert_qa();
              // And get number of blacks and white
              get_number();
              if (b == p9) {
                  print("YOU GUESSED IT IN " + m + " MOVES!\n");
                  break;
              }
              //tell human results
              print("YOU HAVE " + b + " BLACKS AND " + w + " WHITES.")
              // Save all this stuff for board printout later
              ss[m] = str;
              sa[m] = [];
              sa[m][1] = b;
              sa[m][2] = w;
          }
          if (m > 10) {
              print("YOU RAN OUT OF MOVES!  THAT'S ALL YOU GET!\n");
          }
          h += m;
          show_score();
  
          //
          // Now computer guesses
          //
          for (x = 1; x <= p; x++)
              ia[x] = 1;
          print("NOW I GUESS.  THINK OF A COMBINATION.\n");
          print("HIT RETURN WHEN READY:");
          str = await input();
          for (m = 1; m <= 10; m++) {
              initialize_qa();
              // Find a guess
              g = Math.floor(p * Math.random() + 1);
              if (ia[g] != 1) {
                  for (x = g; x <= p; x++) {
                      if (ia[x] == 1)
                          break;
                  }
                  if (x > p) {
                      for (x = 1; x <= g; x++) {
                          if (ia[x] == 1)
                              break;
                      }
                      if (x > g) {
                          print("YOU HAVE GIVEN ME INCONSISTENT INFORMATION.\n");
                          print("TRY AGAIN, AND THIS TIME PLEASE BE MORE CAREFUL.\n");
                          for (x = 1; x <= p; x++)
                              ia[x] = 1;
                          print("NOW I GUESS.  THINK OF A COMBINATION.\n");
                          print("HIT RETURN WHEN READY:");
                          str = await input();
                          m = 0;
                          continue;
                      }
                  }
                  g = x;
              }
              // Now we convert guess #g into gs
              for (x = 1; x <= g; x++) {
                  increment_qa();
              }
              convert_qa_hs();
              print("MY GUESS IS: ");
              for (x = 1; x <= p9; x++) {
                  print(hs[x]);
              }
              print("  BLACKS, WHITES ");
              str = await input();
              b1 = parseInt(str);
              w1 = parseInt(str.substr(str.indexOf(",") + 1));
              if (b1 == p9) {
                  print("I GOT IT IN " + m + " MOVES!\n");
                  break;
              }
              initialize_qa();
              for (x = 1; x <= p; x++) {
                  increment_qa();
                  if (ia[x] != 0) {
                      copy_hs();
                      convert_qa();
                      get_number();
                      if (b1 > b || w1 > w)
                          ia[x] = 0;
                  }
              }
          }
          if (m > 10) {
              print("I USED UP ALL MY MOVES!\n");
              print("I GUESS MY CPU I JUST HAVING AN OFF DAY.\n");
          }
          c += m;
          show_score();
      }
      print("GAME OVER\n");
      print("FINAL SCORE:\n");
      show_points();
  }
  
  main();
  