心の旅 blog

心だけでも旅に出れる

【いろんな言語で書いてみた】与えられた2つの文字列がアナグラムであるか判定する関数

PHP

<?php

/**
 * アナグラム判定(ただし、半角英数字のみ)
 *
 * @param string $str1
 * @param string $str2
 * @return boolean
 */
function isAnagram($str1, $str2)
{
  $strs1 = _sort($str1);
  $strs2 = _sort($str2);

  if($strs1 !== $strs2) {
    return false;
  }

  return true;
}

/**
 * 文字列の中のスペースを除去して、aから順にソートする
 * @param string $str
 * @return array
 */
function _sort($str)
{
  $str = str_replace(" ", "", trim($str));
  $strs = str_split($str);
  $strs = array_filter($strs);
  sort($strs);
  return $strs;
}

$str1 = "anagrams";
$str2 = "ars magna";

var_dump(isAnagram($str1, $str2));

JavaScript

/**
 * アナグラム判定
 */

/**
 * Anagramクラス
 *
 * @param [string] str1
 * @param [string] str2
 */
Anagram = function(str1, str2) {
  this.str1 = str1;
  this.str2 = str2;
}

/**
 * アナグラムかどうか判定
 *
 * @return [bool]
 */
Anagram.prototype.isAnagram = function() {

  strs1 = this._sort(this.str1);
  strs2 = this._sort(this.str2);

  if(strs1.toString() != strs2.toString()) {
    return false;
  }

  return true;
}

/**
 * 文字列を配列にしてソート
 * @param [string] str
 * @return [array]
 */
Anagram.prototype._sort = function(str) {
  return str.trim().replace(" ", "").split("").sort();
}


var str1 = "anagrams";
var str2 = "ars magna";
var anagram = new Anagram(str1, str2);
console.log(anagram.isAnagram());

Ruby

# coding: utf-8
#
# 与えられた2つの文字列がAnagramかどうか判定する
#

# 与えられた2つの文字列がAnagramかどうか関数(ただし英数字のみ しかも小文字)
# @param [string] str1 文字
# @param [string] str2 文字
# @return [bool]
def is_anagram(str1, str2)

  strs1 = _sort(str1)
  strs2 = _sort(str2)

  if strs1 != strs2
    return false
  end

  return true
end

# 文字列を配列にし、aから順にソートして返す
# @desc timrして空白除去して、配列にして、ソート
# @param [string] str
# @return [array]
def _sort(str)
  return str.strip.delete(" ").split("").sort
end

str1 = "anagrams"
str2 = "ars magna"
puts is_anagram(str1, str2)

Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def is_anagram(str1, str2):

  strs1 = _sort(str1)
  strs2 = _sort(str2)

  if strs1 != strs2:
    return False

  return True

def _sort(str):
  str = str.strip().replace(' ', '')
  strs = list(str)
  strs.sort()
  return strs

if __name__ == "__main__":
  str1 = "anagrams"
  str2 = "ars magna"
  print is_anagram(str1, str2)

Go

package main

import "fmt"
import "strings"
import "sort"
import "reflect"

func _Sort(str string) []string {

>-str = strings.Trim(str, " ")
>-str = strings.Replace(str, " ", "", -1)

>-strs := strings.Split(str, "")
>-sort.Strings(strs)

>-return strs
}

func IsAnagram(str1 string, str2 string) bool {

>-strs1 := _Sort(str1)
>-strs2 := _Sort(str2)

>-if reflect.DeepEqual(strs1, strs2) == false {
>->-return false
>-}

>-return true
}

func main() {
>-var str1 string = "anagrams"
>-var str2 string = "ars magna"
>-// 文字列を逆にする
>-fmt.Println(IsAnagram(str1, str2))
}

Elixir

#
# 2つの文字がアナグラムかどうか判定する
#

defmodule IsAnagram do
  def main(str1, str2) do
    strs1 = _sort(str1)
    strs2 = _sort(str2)

    if strs1 != strs2 do
      false
    else
      true
    end
  end

  defp _sort(str) do
    str = String.strip(str)
    str = String.replace(str, " ", "")
    strs = String.split(str, "")
    strs = Enum.sort(strs)
    strs
  end
end


str1 = "aanagrams"
str2 = "ars magna"
IO.puts IsAnagram.main(str1, str2)