ZARU(ざる)のWeb系ブログですー。プログラミング&デザイン関係のTipsとか色々と。

Ruby プログラミング練習問題3「素数判定」

火曜日, 2月 16th, 2010

第3回目のRubyプログラミング練習問題。今回は素数かどうかを調べる。

プログラミング練習問題3「素数判定」

与えられた数が素数かどうか調べる
あるいは与えられた数までの素数を列挙する
処理にかかった時間を計測しておくと、自分の技術向上に伴って処理時間が短くなっていくのがよくわかる

素数とは

素数自体について調べる余地はないと思っていたけど、念のためWikipediaさまを参照してみると1とその数自身以外に正の約数がない(つまり1とその数以外のどんな自然数によっても割り切れない)、1 より大きな自然数のこと。ということだそうで。

とりあえずの回答

じゃあ、指定した数字が素数かどうかを調べるのを書いてみることにする。ぱっと思いついたのはやはり、2から指定した数まで全て列挙して割り算をしていくという力業。というかこれしか思いつかない。ならば簡単…ということで。

#!/usr/bin/ruby

num = ARGV[0]
flag = 0
2.upto(num.to_i - 1) do |i|
    over = num.to_i % i
    puts num + ' / ' + i.to_s + 'の余りは' + over.to_s + "\n"
    if over == 0
        flag = 1
    end
end

if flag == 0
    puts num + 'は素数です'
else
    puts num + 'は素数ではありません'
end

実行結果
$./3_1.rb 5
5 / 2の余りは1
5 / 3の余りは2
5 / 4の余りは1
5は素数です

そもそも素数の判定方法がきちんと考えられていない…気もする。うーん。

まとめサイトに掲載されていた解答例

#!/usr/bin/ruby

require 'mathn.rb'

class PrimePredicater
  def initialize
    @prime = Prime.new
    @cache = []
  end

  def prime?(x)
    extend_cache x if @cache.empty? || x > @cache.last
    @cache.include? x
  end

private
  def extend_cache(lim)
    @prime.each do |x|
      break if x > lim
      @cache.push x
    end
  end
end

#使用例
ppred = PrimePredicater.new
[1, 10, 2, 5, 7].each do |x|
  p ppred.prime?(x)
end

う、うーん?
先生。まったく意味がわかりません。構文自体が謎…。ここら辺はちょっと構文調べてこよう。とりあえずまた次回。

現時点でWebデザインの配色に使える良い感じツール

金曜日, 2月 12th, 2010

デザインでなにが難しいって、やっぱり配色なわけで。レイアウトやディティールが良くても配色次第でオシャレになったりダサくなったり。しかし、配色と一口に言っても奥が深すぎて、軟弱な僕は配色ツールに頼るしかないわけで。

Color Scheme Designer 3

ちょっと前まで、前バージョンのColor Scheme Designer 2を使っていたけど新しいバージョンが素晴らしい。使用方法に慣れるまで少し時間がかかるかもしれないけど、これを使うと安定した配色に。ただ、カスタマイズがかなりできるので色々といじった結果、めちゃくちゃな配色になりがちなので、ほどほどに。

Adobeの配色サイトkulerとかも利用していたのだけど、あれはパラパラーっと見てインスピレーションを得るだけの方が良いのかもしれない。で、思いついた配色をColorSchemeDesigner3で試してみると。

それと、メインの色ではなくて地味な部分で使いたい大人しい色は和色を使っている。

目に優しくメインを壊さずなテイストなので使いやすい。

iMacのモニタが眩しすぎるので暗くしてみた

火曜日, 2月 9th, 2010

なんかここ最近、すごく目がつかれるなーというか、頭が痛い。原因は体調不良とか仕事したくないーとか色々あるけれど、とりあえずiMacのモニタが眩しくて見ていられないので、暗くしてみたよ。

デザインもやっているくせに、僕はかなり暗いモニタが好きでCRTの時もかなり暗くして使っていた。けど、iMacは最低の明るさに設定しても全然明るい!なんだよ、こんちくちょう。ということで、モニタ明るさ調整ソフトを導入してみた。

ユニバーサルバイナリで、10.5以降対応かな?僕のiMac24インチ 10.6でもきちんと動作した。これでめっちゃ暗くして使ってる。環境光と違いすぎると逆に目に負担をかけると思うので、そこら辺は調整していこう。

Flashの上に画像やテキスト、DIVを重ねて表示する方法

月曜日, 2月 8th, 2010

Flashの上に画像やテキストを重ねて表示できないかなーと思って試してみたら普通にできたのでまとめ。とりあえずサンプルを見るのがわかりやすい。

サンプル


HTMLテキストです。

重ねて表示する方法:HTML + CSS

大事なのはFlashを描画する<object>タグの部分。

<param name="wmode" value="transparent" />
<embed wmode="transparent" ... />

この2つをしているすればIE6〜/Fx3〜/Safari3〜/Chromeで、無事にDIVによるテキストの重ね合わせ・背景色の重ね合わせ、透過PNGの重ね合わせを表示できた。透過PNGに関してはIE6対策にJavaScriptのライブラリを導入している。

今回初めてこの透過ライブラリ使ってみたけど、結構良いかもしれない。

#test_flash{
    position:relative;
}
#test_hoge{
    position:absolute;
    top:0px;
    left:100px;
    padding:10px;
    width:300px;
    color:#00f;
}
#test_hoge span{
    background-color:#eeeeee;
}
<script src="/DD_belatedPNG.js"></script>
<script>
  DD_belatedPNG.fix('.png_bg');<!-- IE6の透過PNG対策 -->
</script>
<![endif]-->
<div id="flash">
	<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="550" height="400" id="test" align="middle">
	<param name="allowScriptAccess" value="sameDomain" />
	<param name="allowFullScreen" value="false" />
	<param name="wmode" value="transparent" />
	<param name="movie" value="http://zaru.tofu-kun.org/wp-content/uploads/2010/02/test.swf" />
	<param name="quality" value="high" />
	<param name="bgcolor" value="#ffffff" />
	<embed wmode="transparent" src="http://zaru.tofu-kun.org/wp-content/uploads/2010/02/test.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="test" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_jp" />
	</object>
	<div id="hoge">
	<p>HTMLテキストです。</p>
	<img src="http://zaru.tofu-kun.org/wp-content/uploads/2010/02/img.png" />
	</div>
</div>

Ruby プログラミング練習問題2「FizzBuzz問題」

水曜日, 2月 3rd, 2010

第2回目のRubyプログラミング練習問題。今回は有名な「FizzBuzz問題」。

プログラミング練習問題2「FizzBuzz」

ルールは以下の通り
1から順番に数を表示する
その数が3で割り切れるなら”Fizz”、5で割り切れるなら”Buzz”、両方で割り切れるなら”FizzBuzz”と表示する
要するに”1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz ・・・”と出力される

回答

#!/usr/bin/ruby

1.upto(100) do |i|
    if  i % 3 == 0 && i % 5 == 0
        puts 'FizzBuzz '
    elsif i % 3 == 0
        puts 'Fizz '
    elsif i % 5 == 0
        puts 'Buzz '
    else
        puts i.to_s + " "
    end
end

実行結果
$./2_1.rb
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...

Ruby初心者な僕はこんな単純な条件分岐…。うーん。もっとスマートにできるはず。

解答例

#!/usr/bin/ruby

def fizz_buzz(n)
  ret = "#{["Fizz"][n % 3]}#{["Buzz"][n % 5]}"
  ret.empty? ? n.to_s : ret
end

puts (1..100).collect{|n| fizz_buzz n }

上記ページに載っている解答例はこんな感じ。

ret = "#{["Fizz"][n % 3]}#{["Buzz"][n % 5]}"

これなんだよ!って、調べてみたら配列の省略形?っぽいもの。つまり、これを書きなおすと

a = ["Fizz"]
b = ["Buzz"]
ret = "#{a[n % 3]}#{b[n % 5]}"

ってこと。
Rubyってこういう記述が普通というか一般的なのかな?教えてエロい人!