Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Самый читаемый язык программирования для имитации 10 000 игр с лотками и лестницами?

Автор вопроса: Landon KuhnОтветов: 7

Мне интересно, какой язык больше всего подходит для моделирования игры Желоба и Лестницы (Змеи и Лестницы в некоторых странах). Я хочу собрать базовую статистику, такую ​​как среднее и стандартное отклонение продолжительности игры (по ходам), вероятность выигрыша в зависимости от порядка хода (кто играет первым, вторым и т. Д.) И все остальное, что может вас заинтересовать. В частности, я ищу наиболее читаемую, удобную в обслуживании и модифицируемую реализацию. Он также должен быть очень кратким.

Если вы взрослый и не проводите много времени с маленькими детьми, вы, вероятно, плохо помните игру. Напомню:

  • На доске 100 квадратов.
  • Каждый игрок по очереди вращает случайное число от 1 до 6 (или бросает кости).
  • Затем игрок продвигается на столько клеток.
  • Некоторые квадраты находятся у основания лестницы; приземление на один из этих квадратов означает, что игрок может подняться по лестнице, продвигая его позицию до заранее определенного квадрата.
  • Некоторые квадраты находятся в верхней части горки (желоб или змейка); приземление на один из этих квадратов означает, что игрок должен соскользнуть вниз, перемещая позицию игрока обратно в заранее определенный квадрат.
  • Тот игрок, который первым попадет на позицию 100, становится победителем.
  • Что касается змей и лестниц, вам действительно нужно спросить? Это должен быть Python! 04.07.2009
  • Мне любопытно, есть ли у вас свои выводы и данные и готовы ли вы ими поделиться? То есть статистика. Я бы использовал Руби. Сложно обыграть по читабельности. Mohamad 20.11.2014

statisticssimulationlanguage-agnostic

Ответы

Ответ 1 · рейтинг 24 · Yehuda Katz

Это немного грубо, но должно работать:

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.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы