[プログラマー]秘密地図-Javascript


問題の説明


秘密の地図


ニオは秘密の地図を手に持って、プロドが普段私房のお金を隠している場所を教えた.しかし、この秘密地図はデジタル暗号化されており、位置を確認するために解読が必要です.幸いなことに、地図のパスワードを解読する方法が書かれたメモも見つかった.
  • 地図は、エッジ長がNの正方形のエッジバー形式で、各セグメントは「空白」("")または「壁」("#")の2種類から構成されています.
  • 全図は、2つの地図を重ね合わせることによって得ることができる.それぞれ「地図1」と「地図2」と言います.地図1または地図2のいずれかが壁である部分は、地図全体でも壁である.地図1も地図2も空白の部分であり、地図全体においても空白である.
  • 「地図1」と「地図2」はそれぞれ整数配列で暗号化されている.
  • 暗号化された配列は、地図の各横線において、壁部分を1に符号化し、空白部分を0に符号化したときのバイナリ数の配列である.

    ニオがフロドの私房金を手に入れるために、秘密地図のパスワードを解読するのに役立つプログラムを作成しました.
  • 入力フォーマット


    地図に入るエッジサイズnと2つの整数配列arr 1とarr 2を入力します.
  • 1 ≦ n ≦ 16
  • arr 1,arr 2は長さnの整数配列である.
  • 整数配列の各要素xがバイナリ数に変換されたときの長さはn以下である.すなわち、0≦x≦2 n−1を満たす.
  • 出力フォーマット

  • の元の秘密地図を解読し、「#」、スペースからなる文字列配列で出力します.
  • I/O例


    パラメータ値n 5 arr 1[9,20,28,17,11]arr 2[30,1,21,17,28]出力[#########################################################]
    パラメータ値n 6 arr 1[46,33,33,22,31,50]arr 2[27,56,19,14,14,10]出力[######################################################################################

    に答える

    function solution(n, arr1, arr2) {
        let answer1 = [];
        let answer2 = [];
        for (let i = 0; i < n; i++) {
            // 지도 1
            let num1 = arr1[i].toString(2);
            let result1 = [];
            // 부족한 배열의 길이만큼 0 push
            for (let j = 0; j < n - num1.length; j++) {
                result1.push(0)
            }
            // 2진수 순서대로 push
            for (let j = 0; j < num1.length; j++) {
                result1.push(num1[j])
            }
            answer1.push(result1);
            
            // 지도 2
            let num2 = arr2[i].toString(2);
            let result2 = [];
            for (let j = 0; j < n - num2.length; j++) {
                result2.push(0)
            }
            for (let j = 0; j < num2.length; j++) {
                result2.push(num2[j])
            }
            answer2.push(result2);
        }
        
        let correct = [];
        for (let i = 0; i < n; i++) {
            let temp = "";
            for (let j = 0; j < n; j++) {
                // 둘 중의 하나라도 1이면 "#"추가
                parseInt(answer1[i][j]) !== 0 || parseInt(answer2[i][j]) !== 0 ? temp += "#" : temp += " ";
            }
            correct.push(temp);
        }
        return correct;
    }
    まず,地図1と地図2を二重forゲートを用いて図中の二次配列に従う.
    入力した数字をバイナリに変更し,1つの配列を形成してpushを行う.
    その後、2つの配列の同じ位置に1つの値がある場合は、"#"を追加して正しい配列を作成します.

    他人の解答

    function solution(n, arr1, arr2) { 
      return arr1.map((a,i)=>(a|arr2[i]).toString(2).padStart(n,0).replace(/0/g,'').replace(/1/g,'#')) 
    }
    上記の解答ではmap法を用いてarr 1を繰り返し,配列中の要素aと配列中の要素aのインデックスを求め,arr 2中のインデックスと比較した.ここで、a|arr 2[i]はOR演算を行う.

    ビット演算では|を用い,ビットの論理和を求めることができる.ビットロジックを求めた後、padStartで0を埋め、正規表現を使用してグローバルで0と1を検索し、replaceメソッドを使用して0を「,1を返す」を「#」に戻します.