学年割り電卓2のリリース

学年割り電卓2(スマホ用Webアプリ)をすぐに使ってみる --> https://jumpaku.github.io/GakunenWari/

はじめに

日本には「先輩は後輩よりも偉い」という意味不明の謎の文化があるらしい. 実際,私も大学生活において次のような場面に遭遇したことがある.

  1. サークル内でお喋りをしていたとき,後輩が先輩に対して敬語を使わなかったため空気が張り詰めた.
  2. サークルで食事をして割り勘をするときに,先輩が後輩よりも多く支払った.

ここで,2. のように先輩の支払額が後輩のものよりも多くなるように割り勘することを学年割りという. 学年割りは学年が上がるに従って支払額も増加させる必要があるが,暗算だけで「丁度良い」増加量を設定するのは困難である. そこで,これまでに学年割り電卓 GakunenWari Calculator - Jumpaku’s blog[1],学年割電卓に新機能 GakunenWari Calculator updated - Jumpaku’s blog[2]が開発され,学年割りを行うスマホ用Webアプリによって,暗算に頼らない学年割りが実現された. しかし,これらのスマホ用Webアプリでは「丁度良い」増加量を見つけるために,学年間の支払金額の差をテキストフィールドに入力し,計算ボタンを押す,という作業を繰り返しながら試行錯誤する必要があり,手間がかかった. また,端数の処理していなかったため,学年割り計算後の集金にも手間がかかった.

以下では,端数処理を含めた学年割り計算法を示した上で,これを[1], [2]に組み込み,新たに「学年割り電卓2」を開発する.

端数処理を含めた学年割り計算法

学年割りは学年\(i \ (i \in I, I = \{0, \ldots, 6\})\)が上がるに従ってその学年の参加者一人当たりの支払額\(x_i\)が増加するように\(x_i\)を計算するものである. ただし,学年\(i\)は以下のように定める.

学部1年 学部2年 学部3年 学部4年 修士1年 修士2年 博士以上
\(0\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\)

ここでは\(x_i\)を単調増加する等差数列として求めることとする. また,切捨て端数の上限を\(u\)を設定し,\(x_i\)に次の制約を与えることとする.

$$ \forall i \in I, \ x_i は u で割り切れる. $$

この端数処理より,\(x_i\)が切りの良い値となり,集金の際の手間が軽減される.

合計支払金額を\(T\),学年が\(i\)である参加者の人数を\(c_i\)とし, 参加者からそれぞれ\(x_i\)だけ集金しそれを合計した合計集金額を \( T' = \sum_{i \in I} x_i c_i \) とするとき, 端数処理によって必ずしも \(T = T'\) とはならない. ここでは\(T'\)が\(T\)を超えない限り最大になるように\(x_i\)を求めて,不足額\(r = T - T'\)とともに出力するものとする.

\(x_i\)は初項\(x_0\),公差\(d\)を用いて

$$ x_i = x_0 + id $$

と表される. \(x_i\)は\(u\)の倍数となるため,\(x_0 = a u\),\(d = b u\)を満たすパラメータ\(a \in \mathrm{Z}\),\(b \in \mathrm{Z}\)が存在し,\(x_i\)は

$$ x_i = u(a + ib) $$

と表すことができる. 従って\(T'\)は\(n = \sum_{i \in I} c_i\),\(C = \sum_{i \in I} i c_i\)を用いて

$$ T' = u a n + u b C $$

と表すことができる. ここで,\(b\)は学年毎の金額差を調節するパラメータであり,ユーザはこれを変更することで丁度良い増加量を見つけることができる. また,\(a\)は初項を決定する未知のパラメータである.

\(r = T - T'\)より

$$ a = \frac{T - r - u b C}{u n} $$

と変形すると\(a\)が整数であり,\(T'\)は\(T\)を超えない限り最大となるため,

$$ r = (T - u b C) \% (u n) $$

と\(r\)が得られ,\(a\)が定まる.

以上より,

  • 合計支払金額\(T\),
  • 端数の上限\(u > 0\),
  • 学年毎の金額差を調節するパラメータ\(b \geq 0\),
  • 学年が\(i\)である参加者の人数\(c_i\)

を入力とし,

  • 学年が\(i\)である参加者の一人当たりの支払額\(x_i\),
  • 不足額\(r\)

を出力とする,端数処理を含めた学年割り計算法が実現される.

学年割り電卓2

上の端数処理を含めた学年割り計算法を用いてスマホ用Webアプリ「学年割り電卓2」を開発した. 学年割り電卓2はHTML,TypeScript,CSSを用いて開発され,現在GitHub Pages上で公開されている(https://jumpaku.github.io/GakunenWari/).

学年割り電卓2のUIを以下に示す.

f:id:Jumpaku:20181224182122j:plain

まず,合計支払金額に\(T\)の値,切捨端数に\(u\)の値,それぞれの学年の人数に\(c_i\)の値を入力し, 次に,下部のスライダーを動かして\(b\)の値を設定すると, 支払額に\(x_i\)の値,不足額に\(r\)の値が表示される. ここで,\(b\)の値を設定するスライダーの変化に応じて,リアルタイムに支払額の表示が変化するため, 丁度良い増加量をすぐに見つけることができる.

また,表示される支払額は設定した端数の上限で割り切れることが保証されているため,集金時に細かい小銭をやり取りする手間もかからない.

学年割り電卓2のソースコードGitHub - Jumpaku/GakunenWari: 学年割り電卓で公開されている.

まとめ

  • 学年が上がるに従って支払額も増加する割り勘,すなわち,学年割りが行われる機会がある.
  • 学年割りを暗算無しに行うためのスマホ用Webアプリ「学年割り電卓2(https://jumpaku.github.io/GakunenWari/)」を開発した.
  • 学年割り電卓2は端数処理を行うため,それぞれ学年の参加者の一人当たりの支払額が切りの良い値となる.
  • 学年間の金額差を設定するスライダーがあり,学年間の金額差を設定しやすい.

謝辞

本記事はMuroran Institute of Technology Advent Calendar 2018 - Adventarの記事です.