プログラミングする数学信者

数学信者が数学とプログラミングの話題を中心にして何か書きます

Rubyでバイバイマンを数えてみた

CodeIQのバイバイマンを数えように挑戦しました。問題はこちらです。

バイバイマンのサイズを整数値で表します。
一番最初の大きさを「1」とし、1日経つと2倍の「2」、さらに1日後は「4」というように、1日毎に2倍になります。


また、バイバイマンは「1」→「2」→「4」→「8」→「16」と、大きさが10を超えたところで分裂します。
分裂後のサイズは、「16」なら「1」と「6」のように10の位の数と1の位の数になります。
分裂したバイバイマンは、再び大きくなります。


このようなルールで増えるバイバイマンの数を、1日ごとに調べて、100日目までを出力してください。

この問題ではコードゴルフが行われていて、できるだけ短いコードで書くことを競います。僕はRubyで挑戦したのですが、結果はRubyで25位でした。そんなによくない結果ですが、提出したコードを晒すと次のようになります。

a=[0,0,0,0,1];100.times{p a.inject(:+);a[4]+=a[0];a[0]+=a[1];a.rotate!()}

最後にこのコードについて説明してこの記事を締めくくります。

配列aの各要素には、サイズ6,8,4,2,1のバイバイマンの数を格納します。

バイバイマン分裂時に生じるサイズ1の個体を無視すると(例えばサイズ16の個体がサイズ1と6の個体に分裂するとき、サイズ6の方だけ考える)、1日経った後の各サイズのバイバイマンの個数は配列aの中身を左へ巡回させることで求められます。これがa.rotete!()の部分です。

そして先ほど無視したサイズ1の個体を加えます。これがa[4]+=a[0];a[0]+=a[1];に対応しています。

(2016.02.21 修正)
バイバイマンのサイズは1,2,4,8,6に限られます。各サイズのバイバイマンの数を配列aにするのですが、配列の操作がしやすいように、a[0]から順にサイズ6,8,4,2,1のバイバイマンの数を格納します。

バイバイマンの数が増えるのは、サイズが8→16になるか、6→12になるときです。ここで、サイズ16の個体から分裂してできた個体のうちサイズ1の方を無視し、サイズ12の個体からの分裂についてはサイズ2の方を無視します。このとき、1日経った後の各サイズのバイバイマンの個数は配列aの中身を左へ巡回させることで求められます。これがa.rotete!()の部分です。

そして先ほど無視した個体を勘定に入れます。これがa[4]+=a[0];a[0]+=a[1];に対応しています。

バイバイマンの総数はa.inject(:+) で求めます。

POH7「プログラミングで彼女をつくる」水着ゲットチャレンジ

paizaオンラインハッカソン vol.7 「プログラミングで彼女をつくる」というプログラミングで遊ぶイベントがありました。
paiza.jp

そこの水着ゲットチャレンジで正解した自分のコードを載せます。試行錯誤の末辿り着いたものなので、自分でもわからない部分がありますが…

続きを読む

CodeIQ「スクエア・カルテット」提出コード

CodeIQの「スクエア・カルテット」で正解した自分のコードをとりあえず公開します。

問題はこちら。

2つの自然数の組 (a, b) が与えられたとき、自然数 x, y に関する次の方程式を考えます。
    x^2 + a^2 = y^2 + b^2 … (※)
例えば、(a, b) = (3, 10) のとき、方程式(※)の解は (x, y) = (10, 3), (46, 45) の 2 組です。

自然数の組 (a, b) に対し、方程式(※)の全ての解の x + y の和を F(a, b) と定義します。

例えば F(3, 10) = 10 + 3 + 46 + 45 = 104 です。

同様に、F(10, 50) = 3500、F(20, 100) = 15022 となることが確かめられます。

標準入力から、半角空白区切りで 2 つの自然数 a, b(1 ≦ a < b ≦ 105)が与えられます。
標準出力に F(a, b) の値を出力するプログラムを書いてください。

続きを読む

成人式に行かなかった理由

今日は各地で成人式が行われているようですね。僕も大学3年生のときに成人式に行く(一生に一度だけの)チャンスがありましたが、結局行きませんでした。行かなかった理由(言い訳)はざっくり言うと次の通りです。

会場へのアクセスがよくなかった

 成人式の会場へのアクセスがよくありませんでした。電車の駅近くになく、バスでしか行けませんでした(混んでいるバスに乗りたくなかった)。

会いたい人がいなかった

自分の経歴を言うと、地元の公立の小中学校を卒業後、私立の高校に進学しました。その当時、小中時代の同級生とはコンタクトを取っていませんでした*1。高校は私立だったので、同級生の出身地はバラバラで、成人式で会う可能性はほぼありませんでした*2

 最後に一言だけ。成人式に行ってなくても別に後悔はありませんでした。

*1:今はFacebookでコンタクトが取れるようになっています。おかげで中学の同窓会に参加できました。

*2:高校の系列の大学に進学したので、大学で高校の同級生には会えていました。

Twitterで論文誌が作れる時代が来るかも

Twitterがツィートの文字数制限を1万字にまで緩和することを検討しているとこのこと。

ニュース - Twitter、140字の文字数制限を今春にも撤廃か:ITpro

 

いままでの140字に比べると約70倍になります。では、1万字では日本語だとどれくらいの文章を書けるのでしょうか?400字詰原稿用紙を考えると25枚分。多いです。ちょっとした論文を書けるレベルです。さらに、文字数制限緩和してもタイムライン上で表示されるのは140字のままにする計画のようです。

 

このニュースを聞いてあることを思いつきました。それはTwitter上で和文論文誌を作ること。基本的な枠組みは次のようになります。

  • 最初の140字に概要を書く。つまりタイムライン上で見えるのは概要だけ。残りに本文を書く。
  • Togetterで論文を集約し、そのまとめを論文誌の冊子代わりにする。

ただ、参考文献のリストは本文とは別のツィートに書くことになるかもしれません。それは実際に運営して決めるべきでしょう。さらにTwitterの機能を活かせば、次のようなことも可能になります。

  • 返信機能でsupplement, errata, comment, replyを書く。
  • Twitter上でリアルタイムでレフェリーと議論。しかも議論はオープン。
  • 投票機能で論文をアクセプトするかリジェクトするかをアンケートする。

 

1ツィート1万字になると夢が広がりますね。なお、この論文誌構想は自分でやるのが面倒くさいので、誰か代わりにやってください(丸投げ)

二項係数に関する恒等式

この恒等式を証明します。
\displaystyle \sum_{j=1}^{n} j\binom{2n}{n+j} = \frac{n}{2} \binom{2n}{n} \tag{*} \label{eq0}
元ネタはhttps://twitter.com/MERU9RIN/status/684313920945786880です。

続きを読む

Q上の加法的関数

今回はこの問題を解きます。


関数f:\mathbb{Q}\rightarrow\mathbb{Q} で、
\forall x,y\in\mathbb{Q},\: f(x+y)=f(x)+f(y)\tag{1}\label{eq1}
を満たすものを決定するという問題です。

続きを読む