2015-10-29 4 views
-1

Меня недавно попросили об этом в интервью для младшей позиции dev. Меня попросили создать программу калькулятора, которая может добавлять, вычитать, умножать и делить без использования встроенных операторов +, -, *, /. По существу, строить его с нуля.Калькулятор Программа в Ruby/Python без использования встроенных операторов

Я понятия не имел, как это решить. Кто-нибудь имеет какие-либо указания относительно того, как реализовать хотя бы одну из операций? Я могу найти остальное оттуда, но мне действительно нужно какое-то руководство.

Я код как в python, так и в ruby.

+0

Вы ищете что-то вроде этого? http://stackoverflow.com/questions/30696484/a-b-without-arithmetic-operators-python-vs-c – idjaw

+0

Ваш вопрос очень широк. Мы не знаем вашего опыта, так как «я кодирую как питон, так и рубин». действительно говорит нам немного. –

+0

Подсказка. Если вы игнорируете * большинство * методов и косоглазие в остальном, то сразу становится очевидным, что реализация Ruby в Integer's в основном представляет собой объектно-ориентированную интерпретацию церковного кодирования (что вы знаете из основного CS) чисел Пеано (которые вы знаете по основным математикам) в лямбда-исчислении. –

ответ

1

Изучите, как реализованы «операторы» Ruby; Это методы, а send можно использовать в качестве альтернативного способа их вызова.

Из документации:

Запускает метод идентифицированной символа, передавая его указаны какие-либо аргументы ....

class Klass 
    def hello(*args) 
    "Hello " + args.join(' ') 
    end 
end 
k = Klass.new 
k.send :hello, "gentle", "readers" #=> "Hello gentle readers" 

Из этого:

1.send(:+, 1) # => 2 

Обучение больше об этом остается как упражнение для читателя.

Если вы действительно хотите, чтобы начать, вы можете создать базовые методы, как:

class Fixnum 
    def add(value) 
    val = self 
    value.times do 
     val = val.succ 
    end 
    val 
    end 
end 

1.add(1) # => 2 
+0

Я не думаю, что смысл упражнения состоял в том, чтобы просто вызвать незаконных операторов, использующих send. Вероятно, он хочет посмотреть, как математические операции выполняются на более низком уровне, то есть в двоичном формате. –

+0

Мы не знаем, чего хочет OP, поскольку он не определен, и поэтому вопрос слишком широк. Я рассказываю о том, как это сделать в Ruby, что я имел в виду, если бы я задал этот вопрос в интервью. –

+0

спасибо, это помогло много! – james

2

Это пример того.

class Integer 
    def add(int) # int is 5 in the demo 
    res = self # 7 in the demo 
    int.times{res = res.succ} # succ just adds 1 
    return res 
    end 
end 

# demo 
p 7.add(5) # => 12 

Помимо succ, класс Integer имеет pred метод, который вычитает 1. Действительно полезно для построения метода subtract. Умножение просто добавляется несколько раз, а целочисленное деление просто вычитается несколько раз.

+1

Это. Если вы игнорируете операторы и фокусируете * просто * на эти три метода, сразу становится очевидным, что реализация Ruby 'Integer' в основном представляет собой объектно-ориентированную интерпретацию церковного кодирования чисел Пеано в лямбда-исчислении. –

+0

@ JörgWMittag Слушайте, слушайте. – steenslag

+0

спасибо! это помогло – james

Смежные вопросы