RubyでFizzBuzz問題を解く
どうも、パイソンです。
ネットを探索してると、初歩的なプログラム問題としてFizzBuzz問題なるものが超有名であるとありました。
いや、実際10年以上プログラマやってるが初めて聞いたぞ。。(;^_^A
ということで、今回ブログのネタがてら少し調べて見ることにしました。
FizzBuzzとは
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
Fizz Buzz - Wikipedia
これをプログラムで出力しなさいというのが、FizzBuzz問題だということ。
確かにこの問題、プログラミングの初歩である、「条件分岐」、「繰り返し」の要素が理解出来ていないと解けないので、基本が出来ているかどうかを試すには程よい問題ですね。
プログラミングを教える題材として、HelloWorldの次ぐらいの例題として使えます。
時期柄、新人研修なんかの演習問題としても丁度良いかも。
雑感
この問題の解き方として、「剰余演算子(%)禁止」とか、最小文字数で実装するとか色んな楽しみ方があるようです。色んな解き方を考えて見るのもプログラミングの楽しさですね。(^-^)
Rubyの勉強開始
どうも、パイソンです。
先日からRubyを独学で勉強してます。ただググって自習するのも大分しんどいので、図書館でruby周りの本を片っ端から借りてきました。先ずはイロハのイ辺り、初歩中の初歩から勉強してます。
そこで先ず最初に感心したのが、
rubyにはプリミティブ型が無い
ということ。所謂CやJavaで使うようなint,doubleなんかの型という概念は無いということですな。
代わりに、1や"string"といったようなモノは全てオブジェクトとして扱えるということみたい。
サンプルプログラム
puts 1.class.name puts 1.1.class.name puts "Hello".class.name puts true.class.name puts false.class.name puts nil.class.name
初めてのRubyプログラム
Rubyはじめました。
先ずはCodeIQとかでありがちな問題を解く用の簡単なプログラムを書いてみた。
メインプログラム
標準入力から2個の数値を受け取って、そっからcalcAnswerメソッドでなんやかんや処理した結果を標準出力するプログラム。
例は単なる掛け算だけど、まぁこれは単なるサンプルということで。
#sample.rb class Sample def self.calcAnswer(m, n) return m * n; end if __FILE__ == $0 (m, n) = STDIN.gets.split(" ") str = calcAnswer(m.to_i,n.to_i) puts str end end
テストプログラム
メインがあればテストプログラムも必要。というわけで、メインプログラムのメソッドを検証する用のプログラムがこれ。
#sample_test.rb require 'test/unit' require_relative 'sample' class TestSample < Test::Unit::TestCase def test_calc_answer assert_equal 8 , Sample.calcAnswer(2,4) end end
開発環境
Eclipse4.6 + Ruby Development Tools
雑感
Rubyの文法は慣れないから、これだけ書くのに2時間以上かかった。。(´Д`)
参考URL
組み合わせの数を計算する
プログラミングの問題を解いてると、組み合わせの数を計算する必要が出てきたので、調査した内容をメモ。
組み合わせの数とは
高校数学なんかで習った記憶は微かにあるが、大分忘れてるので勉強しなおし。
こちらのサイトの説明が非常に丁寧でした。
実装
一通り理解したところで実装してみる。因みに言語はJava。
//組み合わせの数nCrを計算 int calcNumOfCombination(int n, int r){ return factorial(n) / (factorial(r) * factorial(n-r)); } //nの階乗を計算 int factorial(int n){ int answer = 1; while(n > 1){ answer *= n; n--; } return answer; }
実行して見た結果
テストを走らせたところ、一部ケースが通ったが組み合わせがでかいケースで結果がおかしくなることが判明!
そりゃそーだ。桁あふれしてますやーん(T_T)
改良版実装
こちらが、(ある程度)桁あふれ対策した改良版。おとなしく先人の知恵を拝借することに。
C言語で数値計算(1)順列・組み合わせの「組み合わせ」(漸化式のループ処理による実装) - Qiita
//組み合わせの数nCrを計算 int calcNumOfCombination(int n, int r){ int num = 1; for(int i = 1; i <= r; i++){ num = num * (n - i + 1) / i; } return num; }
2017年4月の目標
本日は2017年4月2日。一応年度初めでもあるし、月の初めでもあるので何か目標みたいなものを書いてみようと思う。
そこで今回は、当面4月の目標として簡単に2点挙げておこうと思う。
何故なら、
1年に渡るような長期の目標だと、途中でダレてしまいそうだから。。
また、
出来るかどーか分からんような崇高な目標だと、投げ出したくなりそうだから。。
というわけで、4月の目標。
1.ブログを毎日更新してみる。
実はブログを書くのはここが初めてでは無いのだが、はてなブログは昨日触り始めたばかりなのである。ぶっちゃけ目次や見出しのつけ方なんかも、よーわからん状態ではあるが、もうこういうのは書きまくって慣れるしかないのであろう。
とりあえず、最初の内は荒い内容になるかとは思うが、1日1更新を実行していこう。
2.Rubyを勉強してみる
現在の業務ではJavaを主に使っているが、やはりプログラマたるもの自分の使える言語は増やしておきたいものである。
そこで、とりま今月はRubyの勉強をすることにする。
いや、実はPythonやC#なんかも覚えて見たいとなーという感じはあるのだが、あれもこれもと欲を張ると結果何も身につかないものである。これは、自分でも身にしみて分かっているのである。二兎追うものはなんとやらである。
ま、勉強方法としてはCodeIQや最近登録してみたpaizaなんかの問題をRuby使って解いて見るということで考えている。
とりあえず、今日は以上。
月末にはちゃんと振り返りできてますよーに。( ー人ー)|||~~~