質問編集履歴

5 規約に則り削除

退会済みユーザー

退会済みユーザー

2017/03/05 21:04  投稿

競技プログラミングで可読性を高めたい
###前提・実現したいこと
競技系プログラミングで提出するコードの量を減らして可読性を高めたい(以下兢プロ)。
言語はRuby、趣味で兢プロをやっています。
競プロでは一度に複数の値を扱うことがよくあります。
例えばn行の数字がスペース区切りで10個与えられ、それらを条件によって違う処理をする時などです。
```Ruby
n = gets.chomp.to_i
number = []
n.times do
number << gets.chomp.split(/\n/).map(&:to_i)
end
```
のように多重配列として受けて
条件が1つや2つなら
```Ruby
number.each_slice(1) do |num|
if 略
end
end
```
のように行っています。
しかし、これが上記のifの結果を使用して、そしてその結果もまた使用する。といった事があります。
#そのような場合は
```Ruby
上で得た結果を配列に入れ(仮にsample_array)
sample_array.each_slice(1) do |num|
.
.
.
end
```
や、ものによってはeachを2重3重したコードを書いています。
さらにまたその結果を・・・と合計で4回ほど行う時があり、辟易してしまいます。
###知りたいこと
このやりかたですと、毎回num[0]と何々をやったり、文字と数字が混ざったものが与えられ、文字が◯なら文字以下の数字をどの条件に従って計算する。といったものが出るのでその都度deleteしてから数字にして計算。そして結果は都度配列に、といったふうに冗長なコードになってしまい美しくありません。
```Ruby
n = gets.chomp.to_i
n.times do
gets.chomp.split(/\n/).map(&:to_i)
できたらココの時点で
def ~~(, , ,)
```
のようなメソッドで数値が入力されるごとにすぐ計算。そしてその結果は配列に入れておくなりして次の数字が入力される頃には引数が初期値に戻り、繰り返し。
のような再帰関数のような処理で行えないものかと思い質問させていただきました。
もしかしたらifなどのネストでやるべきかとも思いますが方法がありましたらぜひお願いします。
理解に努めますが、Ruby以外分からないのでその際は言葉で説明して頂けると助かります。
よろしくお願いいたします。
#
#
例題の追記をします。
とある学校で受験が行われるそうです。がんばってください。
その学校には1つの学年に文系と理系のクラスがあるそうですが、文系か理系かによって合格の条件が変わります。
・1科目は100点満点です
・共通する条件はどちらのクラスも合計点が350点以上なければなりません。
ー350点の内、理系受験者は理科と数学の合計点が150点以上なければなりません。
ー350点の内、文系受験者は国語と社会の合計点が150点以上なければなりません。
・一行目に受験した人数が入力されます
・2行目以降はどちらを受験したかの後に、各教科の点数が半角スペース区切りで入力されます。科目の順番は国語・数学・英語・理科・社会の順番です。
・whichがscなら理系受験者、soなら文系受験者です。
人数
which 国 数 英 理 社
.
.
.
人数分の入力
```Ruby
n = gets.chomp.to_i #生徒の人数
score = [] #生徒の成績を入れるための配列
#生徒の人数分配列にスペース区切りで配列の最後に追加していく
n.times do
score << gets.chomp.split()
end
#scoreを1つずつ展開する。展開直後は多重配列になっているのでさらに展開して普通の状態の配列にする。
#次に配列の中身の値で条件分岐する。最初のアルファベットでどちらを受験したか判断する。
#判断した後は数列にして点数を求めたいので文字列を削除。
#そして数列に
#数列にしたnum2の値を合計してnumberに代入
#numberの合計値と受験したクラスの条件によって合否の判定
#以上の処理を文系と理系分作成
score.each_slice(1) do |num|
 num.each do |num2|
   if num2[0] == "so"
     num2.delete("so")
     num2 = num2.map(&:to_i)
     number = num2.inject{ |sum, n| sum + n }
     if number >= 350 && num2[0] + num2[4] >= 150
       puts "文系クラス合格"
     else
       puts "残念でした"
     end
   end
   if num2[0] == "sc"
     num2.delete("sc")
     num2 = num2.flatten.map(&:to_i)
     number = num2.flatten.inject{ |sum, n| sum + n }
     if number >= 350 && num2[1] + num2[3] >= 150
       puts "理系クラス合格"
     else
       puts "残念でした"
     end
   end
 end
end
```
といった具合でしょうか。
私が一番改善したい箇所はnum2[0]やnum2[4]などと書いてあるところです。
この場合ですと
kokugo = num2[0]
のようにやるしかないのでしょうか。
ここの値が個数が多い問題で処理を書き直すときなどに理解が追いつかなくなってしまい、とても時間がかかってしまいます。
もう一つは、理系と文系に分けて処理していますがこの部分を2in1や問題によっては3in1などでキレイに書けないものかと模索しています。
よろしくお願いいたします。
  • Ruby

    17826 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

4 参考問題の追記

退会済みユーザー

退会済みユーザー

2017/03/05 03:05  投稿

競技プログラミングで可読性を高めたい
###前提・実現したいこと
競技系プログラミングで提出するコードの量を減らして可読性を高めたい(以下兢プロ)。
言語はRuby、趣味で兢プロをやっています。
競プロでは一度に複数の値を扱うことがよくあります。
例えばn行の数字がスペース区切りで10個与えられ、それらを条件によって違う処理をする時などです。
```Ruby
n = gets.chomp.to_i
number = []
n.times do
number << gets.chomp.split(/\n/).map(&:to_i)
end
```
のように多重配列として受けて
条件が1つや2つなら
```Ruby
number.each_slice(1) do |num|
if 略
end
end
```
のように行っています。
しかし、これが上記のifの結果を使用して、そしてその結果もまた使用する。といった事があります。
#そのような場合は
```Ruby
上で得た結果を配列に入れ(仮にsample_array)
sample_array.each_slice(1) do |num|
.
.
.
end
```
や、ものによってはeachを2重3重したコードを書いています。
さらにまたその結果を・・・と合計で4回ほど行う時があり、辟易してしまいます。
###知りたいこと
このやりかたですと、毎回num[0]と何々をやったり、文字と数字が混ざったものが与えられ、文字が◯なら文字以下の数字をどの条件に従って計算する。といったものが出るのでその都度deleteしてから数字にして計算。そして結果は都度配列に、といったふうに冗長なコードになってしまい美しくありません。
```Ruby
n = gets.chomp.to_i
n.times do
gets.chomp.split(/\n/).map(&:to_i)
できたらココの時点で
def ~~(, , ,)
```
のようなメソッドで数値が入力されるごとにすぐ計算。そしてその結果は配列に入れておくなりして次の数字が入力される頃には引数が初期値に戻り、繰り返し。
のような再帰関数のような処理で行えないものかと思い質問させていただきました。
もしかしたらifなどのネストでやるべきかとも思いますが方法がありましたらぜひお願いします。
理解に努めますが、Ruby以外分からないのでその際は言葉で説明して頂けると助かります。
よろしくお願いいたします。  
 
#  
#  
 
例題の追記をします。  
 
とある学校で受験が行われるそうです。がんばってください。  
その学校には1つの学年に文系と理系のクラスがあるそうですが、文系か理系かによって合格の条件が変わります。  
 
・1科目は100点満点です  
・共通する条件はどちらのクラスも合計点が350点以上なければなりません。  
ー350点の内、理系受験者は理科と数学の合計点が150点以上なければなりません。  
ー350点の内、文系受験者は国語と社会の合計点が150点以上なければなりません。  
・一行目に受験した人数が入力されます  
・2行目以降はどちらを受験したかの後に、各教科の点数が半角スペース区切りで入力されます。科目の順番は国語・数学・英語・理科・社会の順番です。  
・whichがscなら理系受験者、soなら文系受験者です。  
 
人数  
which 国 数 英 理 社  
.  
.  
.  
人数分の入力  
 
```Ruby  
n = gets.chomp.to_i #生徒の人数  
score = [] #生徒の成績を入れるための配列  
#生徒の人数分配列にスペース区切りで配列の最後に追加していく  
n.times do  
score << gets.chomp.split()  
end  
 
#scoreを1つずつ展開する。展開直後は多重配列になっているのでさらに展開して普通の状態の配列にする。  
#次に配列の中身の値で条件分岐する。最初のアルファベットでどちらを受験したか判断する。  
#判断した後は数列にして点数を求めたいので文字列を削除。  
#そして数列に  
#数列にしたnum2の値を合計してnumberに代入  
#numberの合計値と受験したクラスの条件によって合否の判定  
 
#以上の処理を文系と理系分作成  
 
score.each_slice(1) do |num|  
 num.each do |num2|  
   if num2[0] == "so"  
     num2.delete("so")  
     num2 = num2.map(&:to_i)  
     number = num2.inject{ |sum, n| sum + n }  
 
     if number >= 350 && num2[0] + num2[4] >= 150  
       puts "文系クラス合格"  
     else  
       puts "残念でした"  
     end  
   end  
   if num2[0] == "sc"  
     num2.delete("sc")  
     num2 = num2.flatten.map(&:to_i)  
     number = num2.flatten.inject{ |sum, n| sum + n }  
 
     if number >= 350 && num2[1] + num2[3] >= 150  
       puts "理系クラス合格"  
     else  
       puts "残念でした"  
     end  
   end  
 end  
end  
 
```  
 
といった具合でしょうか。  
私が一番改善したい箇所はnum2[0]やnum2[4]などと書いてあるところです。  
この場合ですと  
kokugo = num2[0]  
のようにやるしかないのでしょうか。  
ここの値が個数が多い問題で処理を書き直すときなどに理解が追いつかなくなってしまい、とても時間がかかってしまいます。  
 
 
もう一つは、理系と文系に分けて処理していますがこの部分を2in1や問題によっては3in1などでキレイに書けないものかと模索しています。  
 
 
よろしくお願いいたします。
  • Ruby

    17826 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

3 誤解を生まないようなタイトルに編集

退会済みユーザー

退会済みユーザー

2017/03/04 19:15  投稿

競技プログラミングで記述量を減らしたい
競技プログラミングで可読性を高めたい
###前提・実現したいこと
競技系プログラミングで提出するコードの量を減らして可読性を高めたい(以下兢プロ)。
言語はRuby、趣味で兢プロをやっています。
競プロでは一度に複数の値を扱うことがよくあります。
例えばn行の数字がスペース区切りで10個与えられ、それらを条件によって違う処理をする時などです。
```Ruby
n = gets.chomp.to_i
number = []
n.times do
number << gets.chomp.split(/\n/).map(&:to_i)
end
```
のように多重配列として受けて
条件が1つや2つなら
```Ruby
number.each_slice(1) do |num|
if 略
end
end
```
のように行っています。
しかし、これが上記のifの結果を使用して、そしてその結果もまた使用する。といった事があります。
#そのような場合は
```Ruby
上で得た結果を配列に入れ(仮にsample_array)
sample_array.each_slice(1) do |num|
.
.
.
end
```
や、ものによってはeachを2重3重したコードを書いています。
さらにまたその結果を・・・と合計で4回ほど行う時があり、辟易してしまいます。
###知りたいこと
このやりかたですと、毎回num[0]と何々をやったり、文字と数字が混ざったものが与えられ、文字が◯なら文字以下の数字をどの条件に従って計算する。といったものが出るのでその都度deleteしてから数字にして計算。そして結果は都度配列に、といったふうに冗長なコードになってしまい美しくありません。
```Ruby
n = gets.chomp.to_i
n.times do
gets.chomp.split(/\n/).map(&:to_i)
できたらココの時点で
def ~~(, , ,)
```
のようなメソッドで数値が入力されるごとにすぐ計算。そしてその結果は配列に入れておくなりして次の数字が入力される頃には引数が初期値に戻り、繰り返し。
のような再帰関数のような処理で行えないものかと思い質問させていただきました。
もしかしたらifなどのネストでやるべきかとも思いますが方法がありましたらぜひお願いします。
理解に努めますが、Ruby以外分からないのでその際は言葉で説明して頂けると助かります。
よろしくお願いいたします。
  • Ruby

    17826 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

2

退会済みユーザー

退会済みユーザー

2017/03/04 10:34  投稿

競技プログラミングで記述量を減らしたい
###前提・実現したいこと
競技系プログラミングで提出するコードの量を減らして可読性を高めたい(以下兢プロ)。
言語はRuby、趣味で兢プロをやっています。
競プロでは一度に複数の値を扱うことがよくあります。
例えばn行の数字がスペース区切りで10個与えられ、それらを条件によって違う処理をする時などです。
```Ruby
n = gets.chomp.to_i
number = []
n.times do
number << gets.chomp.split(/\n/).map(&:to_i)
end
```
のように多重配列として受けて
条件が1つや2つなら
```Ruby
number.each_slice(1) do |num|
if 略
end
end
```
のように行っています。
しかし、これが上記のifの結果を使用して、そしてその結果もまた使用する。といった事があります。
#そのような場合は
```Ruby
上で得た結果を配列に入れ(仮にsample_array)
sample_array.each_slice(1) do |num|
.
.
.
end
```
や、ものによってはeachを2重3重したコードを書いています。
さらにまたその結果を・・・と合計で4回ほど行う時があり、辟易してしまいます。
###知りたいこと
このやりかたですと、毎回num[0]と何々をやったり、文字と数字が混ざったものが与えられ、文字が◯なら文字以下の数字をどの条件に従って計算する。といったものが出るのでその都度deleteしてから数字にして計算。そして結果は都度配列に、といったふうに冗長なコードになってしまい美しくありません。
```Ruby
n = gets.chomp.to_i
n.times do
gets.chomp.split(/\n/).map(&:to_i)
できたらココの時点で
def ~~(, , ,)
```
のようなメソッドで数値が入力されるごとにすぐ計算。そしてその結果は配列に入れておくなりして次の数字が入力される頃には引数が初期値に戻り、繰り返し。
のような再帰関数のような処理で行えないものかと思い質問させていただきました。
もしかしたらifなどのネストでやるべきかとも思いますが方法がありましたらぜひお願いします。
理解に努めますが、Ruby以外分からないのでその際は言葉で説明して頂ければ助かります。
理解に努めますが、Ruby以外分からないのでその際は言葉で説明して頂けると助かります。
よろしくお願いいたします。
  • Ruby

    17826 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1 誤字の修正

退会済みユーザー

退会済みユーザー

2017/03/04 10:15  投稿

競技プログラミングで記述量を減らしたい
###前提・実現したいこと
競技系プログラミングで提出するコードの量を減らして可読性を高めたい(以下兢プロ)。
言語はRuby、趣味で兢プロをやっています。
競プロでは一度に複数の値を扱うことがよくあります。
例えばn行の数字がスペース区切りで10個与えられ、それらを条件によって違う処理をする時などです。
```Ruby
n = gets.chomp.to_i
number = []
n.times do
number << gets.chomp.split(/\n/).map(&:to_i)
end
```
のように多重配列として受けて
条件が1つや2つなら
```Ruby
number.each_slice(1) do |num|
if 略
end
end
```
のように行っています。
しかし、これが上記のifの結果を更に使用して、そしてその結果もまた使用する。といった事があります。
しかし、これが上記のifの結果を使用して、そしてその結果もまた使用する。といった事があります。
#そのような場合は
```Ruby
上で得た結果を配列に入れ(仮にsample_array)
sample_array.each_slice(1) do |num|
.
.
.
end
```
や、これにさらにnumをeachしたコードを書いています。
や、ものによってはeachを2重3重したコードを書いています。
さらにまたその結果を・・・と合計で4回ほど行う時があり、辟易してしまいます。
###知りたいこと
このやりかたですと、毎回num[0]と何々をやったり、文字と数字が混ざったものが与えられ、文字が◯なら文字以下の数字をどの条件に従って計算する。といったものが出るのでその都度deleteしてから数字にして計算。そして結果は都度配列に、といったふうに冗長なコードになってしまい美しくありません。
```Ruby
n = gets.chomp.to_i
n.times do
gets.chomp.split(/\n/).map(&:to_i)
できたらココの時点で
def ~~(, , ,)
```
のようなメソッドで数値が入力されるごとにすぐ計算。そしてその結果は配列に入れておくなりして次の数字が入力される頃には引数が初期値に戻り、繰り返し。
のような再帰関数のような処理で行えないものかと思い質問させていただきました。
もしかしたらifなどのネストでやるべきかとも思いますが方法がありましたらぜひお願いします。
理解に努めますが、Ruby以外分からないのでその際は言葉で説明して頂ければ助かります。
よろしくお願いいたします。
  • Ruby

    17826 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る