paizaの標準出力メニュー全問のRubyでの解答例

Paizaの標準出力メニュー全問のrubyでの解答例

PaizaのRuby言語の標準出力メニューの解答例を書いてみました。
一部正解にならないものもありますが、
その場合※で補足してあります。
初学者なのでかなり汚い部分、
プロから見ると慣例と外れている部分もあると思いますが、
お見逃しを。
あくまでもご参考までにお願いします。
※２１年１２月２７日一部の答えを修正
STEP: 1 1 行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step1



```ruby:step1.rb
puts 813
```






STEP: 2 2 行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step2

```ruby:step2.rb
puts 8
puts 13
```

STEP: 3 3 行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step3

```ruby:step3.rb
puts 8
puts 1
puts 3
```

STEP: 4 10 行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_step4


```ruby:step4.rb
#813, 1, 2, 923874, 23648, 782356, 3256, 2342, 24324, 112
puts 813
puts 1
puts 2 
puts 923874
puts 23648
puts 782356
puts 3256
puts 2342
puts 24324
puts 112
```

※最初に入力する文字列をコピペしておくと
数字の入力途中で候補の数字を入れてくれるので便利です！


 STEP:5【改行あり出力】1,000 行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__newline_digit_boss

```ruby:step5.rb
for i in 1..1000
  puts i
end
```

STEP: 6 2 つの数値を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step1

```ruby:step6.rb
puts "1 1"
```

STEP: 7 3 つの数値を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step2

```ruby:step7.rb
puts "8 1 3"
```

STEP: 8 10 個の数値を出力 (末尾に半角スペース有)
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step3

```ruby:step8.rb
for i in 1..10
  print "#{i} "
end
```

※ 末尾に半角スペースがあるので
Putsで一つずつ入力すると
それを忘れて答えにならずに「あれ？」となる。


STEP: 9 10 個の数値を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_step4

```ruby:step9.rb
for i in 1..9
    print "#{i} "
end
puts 10
```

STEP:10 半角スペース区切りの出力】1,000 個の数値を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__space_oneline_boss

```ruby:step10.rb
for i in 1..999
    print "#{i} "
end
puts 1000
```

STEP: 11 1 つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step1

```ruby:step11.rb
puts "paiza"
```

STEP: 12 2 つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step2

```ruby:step12.rb
puts "paiza learning"
```

STEP: 13 入力された 2 つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step3

```ruby:step13.rb
s = gets
t = gets
puts s
puts t
```

STEP: 14 入力された 10 個の文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step4

```ruby:step14.rb
s = Array.new(10)
for i in 1..10
    s[i] = gets.chomp
end
for j in 1..9
    print "#{s[j]} "
end
puts s[10]
```

STEP:15 文字列の出力】入力された 10 個の文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_boss

```ruby:step15.rb
s = gets.split(' ')
for i in 1..10
    puts s[i-1]
end
```

STEP: 16 1 行または 2 行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_step1

```ruby:step16.rb
N = gets.to_i

if N == 1
    puts 1
else
    puts 1
    puts 2
end
```

STEP: 17 数行の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_step2

```ruby:step17.rb
n = gets.to_i

n.times {|i| puts i + 1}
```

STEP: 18 10 行以内の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_step3

```ruby:step18.rb
n = gets.to_i

n.times {|i| puts i + 1}
```

STEP:19【n 行の出力】1,000 行以内の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__n_line_boss

```ruby:step19.rb
n = gets.to_i

n.times {|i| puts i + 1}
```


STEP: 20 カンマ区切りで 2 つ出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step1

```ruby:step20.rb
n,m = gets.split(' ')
puts "#{n},#{m}"
```

STEP: 21 バーティカルライン区切りで 3 つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step2

```ruby:step21.rb
s1 = gets.chomp
s2 = gets.chomp
s3 = gets
puts "#{s1}|#{s2}|#{s3}"
```

STEP: 22 カンマ区切りで 10 個出力 1
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step3

```ruby:step22.rb
s = gets.split(' ')
10.times {|i| print "#{s[i]},"}
```

STEP: 23 カンマ区切りで 10 個出力 2
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step4

```ruby:step23.rb
s = gets.split(' ')
9.times {|i| print "#{s[i]},"}
puts s[9]
```

STEP: 24 半角スペースとバーティカルライン区切りで 10 個出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step5

```ruby:step24.rb
n = Array.new(10)
10.times {|i| n[i] = gets.chomp}
9.times {|j| print "#{n[j]} | "}
puts n[9]
```

STEP: 25 大きな数値を 3 けたごとにカンマ区切りで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_step6

```ruby:step25.rb
n = gets
a = n.scan(/.{1,#{3}}/)
    puts a.join(',')
```

STEP:26【特定の文字で区切り 1 行で出力】大きな数値を 3 けたごとにカンマ区切りで出力 2
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_split_boss

```ruby:step26.rb
n = gets.to_s
if n.size % 3 == 0
    a = n.scan(/.{1,#{3}}/)
    puts a.join(',')
elsif n.size % 3 == 1 
    b = n.scan(/.{1,#{1}}/)
    print "#{b[0]},"
    c = n.slice(1..(n.size))
    d = c.scan(/.{1,#{3}}/)
    print d.join(',')
else
    e = n.scan(/.{1,#{2}}/)
    print "#{e[0]},"
    f = n.slice(2..(n.size))
    g = f.scan(/.{1,#{3}}/)
    print g.join(',')
end
```
※問題の判定だと違いますが、解答にかけるとちゃんと通ります。
この文章は当たっていればそれでいいという精神で書いてます。


STEP: 27 2 * 2 の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step1

```ruby:step27.rb
puts "0 8"
puts "1 3"
```

STEP: 28 3 * 3 の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step2

```ruby:step28.rb
n = gets.split(' ')
puts "#{n[0]} #{n[1]} #{n[2]}"
puts "#{n[3]} #{n[4]} #{n[5]}"
puts "#{n[6]} #{n[7]} #{n[8]}"
```

STEP: 29 九九表の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_step3

```ruby:step29.rb
9.times do|i|
    8.times do |j|
        print "#{(i+1)*(j+1)} "
    end
    puts (i+1)*9
end
```

STEP:30 n * n の 2 次元配列の表示】N * N の九九表の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__2dim_array_boss

```ruby:step30.rb
n = gets.to_i
n.times do |i|
    (n-1).times do |j|
            print "#{(i+1)*(j+1)} "
    end
    puts (i+1) * (n)
end
```

STEP: 31 N 個の文字を半分ずつ出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_step1

```ruby:step31.rb
n = gets.to_i
(n / 2 - 1).times {|i| print "#{i + 1} "} 
puts n/2
(n / 2 - 1).times {|j| print "#{(n / 2) + j + 1} "}
puts n
```

STEP: 32 数値を異なる長さで 2 行出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_step2

```ruby:step32.rb
n,m =gets.split(' ').map(&:to_i)
(n - 1).times {|i| print "#{i + 1} "}
puts n
(m - 1).times {|j| print "#{j + 1} "}
puts m
```

STEP: 33 直角三角形の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_step3

```ruby:step33.rb
n = gets.to_i
n.times  do |i|
    i.times {|j| print "#{j + 1} "}
    puts i + 1
end
```

STEP: 34 すべての行の長さが不定な 2 次元配列の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_step4

```ruby:step34.rb
n = gets.to_i
m = gets.split(' ').map(&:to_i)

n.times do |i|
    (m[i]-1).times {|j| print "#{j + 1} "}
    puts m[i]
end
```

STEP: 35 【行によって長さが違う二次元配列の表示】すべての行の長さと値が不定な 2 次元配列の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_boss

```ruby:step35.rb
n,m = gets.split(' ').map(&:to_i)
a = gets.split(' ').map(&:to_i)
b = gets.split(' ').map(&:to_i)
c = 0
d = 0

m.times do |i|
    (b[c]-1).times do |j| 
        print "#{a[d]} "
        d  = d + 1
    end
d = d + 1
puts a[d - 1]
c = c + 1
end
```
※この問題はc = 0, d =0 という
関数を使うことを思いつけるかどうかが鍵となるようです。


STEP: 36 1 つの実数を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__format_real_number_step1

```ruby:step36.rb
n = gets.to_f

puts n
```

STEP: 37 1 つの実数を出力 2
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__format_real_number_step2

```ruby:step37.rb
n = gets.to_f

puts n
```

STEP: 38 1 つの実数を出力 3
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__format_real_number_step3

```ruby:step38.rb
n = gets.to_f

puts n.round(3)
```

※この答えは８０点です。
答えを十で割って十でかけても0.0001を足しても
小数点以下第三位の0が無視されてしまいます。
いくら調べてもわからないので、
１００点はもしかするとrubyの言語では無理なのかもしれません。

すみません。入れる方法ありました。

```ruby:step40.rb
n = gets.to_f

printf("%2.3f", n)
```


STEP: 39 1 つの実数を出力 4
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__format_real_number_step4

```ruby:step39.rb
n,m = gets.split(' ').map(&:to_f)

puts n.round(m.to_i)
```

※前の答えと同様にこの答えも８０点です。
１００点はもしかするとrubyの言語では無理なのかもしれません。

こちらも同様にちゃんと入力できる答えがありました。

```ruby:step39.rb
n,m = gets.split(' ').map(&:to_f)

printf("%2.#{m.to_i}f", n)
```

STEP:40【実数をフォーマット指定して出力】複数の実数を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__format_real_number_boss

```ruby:step40.rb
q = gets.to_i
n = Array.new(q)
m = Array.new(q)

q.times do |i|
    n[i],m[i] = gets.split(' ').map(&:to_f)
    puts n[i].round(m[i].to_i)
end
```

※この答えは１０点です。
小数点以下の0が無視されるのでどうしても無理です。
ちゃんとした解答方法はあるのでしょうか？

```ruby:step40.rb
q = gets.to_i
n = Array.new(q)
m = Array.new(q)

q.times do |i|
    n[i],m[i] = gets.split(' ').map(&:to_f)
    printf("%2.#{m[i].to_i}f", n[i])
    puts ""
end
```

すみません。解き直しても90点にしかならないです。
なぜかがわかりません。



STEP: 41 数値を半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step1

```ruby:step41.rb
n = gets.to_i

if n > 99
    puts n
elsif n > 9
    puts " #{n}"
else
    puts "  #{n}"
end
```

※答えを見て、問題の意味がわかるという問題です。
せめてhmtlに空白を入れるなりして欲しいのですが…


STEP: 42 数値をゼロ埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step2

```ruby:step42.rb
n = gets.to_i

if n > 99
    puts n
elsif n > 9
    puts "0#{n}"
else
    puts "00#{n}"
end
```

STEP: 43 複数の数値を半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step3

```ruby:step43.rb
n = gets.to_i
m = Array.new(n)

n.times do|i|
    m[i] = gets.to_i
    if m[i] > 99
        puts m[i]
    elsif m[i] > 9
        puts " #{m[i]}"
    else
        puts "  #{m[i]}"
    end
end
```

STEP: 44 数値を M けた半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_step4

```ruby:step44.rb
n,m = gets.split(' ').map(&:to_s)
if m.to_i == 1
    puts n.slice(n.size)
elsif m.to_i == 2
    if n.to_i > 9
        puts n
    else
        puts " #{n}"
    end
else
    if n.to_i > 99
        (m.to_i - 3).times {print " "}
        print n
    elsif n.to_i > 9
        (m.to_i - 2).times {print " "}
        print n
    else
        (m.to_i - 1).times {print " "}
        print n
    end
end
```

STEP:45【出力幅を指定して出力】N 個の数値を M けた半角スペース埋めで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__print_width_boss

```ruby:step45.rb
n,m = gets.split(' ').map(&:to_i)
a = Array.new(n)

n.times do |i|
    a[i] = gets.to_s
    if m == 1
        puts a[i].slice(a[i].size)
    elsif m == 2
        if a[i].to_i > 9
            puts a[i]
        else
            puts " #{a[i]}"
        end
    else
        if a[i].to_i > 99
            (m - 3).times {print " "}
            puts a[i]
        elsif a[i].to_i > 9
            (m - 2).times {print " "}
            puts a[i]
        else
            (m - 1).times {print " "}
            puts a[i]
        end
    end
end
```

STEP: 46 2 つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step1

```ruby:step46.rb
s = gets.to_s.chomp
t = gets.to_s.chomp
puts "#{s} + #{t} = #{s}#{t}"
```

STEP: 47 文字列と N 個の整数の出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step2

```ruby:step47.rb
n,a,b = gets.split(' ').map(&:to_i)
(n-1) .times {print "(#{a}, #{b}), "}
print "(#{a}, #{b})"
```

STEP: 48 九九表を罫線入りで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step3

```ruby:step48.rb
8.times do |i|
    8.times do |j|
        if (i + 1) * (j + 1) < 10
            print " "
            print (i + 1) * (j + 1)
        else
            print (i + 1) * (j + 1)
        end
        print "|"
    end
    
    if (i + 1) * 9 < 10
        print " "
        puts (i + 1) * 9
    else
        puts (i + 1) * 9
    end
    25.times {print "="}
    puts "="
end
print " 9|"
7.times do |k|
    print (k + 2) * 9
    print "|"
end
puts "81"
```

※このコードはほぼほぼ答えと合致しますが、何故か答えが違うと出ます。
理由がわからないのでちょっとこの問題は保留にします。


STEP: 49 ペアの数値の入った表を罫線入りで出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__specific_format_step4

```ruby:step49.rb
h,w,a,b = gets.split(' ').map(&:to_i)
c = 0

(h - 1).times do 
    (w - 1).times do |i|
        print "("
        if a > 9
            print a
        else
            print " #{a}"
        end
        print ","
        if b > 9
            print b
        else
            print " #{b}"
        end
    print ")|"
    c = c + 1
    end    
    print "("
        if a > 9
            print a
        else
            print " #{a}"
        end
    print ","
        if  b > 9
            print b
        else
            print " #{b}"
        end
    puts ")"
    c.times {print "========"}
    puts "========"
    c = 0
end

(w - 1).times do
    print "("
        if a > 9
            print a
        else
            print " #{a}"
        end
    print ","
        if b > 9
            print b
        else
            print " #{b}"
        end
    print ")|"
end    
    print "("
    if a > 9
        print a
    else
        print " #{a}"
    end
print ","
    if b > 9
        print b
    else
        print " #{b}"
    end
puts ")"
```

※この問題もほぼほぼ答え通りの結果が出たのではないかと思うのですが、
何故か間違い、どこが違うかがわからないので保留にします。
自由に書くメソッドをうまく使えば省略できるのかもしれませんが、
現段階ではメソッドの使い方がよくわかりません。
（次の問題をやることでsizeのメソッドを使えば解決できると気づきましたが、
えらい苦労したので、そのままこのコードを貼っておきます。



STEP 50 :【出力形式を指定して出力】ペアの数値の入った表を罫線入りで出力 2

```ruby:step50.rb
h,w,a,b = gets.split(' ').map(&:to_i)
c = 0

(h - 1).times do 
    (w - 1).times do 
        print "("
        (9 - a.to_s.size).times {print " "}
        print "#{a},"
        (9 - b.to_s.size).times {print " "}
        print "#{b}) | "
        c = c + 1
    end
    
    print "("
    (9 - a.to_s.size).times {print " "}
    print "#{a},"
    (9 - b.to_s.size).times {print " "}
    puts "#{b})"
    c.times { print "======================="}
    puts "======================"
    c = 0
end

 (w - 1).times do 
    print "("
    (9 - a.to_s.size).times {print " "}
    print "#{a},"
    (9 - b.to_s.size).times {print " "}
    print "#{b}) | "
    end
    
print "("
(9 - a.to_s.size).times {print " "}
print "#{a},"
(9 - b.to_s.size).times {print " "}
puts "#{b})"
```

※この答えも失敗します。数がデカすぎてチェックが当たっているのか確認できず、
正解を出すのを断念したので、答えに近いと思われるコードだけ貼って
お茶を濁しておきます。
そもそも罫線を何本引くかの正解がよくわからないし、
正解っぽい本数にしても正解にならないので、
断念せざるを得ませんでした。