プログラマーコードテスト-人形を抽出


1.コードテスト練習


いくつかの項目を作ったので,コードの質をさらに高めるために,学習アルゴリズムと資料構造を決定する.必要だと言う人もいれば、そうではないと言う人もいますが、個人的には不自然なことをするのが好きではありませんし、何かをした以上はしっかりやるべきだと思うので、勉強することにしました.同時に、今後CS知識とC言語を学び、基礎を固める.
現在アルゴリズムについてはほとんど素人です.プログラマーの中で最も容易な符号化テストに恐れず参加しただけだ.
人形を捕まえるテストですまず説明を見てください.

だから消えた最終人形の数を見つければいいのです.
文章を読み始めたばかりの頃から迷っていました.何から手をつけたらいいか分からない.だから最も簡単なことから順番に進むことにした.巡視Boardは動作に合わせて選びます
そんな簡単なことから、道が不思議にスムーズになりました.このまま三日...△そんなに時間をかけるべきではない...しかし、私はやったと信じています.何の助けも得られず、ヒントも見ず、独りぼっちで捕まえて放さず、結果は成功した!ハーモニーを公開!
let first = [];

let rearrangedBoard = [];

let basket = [];

let same = [];

let board = [
  [0, 0, 0, 0, 0],
  [0, 0, 1, 0, 3],
  [0, 2, 5, 0, 1],
  [4, 2, 4, 4, 2],
  [3, 5, 1, 3, 1],
];

let moves = [1, 5, 3, 5, 1, 2, 1, 4];
// moves가 7이상이면 버그 발생함 일단 디버거로 차근차근 훑어보면서 확인해보자

function solution(board, moves) {
  pickUpDolls(board, moves);
  sameElementExtractor();
  return same.length;
}

const result = solution(board, moves);
console.log(board);
console.log(basket);
console.log(same);
console.log(result);

// rearragne board sequence to get dolls ready to be picked up.(but not necessary anymore due to picupDolls)
function rearrangeBoard(board) {
  // let boardContents = board[0];
  let whileLoopNum = board[0].length;
  let num = 0;
  while (num < whileLoopNum) {
    for (var i = 0; i < board.length; i++) {
      let boardFirstNum = board[i][0];
      first.push(boardFirstNum);
      let index = board[i].indexOf(boardFirstNum);
      board[i].splice(index, 1);
    }
    rearrangedBoard.push(first);
    first = [];
    num++;
  }
}

// Picking up dolls according to moves
function pickUpDolls(board, moves) {
  // let boardContents = board[0];
  for (var m = 0; m < moves.length; m++) {
    for (var i = 0; i < board.length; i++) {
      let movesNum = moves[m] - 1;
      let boardLine = board[i][movesNum];
      if (boardLine !== 0) {
        basket.push(boardLine);
        board[i].splice(movesNum, 1, 0);
        break;
      }
    }
  }
}

// Extract same dolls and put them in the array called 'same'
function sameElementExtractor() {
  while (true) {
    let isThereAnySameThing = sameElementsDetector(basket);
    if (!isThereAnySameThing) {
      break;
    }
    console.log(basket);
    for (var m = 0; m < basket.length; m++) {
      if (basket[m] === basket[m + 1]) {
        same.push(basket[m], basket[m + 1]);
        console.log(basket[m], basket[m + 1]);
        basket.splice(m, 2);
        break;
      }
    }
  }
}

// shows Whther there are any same dolls left in a raw in the basket
function sameElementsDetector(array) {
  for (var n = 0; n < array.length; n++) {
    if (array[n] === array[n + 1]) {
      return true;
    }
  }
}

// 일단 답을 구하긴 했다. 근데 노가다로 구한거다 진짜...
// 기능을 더 추가해서 확장성을 높이자 (class clawMachine)
// 인형뽑기가 끝나고 나서 기계에 남아있는 인형들 보여주기(showDollsInMachine)
// 인형뽑기가 끝나고 나서 바구니에 남아있는 인형들 보여주기(showDollsInBasket)
// 인형뽑기가 끝나고 나서 어떤 인형이 없어졌는지 보여주기(showDisappearedDolls)
// 인형뽑기가 끝나고 나서 없어진 인형의 갯수 보여주기(showNumberOfDisappearedDolls)
こうして実現した.初めて質問を開始し,答えが増えるにつれてガイドラインを可視化する.

2.質問と答え。レリーズプロセス


質問:
本当にどうやって解くの?まず最初の要素を抽出して単独で収集しますか?何からですか.ぼんやりした
全部集めてから吸いますか?それともBoardを巡視しながら吸いますか?
答え
rearrangeBoard(board)
1 boardを巡回し、最初の要素を最初に入れ、最初の要素を消去します.次の行に移動
2 firstarrayを並べ替え板に入れ、firstを初期化します.
3つ目のプロセスは、繰り返しボードの配列長です.
4既存のarrayを新しいarrayで上書きし、LSに格納する.
pickUpDolls(moves)
1.並べ替えボード内で移動した数字に従って移動します.
2.爪がmovies数字がその数字の2番目に達することを理解すると、0は出会った最初の数字を直接通過して抽出する.
3.かごに入れる
4.かごに入れた数字を並べ替え板から0にする
5.上記の手順を繰り返して
sameElementExtractor(basket)
1.かごの中の数字を見て、同じ数字が連続している場合は、同じ数字に入れます.
2.そしてその数字をかごから削除します.フィルタの使用
3.連続する数字がなくなるまで
これが一番いい方法ですか?ここでこれ以上発展できませんか?悩みました.
修正した答え
boardでループしながらmove順に数字を近づけて抽出すればよい.成功した!髪が大きい.
pickUpDolls(moves)
1.黒板を数字で移動します.
2.爪がその数字の2番目に届いたとき、0はそのまま通り過ぎて、巡視を続け、出会った最初の数字を引き出します.
3.抽出した数字をかごに入れる
4.バスケットの数字をBoardで0にする
5.上記の手順を繰り返して
ただし、filterを使用すると、前後の2つの同じ要素が消えた配列を返します.
したがって,2つの連続した同じ要素だけを除去するにはsplice(index,2)を使用する必要がある.
後の論理は前の答えと同じです.
エラー
moves = [1, 5, 2, 3, 5, 3, 5, 6, 2];

let board = [
  [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 3, 0],
    [0, 4, 5, 0, 1, 5],
    [4, 2, 4, 4, 2, 8],
    [3, 5, 1, 3, 1, 1],
    [3, 5, 1, 3, 1, 1],
  ],
];
そうなると、7回目(5行目の人型抜きの場合)の抜きでエラーが発生します.エラーはバスケットの結果である[4,3,4,1,5,2,5].
最後の数字は2のはずですが、5になりました.もしそうなら、同じ[1,1,5,5]のはずですが、つまり[1,1,5,5,5,5]・・・
いったい何が問題なのか...デバッグして、一つ一つ実行して、わかりました.
デバッグ
移動中に7回目にぬいぐるみを捕まえようとすると(5行目で選択)2を引きます.では、4列目の5番目の人形を除去しますが、4列目の2番目の人形を除去します.
前から2を探していたので、2番目に2があったので、ここで発見されました.だから最後に人形を捕まえた時は5回捕まえられますかごの中に同じ数があれば、前からブラウズし、初めて選択された内容から2つ削除するので、5、5は削除されず、5、2は削除されます.
したがってsplice()で削除する必要がある場所はindexOfではなくmovesNumとmです.
より明確に命令を下すことです.
大きな髪が本当に破れた何も知らないうちに、いろいろな汚い愚かな方法でコードします.
数回の試行錯誤を経て、探したり探したりして、最後には落ち着いて答えを見つけたり、再包装したり、ある程度の命名法を修正したりしました.
最初は勝手に書いて、何か思いついたら、本当に勝手に書いてもいいです.
それではそこに道が見えますそのように一つ一つ研究して解決していけば,進展が得られる.
プログラミングから人生を学びました.来ました.
そしてテストに合格すると、他の人は答えを見ることができます.通過するよりも重要な過程かもしれません.