Ruby ![]() |
http://www.ruby-lang.org |
Beschreibung: | Ruby ist DIE interpretierte Programmier-Sprache für schnelles und einfaches, objekt-orientiertes Programmieren. Sie hat viele Fähigkeiten um Text-Dateien zu verarbeiten und Systemverwaltungs-Aufgaben zu bewältigen (wie Perl). Ruby ist einfach, unkompliziert und erweiterbar. |
Berechnen von PI | Yukihiro Matsumoto? |
k, a, b, a1, b1 = 2, 4, 1, 12, 4 while TRUE # Next approximation p, q, k = k*k, 2*k+1, k+1 a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1 # Print common digits d = a / b d1 = a1 / b1 while d == d1 print d $stdout.flush a, a1 = 10*(a%b), 10*(a1%b1) d, d1 = a/b, a1/b1 end end |
Berechnen der Zahl PI |
Berechnen von PI | Michael Neumann |
# # From the paper "Un Unbounded Spigot Algorithm for the Digits of Pi" # http://web.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/spigot.pdf # def pi q, r, t, k = 1, 0, 1, 1 loop do n = (3*q+r) / t if (4*q+r) / t == n then yield n q, r, t, k = 10*q, 10*(r-n*t), t, k else q, r, t, k = q*k, q*(4*k+2)+r*(2*k+1), t*(2*k+1), k+1 end end end pi {|n| print n; $stdout.flush } |
Berechnen der Zahl PI |
Binary Search Tree | Michael Neumann |
# # $Id: binary_tree.rb,v 1.1 2001/10/07 11:58:07 michael Exp $ # # BinaryTree by Michael Neumann # class BinaryTree class Node attr_reader :value, :left, :right def initialize( value, left=nil, right=nil) @value = value @left, @right = left, right end def insert( value ) if value >= @value then # insert right if @right.nil? @right = Node.new( value ) else @right.insert( value ) end else # insert left if @left.nil? @left = Node.new( value ) else @left.insert( value ) end end end # depth first (from left to right) def traverse(&b) @left.traverse(&b) if @left b.call(self) @right.traverse(&b) if @right end end attr_reader :root def initialize @root = nil end def insert( value ) if @root.nil? @root = Node.new( value ) else @root.insert( value ) end end def traverse(&b) return if @root.nil? @root.traverse(&b) end end def binary_sort( array ) tree = BinaryTree.new # fill tree with array elements array.each do |e| tree.insert( e ) end sorted_array = [] tree.traverse do |node| sorted_array << node.value end return sorted_array end if __FILE__ == $0 p binary_sort( [0,6,4,3,5,8,4,6] ) # => [0, 3, 4, 4, 5, 6, 6, 8] end |
Binary Search Tree used to sort an
array by traversing it with DFS (depth-first-search). |
Fakultät | Michael Neumann |
def fac(n) if n < 2 then n else n * fac(n-1) end end # Aufrufen print fac(6) |
Berechnet die Fakultät. Ergibt
720 . |
Fakultät (2) | Michael Neumann |
def fac(n)n>1?n*fac(n-1):1 end puts fac(6) |
Berechnet die Fakultät. Ergibt
720 . |
Fakultät (tail-rekursiv) | Michael Neumann |
def fac(n, res=1) if n < 2 then res else fac(n-1, n*res) end end # Aufrufen print fac(6) |
Berechnet die Fakultät. Ergibt
720 . |
GgT | Michael Neumann |
# # Größter Gemeinsamer Teiler # def ggt(a, b) a,b = b,a if a < b a,b = b,a%b while a%b != 0 return b end |
Grösster Gemeinsamer
Teiler |
Hash1 - Standard-Hash-Funktion | Michael Neumann |
def hash1( txt, m = 101 ) h = 0 txt.each_byte { |i| h = ((h<<8) + i) % m} return h end |
Einfacher Hash-Algorithmus
|
hashpjw | Michael Neumann |
# # hashpjw, algorithm by P.J.Weinberg # # implemented by Michael Neumann # def hashpjw(txt, m=101) h = 0 txt.each_byte {|i| h = (h << 4) + i g = h & 0xf0000000 h ^= (g >> 24) ^ g if g } return h%m end |
Hashfunktion von P.J. Weinberg
|
Heapsort | Michael Neumann |
# # $Id: heapsort.rb,v 1.1 2001/10/06 18:48:30 michael Exp $ # # in-place Heapsort by Michael Neumann # class Array def heapsort! a = self n = a.size a.unshift nil # add 0'th element ## # (1) construct heap # 2.upto(n) do | i | # insert element a[i] into heap a[1..i-1] cnode = i while cnode != 1 and a[cnode] > a[cnode/2] do a[cnode], a[cnode/2] = a[cnode/2], a[cnode] cnode /= 2 end end ## # (2) remove elements from heap # n.downto(2) do | i | a[1], a[i] = a[i], a[1] cnode = 1 while cnode*2 < i do if cnode*2+1 >= i or a[cnode*2] > a[cnode*2+1] # no right node exist or left > right if a[cnode] < a[cnode*2] # cnode < left a[cnode], a[cnode*2] = a[cnode*2], a[cnode] cnode *= 2 else break end else # right > left if a[cnode] < a[cnode*2+1] # cnode < right a[cnode], a[cnode*2+1] = a[cnode*2+1], a[cnode] cnode = cnode*2+1 else break end end end # do end a.shift # remove 0'th element return a end def heapsort self.dup.heapsort! end end if __FILE__ == $0 a = [6, 3, 5, 3 ,8, 5, 3, 7, 4, 2, 3] p a.heapsort end |
Heapsort (in-place), runtime is in
O(n * log(n)) |
Hello World (1) | Michael Neumann |
# Hello World in Ruby print "Hello World\n" |
Gibt "Hello World" auf dem Bildschirm
aus. |
Hello World (2) | Michael Neumann |
"Hello World\n".display
|
Gibt "Hello World" auf dem Bildschirm
aus. |
OO - Shape, Circle, Rectangle | Michael Neumann |
class Color attr_accessor :red, :green, :blue def initialize(red=0, green=0, blue=0) @red, @green, @blue = red, green, blue end end # no abstract classes in Ruby! class Shape attr_accessor :x, :y, :color def initialize(x, y, color) @x, @y, @color = x, y, color end def draw raise "abstract method" end def getArea raise "abstract method" end def move(x, y) @x += x @y += y end end class Circle < Shape attr_accessor :radius def initialize(x, y, radius, color) super(x, y, color) @radius = radius end def draw # do something here end def getArea Integer(Math::PI * radius) end end class Rectangle < Shape attr_accessor :width, :height def initialize(x, y, width, height, color) super(x, y, color) @width, @height = width, height end def draw # do something here end def getArea @width * @height end end ## Test the Classes ## BLACK = Color.new WHITE = Color.new(255, 255, 255) circle = Circle.new(100, 100, 50, BLACK) rect = Rectangle.new(20, 20, 5, 5, WHITE) circle.move(10, 10) circle.x = 50 circle.radius = 5 p circle.getArea # => 15 p rect.getArea # => 25 p rect.width # => 5 rect.width = 10 p rect.width # => 10 circle.draw rect.draw |
Quicksort | Michael Neumann |
def quicksort( arr ) return arr if arr.size <= 1 m = arr[0] return quicksort( arr.select { |i| i < m } ) + arr.select { |i| i == m } + quicksort( arr.select { |i| i > m } ) end # Aufruf print quicksort( [5, 99, 2, 45, 12, 234, 29, 0] ).join( " " ) |
Quicksort-Sortieralgorithmus
|
RC4 | Michael Neumann |
s, j, k = (0..255).to_a, 0, (ARGV[0]*256)[0,256].unpack('C*') (0..255).each{|x| j = (j + s[x] + k[x]) % 256; s[x], s[j] = s[j], s[x] } i = j = 0; $stdin.each_byte{|b| i = (i + 1) % 256; j = (j + s[i]) % 256 s[i], s[j] = s[j], s[i]; $stdout<<(b ^ s[(s[i] + s[j])%256]).chr } |
RC4 stream chiper (algorithm by Ron
Rivest, RSA) |
Sieb des Eratosthenes | Michael Neumann |
# $Id: prime.rb,v 1.2 2001/10/16 11:00:12 michael Exp $ class Primes def initialize(n = 10_000) @n = n @primes = 0 # Sieve of Eratosthenes k = 2 while k < Math.sqrt(@n) if @primes[k] == 0 j = 2*k while j <= @n @primes |= (1 << j) j += k end end k += 1 end end def is_prime?( number ) if number > @n raise "number to big" else @primes[number] == 0 end end alias prime? is_prime? end if __FILE__ == $0 x = Primes.new(10_000) p x.prime?(77) # => false p x.prime?(13) # => true p x.prime?(100) # => false end |
Erzeugt alle Primzahlen bis zu einer
gegebenen Zahl. |
Squares (1) | Michael Neumann |
for i in 1..10 do print i*i, " " end |
Gibt die Quadrate von 1 bis 10
aus. |
Squares (2) | Michael Neumann |
(1..10).each { |i| print i*i, " " }
|
Gibt die Quadrate von 1 bis 10
aus. |
Squares (3) | Michael Neumann |
1.upto(10) do |i| puts i**2 end |
Gibt die Quadrate von 1 bis 10
aus. |
Squares (4) | Michael Neumann |
i = 1 until i > 10 do puts i**2 i += 1 end |
Gibt die Quadrate von 1 bis 10
aus. |