Самый читаемый язык программирования для имитации 10 000 игр с лотками и лестницами?
Автор вопроса: Landon KuhnОтветов: 7
Мне интересно, какой язык больше всего подходит для моделирования игры Желоба и Лестницы (Змеи и Лестницы в некоторых странах). Я хочу собрать базовую статистику, такую как среднее и стандартное отклонение продолжительности игры (по ходам), вероятность выигрыша в зависимости от порядка хода (кто играет первым, вторым и т. Д.) И все остальное, что может вас заинтересовать. В частности, я ищу наиболее читаемую, удобную в обслуживании и модифицируемую реализацию. Он также должен быть очень кратким.
Если вы взрослый и не проводите много времени с маленькими детьми, вы, вероятно, плохо помните игру. Напомню:
На доске 100 квадратов.
Каждый игрок по очереди вращает случайное число от 1 до 6 (или бросает кости).
Затем игрок продвигается на столько клеток.
Некоторые квадраты находятся у основания лестницы; приземление на один из этих квадратов означает, что игрок может подняться по лестнице, продвигая его позицию до заранее определенного квадрата.
Некоторые квадраты находятся в верхней части горки (желоб или змейка); приземление на один из этих квадратов означает, что игрок должен соскользнуть вниз, перемещая позицию игрока обратно в заранее определенный квадрат.
Тот игрок, который первым попадет на позицию 100, становится победителем.
Что касается змей и лестниц, вам действительно нужно спросить? Это должен быть Python! 04.07.2009
Мне любопытно, есть ли у вас свои выводы и данные и готовы ли вы ими поделиться? То есть статистика. Я бы использовал Руби. Сложно обыграть по читабельности. Mohamad 20.11.2014
class Board
attr_accessor :winner
def initialize(players, &blk)
@chutes, @ladders = {}, {}
@players = players
@move = 0
@player_locations = Hash.new(0)
self.instance_eval(&blk)
end
def chute(location)
@chutes[location[:from]] = location[:to]
end
def ladder(location)
@ladders[location[:from]] = location[:to]
end
def spin
player = @move % @players
die = rand(6) + 1
location = (@player_locations[player] += die)
if endpoint = @chutes[location] || endpoint = @ladders[location]
@player_locations[player] = endpoint
end
if @player_locations[player] >= 100
@winner = player
end
@move += 1
end
end
num_players = 4
board = Board.new num_players, do
ladder :from => 4, :to => 14
ladder :from => 9, :to => 31
# etc.
chute :from => 16, :to => 6
# etc.
end
until board.winner
board.spin
end
puts "Player #{board.winner} is the winner!"
Ответ 2 · рейтинг 14 · Ben Hughes
Вам следует попробовать что-нибудь вроде Ruby или Python. Оба в основном являются исполняемым псевдокодом.
Вы могли бы получить более короткую и более блестящую программу с Haskell, но я полагаю, что Ruby или Python, вероятно, действительно будут понятны.
Ответ 3 · рейтинг 5 · mattiast
Для многих статистических данных моделирование не требуется. Используя цепи Маркова, вы можете свести многие проблемы к матричным операциям с матрицей 100x100, вычисление которых занимает всего около 1 миллисекунды.
Ответ 4 · рейтинг 4 · leif
Я собираюсь не согласиться с некоторыми из более ранних постов и сказать, что объектно-ориентированный подход здесь не подходит, поскольку он усложняет ситуацию.
Все, что вам нужно, это отслеживать позицию каждого игрока и вектор для представления доски. Если на позиции доски нет желоба или лестницы, она равна 0. Если она содержит лестницу, доска содержит положительное число, указывающее, на сколько позиций нужно продвинуться вперед. Если он содержит желоб, он содержит отрицательное число, чтобы переместить вас назад. Просто отслеживайте количество поворотов и позиций каждого игрока.
Фактическое моделирование с помощью этого метода довольно просто, и вы можете сделать это практически на любом языке программирования. Я бы посоветовал R или python, но только потому, что сегодня я использую именно их.
У меня нет копии желобов и лестниц, поэтому я сделал небольшую доску. Вам нужно будет вставить правую доску:
#!/usr/bin/python
import random, numpy
board = [0, 0, 0, 3, 0, -3, 0, 1, 0, 0]
numplayers = 2
numruns = 100
def simgame(numplayers, board):
winner = -1
winpos = len(board)
pos = [0] * numplayers
turns = 0
while max(pos) < winpos:
turns += 1
for i in range(0, numplayers):
pos[i] += random.randint(1,6)
if pos[i] < winpos:
pos[i] += board[pos[i]]
if pos[i] >= winpos and winner == -1:
winner = i
return (turns, winner)
# simulate games, then extract turns and winners
games = [simgame(numplayers, board) for x in range(numruns)]
turns = [n for (n, w) in games]
winner = [w for (t, w) in games]
pwins = [len([p for p in winner if p == i]) for i in range(numplayers)]
print "runs:", numruns
print "mean(turns):", numpy.mean(turns)
print "sd(turns):", numpy.std(turns)
for i in range(numplayers):
print "Player", (i+1), "won with proportion:", (float(pwins[i])/numruns)
Ответ 5 · рейтинг 2 · Sam Saffron
F # тоже не слишком уродлив, его сложно превзойти функциональный язык по краткости:
#light
open System
let snakes_and_ladders = dict [(1,30);(2,5);(20,10);(50,11)]
let roll_dice(sides) =
Random().Next(sides) + 1
let turn(starting_position) =
let new_pos = starting_position + roll_dice(6)
let found, after_snake_or_ladder = snakes_and_ladders.TryGetValue(new_pos)
if found then after_snake_or_ladder else new_pos
let mutable player_positions = [0;0]
while List.max player_positions < 100 do
player_positions <- List.map turn player_positions
if player_positions.Head > 100 then printfn "Player 1 wins" else printf "Player 2 wins"
Ответ 6 · рейтинг 1 · Simeon Pilgrim
Я помню, как около 4 лет назад это было соревнование Top Coders, где вопрос заключался в том, какова вероятность того, что игрок 1 выиграет в змейках и лестницах.
После матча была опубликована действительно хорошая статья о том, как решать головоломку. Не могу найти сейчас, но эта статья вполне хорошо
C / C ++ казалось достаточно, чтобы хорошо решить проблему.
Ответ 7 · рейтинг 1 · starblue
Выберите любой объектно-ориентированный язык, они были придуманы для моделирования.
Поскольку вы хотите, чтобы он был кратким (почему?), Выберите язык с динамической типизацией, такой как Smalltalk, Ruby или Python.