Решение на Осма задача от Иван Станков

Обратно към всички решения

Към профила на Иван Станков

Резултати

  • 2 точки от тестове
  • 0 бонус точки
  • 2 точки общо
  • 10 успешни тест(а)
  • 30 неуспешни тест(а)

Код

class Spreadsheet
def initialize(string = '')
@sheet = extract_sheet_from_string(string)
end
def empty?
@sheet == nil
end
def to_s
string = ''
@sheet.each.with_index do |row, a|
row.each_index do |b|
string += "\t" + evaluate_cell(@sheet[a][b])
end
string += "\n" if not row == @sheet[@sheet.length - 1]
end
string.sub("\t", "").sub("\n\t", "\n")
end
def cell_at(cell_index)
row = cell_index.delete("A-Z").to_i - 1
offset = 'A'.ord - 1
cell_index = cell_index.delete("0-9")
column = cell_index.chars.inject(0){ |x,c| x * 26 + c.ord - offset } - 1
@sheet[row][column]
end
def [](cell_index)
if cell_at(cell_index)[0] == "="
cell = evaluate_cell(cell_at(cell_index))
else
cell = cell_at(cell_index)
end
cell
end
def extract_sheet_from_string(string = '')
return nil if string.empty?
rows = string.split("\n")
columns = Array.new()
get_cells(rows, columns)
end
def get_cells(rows, columns)
cells = Array.new()
rows.each.with_index do |row, row_index|
columns[row_index] = row.gsub(/ /, "\t").lstrip.rstrip.split("\t")
cells << columns[row_index]
end
cells
end
def evaluate_cell(cell)
if cell.include? "="
content = cell.sub(/=/,"")
content = cell_at(content) if not content.include? "("
else
content = cell
end
content
end
end
class Formula
def initialize(*formula)
end
end

Лог от изпълнението

....F...FFF.F..FFFFFFFFFFFFFFFFFFFFFFFFF

Failures:

  1) Spreadsheet#to_s returns blank tables as blank strings
     Failure/Error: expect(Spreadsheet.new.to_s).to eq ''
     NoMethodError:
       undefined method `each' for nil:NilClass
     # /tmp/d20160121-5693-15brby5/solution.rb:12:in `to_s'
     # /tmp/d20160121-5693-15brby5/spec.rb:24:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  2) Spreadsheet#to_s splits cells by two or more spaces
     Failure/Error: expect(Spreadsheet.new("foo  bar   42\nbaz    larodi  100").to_s).to eq "foo\tbar\t42\nbaz\tlarodi\t100"
       
       expected: "foo\tbar\t42\nbaz\tlarodi\t100"
            got: "foo\tbar\t 42\nbaz\t\tlarodi\t100"
       
       (compared using ==)
       
       Diff:
       @@ -1,3 +1,3 @@
       -foo	bar	42
       -baz	larodi	100
       +foo	bar	 42
       +baz		larodi	100
     # /tmp/d20160121-5693-15brby5/spec.rb:40:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  3) Spreadsheet#to_s returns the evaluated spreadsheet as a table
     Failure/Error: expect(sheet.to_s).to eq \
       
       expected: "foo\t10\t2.1\t15\nbar\t11\t2.2\t5\nbaz\t12\t2.3\t27.60"
            got: "foo\t 10\t2.1\t ADD(B1, C1, 2.9)\nbar\t 11\t2.2\t DIVIDE(B2, C2)\n\tbaz\t 12\t2.3\t MULTIPLY(C3, B3)"
       
       (compared using ==)
       
       Diff:
       @@ -1,4 +1,4 @@
       -foo	10	2.1	15
       -bar	11	2.2	5
       -baz	12	2.3	27.60
       +foo	 10	2.1	 ADD(B1, C1, 2.9)
       +bar	 11	2.2	 DIVIDE(B2, C2)
       +	baz	 12	2.3	 MULTIPLY(C3, B3)
     # /tmp/d20160121-5693-15brby5/spec.rb:50:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  4) Spreadsheet#cell_at raises and exception for non-existant cells
     Failure/Error: expect { Spreadsheet.new('foo')['B10'] }.to raise_error(Spreadsheet::Error, /Cell 'B10' does not exist/)
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:59:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  5) Spreadsheet#[] raises an exception for non-existant cells
     Failure/Error: expect { Spreadsheet.new()['A1'] }.to raise_error(Spreadsheet::Error, /Cell 'A1' does not exist/)
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:75:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  6) Spreadsheet#[] returns the calculated value of formulae cells
     Failure/Error: expect(sheet['C1']).to eq '4'
       
       expected: "4"
            got: "ADD(2, 2)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:103:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  7) Spreadsheet#[] adds two numbers with ADD
     Failure/Error: expect(sheet['A1']).to eq('4')
       
       expected: "4"
            got: "ADD(2, 2)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:109:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  8) Spreadsheet#[] adds five numbers with ADD
     Failure/Error: expect(sheet['A1']).to eq('15')
       
       expected: "15"
            got: "ADD(1, 2, 3, 4, 5)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:115:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  9) Spreadsheet#[] raises an exception for less than two arguments passed to ADD
     Failure/Error: Spreadsheet::Error, /Wrong number of arguments for 'ADD': expected at least 2, got 1/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:120:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  10) Spreadsheet#[] adds numbers from cell references and as immediate arguments with ADD
     Failure/Error: expect(sheet['B1']).to eq('55')
       
       expected: "55"
            got: "ADD(1, A1, 2, C1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:131:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  11) Spreadsheet#[] adds numbers only from cell references with ADD
     Failure/Error: expect(sheet['D1']).to eq('10')
       
       expected: "10"
            got: "ADD(B1, A1, C1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:137:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  12) Spreadsheet#[] multiplies numbers with MULTIPLY
     Failure/Error: expect(sheet1['A1']).to eq('120')
       
       expected: "120"
            got: "MULTIPLY(1, 2, 3, 4, 5)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:144:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  13) Spreadsheet#[] raises an exception for less than two arguments to MULTIPLY
     Failure/Error: Spreadsheet::Error, /Wrong number of arguments for 'MULTIPLY': expected at least 2, got 1/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:150:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  14) Spreadsheet#[] subtracts two numbers with SUBTRACT
     Failure/Error: expect(sheet['A1']).to eq('2')
       
       expected: "2"
            got: "SUBTRACT(5, 3)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:161:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  15) Spreadsheet#[] subtracts numbers via cell references
     Failure/Error: expect(sheet['D1']).to eq('4')
       
       expected: "4"
            got: "SUBTRACT(C1, 1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:167:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  16) Spreadsheet#[] raises an exception when SUBTRACT is called with a wrong number of arguments
     Failure/Error: Spreadsheet::Error, /Wrong number of arguments for 'SUBTRACT': expected 2, got 1/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:172:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  17) Spreadsheet#[] divides two numbers with DIVIDE
     Failure/Error: expect(sheet['A1']).to eq('42')
       
       expected: "42"
            got: "DIVIDE(84, 2)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:183:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  18) Spreadsheet#[] divides numbers via cell references
     Failure/Error: expect(sheet1['C1']).to eq('42')
       
       expected: "42"
            got: "DIVIDE(B1, A1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:190:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  19) Spreadsheet#[] raises an exception when DIVIDE is called with a wrong number of arguments
     Failure/Error: Spreadsheet::Error, /Wrong number of arguments for 'DIVIDE': expected 2, got 1/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:196:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  20) Spreadsheet#[] calculates the modulo of two numbers with MOD
     Failure/Error: expect(Spreadsheet.new('=MOD(42, 5)')['A1']).to eq('2')
       
       expected: "2"
            got: "MOD(42, 5)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:205:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  21) Spreadsheet#[] calculates the modulo of two numbers with MOD via cell references
     Failure/Error: expect(sheet1['C1']).to eq('4')
       
       expected: "4"
            got: "MOD(B1, A1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:214:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  22) Spreadsheet#[] raises an exception when MOD is called with a wrong number of arguments
     Failure/Error: Spreadsheet::Error, /Wrong number of arguments for 'MOD': expected 2, got 1/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:220:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  23) Spreadsheet#[] adds floating point numbers with ADD
     Failure/Error: expect(Spreadsheet.new('10  =ADD(A1, 1.1)')['B1']).to eq '11.10'
       
       expected: "11.10"
            got: "ADD(A1, 1.1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:229:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  24) Spreadsheet#[] subtracts floating point numbers with SUBTRACT
     Failure/Error: expect(Spreadsheet.new('10  =SUBTRACT(A1, 1.1)')['B1']).to eq '8.90'
       
       expected: "8.90"
            got: "SUBTRACT(A1, 1.1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:234:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  25) Spreadsheet#[] multiplies floating point numbers with MULTIPLY
     Failure/Error: expect(Spreadsheet.new('10  =MULTIPLY(A1, 1.1)')['B1']).to eq '11'
       
       expected: "11"
            got: "MULTIPLY(A1, 1.1)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:239:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  26) Spreadsheet#[] divides floating point numbers with DIVIDE
     Failure/Error: expect(Spreadsheet.new('10  =DIVIDE(A1, 4)')['B1']).to eq '2.50'
       
       expected: "2.50"
            got: "DIVIDE(A1, 4)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:244:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  27) Spreadsheet#[] evaluates deeply-nested cell references
     Failure/Error: expect(Spreadsheet.new('10  =ADD(5, A1)  3  =DIVIDE(B1, C1)  =MOD(D1, 4)')['E1']).to eq '1'
       
       expected: "1"
            got: "MOD(D1, 4)"
       
       (compared using ==)
     # /tmp/d20160121-5693-15brby5/spec.rb:250:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  28) Spreadsheet#[] raises an exception for unknown functions
     Failure/Error: Spreadsheet::Error, /Unknown function 'FOO'/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:255:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  29) Spreadsheet#[] raises an exception for missing cells passed as function arguments
     Failure/Error: Spreadsheet::Error, /Cell 'B4' does not exist/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:261:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

  30) Spreadsheet#[] raises an exception for invalid expressions
     Failure/Error: Spreadsheet::Error, /Invalid expression 'FOO'/
     NameError:
       uninitialized constant Spreadsheet::Error
     # /tmp/d20160121-5693-15brby5/spec.rb:267:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (3 levels) in <top (required)>'
     # ./lib/language/ruby/run_with_timeout.rb:5:in `block (2 levels) in <top (required)>'

Finished in 0.03406 seconds
40 examples, 30 failures

Failed examples:

rspec /tmp/d20160121-5693-15brby5/spec.rb:23 # Spreadsheet#to_s returns blank tables as blank strings
rspec /tmp/d20160121-5693-15brby5/spec.rb:39 # Spreadsheet#to_s splits cells by two or more spaces
rspec /tmp/d20160121-5693-15brby5/spec.rb:43 # Spreadsheet#to_s returns the evaluated spreadsheet as a table
rspec /tmp/d20160121-5693-15brby5/spec.rb:58 # Spreadsheet#cell_at raises and exception for non-existant cells
rspec /tmp/d20160121-5693-15brby5/spec.rb:74 # Spreadsheet#[] raises an exception for non-existant cells
rspec /tmp/d20160121-5693-15brby5/spec.rb:98 # Spreadsheet#[] returns the calculated value of formulae cells
rspec /tmp/d20160121-5693-15brby5/spec.rb:106 # Spreadsheet#[] adds two numbers with ADD
rspec /tmp/d20160121-5693-15brby5/spec.rb:112 # Spreadsheet#[] adds five numbers with ADD
rspec /tmp/d20160121-5693-15brby5/spec.rb:118 # Spreadsheet#[] raises an exception for less than two arguments passed to ADD
rspec /tmp/d20160121-5693-15brby5/spec.rb:128 # Spreadsheet#[] adds numbers from cell references and as immediate arguments with ADD
rspec /tmp/d20160121-5693-15brby5/spec.rb:134 # Spreadsheet#[] adds numbers only from cell references with ADD
rspec /tmp/d20160121-5693-15brby5/spec.rb:140 # Spreadsheet#[] multiplies numbers with MULTIPLY
rspec /tmp/d20160121-5693-15brby5/spec.rb:148 # Spreadsheet#[] raises an exception for less than two arguments to MULTIPLY
rspec /tmp/d20160121-5693-15brby5/spec.rb:158 # Spreadsheet#[] subtracts two numbers with SUBTRACT
rspec /tmp/d20160121-5693-15brby5/spec.rb:164 # Spreadsheet#[] subtracts numbers via cell references
rspec /tmp/d20160121-5693-15brby5/spec.rb:170 # Spreadsheet#[] raises an exception when SUBTRACT is called with a wrong number of arguments
rspec /tmp/d20160121-5693-15brby5/spec.rb:180 # Spreadsheet#[] divides two numbers with DIVIDE
rspec /tmp/d20160121-5693-15brby5/spec.rb:186 # Spreadsheet#[] divides numbers via cell references
rspec /tmp/d20160121-5693-15brby5/spec.rb:194 # Spreadsheet#[] raises an exception when DIVIDE is called with a wrong number of arguments
rspec /tmp/d20160121-5693-15brby5/spec.rb:204 # Spreadsheet#[] calculates the modulo of two numbers with MOD
rspec /tmp/d20160121-5693-15brby5/spec.rb:210 # Spreadsheet#[] calculates the modulo of two numbers with MOD via cell references
rspec /tmp/d20160121-5693-15brby5/spec.rb:218 # Spreadsheet#[] raises an exception when MOD is called with a wrong number of arguments
rspec /tmp/d20160121-5693-15brby5/spec.rb:228 # Spreadsheet#[] adds floating point numbers with ADD
rspec /tmp/d20160121-5693-15brby5/spec.rb:233 # Spreadsheet#[] subtracts floating point numbers with SUBTRACT
rspec /tmp/d20160121-5693-15brby5/spec.rb:238 # Spreadsheet#[] multiplies floating point numbers with MULTIPLY
rspec /tmp/d20160121-5693-15brby5/spec.rb:243 # Spreadsheet#[] divides floating point numbers with DIVIDE
rspec /tmp/d20160121-5693-15brby5/spec.rb:249 # Spreadsheet#[] evaluates deeply-nested cell references
rspec /tmp/d20160121-5693-15brby5/spec.rb:253 # Spreadsheet#[] raises an exception for unknown functions
rspec /tmp/d20160121-5693-15brby5/spec.rb:259 # Spreadsheet#[] raises an exception for missing cells passed as function arguments
rspec /tmp/d20160121-5693-15brby5/spec.rb:265 # Spreadsheet#[] raises an exception for invalid expressions

История (1 версия и 0 коментара)

Иван обнови решението на 10.01.2016 15:02 (преди около 9 години)

+class Spreadsheet
+ def initialize(string = '')
+ @sheet = extract_sheet_from_string(string)
+ end
+
+ def empty?
+ @sheet == nil
+ end
+
+ def to_s
+ string = ''
+ @sheet.each.with_index do |row, a|
+ row.each_index do |b|
+ string += "\t" + evaluate_cell(@sheet[a][b])
+ end
+ string += "\n" if not row == @sheet[@sheet.length - 1]
+ end
+ string.sub("\t", "").sub("\n\t", "\n")
+ end
+
+ def cell_at(cell_index)
+ row = cell_index.delete("A-Z").to_i - 1
+
+ offset = 'A'.ord - 1
+ cell_index = cell_index.delete("0-9")
+ column = cell_index.chars.inject(0){ |x,c| x * 26 + c.ord - offset } - 1
+
+ @sheet[row][column]
+ end
+
+ def [](cell_index)
+ if cell_at(cell_index)[0] == "="
+ cell = evaluate_cell(cell_at(cell_index))
+ else
+ cell = cell_at(cell_index)
+ end
+ cell
+ end
+
+ def extract_sheet_from_string(string = '')
+ return nil if string.empty?
+
+ rows = string.split("\n")
+
+ columns = Array.new()
+ get_cells(rows, columns)
+ end
+
+ def get_cells(rows, columns)
+ cells = Array.new()
+
+ rows.each.with_index do |row, row_index|
+ columns[row_index] = row.gsub(/ /, "\t").lstrip.rstrip.split("\t")
+ cells << columns[row_index]
+ end
+
+ cells
+ end
+
+ def evaluate_cell(cell)
+ if cell.include? "="
+ content = cell.sub(/=/,"")
+ content = cell_at(content) if not content.include? "("
+ else
+ content = cell
+ end
+ content
+ end
+
+end
+
+class Formula
+ def initialize(*formula)
+ end
+end