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


秘密の地図

問題の説明


ニオは秘密の地図を手に持って、プロドが普段私房のお金を隠している場所を教えた.しかし、この秘密地図はデジタル暗号化されており、位置を確認するために解読が必要です.幸いなことに、地図のパスワードを解読する方法が書かれたメモも見つかった.
  • 地図は、エッジ長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以下である.
  • 出力フォーマット


    元の秘密地図を復号し、「#」と出力し、スペースからなる文字列の配列です.

    私の答え

    function solution(n, arr1, arr2) {
        let answer = [];
        let crack1 = [];
        let crack2 = [];
        let result = Array.from({length: arr1.length}, undefined => ""); 
     
        for(let number of arr1){
            crack1.push(number.toString(2).padStart(arr1.length,'0'));
        }
        for(let number of arr2){
            crack2.push(number.toString(2).padStart(arr2.length,'0'));
        }
        for(let i = 0; i < crack1.length; i++){
            for(let j = 0; j < crack1.length; j++){
                if(crack1[i][j] === '1' || crack2[i][j] === '1'){
                    result[i] += '#';
                }
                else{
                    result[i] += ' ';
                }   
           } 
        }
        return result;
    }

    他人の解答

    function solution(n, arr1, arr2) {
        return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' '));
    }
    
    const addZero = (n, s) => {
        return '0'.repeat(n - s.length) + s;
    }

    P.S.


    arr 1の要素を2進数で返し、前のスペースを0で埋めて正確な比較(padStart)を行います.次に、2 D配列を読むときに、2つの地図のいずれかが1と認識された場合、文字列「#」または「」で埋めます.このとき,配列は初期化されず,文字列の前にundefined,Arrayが出力される.from関数を用いて問題を解決した.
    他の人のプールを表示する場合は、ビット演算子OR(|)を使用して2つの配列の要素を2進数で処理し、結リンゴ値を2進数(toString)に戻します.次に、nからバイナリ数の長さを減算して0を入力し、replaceを使用してグローバルの1譲受人を「#」に変換し、0は「」を表して新しい配列を返します.(map)
    この問題はコードを書くと同時に,他のコードが学ぶべき内容もたくさん発見された.😃 特に,正規表現を用いてコードを簡単に減らすことができる点は非常に不思議である.新しく学んだことを逐次漸進的に整理しなければならない.🙃