음이 아닌 실수 A 의 평방근 sqrt(A) 를 구하는 Heron 의 방법:

        반복함수  g(x) = (x + A/x) / 2   를 이용

 

실수 A 의 n제곱근 root(n, A) 를 구하는 Newton-Raphson 의 방법

        반복함수  g(x) = ((n-1)*x + A/(x**(n - 1))) / n    를 이용

n = 2 인 경우에는 Newton-Raphson 의 방법이 Heron 의 방법과 동일하다.

(참조. http://en.wikipedia.org/wiki/Newton's_method )

 

Scala 언어에는 지수 계산을 위한 함수 scala.math.pow(밑수, 지수) 가 이미 구현되어 있다. 하지만 차후 필요한 데가 있을 것 같아서 이와 유사한 n 제곱 함수와 n 제곱근 함수를 구현해 보았다.

지수가 정수인 거듭제곱을 계산하는  함수도 nPow(), gPow, mPow() 세 개 구현해 놓았는데, 이들 세 함수는 절차적 언어의 성능상 재귀호출이 아니고 단순 반복 기법을 사용하는 함수이다. 이 세 함수 중 mPow() 의 성능이 가장 우수하다. 큰 지수의 경우 for 반복문의 반복회수를 따져 보면 성능 비교를 할 수 있을 것이다. (성능 비교를 위해 세 가지를 모두 소스에 남겨 두었다.) mPow() 함수는 n 제곱근을 구하는 재귀함수 newtonNthRoot(int, double) 의 구현에 사용되기도 한다. if ... else ... 구문이 많아 소스가 복잡하게 보일지 모르겠으나 이는 밑수나 지수가 음수이거나 0인 경우의 처리를 위함이다. 구현된 모든 함수의 구현에는 예외상황(예를 들어, 음수의 짝수 제곱근 같은 예외상황) 처리 과정이 있다.

 

1. Scala 언어는 JVM(자바가상기계) 위에서 동작하는 (절차적 프로그래밍도 지원하는) 함수형 언어이다.

   하지만, 아래의 소스에서는 함수형 언어의 기능은 거의 사용하지 않앗고, 절차적 언어의 기능을 위주로 사용하였다. 하나의 함수를 구현하는데 함수형 기능과 절차적 기능을 섞어서 사용하는 것은 좋지 않은 습관이다.

2. Scala  언어는 타입에 동적인(dynamic) 언어이다. 변수 선언시에 타입을 지정하지 않아도 된다.

3. Scala  언어에서는 val 로 선언 된 것은 상수, var 로 선언된 것은 변수이다.

     val a = 2.7      // a 상수
     var b = 5.3     // b 는 변수 

아래의 소스 첫 부분에

        val MAX_ITER = 20000
        val M_EPSILON = 1.0e-15
       

라고 선언하였으니, MAX_ITER 와 M_EPSILON 는 상수로 선언되었다.

4. Scala 언어에는 return 이라는 예약어가 없다. 그냥 리턴될 값만 수식으로 표현해 놓으면, Scala 컴파일러(또는 Scala 인터프리터)가 리턴될 값을 알아서 인식하고 처리해 준다.

5. 예외상황 처리를 위해 예외 던지기 구문 throw ... 와 예외 받기 구문 try ... catch ...을 이용하였다.

/*
 * Filename: testNthRoot.scala
 *
 *            Approximate square roots, cubic roots and n-th roots of a given number.
 *
 * Execute: scalac -d . testNthRoot.scala
 * Execute: scala testNthRoot
 *
 * Date: 2013. 1. 8.
 * Copyright (c) 2013 PH Kim  (pkim __AT__ scripts.pe.kr)
 */

import java.io._

object testNthRoot {

    val MAX_ITER = 20000
    val M_EPSILON = 1.0e-15
   
   
    //
    // Compute the n-th root of x to a given scale, x > 0.
    //
    def nPow(a: Double, n: Int) : Double = {
        if (n > 0) {
            if (n == 1)
                return a
            else {
                if (a == 0.0 || a == 1.0)
                    return a
                else if (a == -1.0) {
                    if ((n % 2) == 1)
                        return -1.0
                    else
                        return 1.0
                }
                else if (a < 0.0) {
                    if ((n % 2) == 1)
                        return -nPow(-a, n)
                    else
                        return nPow(-a, n)
                }
                else {
                    var y = 1.0
                    for (i <- 1 to n) {
                        y = y * a
                    }
                    return y
                }
            }
        }
        else if (n == 0)
            return 1.0
        else {     //  when n < 0
            if (a == 0.0) {
                throw new RuntimeException("Negative powering exception of zero.")
            }
            else {
                if (n == -1)
                    return 1.0/a
                else
                   return 1.0/nPow(a, -n)
            }
        }
    }


    //
    // Compute the n-th root of x to a given scale, x > 0.
    //
    def gPow(a: Double, n: Int) : Double = {
        if (n > 0) {
            if (n == 1)
                return a
            else {
                if (a == 0.0 || a == 1.0)
                    return a
                else if (a == -1.0) {
                    if ((n % 2) == 1)
                        return -1.0
                    else
                        return 1.0
                }
                else if (a < 0.0) {
                    if ((n % 2) == 1)
                        return -gPow(-a, n)
                    else
                        return gPow(-a, n)
                }
                else {
                    var y = 1.0
                    var r = a
                    var m = 8*4 - 1            //  8*sizeof(int) - 1;
                    var one = 1
                    for (i <- 0 to m) {
                        if ((n & one) == 0)
                            y = y * 1.0
                        else {
                            y = y * r
                        }
                        r = r*r
                        one = (one << 1)
                        if (one > n) {
                            return y
                        }
                    }
                    return y
                }
            }
        }
        else if (n == 0)
            return 1.0
        else {     //  when n < 0
            if (a == 0.0) {
                throw new RuntimeException("Negative powering exception of zero.")
            }
            else {
                if (n == -1)
                    return 1.0/a
                else
                    return 1.0/gPow(a, -n)
            }
        }
    }


    //
    // Compute the n-th root of x to a given scale, x > 0.
    //
    def mPow(a: Double, n: Int) : Double = {
        if (n > 0) {
            if (n == 1)
                return a
            else {
                if (a == 0.0 || a == 1.0)
                    return a
                else if (a == -1.0) {
                    if ((n % 2) == 1)
                        return -1.0
                    else
                        return 1.0
                }
                else if (a < 0.0) {
                    if ((n % 2) == 1)
                        return -mPow(-a, n)
                    else
                        return mPow(-a, n)
                }
                else {
                    var y = 1.0
                    var r = a
                    var m = n
                    while (m > 0) {
                        if ((m & 0x1) == 1) {
                            y = y * r
                        }
                        r = r*r
                        m = (m >> 1)
                    }
                    return y
                }
            }
        }
        else if (n == 0)
            return 1.0
        else {     //  when n < 0
            if (a == 0.0) {
                throw new RuntimeException("Negative powering exception of zero.")
            }
            else {
                if (n == -1)
                    return 1.0/a
                else
                    return 1.0/mPow(a, -n)
            }
        }
    }


    //
    // Compute the square root of x to a given scale, x > 0.
    //
    def heronSqrt(a: Double) : Double = {
        if (a < 0.0) {
            throw new RuntimeException("Cannot find the sqrt of a negative number.")
        }
        else if (a == 0.0 || a == 1.0)
            a
        else {
            var x1 = a
            var x2 = (x1 + a/x1)/2.0
            var er = x1 - x2
            var counter = 0
            var not_stop = true
            while (x1 + er != x1 && not_stop) {
                x1 = x2
                x2 = (x1 + a/x1)/2.0
                er = x1 - x2
                if (scala.math.abs(er) < scala.math.abs(M_EPSILON*x1)) {
                    not_stop = false
               }
                counter = counter + 1
                if (counter > MAX_ITER) {
                    // break
                    not_stop = false
                }
            }
            if (counter >= MAX_ITER) {
                    throw new RuntimeException("Inaccurate sqrt exception by too many iterations.")
            }
            x2
        }
    }


    //
    // Compute the cubic root of x to a given scale, x > 0.
    //
    def newtonCbrt(a: Double) : Double = {
        if (a == 0.0 || a == 1.0 || a == -1.0 )
            a
        else if (a < 0.0) {
            return -newtonCbrt(-a)
        }
        else {
            var x1 = a
            var x2 = (2.0*x1 + a/(x1*x1))/3.0
            var er = x1 - x2
            var counter = 0
            var not_stop = true
            while (x1 + er != x1 && not_stop) {
                x1 = x2
                x2 = (2.0*x1 + a/(x1*x1))/3.0
                er = x1 - x2
                if (scala.math.abs(er) < scala.math.abs(M_EPSILON*x1)) {
                    not_stop = false
                }
                counter = counter + 1
                if (counter > MAX_ITER) {
                    not_stop = false
                }
            }
            if (counter >= MAX_ITER) {
                throw new RuntimeException("Inaccurate cbrt exception by too many iterations.")
            }
            return x2
        }
    }


    //
    // Compute the n-th root of x to a given scale, x > 0.
    //
    def newtonNthRoot(n: Int, a: Double) : Double = {
        if (n == 0)
            1.0
        else if (n == 1)
            a
        else if (n > 0) {
            if (a == 0.0 || a == 1.0)
                a
            else if (a == -1.0) {
                if ((n % 2) == 1)
                    a
                else {
                    throw new RuntimeException("Cannot find the even n-th root of a negative number.")
                }
            }
            else if (a < 0.0) {
                if ((n % 2) == 1)
                    -newtonNthRoot(n, -a)
                else {
                    throw new RuntimeException("Cannot find the even n-th root of a negative number.")
                }
            }
            else if (a < 1.0)
                1.0/newtonNthRoot(n, 1.0/a)
            else {
                var x1 = a
                var xn = mPow(x1, n - 1)
                var x2 = ((n - 1)*x1 + a/xn)/n
                var er = x1 - x2
                var counter = 0
                var not_stop = true
                while (x1 + er != x1 && not_stop) {
                    x1 = x2
                    xn = mPow(x1, n - 1)
                    x2 = ((n - 1)*x1 + a/xn)/n
                    er = x1 - x2
                    if (scala.math.abs(er) < scala.math.abs(M_EPSILON*x1)) {
                        not_stop = false
                    }
                    counter = counter + 1
                    if (counter > MAX_ITER) {
                        not_stop = false
                    }
                }
                if (counter >= MAX_ITER) {
                    throw new RuntimeException("Inaccurate n-th root exception by too many iterations.")
                }
                x2
            }
        }
        else {
            if (a == 0.0) {
                throw new RuntimeException("Cannot find the negative n-th root of zero.")
            }
            else
                1.0/newtonNthRoot(-n, a)
        }
    }

 

    def main(args: Array[String]) {
            var x : Double = 16
            var u = scala.math.sqrt(x)

            printf("[ Testing heronSqrt(double) ]--------------------\n")
            printf("x = %g\n", x)
            printf("u = sqrt(%g) = %g\n", x, u)
            var y = heronSqrt(x)
            printf("y = heronSqrt(%g) = %g\n", x, y)
            printf("y*y = %g\n", y*y)
            printf("\n")

            x = 729000000000.0
            printf("x = %g\n", x)
            printf("exp(log(x)/3.0) = %g\n", scala.math.exp(scala.math.log(x)/3.0))
            var w = newtonCbrt(x)
            printf("w = newtonCbrt(%g) = %g\n", x, w)
            printf("w*w*w = %g\n", w*w*w)
            printf("\n")

            printf("[ Testing newtonNthRoot(int, double) ]--------------------\n")
            var z = newtonNthRoot(3, x)
            printf("x = %g\n", x)
            printf("z = newtonNthRoot(3, %g) = %g\n", x, z)
            printf("z*z*z = %g\n", z*z*z)
            printf("\n")

            x = 12960000000000000000.0
            z = newtonNthRoot(4, x)
            printf("x = %g\n", x)
            printf("z = newtonNthRoot(4, x) = newtonNthRoot(4, %g) =  %g\n", x, z)
            printf("z*z*z*z = %g\n", z*z*z*z)
            printf("\n")

            x = 1.0/12960000000000000000.0
            z = newtonNthRoot(4, x)
            printf("x = %g\n", x)
            printf("exp(log(x)/4.0) = %g\n", scala.math.exp(scala.math.log(x)/4.0))
            printf("z = newtonNthRoot(4, x) = newtonNthRoot(4, %g) =  %g\n", x, z)
            printf("z*z*z*z = %g\n", z*z*z*z)
            printf("\n")


            try {
                x = -4.0
                printf("[ Test Exception heronSqrt(double) ]--------------------\n")
                printf("x = %g\n", x)
                printf("Calculating heronSqrt(%g)\n", x)
                y = heronSqrt(x)
                printf("y = heronSqrt(%g) = %g\n", x, y)
                printf("y*y = %g\n", y*y)
                printf("\n")
            }
            catch {
                case ex : RuntimeException =>
                        printf("%s\nCaught some exception in calculating heronSqrt(%g)\n", ex.getMessage(),  x);
                        printf("\n")
            }

            try {
                x = -4.0
                printf("[ Test Exception newtonCbrt(double) ]--------------------\n")
                printf("x = %g\n", x)
                printf("Calculating newtonCbrt(%g)\n", x)
                y = newtonCbrt(x)
                printf("y = newtonCbrt(%g) = %g\n", x, y)
                printf("y*y*y = %g\n", y*y*y)
                printf("\n")
            }
            catch {
                case ex : RuntimeException =>
                        printf("%s\nCaught some exception in calculating newtonCbrtrt(%g)\n", ex.getMessage(),  x);
                        printf("\n")
            }


            printf("[ Test calculations by powering ]-----------------------------\n")
            x = 200.0
            z = newtonNthRoot(10,  x)
            printf("x = %g\n", x)
            printf("exp(log(x)/10.0) = %g\n",  scala.math.exp(scala.math.log(x)/10.0))
            printf("z = newtonNthRoot(10, x) = newtonNthRoot(10, %g) = %g\n", x, z)
            printf("pow(z, 10.0) = %g\n", scala.math.pow(z, 10.0))
            printf("\n")

            x = 3001.0
            z = newtonNthRoot(99, x)
            printf("x = %g\n", x)
            printf("exp(log(x)/99.0) = %g\n", scala.math.exp(scala.math.log(x)/99.0))
            printf("z = newtonNthRoot(99, x) = newtonNthRoot(99, %g) = %g\n", x, z)
            printf("pow(z, 99) = %g\n", scala.math.pow(z, 99.0))
            printf("\n")

            x = 3001.0
            z = newtonNthRoot(-99, x)
            printf("x = %g\n", x)
            printf("exp(log(x)/-99.0) = %g\n", scala.math.exp(scala.math.log(x)/(-99.0)))
            printf("z = newtonNthRoot(-99, x) = newtonNthRoot(-99, %g) = %g\n", x, z)
            printf("1.0/pow(z, 99) = %g\n", 1.0/scala.math.pow(z, 99.0))
            printf("\n")

            printf("2.1**2.1 = pow(2.1, 2.1) = %g\n", scala.math.pow(2.1, 2.1))
            printf("2.1**(-2.1) = pow(2.1, -2.1) = %g\n", scala.math.pow(2.1, -2.1))
            printf("2.1**2.1 * 2.1**(-2.1) = pow(2.1, 2.1) * pow(2.1, -2.1) = %g\n",  scala.math.pow(2.1, 2.1) * scala.math.pow(2.1, -2.1))
            printf("2.1**2.1 = exp(2.1*log(2.1)) = %g\n", scala.math.exp(2.1*scala.math.log(2.1)))
            printf("2.1**(-2.1) = exp(-2.1*log(2.1)) = %g\n", scala.math.exp(-2.1*scala.math.log(2.1)))
            printf("2.1**2.1 * 2.1**(-2.1) = exp(2.1*log(2.1)) * exp(-2.1*log(2.1)) = %g\n", scala.math.pow(2.1, 2.1) * scala.math.pow(2.1, -2.1))
            printf("\n")


            var k : Int = 301
            x = -1.029
            var t1 = nPow(x, k)
            var t2 = gPow(x, k)
            var t3 = mPow(x, k)
            var tt =  scala.math.pow(x, k)
            printf("scala.math.sqrt(%g, %d) = %g\n", x, k, tt)
            printf("t1 = nPow(%g, %d) = %g\n", x, k, t1)
            printf("t2 = gPow(%g, %d) = %g\n", x, k, t2)
            printf("t3 = mPow(%g, %d) = %g\n", x, k, t3)
            printf("t1 / t2 = %g\n", t1 / t2)
            printf("t1 - t2 = %g\n", t1 - t2)
            printf("t1 == t2 ? " )
            if (t1 == t2) printf("yes\n") else printf("no\n")
            printf("t1 / t3 = %g\n", t1 / t3)
            printf("t1 - t3 = %g\n", t1 - t3)
            printf("t1 == t3 ? " )
            if (t1 == t3) printf("yes\n") else printf("no\n")
            printf("t2 / t3 = %g\n", t2 / t3)
            printf("t2 - t3 = %g\n", t2 - t3)
            printf("t2 == t3 ? " )
            if (t2 == t3) printf("yes\n") else printf("no\n")
            printf("\n")

            printf("Done.\n")
    }

}


/*
Output:
[ Testing heronSqrt(double) ]--------------------
x = 16.0000
u = sqrt(16.0000) = 4.00000
y = heronSqrt(16.0000) = 4.00000
y*y = 16.0000

x = 7.29000e+11
exp(log(x)/3.0) = 9000.00
w = newtonCbrt(7.29000e+11) = 9000.00
w*w*w = 7.29000e+11

[ Testing newtonNthRoot(int, double) ]--------------------
x = 7.29000e+11
z = newtonNthRoot(3, 7.29000e+11) = 9000.00
z*z*z = 7.29000e+11

x = 1.29600e+19
z = newtonNthRoot(4, x) = newtonNthRoot(4, 1.29600e+19) =  60000.0
z*z*z*z = 1.29600e+19

x = 7.71605e-20
exp(log(x)/4.0) = 1.66667e-05
z = newtonNthRoot(4, x) = newtonNthRoot(4, 7.71605e-20) =  1.66667e-05
z*z*z*z = 7.71605e-20

[ Test Exception heronSqrt(double) ]--------------------
x = -4.00000
Calculating heronSqrt(-4.00000)
Cannot find the sqrt of a negative number.
Caught some exception in calculating heronSqrt(-4.00000)

[ Test Exception newtonCbrt(double) ]--------------------
x = -4.00000
Calculating newtonCbrt(-4.00000)
y = newtonCbrt(-4.00000) = -1.58740
y*y*y = -4.00000

[ Test calculations by powering ]-----------------------------
x = 200.000
exp(log(x)/10.0) = 1.69865
z = newtonNthRoot(10, x) = newtonNthRoot(10, 200.000) = 1.69865
pow(z, 10.0) = 200.000

x = 3001.00
exp(log(x)/99.0) = 1.08424
z = newtonNthRoot(99, x) = newtonNthRoot(99, 3001.00) = 1.08424
pow(z, 99) = 3001.00

x = 3001.00
exp(log(x)/-99.0) = 0.922308
z = newtonNthRoot(-99, x) = newtonNthRoot(-99, 3001.00) = 0.922308
1.0/pow(z, 99) = 3001.00

2.1**2.1 = pow(2.1, 2.1) = 4.74964
2.1**(-2.1) = pow(2.1, -2.1) = 0.210542
2.1**2.1 * 2.1**(-2.1) = pow(2.1, 2.1) * pow(2.1, -2.1) = 1.00000
2.1**2.1 = exp(2.1*log(2.1)) = 4.74964
2.1**(-2.1) = exp(-2.1*log(2.1)) = 0.210542
2.1**2.1 * 2.1**(-2.1) = exp(2.1*log(2.1)) * exp(-2.1*log(2.1)) = 1.00000

scala.math.sqrt(-1.02900, 301) = -5457.93
t1 = nPow(-1.02900, 301) = -5457.93
t2 = gPow(-1.02900, 301) = -5457.93
t3 = mPow(-1.02900, 301) = -5457.93
t1 / t2 = 1.00000
t1 - t2 = 6.18456e-11
t1 == t2 ? no
t1 / t3 = 1.00000
t1 - t3 = 6.18456e-11
t1 == t3 ? no
t2 / t3 = 1.00000
t2 - t3 = 0.00000
t2 == t3 ? yes

Done.
*/

 

 

Posted by Scripter
,

역삼각함수란 삼각함수의 역함수를 의미하고,

역쌍곡선함수란 쌍곡선함수의 역함수를 의미한다.

수학에서 sin 함수의 역함수는 arcsin 으로 표기되는데,

Scala 언어에서는 scala.math.asin(Double) 메소드로 구현되어 있다.

/*
 * Filename: testArcSine.scala
 *
 * Execute: scala -deprecation testArcSine.scala
 *
 *  Or
 *
 * Compile: scalac -d. -deprecation testArcSine.scala
 * Execute: scala -classpath . -deprecation testArcSine
 *
 * Date: 2013. 1. 1.
 * Copyright (c) pkim _AT_ scripts.pe.kr
 */

import java.io._

object testArcSine {
        def sin(x: Double) : Double = {
            var y = scala.math.sin(x)
            return y
        }

        def asin(x: Double) : Double = {
            var y = scala.math.asin(x)
            return y
        }

        def acos(x: Double) : Double = {
            var y = scala.math.acos(x)
            return y
        }

        def sinh(x: Double) : Double = {
            var y = scala.math.sinh(x)
            return y
        }

        def cosh(x: Double) : Double = {
            var y = scala.math.cosh(x)
            return y
        }

        def asinh(x: Double) : Double = {
            var y = scala.math.log(x + scala.math.sqrt(x*x + 1))
            return y
        }

        def acosh(x: Double) : Double = {
            var y = scala.math.log(x + scala.math.sqrt(x*x - 1))
            return y
        }

        def main(args: Array[String]) {
            var x = -0.9
            var y = asin(x)
            printf("y = asin(%.1g) = %.9f\n", x,  y)
            printf("sin(y) = sin(%.9f) = %.1g\n",  y, sin(y))
            printf("\n")

            x = 1.1
            var u = acosh(x)
            printf("u = acosh(%3.2g) = %.10f\n", x,  u)

            var v = asinh(x)
            printf("v = asinh(%3.2g) = %.10f\n", x,  v)

            printf("cosh(u) = cosh(%.10f) = %3.2g\n", u,  cosh(u))
            printf("sinh(v) = sinh(%.10f) = %3.2g\n", v,  sinh(v))
        }
}

/*
Output:
y = asin(-0.9) = -1.119769515
sin(y) = sin(-1.119769515) = -0.9

u = acosh(1.1) = 0.4435682544
v = asinh(1.1) = 0.9503469298
cosh(u) = cosh(0.4435682544) = 1.1
sinh(v) = sinh(0.9503469298) = 1.1
*/

 

 

 

Posted by Scripter
,
Scala 언어는 명령형 언어와 함수형 언어의 특징을 모두 갖고 있으며,
그 구문 바탕은 Java의 것을 빌려 쓴다. 또한 Java 언어 처럼 타입에 엄격한
(strictly typed) 언어이다.
변수 선언이나 함수의 매개변수 표기하는 방식을 Visual Basic의 것과 비슷하다.
Visual Basic에서 Dim이라는 키워드가 Scala 언어에서는 var이다.

Scala 언어로 숫자 맞추기 게임을 작성해 보았다.
소스에서 눈여겨볼 부분은 18째~20째 줄이다.

      var r : BufferedReader = new BufferedReader(new InputStreamReader(System.in))
      var sbuf = r.readLine()
      var guess = Integer.parseInt(sbuf)

번수 선언이 Visual Basic의 것과 유사한 것 말고는 Java의 구문과 거의 같다.



소스 파일명: guessNumber01.scala
  1. /*
  2.  *  Filename: guessNumber01.scala
  3.  *  Purpose:  Interatice game guessing a given number.
  4.  *                if {CONDITION) {
  5.  *                    ......
  6.  *                }
  7.  *                else {
  8.  *                    ......
  9.  *                }
  10.  *  Execute: scala -encoding MS949 guessNumber01.scala
  11.  */
  12. import java.io._
  13. import java.util._
  14. def doGuessing(num: Int) {
  15.     println("Enter your guess:")
  16.     var r : BufferedReader = new BufferedReader(new InputStreamReader(System.in))
  17.     var sbuf = r.readLine()
  18.     var guess = Integer.parseInt(sbuf)
  19.     if (guess == num) {
  20.         println("You win!")
  21.         return
  22.     }
  23.     // we won't get here if guess == num
  24.     if (guess < num) {
  25.         println("Too low!")
  26.         doGuessing(num)
  27.     }
  28.     else {
  29.         println("Too high!")
  30.         doGuessing(num)
  31.     }
  32. }
  33. doGuessing(123)



실행> scala -encoding MS949 guessNumber01.scala
Enter your guess:
111
Too low!
Enter your guess:
222
Too high!
Enter your guess:
123
You win!




Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.




Posted by Scripter
,

Scala 언어로는 리스트 대신 배열로 처리하였다.
 
[파일명:  testStringFindInArray.scala]------------------------------------------------
object TestStringFindInArray {
    def quickSort(arr: Array[String], start: Int, end: Int) {
        var i: Int = start
        var k: Int = end
        var pivot: String = ""

        if (end - start >= 1) {
            pivot = arr(start)
            while (k > i) {
                 while (arr(i) <= pivot && i <= end && k > i) {
                     i += 1
                 }
                 while (arr(k) > pivot && k >= start && k >= i) {
                     k -= 1
                 }
                 if (k > i) {
                     swap(arr, i, k)
                 }
             }
            swap(arr, start, k)

            quickSort(arr, start, k - 1)
            quickSort(arr, k + 1, end)
        }
    }

    def swap(arr: Array[String], x: Int, y: Int) {
        var tmp: String = arr(x)
        arr(x) = arr(y)
        arr(y) = tmp
    }

    def find(arr: Array[String], s: String): Int = {
        var i: Int = 0
        for (i <- 0 to arr.length - 1) {
        if (arr(i).indexOf(s) >= 0) {
     return i
        }
        }
    return -1
    }

    def printArray(arr: Array[String]) {
        print("[")
        for (i <- 0 to arr.length - 2) {
           print(arr(i) + ", ")
        }
        println(arr(arr.length - 1) + "]")
    }

    def main(args: Array[String]) {
        var words: Array[String] = Array[String]( "하나", "둘", "셋", "넷", "다섯", "여섯" )
        var where: Int = 0

        print("array: ")
        printArray(words)

        where = find(words, "셋")
        if (where > 0) {
            print("발견!  ")
            println("Next word of 셋 in array: " + words(where+1))
        }

        quickSort(words, 0, words.length - 1)

        print("array: ")
        printArray(words)

        where = find(words, "셋")
        if (where > 0) {
            print("발견!  ")
            println("Next word of 셋 in array: " + words(where+1))
        }
    }
}
------------------------------------------------


컴파일> scalac -encoding ms949 testStringFindInArray.scala

실행> scala testStringFindInArray
array: [하나, 둘, 셋, 넷, 다섯, 여섯]
발견!  Next word of 셋 in array: 넷
Sorting...
array: [넷, 다섯, 둘, 셋, 여섯, 하나]
발견!  Next word of 셋 in array: 여섯


크리에이티브 커먼즈 라이선스
Creative Commons License

Posted by Scripter
,


[파일명:  TestSort.scala]------------------------------------------------
object TestSort {
    def quickSort(arr: Array[String], start: Int, end: Int) {
        var i: Int = start
        var k: Int = end
        var pivot: String = ""

        if (end - start >= 1) {
            pivot = arr(start)
            while (k > i) {
                 while (arr(i) <= pivot && i <= end && k > i) {
                     i += 1
                 }
                 while (arr(k) > pivot && k >= start && k >= i) {
                     k -= 1
                 }
                 if (k > i) {
                     swap(arr, i, k)
                 }
             }
            swap(arr, start, k)

            quickSort(arr, start, k - 1)
            quickSort(arr, k + 1, end)
        }
    }

    def swap(arr: Array[String], x: Int, y: Int) {
        var tmp: String = arr(x)
        arr(x) = arr(y)
        arr(y) = tmp
    }

    def printArray(arr: Array[String]) {
        print("[")
        for (i <- 0 to arr.length - 2) {
           print(arr(i) + ", ")
        }
        println(arr(arr.length - 1) + "]")
    }

    def main(args: Array[String]) {
        var arr: Array[String] = for (a <- args) yield a 
        quickSort(arr, 0, arr.length - 1)
        printArray(arr)
    }
}
------------------------------------------------



캄파일> scalac -d . testSort.scala

실행> scala testSort 하나 둘 셋 넷 다섯
[넷, 다섯, 둘, 셋, 하나]


 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Scripter
,

다음은  대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 Scala 소스 코드이다.
메뉴는 주메뉴 Command: (S)et radix, (A)bout, (Q)uit or E(x)it
와 부메뉴 SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
로 구성되어 있으며, 진법 변환의 핵심은 java.lang.Integer 클래스와 java.lang.Long 클래스의 정적 메소드

         Integer.parseInt(String, int); 
         java.lang.Long.toString(long, int);

울 이용하였으며, 지원되는 진법은 2진법에서 36진법 까지이다. 참고로 Java의 Long 타입과 Scala의 Long 타입은 다르므로, 여기서는 java.lang.Long.toString 처럼 Long 타입의 패키지명을 꼭 붙여야 한다. Scala에는 Integer 타입 대신 Int 타입을 쓰므로 Integer.parseInt는 그대로 써도 된다.

Scala 언어의 try ... catch ... finally ... 구문은

        try {
              블럭
        }
        catch {
             case e1 : 예외타입 =>
                  블럭
             case e2 : 예외타입 =>
                  블럭
        }
        finally {
              블럭
        }




  1. /*
  2.  *  Filename: convertRadix.scala
  3.  *            Convert radix in a interactive mode.
  4.  *
  5.  *  Execute: scala convertRadix.scala
  6.  *
  7.  *      Date:  2009/03/09
  8.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  9.  */
  10. import java.io._
  11. import java.util._
  12. def printUsage() {
  13.     println("Usage: scala convertRadix.scala")
  14.     println("Convert radix in a interactive mode, where the maximum radix is 36.")
  15. }
  16. def printAbout() {
  17.     println("    About: Convert radix in a interactive mode.")
  18. }
  19. def printMainMenu() {
  20.     println("  Command: (S)et radix, (A)bout, (Q)uit or E(x)it")
  21. }
  22. def printMainPrompt() {
  23.     print("  Prompt> ")
  24. }
  25. def printSubMenu(srcRadix : Int, destRadix : Int) {
  26.     println("    Convert Radix_" + srcRadix + " to Radix_" + destRadix)
  27.     println("    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit")
  28. }
  29. def printSubPrompt() {
  30.     print("    Input Value>> ")
  31. }
  32. def convertRadix(s : String, srcRdx : Int, destRdx : Int) : String = {
  33.     var value : Long = 0L
  34.     var t = ""
  35.     try {
  36.         value = Integer.parseInt(s, srcRdx)
  37.         t = java.lang.Long.toString(value, destRdx)
  38.         return t.toUpperCase()
  39.     }
  40.     catch {
  41.         case e : NumberFormatException =>
  42.             println("    Error: " + e.getMessage() + " cantains some invalid character.")
  43.             t = "????"
  44.             return t
  45.     }
  46.     finally {
  47.       return t.toUpperCase()
  48.     }
  49. }
  50. def doConvert(r : BufferedReader, srcRadix : Int, destRadix : Int) {
  51.     var line = ""
  52.     var cmd = ""
  53.     var srcStr = ""
  54.     var destStr = ""
  55.     println()
  56.     printSubMenu(srcRadix, destRadix)
  57.     try {
  58.         while (true) {
  59.             printSubPrompt()
  60.             cmd = r.readLine()
  61.             if ("main()".equals(cmd)) {
  62.                 return
  63.             }
  64.             else if ("exit()".equals(cmd) || "quit()".equals(cmd)) {
  65.                 System.exit(0)
  66.             }
  67.             try {
  68.                 Integer.parseInt(cmd, srcRadix)
  69.                 srcStr = cmd
  70.                 destStr = convertRadix(srcStr, srcRadix, destRadix)
  71.                 println("        ( " + srcStr + " )_" + srcRadix +  "   --->   ( " + destStr + " )_" + destRadix)
  72.                 println()
  73.             }
  74.             catch {
  75.                 case e : NumberFormatException =>
  76.                     println("    NumberFormatException: " + e.getMessage())
  77.                 case e : IOException =>
  78.                     e.printStackTrace()
  79.             }
  80.         }
  81.     }
  82. }
  83. def doStart() {
  84.     var line = ""
  85.     var cmd = ""
  86.     var srcRadix = 10
  87.     var destRadix = 10
  88.     var srcStr = ""
  89.     var destStr = ""
  90.     var onlyOnce : Boolean = true
  91.     var r : BufferedReader = new BufferedReader(new InputStreamReader(System.in))
  92.     try {
  93.         while (true) {
  94.             println()
  95.             if (onlyOnce) {
  96.                 println("  The supported maximum radix is 36.")
  97.                 onlyOnce = false
  98.             }
  99.             printMainMenu()
  100.             printMainPrompt()
  101.             cmd = r.readLine()
  102.             if ("qQxX".contains(cmd) && cmd.length() == 1) {
  103.                 System.exit(0)
  104.             }
  105.             else if ("aA".contains(cmd) && cmd.length() == 1) {
  106.                 printAbout()
  107.             }
  108.             else if ("sS".contains(cmd) && cmd.length() == 1) {
  109.                 print("  Input the source and target radices (say, 16 2): ")
  110.                 line = r.readLine()
  111.                 var st : StringTokenizer = new StringTokenizer(line, " ,\t")
  112.                 while (st.countTokens() < 2) {
  113.                     print("  Input the source and target radices (say, 16 2): ")
  114.                     line = r.readLine()
  115.                     st = new StringTokenizer(line, " ,\t");
  116.                 }
  117.                 srcRadix = Integer.parseInt(st.nextToken())
  118.                 destRadix = Integer.parseInt(st.nextToken())
  119.                 doConvert(r, srcRadix, destRadix)
  120.             }
  121.         }
  122.     }
  123.     catch {
  124.         case e: IOException =>
  125.             e.printStackTrace()
  126.     }
  127. }
  128. // Begin here
  129. if (args.length > 0 && "-h".equals(args(0))) {
  130.     printUsage()
  131.     System.exit(1)
  132. }
  133. doStart()



실행> scala convertRadix.scala

  The supported maximum radix is 36.
  Command: (S)et radix, (A)bout, (Q)uit or E(x)it
  Prompt> s
  Input the source and target radices (say, 16 2): 16 2

    Convert Radix_16 to Radix_2
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 1FF
        ( 1FF )_16   --->   ( 111111111 )_2

    Input Value>> main()

  Command: (S)et radix, (A)bout, (Q)uit or E(x)it
  Prompt> S
  Input the source and target radices (say, 16 2): 2 8

    Convert Radix_2 to Radix_8
    SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit
    Input Value>> 1011001
        ( 1011001 )_2   --->   ( 131 )_8

    Input Value>> main()

  Command: (S)et radix, (A)bout, (Q)uit or E(x)it
  Prompt> x




Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.


Posted by Scripter
,

다음은  이차방정식 x^2 - x - 1  = 0 의 양의 근 즉 황금비율(golden ratio)을 구하는 Scala애플리케이션 소스이다. 황금비율을 구하는 비례방정식은   1 : x = x : (x+1) 이며, 이를 이차방정식으로 표현한 것이 x^2 - x - 1  = 0 이다.

See:  http://en.wikipedia.org/wiki/Golden_ratio

  1. /*
  2.  *  Filename: testGoldenRatio.scala
  3.  *    황금률(즉, 이차방정식 x^2 - x - 1  = 0 의 양의 근)을 계산한다. 
  4.  *
  5.  *   Execute: scala testGoldenRatio.scala
  6.  *
  7.  *      Date:  2009/03/09
  8.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  9.  */
  10. def printUsing() {
  11.     println("Using: scala testGoldenRatio.scala [-h|-help]")
  12.     println("This calculates the value of the golden ratio.")
  13. }
  14. // 이차방정식 a x^2 + b x + c  = 0 의 근을 구한다.
  15. def findQuadraticRoot(a: Double, b: Double, c: Double) : Array[Double] = {
  16.     if (a == 0.0) {
  17.         throw new RuntimeException("Since the highest coefficient is zero, the given equation is not a quadratic equation.")
  18.     }
  19.     else if (b*b - 4*a*c < 0.0) {
  20.         throw new RuntimeException("Since the discriminant " + (b*b - 4*a*c) + " is negative, the given equation has no real root.")
  21.     }
  22.     var x1 : Double = (-b + Math.sqrt(b*b - 4*a*c)) / (2.0 * a)
  23.     var x2 : Double = (-b - Math.sqrt(b*b - 4*a*c)) / (2.0 * a)
  24.     var array : Array[Double] = Array(x1, x2)
  25.     return array
  26. }
  27. // 실행 시작 지점
  28. if (args.length > 0 && (args(0).equals("-h") || args(0).equals("-help"))) {
  29.     printUsing()
  30.     System.exit(1)
  31. }
  32. var values : Array[Double] = findQuadraticRoot(1.0, -1.0, -1.0)
  33. var x1 : Double = values(0)
  34. var x2 : Double = values(1)
  35. if (x1 >= x2) {
  36.     println("The bigger root is " + x1 + ", ")
  37.     println("and the less root is " + x2 + ".")
  38. }
  39. else {
  40.     println("The bigger root is " + x2 + ", ")
  41.     println("and the less root is " + x1 + ".")
  42. }



실행> scala testGoldenRatio.scala
The bigger root is 1.618033988749895,
and the less root is -0.6180339887498949.



크리에이티브 커먼즈 라이선스
Creative Commons License


 

Posted by Scripter
,

현재 시각을 컨솔에 보여주는 간단한 애플리케이션의 Scala 언어 소스 코드이다.
UTC란 1970년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초 단위의 총 시간을 의미한다.
* UTC(Universal Time  Coordinated, 협정세계시, 協定世界時)


  1. /*
  2.  *  Filename: testCTime.scala
  3.  *
  4.  *  Compile: scalac -encoding MS949 testCTime.scala
  5.  *  Execute: scala TestCTimeApp
  6.  */
  7. import java.util._
  8. object TestCTimeApp {
  9.     var weekNames : Array[String] = Array( "일", "월", "화", "수", "목", "금", "토" )
  10.     def main(args: Array[String]) {
  11.         def now : Calendar = new GregorianCalendar()
  12.         // 1970년 1월 1일 0시 0분 0초부터 시작하여 현재까지의 초
  13.         // println("UTC: " + (now.getTime().getTime().intdiv(1000L)) + "초")   // for Groovy
  14.         println("UTC: " + (now.getTime().getTime() / 1000L) + "초")
  15.         // 현재 시각 표시: 200x년 x월 xx일 (x요일) xx시 xx분 xx초
  16.         print(now.get(Calendar.YEAR) + "년 ")
  17.         print((1 + now.get(Calendar.MONTH)) + "월 ")
  18.         print(now.get(Calendar.DAY_OF_MONTH) +"일 ")
  19.         print("(" + weekNames(now.get(Calendar.DAY_OF_WEEK)) + "요일) ")
  20.         print(now.get(Calendar.HOUR_OF_DAY) + "시 ")
  21.         print(now.get(Calendar.MINUTE) + "분 ")
  22.         println(now.get(Calendar.SECOND) + "초")
  23.         // 1월 1일은 1, 1월 2일은 2
  24.         print("올해 몇 번째 날: " + now.get(Calendar.DAY_OF_YEAR) +", ")
  25.         // 0 이면 서머타임 없음
  26.         // println("서머타임 적용 여부: " + (now.get(Calendar.DST_OFFSET) == 0 ? "안함" : "함")) // for Groovy
  27.         var strTmp = "안함"
  28.         if (now.get(Calendar.DST_OFFSET) != 0)
  29.             strTmp = "함"
  30.         println("서머타임 적용 여부: " + strTmp)
  31.     }
  32. }



scalac 명령으로 컴파일하고,
생성된 클래스파일(TestCTimeApp.class)을 scala 명령으로 실행한다. 
scala 명령으로 실행할 때는 클래스 파일의 확장자명(.class)을 생략한다.

c -encoding MS949 testCTime.scala
실행> scala TestCTimeApp
UTC: 1236541642초
2009년 3월 9일 (화요일) 4시 47분 22초
올해 몇 번째 날: 68, 서머타임 적용 여부: 안함




크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Scripter
,
다항식 p(x) 를 1차 다항식 x - a 로 나눌 때의 몫과 나머지를 구하는 조립제법을
Scala 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (x - a)q(x) + r

여기서 r은 나머지이며 r = p(a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수



  1. /*
  2.  *  Filename: testSyntheticDivision.scala
  3.  *
  4.  *  Purpose:  Find the quotient and remainder when some polynomial is
  5.  *            divided by a monic polynomial of the first degree.
  6.  *     이 소스는 그루비 소스 testSyntheticDivision.groovy 를
  7.  *     스칼라 소스로 변환한 것이다.
  8.  *
  9.  *  Execute: scala -encoding MS949 testSyntheticDivision.scala -2 1 3 3 1
  10.  *
  11.  */
  12. // 사용법 표시
  13. def printUsage() {
  14.      println("사용법: scala testSyntheticDivision.scala [수] [피제식의 계수들]")
  15.      println("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.")
  16. }
  17. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  18. def simplify(v: Double) : String = {
  19.     var t : String = "" + v 
  20.     if (t.endsWith(".0"))
  21.         t = t.substring(0, t.length - 2)
  22.     return t
  23. }
  24. // 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  25. // 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  26. def simplify(v: Double, width: Int) : String = {
  27.     var t : String = "" + v
  28.     if (t.endsWith(".0"))
  29.         t = t.substring(0, t.length - 2)
  30.     var len : Int = t.length
  31.     if (len < width)
  32.         t = "               ".substring(0, width - len) + t
  33.     return t;
  34. }
  35. // 다항식을 내림차순의 스트링 표현으로 반환
  36. def toPolyString(c : Array[Double]) : String = {
  37.     var t : String = ""
  38.     var sc0 : String = simplify(c(0))
  39.     if (c.length > 2) {
  40.         if (sc0 == "1")
  41.             t += "x^" + (c.length-1)
  42.         else if (sc0 == "-1")
  43.             t += "-x^" + (c.length-1)
  44.         else
  45.             t += sc0 + " x^" + (c.length-1)
  46.     }
  47.     else if (c.length == 2) {
  48.         if (sc0 == "1")
  49.             t += "x"
  50.         else if (sc0 == "-1")
  51.             t += "-x"
  52.         else
  53.             t += sc0 + " x"
  54.     }
  55.     else if (c.length == 1) {
  56.         t += sc0
  57.     }
  58.     for (i <- List.range(1, c.length)) {
  59.         def k = c.length - 1 - i
  60.         def sc = simplify(c(i))
  61.         if (k > 1) {
  62.             if (c(i) > 0.0) {
  63.                 if (sc == "1")
  64.                     t += " + " + "x^" + k
  65.                 else
  66.                     t += " + " + sc + " x^" + k
  67.             }
  68.             else if (c(i) < 0.0) {
  69.                 if (sc == "-1")
  70.                     t += " - " + "x^" + k
  71.                 else
  72.                     t += " - " + simplify(Math.abs((i))) + " x^" + k
  73.             }
  74.         }
  75.         else if (k == 1) {
  76.             if (c(i) > 0.0) {
  77.                 if (sc == "1")
  78.                     t += " + " + "x"
  79.                 else
  80.                     t += " + " + sc + " x"
  81.             }
  82.             else if (c(i) < 0.0) {
  83.                 if (sc == "-1")
  84.                     t += " - " + "x"
  85.                 else
  86.                     t += " - " + simplify(Math.abs(c(i))) + " x"
  87.             }
  88.         }
  89.         else if (k == 0) {
  90.             if (c(i) > 0.0) {
  91.                 t += " + " + sc
  92.             }
  93.             else if (c(i) < 0.0)
  94.                 t += " - " + simplify(Math.abs(c(i)))
  95.         }
  96.     }
  97.     return t
  98. }
  99. // 다항식 나눗셈 결과를
  100. //     (피제식) = (제식)(몫) + (나마지)
  101. // 형태로 출력
  102. def printDivisionResult(a : Double, c : Array[Double], b : Array[Double]) {
  103.     print("  " + toPolyString(c))
  104.     println()
  105.     print("    = ( " + toPolyString( Array(1.0, -a)  ) + " )")
  106.     var tmp : Array[Double] = new Array[Double](b.length - 1)
  107.     for (i <- List.range(0, tmp.length)) {
  108.         tmp(i) = b(i)
  109.     }
  110.     print("( " + toPolyString(tmp) + " )")
  111.     var r : Double = b(b.length - 1)
  112.     if (r > 0.0)
  113.         print(" + " + simplify(r))
  114.     else if (r < 0.0)
  115.         print(" - " + simplify(Math.abs(r)))
  116.     println()
  117. }
  118. // 조립제법 계산표 출력 함수
  119. def printSyntheticTable(a : Double, c : Array[Double], s : Array[Double], q : Array[Double]) {
  120.     print("       | ")
  121.     print(simplify(c(0), 6))
  122.     for (i <- List.range(1, c.length)) {
  123.         print("  " + simplify(c(i), 6))
  124.     }
  125.     println()
  126.     print(simplify(a, 6) + " | ")
  127.     print("        ")
  128.     print(simplify(s(1), 6))
  129.     for (i <- List.range(2, s.length)) {
  130.         print("  " + simplify(s(i), 6))
  131.     }
  132.     println()
  133.     print("       |-")
  134.     for (i <- List.range(0, q.length)) {
  135.         print("--------")
  136.     }
  137.     println()
  138.     print("         ")
  139.     print(simplify(q(0), 6))
  140.     for (i <- List.range(1, q.length)) {
  141.         print("  " + simplify(q(i), 6))
  142.     }
  143.     println()
  144. }
  145. // 실행 시작 지점
  146. if (args.length < 3) {
  147.     printUsage()
  148.     System.exit(1)
  149. }
  150. var a : Double = args(0).toDouble
  151. var c : Array[double] = new Array[Double](args.length - 1)
  152. var s : Array[double] = new Array[Double](c.length)
  153. var b : Array[double] = new Array[Double](c.length)
  154. for (i <- List.range(0, c.length)) {
  155.     c(i) = args(i + 1).toDouble
  156. }
  157. s(0) = 0.0
  158. b(0) = c(0)
  159. for (i <- List.range(1, c.length)) {
  160.     s(i) = b(i-1)*a
  161.     b(i) = c(i) + s(i)
  162. }
  163. print("몫의 계수는 ")
  164. for (i <- List.range(0, b.length - 2)) {
  165.     print(simplify(b(i)) + ", " )
  166. }
  167. print(simplify(b(b.length - 2)))
  168. println(" 이고, 나머지는 " + simplify(b(b.length - 1)) + " 이다.")
  169. println()
  170. printSyntheticTable(a, c, s, b)
  171. println()
  172. printDivisionResult(a, c, b)



scala 명령으로 아래와 같이 실행하여 보았다.


실행> scala -encoding MS949 testSyntheticDivision.scala 1 2 3 4 5
몫의 계수는 2, 5, 9 이고, 나머지는 14 이다.

       |      2       3       4       5
     1 |              2       5       9
       |---------------------------------
              2       5       9      14

  2 x^3 + 3 x^2 + 4 x + 5
    = ( x - 1 )( 2 x^2 + 5 x + 9 ) + 14



Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,

다음은 Groovy 소스 코드를 Scala 소스 코드로 변경한 것이다.

Scala 언어는 Java 언어 처럼 타입을 엄격히 지키는 언어이다.
하지만 Scala 언어는 ML, Haskell 언어 처럼 함수 프로그래밍을 적극 도입한 언어이다.

 

  1. /*
  2.  *  Filename: testForFor.scala
  3.  *
  4.  *  Execute:  scala testForFor.scala
  5.  *
  6.  *  Date:  2008. 5. 18.
  7.  */
  8. def getDan(dan: Int) : Array[String] = {
  9.     var t : Array[String] = new Array[String](20)
  10.     var sa, sb, sval = ""
  11.     for (j <- 0 to 18) {
  12.         sa = "" + dan
  13.         if (sa.length < 2)
  14.             sa = " " + sa
  15.         sb = "" + (j + 1)
  16.         if (sb.length < 2)
  17.             sb = " " + sb
  18.         sval = "" + (dan*(j + 1))
  19.         if (sval.length < 2)
  20.             sval = "  " + sval
  21.         else if (sval.length < 3)
  22.             sval = " " + sval
  23.         t(j) = sa + " x " + sb + " = " + sval
  24.     }
  25.     return t
  26. }
  27. // 19단표를 모두 80컬럼 컨솔에 출력한다.
  28. def printAllNineteenDan() {
  29.     var arr : Array[Array[String]] = new Array[Array[String]](18)
  30.     for (i <- 2 to 19) {
  31.         arr(i - 2) = getDan(i)
  32.     }
  33.     // 아래는 String의 배열을 사용하는 Scala 코드이다.
  34.     var d = List( 2, 7, 11, 16 )      // 각 줄단위 블럭의 첫단
  35.     var counter = List( 5, 4, 5, 4 )  // 각 줄단위 블럭에 속한 단의 개수
  36.     var lines = new Array[String](19)
  37.     for (k <- List.range(0, d.length)) {
  38.         // 80 바이트 길이의 한 줄씩 완성
  39.         for (i <- List.range(0, 19)) {
  40.             lines(i) = arr(d(k)-2)(i)
  41.             for (j <- List.range(1, counter(k))) {
  42.                 lines(i) = lines(i) + "   " +  arr(d(k)-2+j)(i)
  43.             }
  44.         }
  45.         // 8-바이트 길이의 한 줄씩 출력
  46.         for (i <- List.range(0, 19)) {
  47.             println(lines(i))
  48.         }
  49.         println()
  50.     }
  51. }
  52. printAllNineteenDan()




실행> scala -encoding MS949 testForFor.scala

 2 x  1 =   2    3 x  1 =   3    4 x  1 =   4    5 x  1 =   5    6 x  1 =   6
 2 x  2 =   4    3 x  2 =   6    4 x  2 =   8    5 x  2 =  10    6 x  2 =  12
 2 x  3 =   6    3 x  3 =   9    4 x  3 =  12    5 x  3 =  15    6 x  3 =  18
 2 x  4 =   8    3 x  4 =  12    4 x  4 =  16    5 x  4 =  20    6 x  4 =  24
 2 x  5 =  10    3 x  5 =  15    4 x  5 =  20    5 x  5 =  25    6 x  5 =  30
 2 x  6 =  12    3 x  6 =  18    4 x  6 =  24    5 x  6 =  30    6 x  6 =  36
 2 x  7 =  14    3 x  7 =  21    4 x  7 =  28    5 x  7 =  35    6 x  7 =  42
 2 x  8 =  16    3 x  8 =  24    4 x  8 =  32    5 x  8 =  40    6 x  8 =  48
 2 x  9 =  18    3 x  9 =  27    4 x  9 =  36    5 x  9 =  45    6 x  9 =  54
 2 x 10 =  20    3 x 10 =  30    4 x 10 =  40    5 x 10 =  50    6 x 10 =  60
 2 x 11 =  22    3 x 11 =  33    4 x 11 =  44    5 x 11 =  55    6 x 11 =  66
 2 x 12 =  24    3 x 12 =  36    4 x 12 =  48    5 x 12 =  60    6 x 12 =  72
 2 x 13 =  26    3 x 13 =  39    4 x 13 =  52    5 x 13 =  65    6 x 13 =  78
 2 x 14 =  28    3 x 14 =  42    4 x 14 =  56    5 x 14 =  70    6 x 14 =  84
 2 x 15 =  30    3 x 15 =  45    4 x 15 =  60    5 x 15 =  75    6 x 15 =  90
 2 x 16 =  32    3 x 16 =  48    4 x 16 =  64    5 x 16 =  80    6 x 16 =  96
 2 x 17 =  34    3 x 17 =  51    4 x 17 =  68    5 x 17 =  85    6 x 17 = 102
 2 x 18 =  36    3 x 18 =  54    4 x 18 =  72    5 x 18 =  90    6 x 18 = 108
 2 x 19 =  38    3 x 19 =  57    4 x 19 =  76    5 x 19 =  95    6 x 19 = 114

 7 x  1 =   7    8 x  1 =   8    9 x  1 =   9   10 x  1 =  10
 7 x  2 =  14    8 x  2 =  16    9 x  2 =  18   10 x  2 =  20
 7 x  3 =  21    8 x  3 =  24    9 x  3 =  27   10 x  3 =  30
 7 x  4 =  28    8 x  4 =  32    9 x  4 =  36   10 x  4 =  40
 7 x  5 =  35    8 x  5 =  40    9 x  5 =  45   10 x  5 =  50
 7 x  6 =  42    8 x  6 =  48    9 x  6 =  54   10 x  6 =  60
 7 x  7 =  49    8 x  7 =  56    9 x  7 =  63   10 x  7 =  70
 7 x  8 =  56    8 x  8 =  64    9 x  8 =  72   10 x  8 =  80
 7 x  9 =  63    8 x  9 =  72    9 x  9 =  81   10 x  9 =  90
 7 x 10 =  70    8 x 10 =  80    9 x 10 =  90   10 x 10 = 100
 7 x 11 =  77    8 x 11 =  88    9 x 11 =  99   10 x 11 = 110
 7 x 12 =  84    8 x 12 =  96    9 x 12 = 108   10 x 12 = 120
 7 x 13 =  91    8 x 13 = 104    9 x 13 = 117   10 x 13 = 130
 7 x 14 =  98    8 x 14 = 112    9 x 14 = 126   10 x 14 = 140
 7 x 15 = 105    8 x 15 = 120    9 x 15 = 135   10 x 15 = 150
 7 x 16 = 112    8 x 16 = 128    9 x 16 = 144   10 x 16 = 160
 7 x 17 = 119    8 x 17 = 136    9 x 17 = 153   10 x 17 = 170
 7 x 18 = 126    8 x 18 = 144    9 x 18 = 162   10 x 18 = 180
 7 x 19 = 133    8 x 19 = 152    9 x 19 = 171   10 x 19 = 190

11 x  1 =  11   12 x  1 =  12   13 x  1 =  13   14 x  1 =  14   15 x  1 =  15
11 x  2 =  22   12 x  2 =  24   13 x  2 =  26   14 x  2 =  28   15 x  2 =  30
11 x  3 =  33   12 x  3 =  36   13 x  3 =  39   14 x  3 =  42   15 x  3 =  45
11 x  4 =  44   12 x  4 =  48   13 x  4 =  52   14 x  4 =  56   15 x  4 =  60
11 x  5 =  55   12 x  5 =  60   13 x  5 =  65   14 x  5 =  70   15 x  5 =  75
11 x  6 =  66   12 x  6 =  72   13 x  6 =  78   14 x  6 =  84   15 x  6 =  90
11 x  7 =  77   12 x  7 =  84   13 x  7 =  91   14 x  7 =  98   15 x  7 = 105
11 x  8 =  88   12 x  8 =  96   13 x  8 = 104   14 x  8 = 112   15 x  8 = 120
11 x  9 =  99   12 x  9 = 108   13 x  9 = 117   14 x  9 = 126   15 x  9 = 135
11 x 10 = 110   12 x 10 = 120   13 x 10 = 130   14 x 10 = 140   15 x 10 = 150
11 x 11 = 121   12 x 11 = 132   13 x 11 = 143   14 x 11 = 154   15 x 11 = 165
11 x 12 = 132   12 x 12 = 144   13 x 12 = 156   14 x 12 = 168   15 x 12 = 180
11 x 13 = 143   12 x 13 = 156   13 x 13 = 169   14 x 13 = 182   15 x 13 = 195
11 x 14 = 154   12 x 14 = 168   13 x 14 = 182   14 x 14 = 196   15 x 14 = 210
11 x 15 = 165   12 x 15 = 180   13 x 15 = 195   14 x 15 = 210   15 x 15 = 225
11 x 16 = 176   12 x 16 = 192   13 x 16 = 208   14 x 16 = 224   15 x 16 = 240
11 x 17 = 187   12 x 17 = 204   13 x 17 = 221   14 x 17 = 238   15 x 17 = 255
11 x 18 = 198   12 x 18 = 216   13 x 18 = 234   14 x 18 = 252   15 x 18 = 270
11 x 19 = 209   12 x 19 = 228   13 x 19 = 247   14 x 19 = 266   15 x 19 = 285

16 x  1 =  16   17 x  1 =  17   18 x  1 =  18   19 x  1 =  19
16 x  2 =  32   17 x  2 =  34   18 x  2 =  36   19 x  2 =  38
16 x  3 =  48   17 x  3 =  51   18 x  3 =  54   19 x  3 =  57
16 x  4 =  64   17 x  4 =  68   18 x  4 =  72   19 x  4 =  76
16 x  5 =  80   17 x  5 =  85   18 x  5 =  90   19 x  5 =  95
16 x  6 =  96   17 x  6 = 102   18 x  6 = 108   19 x  6 = 114
16 x  7 = 112   17 x  7 = 119   18 x  7 = 126   19 x  7 = 133
16 x  8 = 128   17 x  8 = 136   18 x  8 = 144   19 x  8 = 152
16 x  9 = 144   17 x  9 = 153   18 x  9 = 162   19 x  9 = 171
16 x 10 = 160   17 x 10 = 170   18 x 10 = 180   19 x 10 = 190
16 x 11 = 176   17 x 11 = 187   18 x 11 = 198   19 x 11 = 209
16 x 12 = 192   17 x 12 = 204   18 x 12 = 216   19 x 12 = 228
16 x 13 = 208   17 x 13 = 221   18 x 13 = 234   19 x 13 = 247
16 x 14 = 224   17 x 14 = 238   18 x 14 = 252   19 x 14 = 266
16 x 15 = 240   17 x 15 = 255   18 x 15 = 270   19 x 15 = 285
16 x 16 = 256   17 x 16 = 272   18 x 16 = 288   19 x 16 = 304
16 x 17 = 272   17 x 17 = 289   18 x 17 = 306   19 x 17 = 323
16 x 18 = 288   17 x 18 = 306   18 x 18 = 324   19 x 18 = 342
16 x 19 = 304   17 x 19 = 323   18 x 19 = 342   19 x 19 = 361


Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,