Робот

Краен срок
12.01.2013 12:00

Срокът за предаване на решения е отминал

Разполагаме с много прост робот, който се движи по числова права. Няма значение дали правата е с цели или реални числа. По подразбиране роботът потегля от точка 0, но може да му бъде указана коя да е друга точка от правата за начало. Роботът може да изпълнява две прости команди – move, която го премества с 1 позиция надясно и mark, която го кара да съобщи текущите си координати.

Задачата е да се имплементира следният прост DSL:

Да се създаде функция robot, която приема един аргумент – началната позиция на робота (аргументът има стойност по подразбиране 0).

robot    # Роботът ще стартира от позиция 0
robot 42 # Роботът ще стартира от позиция 42

robot също така трябва да приема блок, който да съдържа серия от команди move и mark:

robot 42 do
  move
  mark
end

robot връща като резултат масив, съдържащ позициите, които роботът е маркирал:

robot { move; move; mark; move; mark; } # => [2, 3]
robot(9) { move; mark; mark; move; move; mark; } # => [10, 10, 12]
robot(1000000) {} # => []

Забранено е използването на глобални променливи. Не използвайте долари и други парични знаци. :-) Забранено е и използването на дефакто глобални променливи (дефинирани някъде извън robot, например) за съхранение на информацията.

Hint: разгледайте instance_eval и напишете помощен клас, който да помни информацията, необходима на робота.

Решения

Николай Колев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Колев
class RobotManager
attr_reader :marked_positions
def initialize(start_position)
@current_position = start_position
@marked_positions = []
end
def move
@current_position += 1
end
def mark
@marked_positions << @current_position
end
end
def robot(start_position = 0, &block)
manager = RobotManager.new(start_position)
manager.instance_eval(&block)
manager.marked_positions
end
Николай Димитров
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Димитров
class RobotData
attr_accessor :marked
def initialize(position)
@current_position = position
@marked = []
end
def mark
@marked.push @current_position
self
end
def move
@current_position = @current_position.next
self
end
end
def robot(position = 0, &block)
RobotData.new(position).instance_eval(&block).marked
end
Станислав Гатев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Станислав Гатев
class Robot
attr_accessor :position
attr_reader :marks
def initialize(position)
@position, @marks = position, []
end
def move
@position += 1
end
def mark
marks << @position
end
end
def robot(position=0, &commands)
robot = Robot.new position
robot.instance_eval &commands
robot.marks
end
Йордан Петров
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Йордан Петров
class Helper
def initialize(current_position)
@current_position = current_position
@marks = []
end
def move
@current_position += 1
end
def mark
@marks << @current_position
end
end
def robot(starting_position = 0, &block)
helper = Helper.new starting_position
helper.instance_eval(&block) if block_given?
helper.instance_eval { @marks }
end
Никола Таушанов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Никола Таушанов
class Robot
def initialize(position)
@position = position
@marked_positions = []
end
def do_commands(&block)
instance_eval &block
@marked_positions
end
private
def move
@position += 1
end
def mark
@marked_positions << @position
end
end
Цвета Гергичанова
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Цвета Гергичанова
def robot(number = 0)
@result = []
@beginning = number
def move()
@beginning += 1
end
def mark()
@result << @beginning
end
if block_given?
yield
end
@result
end
Свилен Андонов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Свилен Андонов
class RobotState
#include Enumerable ?
attr_reader :result, :position
def initialize start
@position = start
@result = []
end
def move
@position += 1
end
def mark
@result << @position
end
end
def robot start = 0, &block
robot = RobotState.new start
robot.instance_eval &block
end
Елена Денева
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Елена Денева
def robot pos=0 , &commands
place = Position.new pos
place.instance_eval(&commands) if block_given?
place.marked
end
class Position
attr_reader :marked
def initialize position
@position = position
@marked = []
end
def move
@position = @position + 1
end
def mark
marked << @position
end
end
Милан Миланов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Милан Миланов
class Robot
def initialize(starting_position)
@position = starting_position
@movements = []
end
def move
@position += 1
end
def mark
@movements << @position
end
end
def robot(starting_position = 0, &commands)
Robot.new(starting_position).instance_eval(&commands) or []
end
Мартин Попов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Мартин Попов
class Robot
attr_accessor :position, :marked_positions
def initialize(start = 0)
@position = start
@marked_positions = []
end
def move
@position += 1
end
def mark
marked_positions << position
end
end
def robot( start = 0, &block)
a_robot = Robot.new start
a_robot.instance_eval(&block)
a_robot.marked_positions
end
Теодор Илиев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Теодор Илиев
def robot(position = 0, &block)
robot_fiber = Fiber.new &block
marked_positions = []
while action = robot_fiber.resume
position += action
marked_positions << position if action.zero?
end
marked_positions
end
def move
Fiber.yield 1
end
def mark
Fiber.yield 0
end
Илиян Величков
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Илиян Величков
class RobotMemory
attr_accessor :position, :marked_positions
def initialize(position)
@position = position
@marked_positions = []
end
end
def robot(start_position = 0, &block)
return [] unless block_given?
memory = RobotMemory.new start_position
memory.instance_eval &block
memory.marked_positions
end
def move
@position += 1
#position += 1 # NoMethodError: undefined method `+' for nil:NilClass
end
def mark
marked_positions << position
end
Петър Костов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Петър Костов
class RobotState
attr_reader :marked
def initialize(start)
@current = start
@marked = []
end
def move
@current += 1
end
def mark
@marked << @current
end
end
def robot(start = 0, &block)
state = RobotState.new start
state.instance_eval &block
state.marked
end
Виктория Христова
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Виктория Христова
class Robot
def initialize(start)
@start = start
@marked_moves = []
end
def move
@start += 1
@marked_moves
end
def mark
@marked_moves<<@start
end
end
def robot(start = 0, &block)
my_robot = Robot.new(start)
my_robot.instance_eval(&block)
end
Нели Хатева
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Нели Хатева
def robot(start_point = 0, &block)
robot = RobotMemorizer.new start_point
robot.marked_points &block
end
class RobotMemorizer
attr_accessor :current_point, :marked_points_array
def initialize(start_point)
@current_point = start_point
@marked_points_array = []
end
def marked_points(&block)
if block_given?
instance_eval &block
end
marked_points_array
end
def move
@current_point += 1
end
def mark
marked_points_array << current_point
end
end
Филарета Йорданова
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Филарета Йорданова
class Robot
def initialize
@array = []
end
def move
@position += 1
end
def mark
@array << @position
end
end
def robot(position = 0, &block)
robot = Robot.new
robot.instance_eval do
@position = position
end
if block_given?
robot.instance_exec(&block) or
[]
end
end
Иван Георгиев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Иван Георгиев
class RobotHelper
attr_reader :robot_list
def initialize(start = 0)
@current_position = start
@robot_list = []
end
def move
@current_position += 1
end
def mark
@robot_list << @current_position
end
end
def robot(*start, &block)
robocop = RobotHelper.new *start
robocop.instance_eval(&block)
robocop.robot_list
end
Кирчо Кирев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Кирчо Кирев
class OperateRobot
attr_reader :marks
def initialize(position)
@position = position
@marks = []
end
def move
@position += 1
end
def mark
@marks << @position
end
end
def robot(position = 0, &block)
operate = OperateRobot.new position
operate.instance_exec(&block)
operate.marks
end
Георги Пачов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Пачов
def robot(position=0, &block)
return Robot.new position, &block if block_given?
Robot.new position
end
class Robot
def initialize(position=0, &block)
@positions = []
@current_position = position
instance_eval &block if block_given?
end
def move
@current_position += 1
end
def mark
@positions << @current_position
end
def to_s
@positions.to_s
end
end
Николай Шегунов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Николай Шегунов
class Robot
def self.robot(start_position = 0, &block)
DSL.new(start_position, &block).result
end
end
class DSL
attr_reader :result
def initialize(position, &block)
@position, @result = position, []
instance_eval &block
end
def move
@position += 1
end
def mark
@result << @position
end
end
Георги Гърдев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Гърдев
def robot(start = 0)
@steps = []
@current_position = start
def move
@current_position += 1
end
def mark
@steps << @current_position
end
yield
end
Атанас Пройчев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Атанас Пройчев
class HelpRobot
def initialize(start)
@coord = start
end
def move
@coord += 1
end
def mark
@coord
end
end
def robot(start = 0)
help = HelpRobot.new start
if block_given?
yield
end
end
Чанита Иванова
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Чанита Иванова
class AuxiliaryClass
def initialize(start)
@start = start
@array = []
end
def move
@start += 1
end
def mark
@array << @start
end
end
def robot(start = 0, &block)
result = AuxiliaryClass.new(start)
result.instance_eval &block
result.instance_eval { @array }
end
Христо Хърсев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Христо Хърсев
def robot position = 0, &block
robot = RobotController.new position
robot.instance_eval &block
robot.marked_paths
end
class RobotController
def initialize position
@position = position
@marked_paths = []
end
def move
@position += 1
end
def mark
@marked_paths << @position
end
def marked_paths
@marked_paths
end
end
Красимир Георгиев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Красимир Георгиев
class WalkingRobot
def initialize(position)
@position = position
@route = []
end
def move
@position += 1
end
def mark
@route << @position
end
def route
@route.clone
end
end
def robot(initial_position = 0, &block)
robot = WalkingRobot.new(initial_position)
robot.instance_eval(&block)
robot.route
end
Гергана Петрова
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Гергана Петрова
class Robot
attr_reader :current_position, :marked_path
def initialize(start_position)
@current_position = start_position
@marked_path = []
end
def move
@current_position += 1
end
def mark
@marked_path.push current_position
end
end
def robot(start_position = 0, &block)
robo = Robot.new start_position
robo.instance_eval(&block)
robo.marked_path
end
Мартина Величкова
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Мартина Величкова
class MovingRobot
attr_reader :result
def initialize(start_position = 0)
@current_position = start_position
@result = []
end
def mark
@result << @current_position
end
def move
@current_position += 1
end
end
def robot(start_position = 0, &block)
robot = MovingRobot.new(start_position)
robot.instance_eval &block
robot.result
end
Ангел Николов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Ангел Николов
class Robot
def initialize(starting_position)
@position = starting_position
@marks = []
end
attr_reader :marks
def move
@position += 1
end
def mark
@marks << @position
end
end
def robot(starting_position = 0, &block)
robot_dummy = Robot.new(starting_position)
robot_dummy.instance_eval(&block)
robot_dummy.marks
end
Стоян Найденов
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Стоян Найденов
class Robot
attr_accessor :marked
def initialize(position)
@position = position
@marked = []
end
def move
@position += 1
end
def mark
@marked << @position
end
end
def robot(position = 0, &block)
helper_robot = Robot.new position
helper_robot.instance_eval &block
helper_robot.marked
end
Даяна Беркова
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Даяна Беркова
class Robot
def initialize(start)
@start = start
@positions = []
end
def move
@start += 1
end
def mark
@positions << @start
end
end
def robot(start = 0, &block)
simple_robot = Robot.new(start)
simple_robot.instance_eval &block
simple_robot.instance_eval { @positions }
end
Христо Владев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Христо Владев
class Robot
attr_reader :marked_positions
def initialize(position)
@current_position, @marked_positions = position, []
end
def execute(&commands)
instance_eval(&commands) if commands
self
end
private
def move
@current_position += 1
end
def mark
@marked_positions.push @current_position
end
end
def robot(position = 0, &commands)
Robot.new(position).execute(&commands).marked_positions
end
Мирослав Крамолински
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Мирослав Крамолински
class Robot
attr_reader :move, :mark
def marked_positions(&block)
instance_eval &block
@marked_positions
end
def initialize
@marked_positions = []
@current_mark = 0
end
def move
@current_mark += 1
end
def mark
@marked_positions << @current_mark
end
end
def robot(starting_position = 0, &block)
return [] if not block_given?
Robot.new.marked_positions(&block).map { |mark| mark + starting_position }
end
Пламен Тотев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Пламен Тотев
def robot(start_position=0, &block)
bot_class = Class.new do
attr_reader :marked
def initialize(start_position=0)
@position = start_position
@marked = []
end
def move
@position += 1
end
def mark
@marked << @position
end
end
bot = bot_class.new start_position
bot.instance_eval &block if block_given?
bot.marked
end
Георги Георгиев
  • Непроверено
  • 0 успешни тест(а)
  • 0 неуспешни тест(а)
Георги Георгиев
class RobotMemory
attr_accessor :log
def initialize (position = 0)
@position = position
@log = []
end
def move
@position += 1
end
def mark
@log << @position
end
end
def robot (position = 0, &block)
memory = RobotMemory.new(position)
memory.instance_eval &block
memory.log
end