ワンライナー
Scala
1def unParentheses(s:String):String = if (!s.isEmpty && s.head == '(' && s.last == ')') unParentheses(s.drop(1).dropRight(1)) else s
パターンマッチ
Scala
1def unParentheses(s:String):String = {
2 def up(c: List[Char]):List[Char] = c match {
3 case Nil => Nil
4 case '('::xs if !xs.isEmpty && xs.last==')' => up(xs.dropRight(1))
5 case _ => c
6 }
7 up(s.toList).mkString
8}
どちらも空文字列のガードが入るので美しくありません。実行は以下のとおり。
Scala
1unParentheses("")
2unParentheses("(")
3unParentheses(")")
4unParentheses("()")
5unParentheses("((ab(c)))")
6unParentheses("(ab(c))")
7unParentheses("ab(c)")
命令型から関数型へ
質問の意図は、Javaで書けるプログラムをScalaにしかっただけでしょうか。以下が望んでいる答えです。"()"の無限ループを避けるため正規表現を変更しました。せっかくなので、これをScalaの関数型プログラミングに変形します。
Scala
1def unParentheses(code:String):String = {
2 var term = code.slice(0,code.length)
3 while(!term.isEmpty && term.head =='(' && term.last == ')'){
4 term = term.replaceAll("^\((.*)\)$", "$1")
5 }
6 term
7}
上の命令型ロジックの構造を変えます。
- var term を削る。必要ないため。
- whileの代わりに末尾再帰にする。末尾再帰はwhileと実質的に同じです。
Scala
1@scala.annotation.tailrec
2def unParentheses(code:String):String = {
3 if (code.isEmpty || code.head !='(' || code.last != ')')
4 code
5 else
6 unParentheses(code.replaceAll("^\((.*)\)$", "$1"))
7}
この if else 構造を、波括弧をはずして一文にすると、ワンライナーになります。
Scala
1@scala.annotation.tailrec
2def unParentheses(code:String):String = if (code.isEmpty || code.head !='(' || code.last != ')') code else unParentheses(code.replaceAll("^\((.*)\)$", "$1"))
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/29 11:35
2019/01/30 11:41