Решение на Осма задача от Георги Стефанов

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

Към профила на Георги Стефанов

Резултати

  • 1 точка от тестове
  • 0 бонус точки
  • 1 точка общо
  • 9 успешни тест(а)
  • 31 неуспешни тест(а)

Код

class Spreadsheet
def initialize(string = "")
sheet = string.split("\n")
sheet.delete_if { |thing| thing == ""}
@sheet = sheet.map { |thing| thing.split(/[\t, ' ']/) }
@sheet = @sheet.map { |row| row.delete_if { |element| element == ""} }
end
def empty?
@sheet.empty?
end
def cell_at(cell_index)
column = find_column(cell_index)
row = find_row(cell_index)
@sheet[row][column]
end
def letter_to_number(letter)
number = 0
'A'.upto(letter) { number += 1 }
number - 1
end
def find_column(cell)
row = 0
new_cell = cell.split("")
new_cell.each { |letter|
row += letter_to_number(letter) if 'A'.upto('Z').include?(letter) }
row
end
def find_row(cell)
column = 0
new_cell = cell.reverse.split("")
new_cell.each_with_index { |item, index| column += (item.to_i) * 10**index }
column - 1
end
def to_s
string = @sheet.map { |thing| thing.join("\t") }.join("\n")
end
class Error < StandardError
def initialize(message = "My Default Message")
@message = message
end
def message
@message
end
end
end

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

.........FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Failures:

  1) 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\t10\t2.1\t=ADD(B1\tC1\t2.9)\nbar\t11\t2.2\t=DIVIDE(B2\tC2)\nbaz\t12\t2.3\t=MULTIPLY(C3\tB3)"
       
       (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-1u1wlyf/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)>'

  2) 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/)
       expected Spreadsheet::Error with message matching /Cell 'B10' does not exist/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2110a10 @sheet=[["foo"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:59:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/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)>'
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  3) Spreadsheet#cell_at returns the raw value of existing cells
     Failure/Error: expect(sheet.cell_at('B1')).to eq '=ADD(2, 2)'
       
       expected: "=ADD(2, 2)"
            got: "=ADD(2"
       
       (compared using ==)
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:69: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#[] raises an exception for non-existant cells
     Failure/Error: expect { Spreadsheet.new()['A1'] }.to raise_error(Spreadsheet::Error, /Cell 'A1' does not exist/)
       expected Spreadsheet::Error with message matching /Cell 'A1' does not exist/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f20de358 @sheet=[]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:75:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/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)>'
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  5) Spreadsheet#[] returns the value of existing cells for simple cell indexes
     Failure/Error: expect(sheet['A1']).to eq 'foo'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f208f7a8>
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:84: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 value of existing cells for complex cell indexes
     Failure/Error: expect(sheet['AD1']).to eq 'b'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f1ed3cc0>
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:93: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#[] returns the calculated value of formulae cells
     Failure/Error: expect(sheet['A1']).to eq 'foo'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2cde7e8>
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:101: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 two numbers with ADD
     Failure/Error: expect(sheet['A1']).to eq('4')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2cdc6a0 @sheet=[["=ADD(2", "2)"]]>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  9) Spreadsheet#[] adds five numbers with ADD
     Failure/Error: expect(sheet['A1']).to eq('15')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2cd2588>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  10) Spreadsheet#[] raises an exception for less than two arguments passed to ADD
     Failure/Error: expect { Spreadsheet.new('=ADD(1)')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Wrong number of arguments for 'ADD': expected at least 2, got 1/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2d5fdc0 @sheet=[["=ADD(1)"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:119:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:119: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:119: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 from cell references and as immediate arguments with ADD
     Failure/Error: expect(sheet['B1']).to eq('55')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d76278>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  12) Spreadsheet#[] adds numbers only from cell references with ADD
     Failure/Error: expect(sheet['D1']).to eq('10')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d74360>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  13) Spreadsheet#[] multiplies numbers with MULTIPLY
     Failure/Error: expect(sheet1['A1']).to eq('120')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d6da38>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  14) Spreadsheet#[] raises an exception for less than two arguments to MULTIPLY
     Failure/Error: expect { Spreadsheet.new('=MULTIPLY(1)')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Wrong number of arguments for 'MULTIPLY': expected at least 2, got 1/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2d66940 @sheet=[["=MULTIPLY(1)"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:149:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:149: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:149: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 two numbers with SUBTRACT
     Failure/Error: expect(sheet['A1']).to eq('2')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d582a0>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  16) Spreadsheet#[] subtracts numbers via cell references
     Failure/Error: expect(sheet['D1']).to eq('4')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d51ae0>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  17) Spreadsheet#[] raises an exception when SUBTRACT is called with a wrong number of arguments
     Failure/Error: expect { Spreadsheet.new('=SUBTRACT(1)')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Wrong number of arguments for 'SUBTRACT': expected 2, got 1/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2c82e20 @sheet=[["=SUBTRACT(1)"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:171:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:171: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:171: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 two numbers with DIVIDE
     Failure/Error: expect(sheet['A1']).to eq('42')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d42298>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  19) Spreadsheet#[] divides numbers via cell references
     Failure/Error: expect(sheet1['C1']).to eq('42')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d40150>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  20) Spreadsheet#[] raises an exception when DIVIDE is called with a wrong number of arguments
     Failure/Error: expect { Spreadsheet.new('=DIVIDE(1)')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Wrong number of arguments for 'DIVIDE': expected 2, got 1/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2d3d798 @sheet=[["=DIVIDE(1)"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:195:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:195: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:195: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
     Failure/Error: expect(Spreadsheet.new('=MOD(42, 5)')['A1']).to eq('2')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d33ae0 @sheet=[["=MOD(42", "5)"]]>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  22) Spreadsheet#[] calculates the modulo of two numbers with MOD via cell references
     Failure/Error: expect(sheet1['C1']).to eq('4')
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d30bb0>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  23) Spreadsheet#[] raises an exception when MOD is called with a wrong number of arguments
     Failure/Error: expect { Spreadsheet.new('=MOD(1)')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Wrong number of arguments for 'MOD': expected 2, got 1/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2d2dfa0 @sheet=[["=MOD(1)"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:219:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:219: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:219: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#[] adds floating point numbers with ADD
     Failure/Error: expect(Spreadsheet.new('10  =ADD(A1, 1.1)')['B1']).to eq '11.10'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d23618>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  25) Spreadsheet#[] subtracts floating point numbers with SUBTRACT
     Failure/Error: expect(Spreadsheet.new('10  =SUBTRACT(A1, 1.1)')['B1']).to eq '8.90'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d21890>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  26) Spreadsheet#[] multiplies floating point numbers with MULTIPLY
     Failure/Error: expect(Spreadsheet.new('10  =MULTIPLY(A1, 1.1)')['B1']).to eq '11'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d1f4a0>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  27) Spreadsheet#[] divides floating point numbers with DIVIDE
     Failure/Error: expect(Spreadsheet.new('10  =DIVIDE(A1, 4)')['B1']).to eq '2.50'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d1d5b0>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  28) 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'
     NoMethodError:
       undefined method `[]' for #<Spreadsheet:0x007f85f2d17278>
     # /tmp/d20160121-5693-1u1wlyf/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)>'

  29) Spreadsheet#[] raises an exception for unknown functions
     Failure/Error: expect { Spreadsheet.new('=FOO(42)  100')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Unknown function 'FOO'/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2d14de8 @sheet=[["=FOO(42)", "100"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:254:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:254: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:254: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 missing cells passed as function arguments
     Failure/Error: expect { Spreadsheet.new('=ADD(1, B4)  100')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Cell 'B4' does not exist/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2d0fa50 @sheet=[["=ADD(1", "B4)", "100"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:260:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:260: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:260: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)>'

  31) Spreadsheet#[] raises an exception for invalid expressions
     Failure/Error: expect { Spreadsheet.new('=FOO  100')['A1'] }.to raise_error(
       expected Spreadsheet::Error with message matching /Invalid expression 'FOO'/, got #<NoMethodError: undefined method `[]' for #<Spreadsheet:0x007f85f2d03ea8 @sheet=[["=FOO", "100"]]>> with backtrace:
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:266:in `block (4 levels) in <top (required)>'
         # /tmp/d20160121-5693-1u1wlyf/spec.rb:266: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)>'
     # /tmp/d20160121-5693-1u1wlyf/spec.rb:266: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.03024 seconds
40 examples, 31 failures

Failed examples:

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

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

Георги обнови решението на 10.01.2016 19:54 (преди над 8 години)

+class Spreadsheet
+ def initialize(string = "")
+ sheet = string.split("\n")
+ sheet.delete_if { |thing| thing == ""}
+ @sheet = sheet.map { |thing| thing.split(/[\t, ' ']/) }
+ @sheet = @sheet.map { |row| row.delete_if { |element| element == ""} }
+ end
+
+ def empty?
+ @sheet.empty?
+ end
+
+ def cell_at(cell_index)
+ column = find_column(cell_index)
+ row = find_row(cell_index)
+ @sheet[row][column]
+ end
+
+ def letter_to_number(letter)
+ number = 0
+ 'A'.upto(letter) { number += 1 }
+ number - 1
+ end
+
+ def find_column(cell)
+ row = 0
+ new_cell = cell.split("")
+ new_cell.each { |letter|
+ row += letter_to_number(letter) if 'A'.upto('Z').include?(letter) }
+ row
+ end
+
+ def find_row(cell)
+ column = 0
+ new_cell = cell.reverse.split("")
+ new_cell.each_with_index { |item, index| column += (item.to_i) * 10**index }
+ column - 1
+ end
+
+ def to_s
+ string = @sheet.map { |thing| thing.join("\t") }.join("\n")
+ end
+
+ class Error < StandardError
+ def initialize(message = "My Default Message")
+ @message = message
+ end
+
+ def message
+ @message
+ end
+ end
+end