Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】2つの数値の2進表現がアナグラムかどうかを判定するプログラム


2つの数値が与えられたとき、その2進表現同士がアナグラム(同じ文字を並べ替えたもの)になっているかどうかを判定します。Pythonでは、collectionsモジュールのCounterクラスと辞書の比較を組み合わせることで、この問題をシンプルかつ効率的に解くことができます。

実行例

入力: a = 8, b = 16
出力: Yes
両方の数値の2進表現は、0と1の個数が同一です。

アルゴリズム

ステップ1 : 2つの数値を受け取ります。
ステップ2 : bin()関数で各数値を2進数の文字列に変換し、接頭辞「0b」に相当する先頭2文字を取り除きます。
ステップ3 : 2つの2進表現は長さが異なる場合があるため、短い方の文字列の先頭に0を追加し、両方を同じ長さに揃えます。
ステップ4 : 両方の文字列をCounterで辞書化して比較します。0と1の出現回数が完全に一致していれば、2つの数値の2進表現はアナグラムであると判定できます。

サンプルコード

# 2つの数値の2進表現がアナグラムかどうかをチェックする関数
from collections import Counter

def anagramoftwonumber(p1, p2):
   # 数値を2進数の文字列に変換
   # bin()の出力には「0b」という接頭辞が付くため、先頭2文字を除去
   bno1 = bin(p1)[2:]
   bno2 = bin(p2)[2:]

   # 短い方の文字列の先頭に0を追加して長さを揃える
   zeros = abs(len(bno1) - len(bno2))
   if (len(bno1) > len(bno2)):
      bno2 = zeros * '0' + bno2
   else:
      bno1 = zeros * '0' + bno1

   # 2進表現をCounter(辞書)に変換
   dict1 = Counter(bno1)
   dict2 = Counter(bno2)

   # 両方の辞書を比較
   if dict1 == dict2:
      print(p1, p2, "は互いにアナグラムです")
   else:
      print(p1, p2, "はアナグラムではありません")

# ドライバープログラム
if __name__ == "__main__":
   n1 = int(input("1つ目の数値を入力してください ::>"))
   n2 = int(input("2つ目の数値を入力してください ::>"))
   anagramoftwonumber(n1, n2)

出力結果

1つ目の数値を入力してください ::>8
2つ目の数値を入力してください ::>16
8 16 は互いにアナグラムです

1つ目の数値を入力してください ::>3
2つ目の数値を入力してください ::>2
3 2 はアナグラムではありません

補足:先頭に0を追加する理由

たとえば、8の2進表現は「1000」、16の2進表現は「10000」です。このまま比較すると0の個数が異なるためアナグラムにはなりませんが、短い方の「1000」の先頭に0を1つ追加して「01000」にすれば、両者とも「0が4個・1が1個」となり、アナグラムと判定されます。この前処理によって、桁数の違いに左右されず、0と1の構成だけで公平に比較できるようになります。

別のアプローチ:sorted()を使う方法

Counterの代わりに、長さを揃えた2進文字列をsorted()でソートして比較する方法もあります。ソート後の文字列が一致すれば、それはアナグラムであることを意味します。

def is_anagram_binary(a, b):
    ba, bb = bin(a)[2:], bin(b)[2:]
    diff = abs(len(ba) - len(bb))
    if len(ba) > len(bb):
        bb = '0' * diff + bb
    else:
        ba = '0' * diff + ba
    return sorted(ba) == sorted(bb)

print(is_anagram_binary(8, 16))  # True
print(is_anagram_binary(3, 2))   # False

  1. Pythonで素数を判定するプログラムの書き方を徹底解説

    はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない

  2. Pythonでアームストロング数を判定するプログラムの書き方

    この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。 問題の定義 整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。 アームストロング数とは? n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。 abcd... = a^n + b^n + c^n + d^n + … つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認す