プログラマ脳を鍛える数学パズル01

Posted on November 20, 2016

http://www.shoeisha.co.jp/book/detail/9784798142456

↑の本を解こうという試みです haskellで解きました.

01.10進数・2進数・8進数のいずれも回文数となる数のうち,10進数の10以上で最小の数を求めよ

rubyの場合(回答コピペ)

num = 11
while true
  if num.to_s == num.to_s.reverse &&
     num.to_s(8) == num.to_s(8).reverse &&
     num.to_s(2) == num.to_s(2).reverse
        puts num
        break
  end
  num += 1
end

シンプルで良い

javaで書いてみた

public class Main {
  public static void main(String[] args) {
  int num = 11;
  while (true)
    int num2 = Integer.toBinaryString(num);
    int num8 = Integer.toOctalString(num);

    StringBuffer sb = new StringBuffer(num);
    StringBuffer sb2 = new StringBuffer(num2);
    StringBuffer sb8 = new StringBuffer(num8);

    if String.valueOf(num).equals(sb.reverse().toString()) &&
       String.valueOf(num2).equals(sb2.reverse().toString()) &&
       String.valueOf(num8).equals(sb8.reverse().toString())  {
        System.out.println(num)
        break;
    }
    num += 1
  }
}

javaっぽい.すごい長い. 標準出力がSystem.out.printlnってやばいと思う.

haskellで書いてみた

module Main where

import Lib
import Char
import System

main :: IO ()
main = do
  num = 11
  print (judge num)


judge num
  | isSame (show num) && isSame (dec2x num 2) && isSame (dec2x num 8) == True = num
  | otherwise = judge num + 1


n2ascii n
  | n <= 9    = chr ((ord '0') + n)
  | otherwise = chr ((ord 'a') + n - 10)

dec2x     :: Int -> Int -> [Char]
dec2x 0 x =  []
dec2x n x =  n2ascii (n `mod` x) : dec2x (n `div` x) x

isSame :: String -> Bool
check n = n == reverse n

judge関数で返ってきたものを出力する. dec2xとn2asciiは進数変換のための関数です. judge関数ではパターンマッチでisSame=trueが10進数2進数8進数全てで成立した場合その数字を返し, そうでない場合はインクリメントして再帰する.

haskellはループが標準では書けないので基本的には再帰でループを表現する. 結構難しかった.もう寝ます.

https://github.com/ygnmhdtt/q01 ソースは上記にあげてあります. おやすみなさい