'ruby'에 해당되는 글 20건

  1. 2008/07/07 Ruby 라는 언어 by sloth_chord (4)
  2. 2008/07/07 Ruby 걸음마의 코드 - self number 문제 by sloth_chord
  3. 2008/05/26 Ruby 걸음마의 코드 - 회의실 스케쥴링 by sloth_chord

Ruby 라는 언어

bit 2008/07/07 12:00
꽤 여러달전 Ruby를 취미생활용 도구로 써봐야겠다.. 라는 생각을 하구 글을 쓰기도했는데.....
게을러놔서 그렇게 열심히 Ruby질(?) 을즐긴것 같지는않다,,;;
Ruby동네의 idiom같은건 전혀 모르구..

 
어쨌든 지금까지 느낀점을보자면

전체적인 태도가마음에든다.

OOP의 요소가 필요하면 가져다 쓰는것도 편하게 해놨지만, OOP를 하라구 강요하지는않는다.
FP의 요소가 필요하면 가져다 쓰는것도 편하게 해놨지만, FP를 하라구 강요하지는않는다.


물론, 훌륭한 패러다임하에서 코드를 짜는것도 좋지만 강요당하면 좀 피곤하긴하다.
그런 점에서보면 Ruby는 꽤 '니 마음대로 하세요'라는 태도다.

음.. 쓰다보니 c++ 도 OO를 하구싶으면 OO를, FP를 하구싶으면 FP를 다 싫구 귀찮으면 그냥 C 스타일코드를짤수있게 한다는 면에서보면 비슷한 스탠스를보인다해야하나...

하지만, c++이랑 Ruby의 다른점은 c++은 OOP의 요소를 가져다쓰기도, FP의 요소를 가져다 쓰기도 힘들다는게 있겠다,,

또, 퍼포먼스도 꽤 다르구나..

c++이 나쁘다는게 아니구 그냥 c++은 부담감(?)을 가지게 만드는 언어였는데 갈수록 더 그쪽방향으로 가는것같다.
같은 혈통을 가졌지만은 덩치가커지는것에대해서 강박적일 정도로 거부감을 보여온 c와는 반대되는 방향으로 계속 진행해왔구, 앞으로도 쭉 그럴듯..

각설하자면..
내가 쓰는 Ruby는

1. 읽기도 쓰기두편한, 그러나 느린 C
2. 좀 더 읽기 편한, 그러나 약간 느린(?) perl
3. 좀 더 바람끼가 있는, 그러나 살짝 느린(?) python
4. 나는 가능한안에서는 c++ 을 가지구 코드를 안짜려구 마음먹은지 좀 됐다.
 
정도의느낌으로 쓰구있는것 같으다..

다시 말하면 Ruby의 탈을쓴 c, perl, python, c++ 코드를 짜구있는듯싶으다..
'순수한 xx'를 중요시하는 사람들에겐 - 여기서 xx에는 아무말이나 넣어두 뭐 다 괜찮다 - 가장 짜증나는 부류가 나같은부류일듯 ㅎㅎㅎㅎ.

  
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
TAG ruby
# Ruby 1.8에서테스트

# 유명해진지 조금 된 셀프넘버 문제

# 1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라


def
d(n)

  ret = n

  while n > 0
    ret += (n % 10)
    n /= 10
  end

  return ret

end

# i가 어떤수의 generator인가를 계산을해가지구
# i가 generate를 하는 수인 generated는 self number가 아님
# 범위안에 있는수면은 tab에 false 넣음
# bound.times 만을 d에 호출하면 되는 이유는
# generated 보다 큰 generator는 없기 때문

def sum_of_self_number(bound)

  tab = Array.new(bound, true)

  bound.times do |i|
    generated = d(i)
    (tab[generated] = false) if (generated < bound)
  end

  sum = 0
  bound.times do |i| ((sum += i) if tab[i]) end

  return sum

end

require 'test/unit'

class TestSumOfSelfNum < Test::Unit::TestCase

  def test_method
    assert_equal(1227365, sum_of_self_number(5000))
  end

end
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
TAG program, ruby
# Ruby 1.8에서테스트


# 여러개의 팀이 한 회의실을 사용할때

# 가장 많은 팀이 회의실을 사용하도록 스케줄링을 하는 문제이다
# 회의는 중간에 중단이될수가없구, 여러팀이 동시에 회의실을 쓸 수없다


# 맨 처음에 회의가 끝나는 시간이 작은 순서대로 정렬한다
# 그 다음 그 팀이랑 시간이 겹치지 않는 팀을 집어넣구,
# 또 그다음엔 그 팀이랑 시간이 겹치지 않는 팀을 집어넣는순으로 스케쥴링을 한다

class Meeting

  def initialize(team_name, start_time, finish_time)
    @team_name = team_name
    @start_time = start_time
    @finish_time = finish_time
  end

  attr_reader :team_name, :start_time, :finish_time

  def <=>(obj)
    return (self.finish_time <=> obj.finish_time)
  end

  def ==(obj)
    return ( (self.team_name == obj.team_name) and
             (self.start_time == obj.start_time) and
             (self.finish_time == obj.finish_time) )
  end

end

# last_meeting의 끝나는 시간 전에 회의를 시작하면 겹치는것.

def overlap?(last_meeting, new_meeting)
  return (new_meeting.start_time < last_meeting.finish_time)
end

def room_schedule(meetings)

  scheduled = Array.new

  last = 0

  meetings.sort!

  scheduled[0] = meetings[0]

  1.upto(meetings.length - 1) do |i|
    unless overlap?(meetings[last], meetings[i])
      last = i
      scheduled << meetings[last]
    end
  end

  return scheduled

end


require 'test/unit'

class TestRoomSchedule < Test::Unit::TestCase

  def test_method
    ans = [ Meeting.new('b', 1, 4), Meeting.new('e', 5, 7), Meeting.new('g', 8, 11),
            Meeting.new('i', 12, 14) ]

    input = [ Meeting.new('a', 3, 5), Meeting.new('b', 1, 4), Meeting.new('c', 2, 13),
              Meeting.new('d', 5, 9), Meeting.new('e', 5, 7), Meeting.new('f', 0, 6),
              Meeting.new('g', 8, 11), Meeting.new('h', 8, 12), Meeting.new('i', 12, 14) ]

    assert_equal(ans, room_schedule(input))
  end

end

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by sloth_chord
TAG program, ruby