月別アーカイブ: 2022年2月

PaizaLvアップ問題集(標準出力)

※スキルチェック問題ではありません。
規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

問題1

実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。
また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。

なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。

入力例
0.813 4

出力例4
0.8130

解答

n,m = gets.split(' ').map(&:to_f)
# 小数点以下の桁数を指定しています
printf("%.#{m.to_i}f", n)

問題2 複数の実数を出力 (paizaランク C 相当)

自然数 Q が与えられます。Q 回以下の問題に答えてください。
実数 N、自然数 M が入力されます。N を丸めて小数第 M 位まで出力してください。また、N の小数部が小数第 M 位に満たない場合は 0 で埋めて出力してください。

なお、小数第 M 位が 5 になることはありません。
自然な丸め処理を行って出力すると正解になります。

入力例1

4
0.813 1
0.813 2
0.813 3
0.813 4

出力例1

0.8
0.81
0.813
0.8130

問題3 直角三角形の出力

自然数 N が与えられます。1 ≦ i ≦ N の各 i について、i 行目には以下の数列を出力してください。* 1 以上 i 以下の数値をすべて、半角スペース区切りで出力してください

入力例1
4

出力例1

1
1 2
1 2 3
1 2 3 4

解答

  1. 入力Nを代入

  2. 配列[1, 2, 3, 4]を作る

  3. timesで繰り返し処理をする

  4. a.takeを使うことで配列をiずつ取り出して半角スペースを間に入れて出力する

n = gets.to_i
a = *(1..n)
1..n.times do |i|
  puts a.take(a[i]).join(' ')
end

 

問題4 すべての行の長さが不定な 2 次元配列の出力

自然数NとN個の要素の数列Mが与えられます。
1 ≦ i ≦ N の各 i について、i 行目には以下の数列を出力してください。
1 以上 M_i 以下のすべての自然数を昇順、半角スペース区切りで出力してください。

入力例1

4
2 4 3 1

出力例1

1 2
1 2 3 4
1 2 3
1

入力例2

1
1

出力例2

1

 

解答  入力例1で解説

  1. 入力Nを受け取る

  2. 数列Mを受け取る

  3. N回繰り返す

  4. mの配列の数字−1回繰り返し(m[0]のときは2−1で1回)、1から初めて

  5. 繰り返しが終わったら、mの配列を加える1 2

  6. 2回目は(m[1]なので4−1で3回繰り返し)1 2 3までやったら

  7. puts m[i]で1 2 3 4が出力されて

  8. 以下繰り返していく

n = gets.to_i
m = gets.split(' ').map(&:to_i)
n.times do |i|
# ここで先に1,2,3,とやってから
  (m[i]-1).times { |j| print "#{j +1 } "}
# 最後にmの配列を足す
  puts m[i]
end

ExecJS::RuntimeError in Users#show(エラー対処録)

ExecJS::RuntimeError in Users#show

Showing /lifehack/app/views/layouts/_head.html.erb where line #8 raised:

SyntaxError: [stdin]:5:19: reserved word ‘function’
Trace of template inclusion: app/views/layouts/application.html.erb

初めてみたエラーだったので記録

経緯

JQueryのスクリプトをパーシャルとしてリファクタリングしようとした。

原因

javascripts/task.coffeeに間違えて以下(JQueryのスクリプト)を記述したら生じた。

<script>
  $("span").click(function () {
  $("h3").toggle("slow");
});
</script>

解決法

javascripts/task.coffeeの↑の記述を削除する。

補足

views/shared/_script.html.erbにスクリプトを記述して

<%= render 'shared/script' %>

で使いました。

ExecJS::RuntimeError(エラー対処録)

初めて見たエラーだったので対処法を記しておきます。

経緯

chart.jsでグラフを作るために記事を参考に試したところエラーが発生した。

原因

window.draw_graph = ->
  ctx = document.getElementById("myChart").getContext('2d')
  barNum = 6
  labels = new Array(barNum)
  bgColors = new Array(barNum)
  bdColors = new Array(barNum)
  for i in [0...barNum]
    labels[i] = 'data' + i
    bgColors[i] = 'rgba(75, 192, 192, 0.2)'
    bdColors[i] = 'rgba(75, 192, 192, 1)'
  myChart = new Chart(ctx, {
    type: 'bar',
    data: {
      labels: labels
      datasets: [{
        label: '# of Votes',
        data: gon.data,
  backgroundColor: bgColors,
  borderColor: bdColors,
  borderWidth: 1
  }]
  },
  options: {
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero:true
        }
      }]
    }
  }
  })

原因

インデントのズレなど構文が間違っているとなるようです。

解決法

Rubymineの自動フォーマット(⌥+⌘+Lキー)でインデント修正して解決しました。

window.draw_graph = ->
  ctx = document.getElementById("myChart").getContext('2d')
  barNum = 6
  labels = new Array(barNum)
  bgColors = new Array(barNum)
  bdColors = new Array(barNum)
  for i in [0...barNum]
    labels[i] = 'data' + i
    bgColors[i] = 'rgba(75, 192, 192, 0.2)'
    bdColors[i] = 'rgba(75, 192, 192, 1)'
  myChart = new Chart(ctx, {
    type: 'bar',
    data: {
      labels: labels
      datasets: [{
        label: '# of Votes',
        data: gon.data,
        backgroundColor: bgColors,
        borderColor: bdColors,
        borderWidth: 1
      }]
    },
    options: {
      scales: {
        yAxes: [{
          ticks: {
            beginAtZero: true
          }
        }]
      }
    }
  })

 

よくあるエラーらしいので、遭遇しても落ち着いて対処しよう

NoMethodError in ***Controller#show(エラー対処備忘録)

NoMethodError in ***Controller#show

undefined method `***’ for nil:NilClass

Extracted source (around line #30):
28
29
30
31
32
33
def show
   @macs = @user.macs.page(params[:page]).per(8)
end
def update

ハマってしまったので、同じことを繰り返さないために。

経緯

<span class="btn-sticky">すべての更新、作成日時を表示,非表示</span>
<% if @user.macs.any? %>
  <% @user.macs.each do |mac| %>
    <section class="panel">
      <div class="panel-left">
          <h2>目標:<%= mac.measurable %></h2>
          <h2>ゴールまでのプロセス<br><%= mac.actionable %></h2>
          <h2>目標達成が価値観に基づいているか?<br><%= mac.competent %></h2>
          <li><h3>更新日時:<%= mac.updated_at.to_s(:datetime_jp) %></h3>
            <h3>作成日時:<%= mac.created_at.to_s(:datetime_jp) %></h3></li>
        </ul>
      </div>
      <div class="panel-right">
        <%= link_to(content_tag(:i, '', class: "fas fa-trash-alt fa-3x faa-horizontal animated-hover fa-pull-right", style: "color: rgb(80,80,80);"), mac_path(mac.id), method: :delete, data: {confirm: "本当に削除しますか?"}) %>
        <%= link_to(content_tag(:i, '', class: "fas fa-edit fa-3x faa-vertical animated-hover fa-pull-right", style: "color: rgb(80,80,80);"), edit_mac_path(mac.id)) %>
    </section>
  <% end %>
<% end %>
<%= render 'shared/script' %>

user_idに紐付いたmacモデルのもの(:measurable, :actionable, :competent)を繰り返しで表示させたかった。

原因

***_controller.rb

def show
  @macs = @user.macs.page(params[:page]).per(8)
end

@userをmacs_controller.rbに定義していなかったためnilになった。

機能がほぼ同じだったので他のコントローラーからコピペしたせいで

リファクタリングでprivate にあった@user = User.find(params[:id])

を見落としていたため。

解決法

***_controller.rb

def show
  @user = User.find(params[:id])
  @macs = @user.macs.page(params[:page]).per(8)
end

@user = User.find(params[:id])

Rubyまとめex(標準入力)

Rubyで標準入力から値を受け取る方法 2022年版

はじめに

この記事は、プログラミング問題などでよく見られる、標準入力から値を受け取る方法をまとめたものです。

前提

使用する言語はRubyです。

一行に1要素のとき(文字列)

標準入力

Ruby

標準入力を受け取るコード

string = gets

出力するコード

p string

出力結果

"Ruby"

一行に半角スペース刻みで要素があるとき(文字列)

標準入力

Ruby PHP Python

標準入力を受け取るコード

strings = gets.split

出力するコード

p strings

出力結果

["Ruby", "PHP", "Python"]

splitを使用することで、3つの要素をそれぞれ別のものとして配列に格納しています。

※splitの使い方
split(‘ ‘)としている記事などもありますが、
半角スペース刻みの入力値の場合は引数(‘ ‘)を指定しなくても問題ありません。

つまりsplit(‘ ‘) ≒ split (※半角スペース刻みの入力値のときのみです)

複数行に一つずつ要素が存在するとき(文字列)

標準入力

Ruby
PHP
Python

標準入力を受け取るコード

strings = readlines.map(&:chomp)
#またはこちら(パフォーマンス的に推奨)
strings = readlines(chomp: true)

出力するコード

p strings

出力結果

["Ruby", "PHP", "Python"]

複数行に半角スペース付きで要素が複数存在するとき(文字列)

標準入力

Ruby PHP Python
Java C# C++

標準入力を受け取るコード

strings = readlines.map{ |i| i.split.map(&:chomp)}
# またはこちら(推奨)
strings = readlines.map(&:split)

出力するコード

p strings

出力結果

[["Ruby", "PHP", "Python"], ["Java", "C#", "C++"]]

標準入力

Ruby PHP Python
Java C# C++

入力値が数値の場合

一行に数値がひとつのとき

標準入力

123

標準入力を受け取るコード

number = gets.to_i

出力するコード

p number

出力結果

123

一行に半角スペース刻みで数値があるとき

標準入力

1 2 3

標準入力を受け取るコード

numbers = gets.split.map(&:to_i)

出力するコード

p numbers

出力結果

[1, 2, 3]

複数行に一つずつ数値が存在するとき

標準入力

1
2
3

標準入力を受け取るコード

numbers = readlines.map(&:to_i)

出力するコード

p numbers

出力結果

[1, 2, 3]

複数行に半角スペース刻みで要素が存在するとき

標準入力

1 2 3
4 5 6

標準入力を受け取るコード

numbers = readlines.map{ |i| i.split.map(&:to_i) }

出力するコード

p numbers

出力結果

[[1, 2, 3], [4, 5, 6]]

PendingMigrationError(エラー対処)

ActiveRecord::PendingMigrationError

Migrations are pending. To resolve this issue, run: bin/rails db:migrate RAILS_ENV=development

Extracted source (around line #576):
574
575
576
577
578
579
# Raises <tt>ActiveRecord::PendingMigrationError</tt> error if any migrations are pending.
def check_pending!(connection = Base.connection)
raise ActiveRecord::PendingMigrationError if ActiveRecord::Migrator.needs_migration?(connection)
end
def load_schema_if_pending!

解決方法(マイグレートする)

docker-compose exec web bundle exec rake db:migrate