回答編集履歴

2

追加

2019/02/06 16:52

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -92,6 +92,88 @@
92
92
 
93
93
 
94
94
 
95
+ さらに参考。最初のクイズをforでといてみた。これで分からなかったらもう私には説明する能力がない
96
+
97
+
98
+
99
+ ```Scala
100
+
101
+ val str = io.StdIn.readLine() //"A(xyw)(stU)cdefg"などと手で入力する
102
+
103
+ val result = imperative(str)
104
+
105
+ println(result)
106
+
107
+
108
+
109
+ def imperative(str:String): String ={
110
+
111
+ var ret = "" //最後にリターンするまで組みあげていく文字列
112
+
113
+ var block = 1 // <A><引数1><引数2><引数3>の概念的なブロック、最初のAはブロック1
114
+
115
+ var canOutput = false //ブロックがスキップされるものであるか、出力されるものであるかのフラグ、最初の1文字を出さないのでfalse
116
+
117
+ var isInsideKakko = false //カッコ継続中かどうかのフラグ、最初はカッコ外
118
+
119
+
120
+
121
+ for(i <- 0 to str.length - 1) { //文字列のはしからはしまで
122
+
123
+ //出力フェイズ
124
+
125
+ if(canOutput || block > 3) { //出力可能であるかをフラグもしくは第3ブロック以降かで判定
126
+
127
+ if(str(i) != '(' && str(i) != ')') { //()を出力したくないようなので、()でないときだけ
128
+
129
+ ret += str(i) //出力文字列に、現在の文字を書く
130
+
131
+ }
132
+
133
+ }
134
+
135
+
136
+
137
+ //状態管理フェイズ
138
+
139
+ if(str(i) == '(') { //(が来たら、カッコ継続中フラグをオンにする
140
+
141
+ isInsideKakko = true
142
+
143
+ } else { //(以外の文字であるとき
144
+
145
+ if(str(i) == ')') { //)であればもはやカッコ継続フラグをオフにする
146
+
147
+ isInsideKakko = false
148
+
149
+ }
150
+
151
+ if(!isInsideKakko) { //カッコがないと考える(Abc)と、1文字ずつがブロックであり、かつ1文字ずつ非出力、出力、非出力とかわっていく。
152
+
153
+ //カッコが終わったときも、ブロックがかわり、出力・非出力が切り変わる。
154
+
155
+ canOutput = !canOutput
156
+
157
+ block += 1
158
+
159
+ } //出力状態・非出力状態はカッコ継続中はかわらないが、かわらないということはプログラムでやることがないのでelseはなし
160
+
161
+ }
162
+
163
+ }
164
+
165
+ ret //作ったものを返す
166
+
167
+ }
168
+
169
+ ```
170
+
171
+
172
+
173
+ このクイズ出したり、質問者様にScalaを教えたりしてる人にも問題ある気がする
174
+
175
+
176
+
95
177
  ~~現時点の質問に追記されたコードは、書かれていないコーダーの気持ちを斟酌するに、カッコの対応が取れているかをもっぱら個数の側面から見ようとするものだと読み取りました。~~
96
178
 
97
179
 

1

追加

2019/02/06 16:52

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -1,9 +1,99 @@
1
- 時点質問に追記されたコードは、書かれていないコーダーの気持ちを斟酌するに、カッコの対応が取れているかをもっぱら個数の側面から見ようとするものだと読み取りました。
1
+ > 状況
2
2
 
3
- ※書かれていない気持ちというのは、このコードはそういう動きをからです。
3
+ 今回は、<引数1>に入力された文字列が'('で始まった場合、れに対応する')'を削除するよと考えています。
4
4
 
5
5
 
6
6
 
7
- 従ってcountが0ときはtruereturnすのが妥当だと考えます。
7
+ 現在の問題、解決したい目的対して「文字列で'('や')'でカウンタ増減させ」はありにも無力です。
8
8
 
9
+
10
+
11
+ ```Scala
12
+
13
+ val str = io.StdIn.readLine()
14
+
15
+ val result = trimParen(str)
16
+
17
+ println(result)
18
+
19
+
20
+
21
+ def trimParen(s : String) : String = {
22
+
23
+ val length = s.length //文字の長さ
24
+
25
+ val firstChar = s(0) //最初の文字
26
+
27
+ val lastChar = s(length -1) //最後の文字(0から数えはじめるので-1)
28
+
29
+ if(firstChar == '(') { //最初の文字は(であって
30
+
31
+ if(lastChar == ')') { //さらに最後が)であるなら
32
+
33
+ return s.slice(1,s.length - 1) //1文字目から最後の文字の手前までを返す
34
+
35
+ }
36
+
37
+ }
38
+
39
+ s //さもなくば元の文字を返す
40
+
41
+ }
42
+
43
+ ```
44
+
45
+
46
+
47
+ このコードがScala的であるとは全く思わないのですが、カウントでは求まらない。そこだけは申し訳ないが諦めてください。
48
+
49
+
50
+
51
+ 参考までに
52
+
53
+ ```Scala
54
+
55
+ //def unParentheses(len:String): Boolean ={
56
+
57
+ def is括弧の個数が対応しているか(len:String): Boolean ={
58
+
59
+ //var str = len.slice(0,len.length)
60
+
61
+ var count = 0
62
+
63
+ var i = 0
64
+
65
+
66
+
67
+ for(i <- 0 to len.length-1){ //-1まで
68
+
69
+ if(len(i) == '('){ //lenではなくlen(i)
70
+
71
+ count = count + 1
72
+
73
+ } else if(len(i) == ')'){
74
+
75
+ count = count - 1
76
+
77
+ }
78
+
79
+ }
80
+
81
+ if(count == 0){ //(があると+1、)があると-1して求まった0は(と)の個数が同じということ
82
+
83
+ return true;
84
+
85
+ }
86
+
87
+ false
88
+
89
+ }
90
+
91
+ ```
92
+
93
+
94
+
95
+ ~~現時点の質問に追記されたコードは、書かれていないコーダーの気持ちを斟酌するに、カッコの対応が取れているかをもっぱら個数の側面から見ようとするものだと読み取りました。~~
96
+
97
+
98
+
9
- なおelseである、0以外のときにはfalseを返すべきと思料します。
99
+ ~~従ってcountが0のときにはtrueをreturnするのが妥当だと考えます。なおelseである、0以外のときにはfalseを返すべきと思料します。~~