[scala-korea] 심심풀이 스칼라 퀴즈

41 views
Skip to first unread message

Hyunsok Oh

unread,
Jan 10, 2013, 1:52:52 AM1/10/13
to scala...@googlegroups.com
안녕들하세요? 새해 복 많이 받으세요.

예전 루비 메일링 리스트에 루비 퀴즈가 올라가면 사람들이 풀어서 서로 올리고 했었는데, 그 퀴즈가 책으로 묶여 나온게 있답니다. 제목은 "Best of Ruby Quiz"입니다.

프로그램은 자주 짜봐야 늘기도 하고, 이런저런 짓을 하면서 스칼라 언어에 익숙해질 수도 있을꺼구, 책에 있는 솔루션과도 비교 가능할 것 같아서 한번 올려봅니다. 심심할때 풀어보세요. 새해 기념 선물(?) 입니당.

오늘의 문제는 : (공백 표시에 문제가 있기 때문에 고정폭 글자로 보셔야 합니다.)

"7-세그먼트 숫자 표시하기" 입니다.
7세그먼트가 뭐냐 하면, 계산기등에 숫자 표시를 위해 사용하는 LED 모듈 입니다. 아시겠지만, 문자는 다음과 같이 표시할 수 있습니다.

 
   |
   |
 
  _
  _|
 |_
 
  _
  _|
  _|

   
 |_|
   |

  _
 |_
  _|

  _
 |_
 |_|

  _  
   |
   |

  _
 |_|
 |_|

  _
 |_|
  _|


이제, 스칼라 스크립트를 seg7.scala를 만듭니다. 인자 없이 호출하면 다음과 같은 도움말 화면을 출력합니다.

$ seg7.scala
사용법: seg7.scala <옵션> 숫자로만_이루어진_문자열

    -s <크기> : <크기>(양의 정수) 배율로 확대한 7세그먼트 문자를 표시합니다.
    -h : 이 도움말 화면을 표시합니다.

크기를 지정하지 않으면 2가 기본으로 지정됩니다.


$ seg7.scala -s 1 1234        
      _  _
   |  _| _| |_|
   | |_  _|   |

$ seq7.scala 1234
      __  __
   |    |   | |  |
   |  __| __| |__| 
   | |      |    |
   | |__  __|    |

이해가 되셨으리라 봅니다. 한번 심심할때 해 보세요. 이런저런 변경도 가능하겠죠?


Dongwook Lee

unread,
Jan 10, 2013, 8:35:57 PM1/10/13
to scala...@googlegroups.com
새해 복 많이 받으세요. 
퀴즈가 올라오니 훨씬 생기도 있어보이고, 더욱 언어를 다루는 모임 다워지고 좋네요.

님 덕분에 지원금의 일부를 할당해 퀴즈를 내시면 약소한(?) 
상품/포인트를 주는 형태의 활동은 어떨까 생각해봤습니다. 

다음에 지원금 사용 회의 시 논의해 봐야겠네요 :)

2013/1/10 Hyunsok Oh <ensh...@gmail.com>

--
Google 그룹스 '라 스칼라 코딩단' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 scala...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 scala-korea...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 

Hyunsok Oh

unread,
Jan 10, 2013, 10:01:28 PM1/10/13
to scala...@googlegroups.com
루비 퀴즈 자체는 아마도 저작권이 없을테니(메일링 리스트에서 이미 오픈된 것임), 제가 매월 1일에 간단하게 번역해서 1개씩 내겠습니다.
스칼라로 구현한 해답은 함께 찾아나가면 될것 같고, 루비로 된 것들(책에 있는 답)은 월말에 쭉 정리해 올리겠습니다.
일단은 책에 있는 것으로 해 나가면 되겠죠. 1년은 갈 수 있을것 같네요.


2013/1/11 Dongwook Lee <i01...@gmail.com>

Hyunsok Oh

unread,
Jan 30, 2013, 6:25:39 AM1/30/13
to scala...@googlegroups.com
월말도 되고 해서 심심풀이로 풀고 있습니다. 1단계로 크기변경 없이 프린트하는 버전...
여기 magnifyDigits라는 함수만 잘 채워넣으면 마무리될것 같네요.

대략 함수형으로 짠 버전입니다. 심심하실 때 magnifyDigits 한번 채워넣어 보세요 ~~ 

---------------- 시작 ---------------
/**
 * Created with IntelliJ IDEA.
 * User: s2852886
 * Date: 30/01/13
 * Time: 12:39 PM
 * To change this template use File | Settings | File Templates.
 */
object seg7 {
val segMap = Map( 
 '0'-> List(" _ ","| |","|_|"),
 '1'-> List("   ","  |","  |"),
 '2'-> List(" _ "," _|","|_ "),
 '3'-> List(" _ "," _|"," _|"),
 '4'-> List("   ","|_|","  |"),
 '5'-> List(" _ ","|_ "," _|"),
 '6'-> List(" _ ","|_ ","|_|"),
 '7'-> List(" _ ","  |","  |"),
 '8'-> List(" _ ","|_|","|_|"),
 '9'-> List(" _ ","|_|"," _|")
)

  def toDigits(s:String) = {
 def toDigit(s:Char):List[String] = segMap.get(s).getOrElse {throw new Exception("Invalid Digit")} 
  s.toList.map(toDigit)
  }

  def printDigits(s:List[List[String]]) {
    def printLine(s:List[String]): List[String] = s match {
    case Nil => Nil
    case hd::tl => print(hd); tl
    }

    if (s.exists((l:List[String])=>(!l.isEmpty))) printDigits({println(""); s.map(printLine)})
  }

  def usage() {
    println("사용법: seg7.scala <옵션> 숫자로만_이루어진_문자열")
    println("")
    println("   -s <크기> : <크기>(양의 정수) 배율로 확대한 7세그먼트 문자를 표시합니다(미지정시 기본값=2).")
    println("   -h : 이 도움말 화면을 표시합니다.")
  }

  def magnifyDigits(sz:Int, s:List[List[String]]) = s
  
  def main(args: Array[String]): Unit =  {
    if((args.length != 3) && (args.length != 1))
      usage()
    else
    {
        try {
          val (str, size) =
            if (args.length==1)
              (args(0), 2)
            else if (args(0) != "-s")
                throw new Exception("invalid argument")
            else
                (args(2), args(1).toInt)

          printDigits(magnifyDigits(2,toDigits(str)))
        }
        catch
        {
          case e:Exception => {
             println("Error: " + e.getMessage())
             println("")
             usage()
          }
        }
    }
  }
}

----------------  끝 -----------------

2013/1/10 Hyunsok Oh <ensh...@gmail.com>
Reply all
Reply to author
Forward
0 new messages