challenge 正整数のゲーデル数化?

正の整数 n を引数としてとり, 2^d1 * 3^d2 * 5^d3 ... * pk^dk を返す関数
goedel を定義してください.

ただし,n を10進表現で k 桁の数としたときの各桁の数が数列 [d1,d2,d3,...,dk]
をなすとし,dk が 1 の位,d1 が 10^(k-1) の位です.また,pk は k番目の素数です.

goedel   9  ⇒ 2^9             ⇒  512
goedel  81  ⇒ 2^8 * 3^1       ⇒  768
goedel 230  ⇒ 2^2 * 3^3 * 5^0 ⇒  108

Posted feedbacks - Erlang

1> c(goedel).
{ok,goedel}
2> goedel:goedel(9).
512
3> goedel:goedel(81).
768
4> goedel:goedel(230).
108
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-module(goedel).
-export([goedel/1]).

prime(Num) -> prime(Num - 1, [2], 3).

prime(0, List, _) -> lists:last(List);
prime(Num, List, Max) ->
    case lists:any(fun(X) -> (Max rem X) =:= 0 end, List) of
        true  -> prime(Num, List, Max + 2);
        false -> prime(Num - 1, List ++ [Max], Max + 2)
    end.

pow({_, 0}) -> 1;
pow({X, Y}) -> X * pow({X, Y - 1}).

column(Num) -> length(hd(io_lib:format("~B", [Num]))).

goedel(Num) ->
    List = [pow(X) || X <- goedel(Num, [], column(Num))],
    lists:foldl(fun(X, Proc) -> X * Proc end, 1, List).

goedel(_, List, 0) -> lists:zip([prime(X) || X <- lists:seq(1, length(List))], List);
goedel(Num, List, Size) -> goedel(Num div 10, [Num rem 10] ++ List, Size - 1).

Index

Feed

Other

Link

Pathtraq

loading...