何度か回答するうちに、質問者の質問パターンが見えてきました。
いつも例を示すことで仕様を提示していますが、例よりも言葉で仕様を定義する方が正確になります。
やってみます。間違っていたら訂正してください。
定義
<関数>とは、アルファベット大文字一字である。
<関数>は<引数>を2つ以上とる。関数の形式は次の通り。<関数><引数><引数> ...
<引数>は、アルファベット小文字1文字か、または、'('アルファベット小文字2文字')'である。
<引数>にはそれぞれ異なるアルファベット文字が与えられる。
以下は関数である。
Aab
Xabc
Y(xy)(zy)
Za(yz)bcd
以下は関数ではない。
B
Aa
C(z)
仕様
関数Aは引数の2番目を捨てて引数を出現順にかえす。
入力文字列:A<引数1><引数2>
出力文字列:<引数1>
入力文字列:A<引数1><引数2><引数3> ...
出力文字列:<引数1><引数3> ...
実現
処理は文字列の操作である。
先頭一文字はアルファベット大文字一字であれば良いので、チェックしたら捨てる。
引数の文字列をリストに変換する。
リストの二番目の要素を捨てる。
リスト全体を結合して一つの文字列にする。
以上
このような形式で質問して下されば、余計な質疑応答がなくなります。
実現のところに具体的なソースコードやエラーメッセージが書けるようになるとなお良いです。
ヒント
slice()を使わず、正規表現を使うことをすすめます。
ヒント:引数を取り出してListに格納する。
Scala
1"(\([a-z]{2}\)|[a-z])".r.findAllIn("Abcd").toList
2"(\([a-z]{2}\)|[a-z])".r.findAllIn("A(xy)(yz)(za)").toList
ヒント:listの2番目の要素を削除する。リストに格納する型は無関係です。
Scala
1def drop2nd[T](list:List[T]):List[T] = if (list.isEmpty) list else list.head :: list.drop(2)
ヒントをもとに考えてみましょう。必要なら新しい質問をしてください。
別解 scala-paser-combinators 紹介 (2019-02-07)
パーサーコンビネーター
Scalaのパーサーコンビネーターを使って問題を解いてみました。
『Scala スケーラブルプログラミング 第3版』インプレス - 第33章 パーサー・コンビネーター
質問の関数をEBNFで記述しました。
EBNF
1function ::= functionHeader argList
2argList ::= argLiteral args
3args ::= argLiteral [args]
4functionHeader ::= (“A” | .. | “Z”)
5argLiteral ::= ( “(“ smallAlpha smallAlpha “)” | smallAlpha )
6smallAlpha ::= (“a” | .. | “z”)
記述したEBNFをもとに、scala.util.parsing.combinator.RegexParsersを使って、パーサーを作成します。^^に続けてパース後に実行する動作を記述します。動作は関数の第二引数を削除して、それ以外の引数を表示する処理になります。
Scala
1import scala.util.parsing.combinator._
2class FunctionParserEval extends RegexParsers {
3
4 def expr: Parser[String] = function ^^ {_.mkString}
5 def function: Parser[List[String]] = functionHeader~argList ^^ { case _ ~ b => b.head :: b.drop(2) }
6 def argList: Parser[List[String]] = argLiteral~args ^^ { case a ~ b => a::b }
7 def args: Parser[List[String]] = argLiteral~opt( args ) ^^ {
8 case a ~ None => a :: Nil
9 case a ~ Some(b) => a :: b
10 }
11 def argLiteral: Parser[String] = "(\([a-z]{2}\)|[a-z])".r
12 def functionHeader: Parser[String] = "[A-Z]".r
13
14 def parse(str:String) = parseAll(expr,str)
15}
パーサーに関数文字列を入力して評価し、結果を表示します。第二引数を削除した引数が表示されます。
Scala
1val parserEval = new FunctionParserEval
2println(parserEval.parse("Aabcd"))
3println(parserEval.parse("A(xy)(yz)(za)"))
build.sbt
パーサーコンビネーターは、最新のScala基本パッケージに同梱されていないので、sbt環境にダウンロードします。
sbt
1"org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.1"
参考
https://github.com/scala/scala-parser-combinators