回答編集履歴
2
追加
answer
CHANGED
@@ -45,6 +45,47 @@
|
|
45
45
|
}
|
46
46
|
```
|
47
47
|
|
48
|
+
さらに参考。最初のクイズをforでといてみた。これで分からなかったらもう私には説明する能力がない
|
49
|
+
|
50
|
+
```Scala
|
51
|
+
val str = io.StdIn.readLine() //"A(xyw)(stU)cdefg"などと手で入力する
|
52
|
+
val result = imperative(str)
|
53
|
+
println(result)
|
54
|
+
|
55
|
+
def imperative(str:String): String ={
|
56
|
+
var ret = "" //最後にリターンするまで組みあげていく文字列
|
57
|
+
var block = 1 // <A><引数1><引数2><引数3>の概念的なブロック、最初のAはブロック1
|
58
|
+
var canOutput = false //ブロックがスキップされるものであるか、出力されるものであるかのフラグ、最初の1文字を出さないのでfalse
|
59
|
+
var isInsideKakko = false //カッコ継続中かどうかのフラグ、最初はカッコ外
|
60
|
+
|
61
|
+
for(i <- 0 to str.length - 1) { //文字列のはしからはしまで
|
62
|
+
//出力フェイズ
|
63
|
+
if(canOutput || block > 3) { //出力可能であるかをフラグもしくは第3ブロック以降かで判定
|
64
|
+
if(str(i) != '(' && str(i) != ')') { //()を出力したくないようなので、()でないときだけ
|
65
|
+
ret += str(i) //出力文字列に、現在の文字を書く
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
//状態管理フェイズ
|
70
|
+
if(str(i) == '(') { //(が来たら、カッコ継続中フラグをオンにする
|
71
|
+
isInsideKakko = true
|
72
|
+
} else { //(以外の文字であるとき
|
73
|
+
if(str(i) == ')') { //)であればもはやカッコ継続フラグをオフにする
|
74
|
+
isInsideKakko = false
|
75
|
+
}
|
76
|
+
if(!isInsideKakko) { //カッコがないと考える(Abc)と、1文字ずつがブロックであり、かつ1文字ずつ非出力、出力、非出力とかわっていく。
|
77
|
+
//カッコが終わったときも、ブロックがかわり、出力・非出力が切り変わる。
|
78
|
+
canOutput = !canOutput
|
79
|
+
block += 1
|
80
|
+
} //出力状態・非出力状態はカッコ継続中はかわらないが、かわらないということはプログラムでやることがないのでelseはなし
|
81
|
+
}
|
82
|
+
}
|
83
|
+
ret //作ったものを返す
|
84
|
+
}
|
85
|
+
```
|
86
|
+
|
87
|
+
このクイズ出したり、質問者様にScalaを教えたりしてる人にも問題ある気がする
|
88
|
+
|
48
89
|
~~現時点の質問に追記されたコードは、書かれていないコーダーの気持ちを斟酌するに、カッコの対応が取れているかをもっぱら個数の側面から見ようとするものだと読み取りました。~~
|
49
90
|
|
50
91
|
~~従ってcountが0のときにはtrueをreturnするのが妥当だと考えます。なおelseである、0以外のときにはfalseを返すべきと思料します。~~
|
1
追加
answer
CHANGED
@@ -1,5 +1,50 @@
|
|
1
|
+
> 現在の状況
|
1
|
-
|
2
|
+
今回は、<引数1>に入力された文字列が'('で始まった場合、それに対応する')'を削除するようにしたいと考えています。
|
2
|
-
※書かれていない気持ちというのは、このコードはそういう動きをしないからです。
|
3
3
|
|
4
|
+
この現在の問題、解決したい目的に対して「文字列で'('や')'でカウンタを増減させる」はあまりにも無力です。
|
5
|
+
|
6
|
+
```Scala
|
7
|
+
val str = io.StdIn.readLine()
|
8
|
+
val result = trimParen(str)
|
9
|
+
println(result)
|
10
|
+
|
11
|
+
def trimParen(s : String) : String = {
|
12
|
+
val length = s.length //文字の長さ
|
13
|
+
val firstChar = s(0) //最初の文字
|
14
|
+
val lastChar = s(length -1) //最後の文字(0から数えはじめるので-1)
|
15
|
+
if(firstChar == '(') { //最初の文字は(であって
|
16
|
+
if(lastChar == ')') { //さらに最後が)であるなら
|
17
|
+
return s.slice(1,s.length - 1) //1文字目から最後の文字の手前までを返す
|
18
|
+
}
|
19
|
+
}
|
20
|
+
s //さもなくば元の文字を返す
|
21
|
+
}
|
22
|
+
```
|
23
|
+
|
24
|
+
このコードがScala的であるとは全く思わないのですが、カウントでは求まらない。そこだけは申し訳ないが諦めてください。
|
25
|
+
|
26
|
+
参考までに
|
27
|
+
```Scala
|
28
|
+
//def unParentheses(len:String): Boolean ={
|
29
|
+
def is括弧の個数が対応しているか(len:String): Boolean ={
|
30
|
+
//var str = len.slice(0,len.length)
|
31
|
+
var count = 0
|
32
|
+
var i = 0
|
33
|
+
|
34
|
+
for(i <- 0 to len.length-1){ //-1まで
|
35
|
+
if(len(i) == '('){ //lenではなくlen(i)
|
36
|
+
count = count + 1
|
37
|
+
} else if(len(i) == ')'){
|
38
|
+
count = count - 1
|
39
|
+
}
|
40
|
+
}
|
41
|
+
if(count == 0){ //(があると+1、)があると-1して求まった0は(と)の個数が同じということ
|
42
|
+
return true;
|
43
|
+
}
|
44
|
+
false
|
45
|
+
}
|
46
|
+
```
|
47
|
+
|
48
|
+
~~現時点の質問に追記されたコードは、書かれていないコーダーの気持ちを斟酌するに、カッコの対応が取れているかをもっぱら個数の側面から見ようとするものだと読み取りました。~~
|
49
|
+
|
4
|
-
従ってcountが0のときにはtrueをreturnするのが妥当だと考えます。
|
50
|
+
~~従ってcountが0のときにはtrueをreturnするのが妥当だと考えます。なおelseである、0以外のときにはfalseを返すべきと思料します。~~
|
5
|
-
なおelseである、0以外のときにはfalseを返すべきと思料します。
|