teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追加

2019/02/06 16:52

投稿

papinianus
papinianus

スコア12705

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

追加

2019/02/06 16:52

投稿

papinianus
papinianus

スコア12705

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を返すべきと思料します。