글

라벨이 scala인 게시물 표시

최후의 생존자

최후의 생존자 알고리듬 책에 나온 문제이다. 1번 부터 n번까지 n명의 사람이 있을 때 한명은 살고 그 다음 사람은 죽는 방법으로 생존자를 결정할 때 최후까지 남는 사람은 누구인가를 알아낸다. 예를 들어 5명이 있다면 1번은 살고 2번이 죽고 3번은 살고 4번이 죽고 5번은 살고 1번이 죽고 3번은 살고 5번이 죽고 나면 3번이 최후의 생존자가 된다. 1, 2, 3, 4, 5 1, 3, 4, 5 1, 3, 5 3, 5 3 기본 프로그램은 C로 짜 보았다. #include #include #include // 인자 크기 n의 정수 배열의 s부터 시작해서 0이 아닌 첫번째 항목을 찾는다 int searchSurvivor ( int * ms , int s , int n ) { if ( s >= n ) s = 0 ; while (*( ms + s ) == 0 ) { s ++; if ( s == n ) s = 0 ; } return s ; } // 인자 n 크기의 members 정수 배열을 할당받은 후 1로 초기화 하고 // searchSurvivor 함수로 배열에서 생존자를 찾고 한번 더 함수로 // 사망자를 찾는 방식으로 구현했다. int last ( int n ) { int i = 0 , sur , * members ; members = ( int *) malloc ( sizeof ( int )* n ); for ( i = 0 ; i n ; i ++) *( members + i ) = 1 ; sur = n ; i = 0 ; while ( sur != i ) { // 마지막은 생존자와 사망자가 같은 경우, 즉 유일한 생존자 sur = searchSurvivor ( members , i , n ); // printf("생존자 %d를 찾...

Scala 함수 연습

Functional Programming in Scala란 책을 읽고 있습니다. 아직 베타판으로 정식으로 출판된것은 아닌데 초기의 난해한 내용에서 제법 재밌게 읽을 수 있는 책으로 바뀌었네요. 그중 함수형 언어로서의 특징을 보여주는 연습문제가 있어 풀이겸 적어봅니다. 함수형 언어의 특징중 하나는 함수 자체가 하나의 값이고 인자로 주거나 받을 수 있다는 것입니다. def curry [ A , B , C ]( f :( A , B )=> C ): A =>( B => C ) = a => ( b => f ( a , b )) 암호같이 보이는 함수 curry는 2개의 인자를 받아 값을 반환하는 함수 f를 인자로 받아 다른 함수를 반환하는데 그 함수는 하나의 값을 주면 인자 하나를 받아 원래 함수값을 계산하게 됩니다. 예로 이해하는게 쉽습니다. // plus는 새로운 함수 val plus = curry (( a : Int , b : Int )=> a + b ) // 하나의 값을 받아서 다른 함수를 반환 val n1 = plus ( 1 ) // 그 함수에 다른 값을 주면 원래 함수가 하는 일을 한다. 결과는 3 val n2 = n1 ( 2 ) curry 함수를 풀어주는 함수입니다. def uncurry [ A , B , C ]( f : A =>( B => C )):( A , B )=> C = ( a , b ) => f ( a )( b ) val plustwo = uncurry ( plus ) plustwo ( 1 , 2 ) 다음은 2개의 함수를 받아 하나의 함수로 만들어주는 함수 compose와 그 예입니다. 숫자가 짝수인지 확인해 주는 함수와 문자열의 길이를 받는 함수를 합쳐 문자열의 길이가 짝수인지 확인하는 함수를 만듭니다. def compose [ A , B , C ]( f : B => C , g : A => B ): A => C = a =>...

마크다운을 이용한 블로깅

이미지
Sublime 에디터를 사용하다 보니 이 블로깅도 에디터로 할 수 있으면 좋겠다는 생각이 듭니다. Markdown Extended 와 같은 패키지를 사용하면 마크다운에 맞춰서 색을 표시해 주는 등, 웹에 접속하지 않고 간편하고 빠르게 사용하기 좋을 것 같습니다. 찾아보니 대부분 마크다운 을 이용해서 마크업을 하며 다음과 같은 몇가지 방법들이 있습니다. 워드프레스용 패키지 어떻게 사용하는지 모르겠지만 현재 사용하는 Blogger에는 쓰기 어려울것 같습니다. Blogger용으로 포스팅 목록도 볼 수 있고 마크다운도 쓰고 하는 패키지를 만들어보고 싶은 마음도 들었습니다만, 파이썬은 1.X 버전때 사용해서 이제는 거의 새로 배워야 할것 같고 sublime 패키지 작성법에다 Blogger API까지 공부해야 하니 그냥 넘어가기로 합니다. 드랍박스 를 사용하는 방법. 마크다운으로 작성한 파일을 드랍박스에다 저장하면 원격 서버에서 읽어서 포스팅을 해 줍니다. 포스팅을 올린 다음 홈페이지에 접속해서 Publish 명령을 내려줘야 하거나 소스 코드의 하이라이트닝을 지원해 주지 않아서 탈락. 간이 블로그 서버를 하나 만들어 볼까 고민하다 떠오른 생각이 사용자 컴퓨터에서 마크다운 파일을 읽어 HTML로 변환한 다음 Blogger에 올려주는 방법입니다. 이용한 자바 라이브러리들 다음과 같은 라이브러리들을 참조했습니다 Markdown4j 자바용 마크다운 변환 라이브러리입니다. 시험삼아 몇가지 돌려보니 이상하게 동작하는 경우도 있지만 PegDown 도 마찬가지였고 PegDown에 비해 간단하게 플러그인을 지원해 주기 때문에 소스 코드 하이라이트를 사용할 수 있었습니다. java-prettify 자바용 소스 코드 하이라이트 라이브러리입니다. 구글 Prettify 를 자바용으로 포팅한 것인데 스윙용 에디터까지 만들어져 있습니다. 같은 제작자가 SyntaxHighlighter 를 포팅한 java-syntax-hilighter 도 있습니다. 위 두가지 라이브러...

sbt 실행시 자바 옵션 주기

sbt는 스칼라 작업의 많은 부분을 간단하게 해 주지만 자세히 들어가면 설정하기가 적어도 내게는 어려운 편이다. 공부하던 중 test 실행시 자바에 옵션을 줄 일이 생겼는데 어떻게 해야할지 잘 몰라서 찾아보니 JVM을 fork 하는 경우 build.sbt에 javaOptions += "..." 와 같이 주는 방법이 있고 리눅스에서는 env JAVA_OPTIONS="..." sbt test 와 같이 줄수도 있으나 OSX에서는 제대로 동작하지 않았고 brew를 통해 sbt를 설치한 경우 /usr/local/bin 에 sbt 파일이 들어있는데 sbt 파일(텍스트)에 ~/.sbtconfig 파일이 있는지 검사하는 부분이 들어가 있는지 확인하고 (brew를 통해 설치하면 들어가 있다고 한다) 홈 디렉토리의 .sbtconfig 파일에 SBT_OPTS="..." 와 같이 자바 옵션을 주면 된다. 나의 경우 세번째 방법을 통해 옵션을 성공적으로 줄 수 있었다.

Scala Enumeration

StackOverflow의 Scala Enumeration 에 대한 문답을 간단히 요약 object Weekday extends Enumeration { type Weekday = Value val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value } import Weekday._ Enumeration 클래스는 Value type(실제로는 내부 클래스)이 있으며 type Weekday = Value 는 type alias val Mon, Tue, Wed, Thur, Fri, Sat, Sun = Value 는 앞서 말한 type의 대입이 아니라 변수 각각에 대해 Value 메소드가 반복되어 호출되는 것이며(아마도 companion object의 apply 메소드인듯) 메소드는 매번 새로운 Value 인스턴스를 생성해서 반환한다 이후 Weekday의 모든 변수를 import하고 나면 Mon, Tue 등을 바로 사용할 수 있다

터미널에서 스칼라 파일 직접 컴파일, 실행

항상 sbt나 eclipse 파일 받아서 실행시키다 보니 처음부터 만드는 방법을 아직 모르고 있다. 일단 컴파일및 실행. scalac -classpath ".:/외부라이브러리패스/*" demo.scala scala 클래스이름 스칼라의 기본 라이브러리만 사용하는 경우에는 classpath를 지정할 필요없지만 외부 자바라이브러리라도 사용하려면 위와 같이 지정해주어야 한다. 쌍따옴표(")를 사용하지 않으면 IO에러가 발생하며 *.jar와 같이 지정해 주어도 제대로 찾지 못한다. 앞의 '.'를 지정하지 않으면 scala 실행시 현재 디렉토리에서 클래스를 찾지 않는다. 반복적으로 사용하는 경우 .bash_profile에 다음과 같이 환경변수로 지정 export CLASSPATH=".:/외부라이브러리패스/*"

그 외 scala에서 함수 정의하기

def f1 = "Hello, world" def f2 = { "Hello, world" } def f3() = "Hello, world" def f4()() = "Hello, world" def f5 = () => "Hello, world" def f6() = () => "Hello, world" def f7 = () => ( () => "Hello, world" ) def f8(c: =>String) = c def f9(c: =>String) = () => c f1을 정의하고 나면 다음에 f1을 만날 때 "Hello, world"로 대치된다. f2는 f1과 동일하게 동작한다. {}안에는 여러 식을 사용할 수 있으며 마지막 식이 전체의 값이 된다. f3는 f1과 동일하다. 괄호없이 단순히 f3로 적어도 "Hello, world"값이 대치되며 f3()로 적어도 된다. f4는 f1, f3와 동일하게 사용할 수 있으나 f4, f4(), f4()() 모두 "Hello, world" 문자열로 대치된다. REPL에서 식을 입력해 보면 f1, f2는 String이지만 f3는 ()String f4는 ()()String이다. 일종의 currying이 아닐까 싶은데 인자가 없기 때문에 그냥 함수 이름만 적어도 여러 단계를 한번에 확장해 버리는 것 같다. f5의 type은 () => String이다. 다시 말해 f5는 아무런 인자도 가지지 않고 문자열을 반환하는 함수로 대치된다. 단순히 f5로 적으면 type과 함수임을 보여주며 실행시키려면 f5()와 같이 명시적으로 실행시켜야 한다. f6의 type은 ()() => String이며 단순히 f6를 입력하면 f5와 동일하게 보이나 f6()를 입력하면 문자열이 바로 반환되지 않으며 f6()()와 같이 ...

Scala에서의 9가지 함수 정의

def f1(n:Int) = println(n) def f2 = (n:Int) => println(n) 오랫만에 scalafx를 만져보다 위의 차이점에 대해 궁금하게 되었다. 결론부터 이야기하자면 f1은 하나의 정수 인자를 받아 출력하는 함수이며 f2는 하나의 정수인자를 받아 출력하는 함수를 반환하는 함수이다. f1의 type은 Int=>Unit이며 f2는 ()=>(Int=>Unit)이 되는 셈이다. StackOverflow 에는 Scala에서 함수를 정의하는 9가지 방법이라는 질문이 나와있다. def f1 = 10 def f2 {10} def f3 = {10} def f4() = 10 def f5() {10} def f6() = {10} def f7 = () => 10 def f8 = () => {10} def f9 = {() => {10}} 가장 좋은 평가를 받은 답을 간단히 요약하면 =을 사용하지 않은 함수 def는 Unit을 반환 하게 되므로 f1과 f5는 같은 함수이고 f2, f3, f4, f6는 아무런 인자를 가지지 않고 정수값을 반환하는 동일한 함수들이며 f7, f8, f9는 아무런 인자를 가지지 않고 정수값을 반환하는 함수를 반환하는 동일한 함수들이 된다. scalafx에서 이벤트 핸들러는 다음과 같이 실행하는데 keyHandler2를 keyHandler1과 같이 사용하지 못하는 이유를 찾아보다 알게 되었다. keyHandler2를 쓰려면 keyHandler2를 반환하는 handler2Wrapper와 같은 함수를 이용해야 한다. scene = new Scene { onKeyPressed = keyHandler1 } def keyHandler1 = (e:KeyEvent) => println(e.code) def keyHandler2(e:KeyEvent) = println(e.code) def handler2Wrapper:KeyEven...

scala에서 processing 사용하기

Scala에서 processing을 사용하는 예제들이 있는데 시험해 보면 size 명령이 제대로 동작하지 않는 경우가 있다. 보통 첫번째 방법을 많이 사용하는데 setup에서 size 명령이 제대로 먹히지 않는 반면 두번째 방법을 사용하니 제대로 동작한다. Windows 시스템에 한정된 일인지는 명확하지 않다. import processing.core._ object Test extends PApplet { private var test:Test = _ def main(args: Array[String]) = { test = new Test val frame = new javax.swing.JFrame("Test") frame.getContentPane().add(test) test.init frame.pack frame.setVisible(true) } } class Test extends PApplet { override def setup() = { } override def draw() = { } } import processing.core._ object Test { def main(args: Array[String]) = PApplet.main(Array[String]("Test")) } class Test extends PApplet { override def setup() = { } override def draw() = { } }

순열 만들기

Scala에서 순열을 만드는 2가지 방식을 생각해 볼 수 있겠습니다. 물론 더 여러가지가 있을 수 있겠지만... 1. 한번에 숫자 하나씩 처리하기 인자로 받은 리스트의 항목을 하나씩 가지고 결과물을 만들어 나가는 방법입니다. 매번 리스트 항목에서 하나를 선택해서 이미 만들어진 리스트의 앞, 중간, 뒤에 그 항목을 끼워넣습니다. List(1, 2, 3), List() -> List(2, 3), List(List(1)) -> List(3), List(List(2, 1), List(1, 2)) -> List(), List(List(3, 2, 1), List(2, 3, 1), List(2, 1, 3), List(3, 1, 2), List(1, 3, 2), List(1, 2, 3)) def permutation[A](xs:List[A]):List[List[A]] = { def mutate(x:A, ys:List[A]):List[List[A]] = { // ys의 앞, 중간, 뒤에 x를 끼워넣은 리스트를 반환 def helper(zs:List[A], prev:List[A], acc:List[List[A]]):List[List[A]] = zs match { case Nil => (ys :+ x)::acc case z::zs1 => helper(zs1, prev :+ z, (prev ++ (x::zs))::acc) } helper(ys, List(), List()) } def helper(ys:List[A], acc:List[List[A]]):List[List[A]] = ys match { case Nil => acc case y::ys1 => helper(ys1, acc.flatMap(mutate(y, _))) } helper(xs, List(Nil)) } ...

Structural subtyping, Upper bounds, Implicite Parameter & View bounds

Scala에서 insertion sort는 다음과 같이 구현할 수 있습니다. def isort[T](less:(T,T)=>Boolean)(xs:List[T]):List[T] = { def insert(x:T, xs:List[T]):List[T] = xs match { case Nil => List(x) case x1::xs1 => if (less(x, x1)) x::xs else x1::insert(x, xs1) } xs match { case Nil => Nil case x::xs1 => insert(x, isort(less)(xs1)) } } println(isort((x:Int, y:Int)=> x x Int형이라면 < 연산자를 사용하고 비교하기 위해 less 연산자를 사용하지 않겠지만 Double이나 Char를 정렬하고 싶은 경우도 생기기 때문에 일반적인 형 T에 대해 사용할 수 있도록 적은 것입니다. 하지만 Double, Char 모두 < 연산자를 제공하고 있는데 반복적인 less를 사용하는 것이 불편합니다. Programming Scala 책에는 structural subtype 에 대해 클래스 이름이 아니라 특정한 메소드를 가지는 것으로 subtype을 결정하는 것이라고 나와 있습니다. 다음과 같이 시도해 봅니다. def isort2[T List(x) case x1::xs1 => if (x Nil case x::xs1 => insert(x, isort(xs1)) } } 위에서 의미하고자 하는 것은 같은 형과 비교하는 연산자 <를 가지는 클래스 T를 말하는 것입니다만, structural subtype에서는 아직 정의되지 않은 T를 사용할 수 없다며 컴파일 오류가 발생합니다. 다른 형의 메소드라면 이 방법으로 해결할 수 있었겠지만 같은 형을 비교해서 Boolean을 반환하는 함수형은 이 방법을 사용할 수 없습...

소수 계산

val primeStream:Stream[Int] = 2 #:: Stream.from(3, 2).filter(i => primeStream.takeWhile(j => j*j i%k != 0)) stackoverflow 에 올라와 있는 scala의 소수(prime) stream 예제 위 코드를 한글로 번역하면 2와 3 이상의 홀수 중에서 제곱해서 자신보다 작은 이미 찾아낸 소수들 모두로 나누어지지 않는 수가 된다. val로 정의되어 있으므로 이미 찾아낸 값을 다시 계산하지 않는다. 2 3 - 2*2 5 - takeWhile에서 선택되는 소수는 2. 2는 5%2!=0을 만족하므로 채택 7 - takeWhile에서 선택되는 소수는 2. 2는 7%2!=0을 만족하므로 채택 9 - takeWhile에서 선택되는 소수는 2,3. 9%3 == 0이므로 채택되지 않음 11 - takeWhile에서 선택되는 소수는 2,3. 2,3 모두 11 나누면 나머지가 있으므로 채택 위의 방식으로 계속 찾아내게 된다.

Scala에서 Tuple의 zipped

Scala 2.10.1 val a = List.range(1, 4) // List(1,2,3) val b = List.range(10, 40, 10) // List(10,20,30) a zip b // List((1, 10), (2, 20), (3, 30)) a zip b map ((x,y) => x+y) // ERROR : wrong number of parameters, expected 1 a zip b map (((x, y)) => x+y) // ERROR : not a legal formal parameter a zip b map (Tuple2(x,y) => x+y) // ERROR : not a legal formal parameter (a, b).zipped.map(_+_) // List(11, 22, 33) val c = List.range(100, 400, 100) // List(100, 200, 300) a zip b zip c // List(((1,10), 100), ((2, 20), 200), ((3, 30), 300)) a.zip(b, c) // ERROR : too many arguments (a, b, c).zipped.toList // List((1, 10, 100), (2, 20, 200), (3, 30, 300)) (a, b, c).zipped.map(_+_+_) // List(111, 222, 333)

ScalaFx 설치와 데모 베껴보기

이미지
ScalaFX를 설치했습니다. ScalaFX는 JavaFX를 scala에서 불러쓸 수 있도록 해 놓은 것입니다. 아직 문서가 자세하게 만들어져 있지 않아 여기저기 맨땅에 헤딩하면서 설치하고 간단한 데모 띄우기까지 성공했습니다. 먼저 JavaFX를 설치해야 합니다. 저는 Oracle Java 설치 프로그램을 받아서 그대로 실행했습니다. ScalaFX는 구글 코드에서 소스를 받아와 다음과 같이 설치했습니다. $ brew install mercurial $ hg clone https://code.google.com/p/scalafx/ $ cd scalafx $ sbt clean compile package publish-local 간단히 데모를 실행시켜보니 제대로 동작하지 않습니다. build.sbt 파일을 다루어야 한다는 것을 알게 되었습니다. 다음과 같이 ScalaFx와 JavaFx를 찾을 수 있도록 해 주었습니다. libraryDependencies += "org.scalafx" % "scalafx" % "1.0-SNAPSHOT" javaHome := Some(file("/Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home")) unmanagedJars in Compile += Attributed.blank(file(System.getenv("JAVA_HOME") + "/jre/lib/jfxrt.jar")) 이제 데모를 띄워봅니다. 인터넷에서 찾은 데모 에 한국어만 바꾸어 보았습니다. 한글이 마음에 들지 않아 JavaFx 문서를 보니 CSS 방식으로 스타일을 바꿀수 있다고 합니다. 최종 수정한 소스와 스타일시트입니다. 폰트는 애플 명조로만 변경가능했는데 시스템의 다른 한글 폰트를 사용하는 방법을 찾아봐야 되겠습니다. 스타일 시트는 src/main/resources에 있지 않으면 전...

map 안의 map

Scala 예제중에 n 미만의 두 숫자 합이 소수가 되는 조합을 찾아내는 것으로 다음과 같은 것이 있습니다. 물론 나중에 나오는 for 문을 사용하면 다 간단하고 이해하기 쉽겠지요. List.range(1, n) .map(i => List.range(1, i).map(x => (i, x))) .foldRight(List([Int, Int])()) { (xs, ys) => xs ::: ys } .filter(pair => isPrime(pair._1 + pair._2) map 문 내부에 map이 있는 것을 보고 ruby에서도 지원해줄지 궁금해서 한번 시험해 보았습니다. 결론은 지원해 주네요. Scala에서 flatMap을 사용하지 않고 foldRight를 써서 엄밀하게 일대일로 대응되는 코드는 아닙니다만. (1...n).flat_map( |i| (1...i).map { |j| [i, j] }}.select { |i, j| (i+j).prime? }

소수(prime)에 대하여

다음은 stackoverflow에 올라온 scala의 소수 생성 방법 에 대한 간단한 분석(?!)입니다. 원 질문자의 소스는 다음과 같습니다. object Euler0007 { def from(n: Int): Stream[Int] = n #:: from(n + 1) def sieve(s: Stream[Int]): Stream[Int] = s.head #:: sieve(s.filter(_ % s.head != 0)) def primes = sieve(from(2)) def main(args: Array[String]): Unit = { println(primes(10001)) } } Scala 강좌에도 나온 에라스토테네스 방법입니다. Stream으로 끝이 정해지지 않은 연속된 자연수를 만들고 sieve 함수에서 stream의 뒷쪽 부분을 filter로 제거하는... 누군가의 비유대로 뱀이 자신의 꼬리를 먹는 것 같은 구현입니다. 문제는 프로그램 실행중 메모리 부족 에러가 발생한다는 것. 그에 대한 대답으로 올라온 소스는 다음과 같습니다. object Sieve { val primes = 2 #:: sieve(3) def sieve(n: Int) : Stream[Int] = if (primes.takeWhile(p => p*p 앞의 소스보다는 좀 더 이해하기 쉬운 편입니다. primes 변수는 2 부터 시작하는 stream이며 sieve 함수에서는 인자로 주어진 숫자 n이 소수인지 판단하고 소수이면 stream에 포함시키고 다음 홀수를 검사하게 됩니다. 소수중 유일하게 짝수인 2는 처음에 포함시켜버리고 홀수만 검사하되 소수 p가 n의 sqrt 값보다 작은 경우까지만 검사합니다 (p => p*p <= n). 깔끔하면서 함수적 프로그래밍을 잘 구현했습니다. 앞의 소스가 sieve stream을 def로 정의해서 매번 처음부터 소수를 구하는 반면 이번은 primes stream을 val로 정의해서 ...

Ruby는 얼마나 좋아졌을까

Ruby는 2.0 preview1 버전이 발표되었습니다. 근래 Scala를 공부했는데 특징중에 Java에 비해 크게 속도가 떨어지지 않고 객체지향과 함수형 언어를 지향한다는 것을 보고 각종 ruby와 scala를 한번 비교해 보았습니다. 여러가지 검사를 시행해야 정확하겠지만 단순히 모 사이트에 나와 있는 문제를 푸는 프로그램을 작성해 보았습니다. Fibonacci 수열중에 4000000보다 작은 값들 중 짝수값들의 합을 구하는 것입니다. 먼저 Ruby 소스. INFINITY = 1.0/0 MAX = 4000000 def fib(n) case n when 1..2 then n else fib(n-1) + fib(n-2) end end # ruby 1.9.3, jruby 1.7.0, macruby 0.12 n = 1 sum = 0 while (c = fib(n)) 다음은 scala 소스 입니다. 그리 잘 만들었다고 생각되지는 않지만 방식은 대충 같습니다. object App { def fibSumUnder(m:Int) = { def fib(n:Int):Int = if (n = m) sum else if (fibResult % 2 == 0) fibSumUnder0(n+1, sum+fibResult) else fibSumUnder0(n+1, sum) } fibSumUnder0(1, 0) } def main(args:Array[String]) = { print(fibSumUnder(4000000)) } } App.main(args) Ruby는 rvm을 사용해서 ruby 1.9.3p125, ruby 2.0.0dev, jruby 1.7.0, macruby 0.12을 설치해서 사용했고, scala는 2.9.2입니다. 프로그램 실행시간은 다음과 같은 방식으로 2번 측정해서 빠른 값을 얻었습니다. $ time ruby fib_test.rb $ time scala fib_test.scala 결과는 다음과 같습니다....

Jumping Frogs 퍼즐

요즘 scala 언어를 배우고 있는 중입니다. Functional language가 어떤건지 관심이 있던 중 기회가 닿아 배우게 되었는데 상당히 재미있습니다. Scala는 JVM상에서 돌아가는 언어라서 java의 여러 라이브러리를 사용할 수 있는 장점이 있는데 scala에서 JavaFX를 사용하기 위한 ScalaFx의 예제로 Jumping Frogs 퍼즐이 있습니다. 소스는 여기 에서 살펴볼 수 있고 퍼즐은 여기 에서 풀어볼 수 있습니다. 며칠 전 풀어보다 잘 안풀려서 scala에서 한번 풀어보자고 프로그램을 짜기 시작했는데 아직 초보라 그런지 며칠간 고민하다 겨우 작성할 수 있었답니다. 잘 작성한 소스는 아니지만 Functional Language와 Scala의 느낌이 어느 정도 살아있는것 같아 올려놓았습니다 . 결과를 보고 한번 풀어보니 이렇게 간단한걸 왜 못 풀었나 싶더군요. object frogs { type State = List[Int] type Sets = List[State] type History = List[State] val setSize = 7 //> setSize : Int = 7 def frogs(n:Int, code:Int) = ((0 until n) map (_ => code)).toList //> frogs: (n: Int, code: Int)List[Int] val leftFrogs = frogs(setSize/2, 1) //> leftFrogs : List[Int] = List(1, 1, 1) val rightFrogs = frogs(setSize/2, 2) //> rightFrogs : List[Int] = List(2, 2, 2) val set = leftFrogs ++ List(0) ++ r...