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 - Batchfile

NT系のCMD.EXEでは、SET /Aで計算ができます。

このコード、goedel.batという名で保存してください。バッチファイルが体を張って関数goedelという形態になっているということにさせてください。さすがにバッチファイル内でサブルーチンは無理です……よね?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@ECHO OFF
If NOT "%1"=="/R" (
    CALL %0 /R %1 2 3 5 7 11
    GOTO EXIT
)
SET /A G = 1
SET /A T = %2
:NEXT
    SET /A N = %T:~0,1% + 0
    FOR /L %%I IN (1, 1, %N%) DO SET /A G *= %3
    SET /A T = %T:~1% + 0
    SHIFT
IF NOT "%T%"=="0" GOTO NEXT

ECHO %G%

:EXIT

> バッチファイル内でサブルーチンは無理です... よね?

setlocalとendlocalで変数のスコープを区切り、callと:EOFを組み
合わせればできます。

バッチなので限界はありますが、整数 nの桁数に応じて素数を生成
するようにしました。

素数を生成する部分もサブルーチンにしたかったのですが、戻り値
に複数の値(擬似的な配列)を返すことができなかったので、そこは
あきらめました。

  e.g.
    C:\>@echo off & (for %n in (9 81 230) do #100.bat %n) & echo on
    512
    768
    108
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
@echo off
  setlocal enabledelayedexpansion
    set G=1
    set i=0
    set j=0
    set k=1
    set l=0
    set n=%~1
    set p=
    set t=0
    set v=0
    set x=1
    
    (echo %n%) | findstr /r [0-9] > NUL 2>&1 || (echo usage: %~n0 NUMBER >&2 & exit /b 1)
    
    call :length %n% l
    
    :: 素数を生成
    set p[0]=2
    :LOOP_1
      if %k% geq %l% goto BREAK
      set /a x+=2
      set j=0
      :LOOP_2
        if %j% lss %k% (
          set /a t=x%%!p[%j%]!
          if !t! neq 0 (
            set /a j+=1
            goto LOOP_2
          )
        )
      if %j% equ %k% (
        set p[!k!]=%x%
        set /a k+=1
      )
      goto LOOP_1
    :BREAK
    
    set /a l-=1
    for /l %%i in (0,1,%l%) do (
      call :power !p[%%i]! !n:~%%i,1! v
      set /a G*=v
    )
  endlocal & echo %G%
goto :EOF

:length
  setlocal enabledelayedexpansion
    set i=0
    set t=%~1
    
    if not "%t%" == "" (
      :_
        set t=!t:~1!
        set /a i+=1
      if not "!t!" == "" goto _
    )
  endlocal & set %~2=%i%
goto :EOF

:power
  setlocal
    set n=1
    
    for /l %%i in (1,1,%~2) do set /a n*=%~1
  endlocal & set %~3=%n%
goto :EOF

Index

Feed

Other

Link

Pathtraq

loading...