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


秘密の地図


質問リンク

問題の説明


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

    出力フォーマット


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

    私の答え

    def solution(n, arr1, arr2):
        answer = []
        arr1_2 = []
        arr2_2 = []
        for i in range(0, n):
            arr1_2.append(bin(arr1[i])[2:].rjust(n, '0'))
            arr2_2.append(bin(arr2[i])[2:].rjust(n, '0'))
    
            answer2 = ''
            for j in range(0, n):
                    if arr1_2[i][j] == '1' or arr2_2[i][j] == '1':
                        answer2+='#'
                    else :
                        answer2+=' '
            answer.append(answer2)
        return answer
  • は、まず、与えられたリストarr 1およびarr 2をバイナリ数に変換する.前列が0の場合は0を省略するので0を埋める必要があります.したがって、rjust()関数を使用して変換されたバイナリ数がnビット数未満の場合、右揃えでスペース「0」を埋めます.その後if文を使用して2つのリストの要素を比較し、「#」または「」に変換して答えを完了します.
  • 他人の解答

    def solution(n, arr1, arr2):
        answer = []
        for i,j in zip(arr1,arr2):
            a12 = str(bin(i|j)[2:])
            a12=a12.rjust(n,'0')
            a12=a12.replace('1','#')
            a12=a12.replace('0',' ')
            answer.append(a12)
        return answer
    これは
  • ビット演算子を用いて解く方法である.問題のルールを読んですぐに、ビット演算子論理演算子「or」を使って解くことができると思いましたが、もっとよく知っているif文を使いました.アイデアがあっても,コードで直接実現するのは別の問題のようだ.zip()関数はわかりませんが、この機会に慣れなければなりません.Pythonの様々な内蔵関数をさらに学ぶ必要がある.