或るプログラマの開発日記

日々の勉強したことの備忘録なんかに使っていきます

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で実装してみました。

(1..100).each do |x|
  if x % 15 == 0 then
    puts "FizzBuzz"
  elsif x % 3 == 0 then
    puts "Fizz"
  elsif x % 5 == 0 then
    puts "Buzz"
  else 
    puts x
  end
end

実行結果

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16

#(中略)

89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

雑感

この問題の解き方として、「剰余演算子(%)禁止」とか、最小文字数で実装するとか色んな楽しみ方があるようです。色んな解き方を考えて見るのもプログラミングの楽しさですね。(^-^)

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

実行結果

Fixnum
Float
String
TrueClass
FalseClass
NilClass

この辺、CやらJava辺りをやってきたモンには結構つまづきやすいとこだなー。

初めてのRubyプログラム

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

qiita.com

組み合わせの数を計算する

プログラミングの問題を解いてると、組み合わせの数を計算する必要が出てきたので、調査した内容をメモ。

組み合わせの数とは

高校数学なんかで習った記憶は微かにあるが、大分忘れてるので勉強しなおし。
こちらのサイトの説明が非常に丁寧でした。

組み合わせの公式~計算方法と練習問題~:ビジュアル数学(数学A:場合の数)

実装

一通り理解したところで実装してみる。因みに言語は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の勉強をすることにする。

 

いや、実はPythonC#なんかも覚えて見たいとなーという感じはあるのだが、あれもこれもと欲を張ると結果何も身につかないものである。これは、自分でも身にしみて分かっているのである。二兎追うものはなんとやらである。

 

ま、勉強方法としてはCodeIQや最近登録してみたpaizaなんかの問題をRuby使って解いて見るということで考えている。

 

 

とりあえず、今日は以上。

月末にはちゃんと振り返りできてますよーに。( ー人ー)|||~~~

ブログはじめました

初めまして!パイソンと申します。

ソフト業界に就職してから、かれこれ10年以上この業界で生き抜いてきたプログラマです。もう30代後半ともなると自分のスキルとかをもっとあげないとこれから仕事してけないかなーという思いを抱きながら日々すごしています。

 

そんなわけで、これからもっとスキルのあるSEになるためにやっている日々のプログラミングの勉強やなんかの覚書、メモとしてこのブログ活用していきたいとおもっています。

そういや、はてなブログてSE業界の人のブログが結構多いような気がするしね。

 

ま気のせいかも知らんが。