The Computer Language
Benchmarks Game

k-nucleotide Matz's Ruby program

source code

# The Computer Language Benchmarks Game
# https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
#
# contributed by jose fco. gonzalez
# modified by Sokolov Yura
# Parallelism by Rick Branson

$seq = String.new

def frequency(seq, length)
  frequencies = Hash.new(0)
  ns          = seq.length + 1 - length
  
  for i in (0 ... ns)
    frequencies[seq[i, length]] += 1
  end
  
  [ns, frequencies]
end

def sort_by_freq(seq, length)
  ret       = ""
  n, table  = frequency(seq, length)

  table.sort{|a,b| b[1] <=> a[1]}.each do |v|
      ret += "%s %.3f\n" % [v[0].upcase,((v[1]*100).to_f/n)]
  end
  
  ret += "\n"
end

def find_seq(seq, s)
  n, table = frequency(seq, s.length)
  "#{table[s].to_s}\t#{s.upcase}\n"
end

line = STDIN.gets while line !~ /^>THREE/
line = STDIN.gets
while (line !~ /^>/) & line do
    $seq << line.chomp
    line = STDIN.gets
end

class Worker
  def initialize(&block)
    if (RUBY_PLATFORM == 'java') || (RUBY_ENGINE == 'truffleruby')
      @t = Thread.new do
        Thread.current[:result] = yield
      end
    else
      @r, @w = IO.pipe
      @p = Process.fork do
        @r.close
        @w.write yield
        @w.close
      end
      
      @w.close
    end
  end
  
  def result
    if (RUBY_PLATFORM == 'java') || (RUBY_ENGINE == 'truffleruby')
      @t.join
      @t[:result]
    else
      ret = @r.read
      @r.close
      Process.wait(@p)
      ret
    end
  end
end

FREQS   = [1, 2]
NUCLEOS = %w(ggt ggta ggtatt ggtattttaatt ggtattttaatttatagt)

workers =   FREQS.map   { |i| Worker.new { sort_by_freq($seq, i) } }
workers +=  NUCLEOS.map { |s| Worker.new { find_seq($seq, s) } }
  
results = workers.map { |w| w.result }
print results.join
    

notes, command-line, and program output

NOTES:
64-bit Ubuntu quad core
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]


Sun, 02 Jun 2019 19:25:42 GMT

COMMAND LINE:
/usr/bin/ruby knucleotide.mri 0 < knucleotide-input250000.txt

PROGRAM FAILED 


PROGRAM OUTPUT:

knucleotide.mri:46:in `initialize': uninitialized constant Worker::RUBY_ENGINE (NameError)
	from knucleotide.mri:78:in `new'
	from knucleotide.mri:78
	from knucleotide.mri:78:in `map'
	from knucleotide.mri:78