KOTH: Mỗi đồng tiền đều có hai mặt


26

Kết quả cuối cùng có sẵn

Giới thiệu

Sau KOTH trước đây của tôi với các chủ đề nặng nề ( chiến tranh giả tưởng , đại dịch toàn cầu ...), tôi trở lại với một trò chơi nhẹ nhàng mới. Lần này, bạn phải đối mặt trong một tình huống "giống như trò chơi cờ". Một đống tiền xu lộn ngược được đặt ở trung tâm của một cái bàn thực sự lớn, và bạn quyết tâm lấy phần của mình về chiến lợi phẩm!

Bảng chú giải

Tiền xu : Mã thông báo có thể được lật hoặc không bị lật.
Unflipped : Tiền xu được đặt trên bàn với giá trị của chúng chỉ xuống. Đây là trạng thái mặc định của các đồng tiền.
Lật : Tiền xu được đặt trên bàn với giá trị của chúng hướng lên.
Địa phương : Đề cập đến đống tiền của bạn.
Toàn cầu : Đề cập đến đống tiền xu tại trung tâm.

Nguyên tắc

Khi bắt đầu trò chơi, mỗi người chơi bắt đầu với 0 điểm0 xu (lật hoặc không bị lật). Trò chơi được chơi theo lượt. Trong lượt của mình, người chơi có thể thực hiện tối đa 3 hành động tương tác với đống tiền xu ở giữa bàn, đống tiền riêng của họ hoặc với người chơi khác.

Thứ tự chơi được xác định ngẫu nhiên khi bắt đầu trò chơi. Thứ tự của người chơi trong danh sách đối số thể hiện thứ tự lần lượt và nó đi từ trái sang phải trong danh sách đó. "Tiếp theo" và "Trước đó" tương ứng với "bên phải trong danh sách đó" và "bên trái trong danh sách đó" với một vòng lặp nếu bạn là người cuối cùng của một trong hai bên.

Trò chơi kéo dài trong 50 vòng hoặc cho đến khi có 0 đồng xu ở trung tâm khi kết thúc lượt người chơi (nghĩa là bạn sẽ hoàn thành 3 hành động của mình ngay cả khi cọc trống sau hành động đầu tiên của bạn và bạn có thể đặt lại xu để cho trò chơi tiếp tục). Số lượng tiền xu toàn cầu bắt đầu được xác định ngẫu nhiên với công thức này:

(2 ^ nb_players) + (nb_players * 10) - random(1 + (nb_players ^ 2))`

Mỗi hành động sẽ giúp bạn có điểm (hoặc khiến bạn mất một số) và vào cuối trò chơi, mỗi đồng xu bạn có sẽ được thêm vào số điểm của bạn ( -1 cho số lần bỏ, +2 khi lật ). Người chơi với chiến thắng điểm số cao nhất.

Bộ điều khiển cung cấp cho bạn đầu vào thông qua các đối số lệnh và chương trình của bạn phải xuất qua thiết bị xuất chuẩn.

Cú pháp

Đầu vào

Mỗi khi chương trình của bạn được gọi, nó sẽ nhận được các đối số ở định dạng này:

Round;YourPlayerId;Coins;PlayerId_Points_Flipped_Unflipped;PlayerId_Points_Flipped_Unflipped;...

Các vòng được lập chỉ mục 1.

Ví dụ đầu vào

6;2;52;1_20_3_12;0_-2_0_1;2_12_1_0

Ở đây, bạn thấy đó là vòng thứ 6 và bạn là người chơi 2. Có 52 đồng xu trong đống trung tâm. Bạn có 12 điểm, 1 đồng xu lật và 0 đồng xu không bị lật. Điểm có thể âm.

Đầu ra

Bạn phải xuất ba ký tự (không có khoảng trắng, không có dấu phân cách), mỗi ký tự tương ứng với một hành động bạn sẽ thực hiện lần lượt này. Thứ tự của các nhân vật xác định thứ tự của các hành động. Bạn có thể xuất các hành động tương tự nhiều lần. Trong trường hợp không có đủ tiền để hoàn thành hành động của bạn, nó sẽ sử dụng tối đa số xu có sẵn và chỉ tính điểm cho số tiền được sử dụng.

N: Không làm gì
1: Lấy 1 đồng xu từ đống trung tâm [Hiệu ứng: +1 cục bộ không bị xóa / -1 điểm / -1 toàn cầu không bị xóa]
2 : Lấy 2 đồng xu từ cọc trung tâm [Hiệu ứng: +2 không bị xóa cục bộ / -2 điểm / -2 unflipped toàn cầu]
3 : Lấy 3 đồng xu từ đống trung tâm [Hiệu ứng: +3 unflipped cục bộ / -3 điểm / -3 toàn cầu unflipped]
A : Đặt lại 1 xu từ đống của bạn [Hiệu ứng: -1 điểm không bị xóa / +1 điểm / +1 unflipped global]
B : Đặt lại 2 xu từ đống của bạn [Hiệu ứng: -2 unflipped cục bộ / +2 điểm / +2 unflipped toàn cầu]
C : Đặt lại 3 xu từ đống của bạn [Hiệu ứng: -3 unflipped / +3 điểm / +3 unflipped toàn cầu]
X : Xóa 1 đồng xu khỏi đống của bạn[Hiệu ứng: -1 cục bộ không bị xóa / 0 điểm]
Y : Xóa 2 đồng xu khỏi đống của bạn [Hiệu ứng: -2 cục bộ không bị xóa / 0 điểm]
Z : Xóa 3 đồng xu khỏi đống của bạn [Hiệu ứng: -3 cục bộ không bị xóa / 0 điểm]
R : Xoay đồng xu cho người chơi trước [Hiệu ứng: -1 điểm cho mỗi lần không nhận được, +2 điểm cho mỗi lần lật được nhận / áp dụng cho tất cả người chơi]
T : Xoay xu cho người chơi tiếp theo [Hiệu ứng: -1 điểm cho mỗi lần không nhận được, +2 điểm cho mỗi lần lật được nhận / áp dụng cho tất cả người chơi]
F : Lật 1 đồng xu [Hiệu ứng: -1 cục bộ không bị lật / +1 lật cục bộ / +2 điểm]
U : Bỏ 1 đồng xu [Hiệu ứng: +1 cục bộ không bị lật / -1 lật cục bộ / -2 điểm]

Ví dụ đầu ra

2FF : Kiếm hai đồng xu và lật hai đồng xu, ghi điểm -2 + 2 + 2 = 2 points

Nếu đầu ra của bạn không chính xác, bộ điều khiển sẽ giả định NNN.

Bộ điều khiển

Bạn có thể tìm thấy bộ điều khiển trên GitHub . Nó cũng chứa hai mẫu, được viết bằng Java. Để làm cho nó chạy, hãy xem dự án và mở nó trong Java IDE của bạn. Điểm vào trong mainphương thức của lớp Game. Yêu cầu Java 8.

Để thêm bot, trước tiên, bạn cần có phiên bản được biên dịch cho Java (tệp. Class) hoặc nguồn cho các ngôn ngữ được diễn giải. Đặt chúng trong thư mục gốc của dự án. Sau đó, tạo một lớp Java mới trong playersgói (bạn có thể lấy ví dụ về các bot đã có). Lớp này phải thực hiện Playerđể ghi đè phương thức String getCmd(). Chuỗi trả về là lệnh shell để chạy bot của bạn. Ví dụ, bạn có thể làm cho bot Ruby hoạt động với lệnh này : return "C:\Ruby\bin\ruby.exe MyBot.rb";. Cuối cùng, thêm bot trong mảng người chơi ở đầu Gamelớp.

Quy tắc

  • Bots không nên được viết để đánh bại hoặc hỗ trợ các bot cụ thể khác.
  • Viết vào các tập tin được cho phép. Vui lòng viết thư cho "mineubmissionname.txt", thư mục sẽ được xóa trước khi trò chơi bắt đầu. Các nguồn lực bên ngoài khác không được phép.
  • Trình của bạn có 1 giây để trả lời.
  • Cung cấp các lệnh để biên dịch và chạy đệ trình của bạn.

Ngôn ngữ được hỗ trợ

Tôi sẽ thử và hỗ trợ mọi ngôn ngữ, nhưng nó cần có sẵn trực tuyến miễn phí. Vui lòng cung cấp hướng dẫn để cài đặt nếu bạn không sử dụng ngôn ngữ "chính thống".

Ngay bây giờ, tôi có thể chạy: Java 6-7-8, PHP, Ruby, Perl, Python 2-3, Lua, R, node.js, Haskell, Kotlin, C ++ 11.

Kết quả cuối cùng

Đây là kết quả của 100 trò chơi (điểm được cộng lại):

1. BirdInTheHand: 1017790
2. Balance: 851428
3. SecondBest: 802316
4. Crook: 739080
5. Jim: 723440
6. Flipper: 613290
7. Wheeler: 585516
8. Oracle: 574916
9. SimpleBot: 543665
10. TraderBot: 538160
11. EgoisticalBot: 529567
12. RememberMe: 497513
13. PassiveBot: 494441
14. TheJanitor: 474069
15. GreedyRotation: 447057
16. Devil: 79212
17. Saboteur: 62240

Kết quả cá nhân của các trò chơi có sẵn tại đây: http://past.co/63f1e924 (với số xu bắt đầu và số vòng cho mỗi trò chơi).

Tiền thưởng 50 danh tiếng được trao cho người chiến thắng: Bird In The Hand của Martin Büttner .

Cảm ơn tất cả các bạn đã tham gia, hẹn gặp lại KOTH tiếp theo ~


1
" Hiệu ứng: -1 cục bộ không bị xóa / +1 lật cục bộ / +2 điểm " có vẻ sai đối với tôi. Không phải là +3 điểm, bởi vì bạn đã đi từ -1 cho một đồng xu chưa được chuyển thành +2 cho một lần lật?
Peter Taylor

1
@PeterTaylor Tôi nghĩ rằng điểm độc lập với tiền xu. Mỗi hành động được liên kết với một số điểm nhận được hoặc mất và những điểm này độc lập với số điểm bạn thực sự nhận được cho các đồng xu vào cuối trò chơi.
Martin Ender

Bạn đề cập đến các đồng tiền với "giá trị" của chúng chỉ lên hoặc xuống. Những giá trị này được sử dụng để làm gì? Là tiền có thể phân biệt?
user2357112 hỗ trợ Monica

@PeterTaylor Như Martin Büttner đã nói, bạn nhận được tiền cho các hành động (trong trường hợp này là +2 cho việc lật) và bạn cũng nhận được điểm khi có đồng xu ở cuối (trong trường hợp này là +2 cho mỗi lần lật).
Thrax

Là ID không dựa trên hoặc một dựa trên?
frederick

Câu trả lời:


12

Chim trong tay, Ruby

def deep_copy(o)
  Marshal.load(Marshal.dump(o))
end

ID = 0
PTS = 1
FLP = 2
UFL = 3

round, id, global, *players = ARGV[0].split(';')
round = round.to_i
id = id.to_i
global = global.to_i

players.map!{ |s| s.split('_').map(&:to_i) }

nplayers = players.size

my_pos = players.find_index { |i, p, f, u| i == id }

state = {
    round: round,
    id: id,
    global: global,
    players: players,
    my_pos: my_pos,
    me: players[my_pos],
    prev_p: players[my_pos-1],
    next_p: players[(my_pos+1)%nplayers],
    ends_game: round == 50 && my_pos == nplayers-1,
    score: 0
}

moves = {
    'N' => ->s{deep_copy(s)},
    '1' => ->s{t = deep_copy(s); coins = [1, t[:global]].min; t[:global] -= coins; t[:me][UFL] += coins; t[:score] -= coins; t},
    '2' => ->s{t = deep_copy(s); coins = [2, t[:global]].min; t[:global] -= coins; t[:me][UFL] += coins; t[:score] -= coins; t},
    '3' => ->s{t = deep_copy(s); coins = [3, t[:global]].min; t[:global] -= coins; t[:me][UFL] += coins; t[:score] -= coins; t},
    'A' => ->s{t = deep_copy(s); coins = [1, t[:me][UFL]].min; t[:global] += coins; t[:me][UFL] -= coins; t[:score] += coins; t},
    'B' => ->s{t = deep_copy(s); coins = [2, t[:me][UFL]].min; t[:global] += coins; t[:me][UFL] -= coins; t[:score] += coins; t},
    'C' => ->s{t = deep_copy(s); coins = [3, t[:me][UFL]].min; t[:global] += coins; t[:me][UFL] -= coins; t[:score] += coins; t},
    'X' => ->s{t = deep_copy(s); coins = [1, t[:me][UFL]].min; t[:me][UFL] -= coins; t},
    'Y' => ->s{t = deep_copy(s); coins = [2, t[:me][UFL]].min; t[:me][UFL] -= coins; t},
    'Z' => ->s{t = deep_copy(s); coins = [3, t[:me][UFL]].min; t[:me][UFL] -= coins; t},
    'F' => ->s{t = deep_copy(s); coins = [1, t[:me][UFL]].min; t[:me][UFL] -= coins; t[:me][FLP] += coins; t[:score] += 2*coins; t},
    'U' => ->s{t = deep_copy(s); coins = [1, t[:me][FLP]].min; t[:me][FLP] -= coins; t[:me][UFL] += coins; t[:score] -= 2*coins; t},
    'R' => ->s{
        t = deep_copy(s)
        (-1...t[:players].size-1).each do |i|
            t[:players][i][FLP] = s[:players][i+1][FLP]
            t[:players][i][UFL] = s[:players][i+1][UFL]
        end
        t[:score] += 2*t[:me][FLP] - t[:me][UFL];
        t
    },
    'T' => ->s{
        t = deep_copy(s)
        (0...t[:players].size).each do |i|
            t[:players][i][FLP] = s[:players][i-1][FLP]
            t[:players][i][UFL] = s[:players][i-1][UFL]
        end
        t[:score] += 2*t[:me][FLP] - t[:me][UFL];
        t
    }
}


results = {}

'N123ABCXYZFURT'.each_char { |c1| 
    s1 = moves[c1][state]
    'N123ABCXYZFURT'.each_char { |c2| 
        s2 = moves[c2][s1]
        'N123ABCXYZFURT'.each_char { |c3| 
            s3 = moves[c3][s2]
            s3[:ends_game] ||= s3[:global] == 0
            results[c1+c2+c3] = s3
        }
    }
}

endingMoves = results.keys.select{|k| results[k][:ends_game]}

endingMoves.each{|k| results[k][:score] += 2*results[k][:me][FLP] - results[k][:me][UFL]}

$> << results.keys.shuffle.max_by {|k| results[k][:score]}

Nếu cả hai chúng tôi đều không có lỗi trong chương trình của họ, thì thuật toán chính của điều này có thể rất giống với Oracle của Mathias. Dựa trên giả định rằng trước vòng đấu cuối cùng, chúng tôi không thể biết được loại tiền nào chúng tôi sẽ kết thúc, chúng tôi đánh giá bộ chuyển động hiện tại hoàn toàn dựa trên số điểm nhận được ngay lập tức, bỏ qua hoàn toàn loại tiền nào chúng tôi sẽ kết thúc với. Vì chỉ có 14 3 = 2744 bộ di chuyển khả thi, chúng tôi có thể dễ dàng mô phỏng tất cả chúng để tìm ra số điểm chúng sẽ mang lại.

Tuy nhiên, nếu một bộ di chuyển kết thúc trò chơi (vì nó làm giảm tỷ lệ cược toàn cầu xuống 0 hoặc vì đây là vòng 50 và chúng tôi là người cuối cùng di chuyển), thì nó cũng tính đến các đồng tiền được sở hữu ở cuối bộ di chuyển để xác định giá trị của bộ di chuyển. Lần đầu tiên tôi cân nhắc việc chấm dứt trò chơi bất cứ khi nào có thể, nhưng điều này sẽ dẫn đến một động thái khủng khiếp 333khi chỉ còn 9 đồng xu trong chậu.

Nếu có nhiều bộ di chuyển cho cùng một kết quả, chúng tôi chọn một bộ ngẫu nhiên. (Tôi có thể thay đổi điều này để thiên vị nó theo hướng có lợi cho các bộ di chuyển kết thúc trò chơi.)


17

Oracle, Python 3

Cập nhật: đã thay đổi thứ tự của các nỗ lực khác nhau để ủng hộ đống tiền xu thấp hơn các vòng quay.

import sys
import itertools
from copy import deepcopy


MOVES_REQUIRED = 3

FLIPPED = 0
UNFLIPPED = 1


def filter_neighbors(neighbors, me, size):
    limit = size - MOVES_REQUIRED
    for data in neighbors:
        i, _, flipped, unflipped = map(int, data.split('_'))
        if MOVES_REQUIRED < (me - i) % size < limit:
            continue  # Skip neighbors that are too far away
        yield i, [flipped, unflipped]


class Player:
    def __init__(self, raw_data):
        _, me, coins, *data = raw_data.split(';')

        self.num_players = len(data)
        self._me = int(me)
        self._coins = int(coins)
        self._state = dict(filter_neighbors(data, self._me, self.num_players))

    def reset(self):
        self.me = self._me
        self.coins = self._coins
        self.state = deepcopy(self._state)
        self.my_state = self.state[self.me]

    def invalid_move(self, move):
        if move in 'NRT':
            return False

        if move in '123'[:self.coins]:
            return False

        flipped, unflipped = self.my_state
        if flipped and move == 'U':
            return False
        if unflipped and move == 'F':
            return False

        if move in 'AXBYCZ'[:2 * unflipped]:
            return False

        return True

    def N(self):
        return 0

    def one(self):
        self.coins -= 1
        self.my_state[UNFLIPPED] += 1
        return -1

    def two(self):
        self.coins -= 2
        self.my_state[UNFLIPPED] += 2
        return -2

    def three(self):
        self.coins -= 3
        self.my_state[UNFLIPPED] += 3
        return -3

    def A(self):
        self.coins += 1
        self.my_state[UNFLIPPED] -= 1
        return 1

    def B(self):
        self.coins += 2
        self.my_state[UNFLIPPED] -= 2
        return 2

    def C(self):
        self.coins += 3
        self.my_state[UNFLIPPED] -= 3
        return 3

    def X(self):
        self.my_state[UNFLIPPED] -= 1
        return 0

    def Y(self):
        self.my_state[UNFLIPPED] -= 2
        return 0

    def Z(self):
        self.my_state[UNFLIPPED] -= 3
        return 0

    def R(self):
        self.me = (self.me + 1) % self.num_players
        flipped, unflipped = self.my_state = self.state[self.me]
        return 2 * flipped - unflipped

    def T(self):
        self.me = (self.me - 1) % self.num_players
        flipped, unflipped = self.my_state = self.state[self.me]
        return 2 * flipped - unflipped

    def F(self):
        self.my_state[FLIPPED] += 1
        self.my_state[UNFLIPPED] -= 1
        return 2

    def U(self):
        self.my_state[FLIPPED] -= 1
        self.my_state[UNFLIPPED] += 1
        return -2

setattr(Player, '1', Player.one)
setattr(Player, '2', Player.two)
setattr(Player, '3', Player.three)


def scenarii(player):
    for tries in itertools.product('FUABCXYZ123NRT', repeat=MOVES_REQUIRED):
        player.reset()
        points = 0
        for try_ in tries:
            if player.invalid_move(try_):
                break
            points += getattr(player, try_)()
        else:
            yield points, ''.join(tries)


if __name__ == '__main__':
    player = Player(sys.argv[1])
    print(max(scenarii(player))[1])

Thử từng đầu ra có thể và giữ nguyên đầu ra mang lại số điểm tối đa cho lượt này.


Ah, tôi vừa mới thực hiện điều này, +1. :) (Tôi vẫn có thể thực sự, bởi vì tôi đã có một hoặc hai ý tưởng nhỏ hơn để cải thiện điều này một chút .)
Martin Ender

@ MartinBüttner Tôi nghĩ đến việc cải thiện deepcopyđộ phức tạp của không gian (do đó thời gian [ ]) bằng cách chỉ giữ các hàng xóm liên quan. Không chắc chắn về cách nó sẽ tác động đến mọi thứ mặc dù.
409_Conflict

@Thrax Tôi đã sửa một lỗi filter_neighborsvà sửa đổi invalid_moveđể giải thích cho câu hỏi. Tôi không thể tái tạo lỗi mặc dù: $ python oracle.py '4;7;2040;8_-28_1_10;9_-43_0_9;2_-10_4_3;6_-24_6_3;0_6_2_12;1_48_3_0;10_21_4_8;5_6_5_1;4_-12_3_7;7_10_1_3;3_1_1_0'inTTR
409_Conflict

7

Xoay vòng tham lam, Ruby

round, id, global, *players = ARGV[0].split(';')
round = round.to_i
id = id.to_i
global = global.to_i

players.map!{ |s| s.split('_').map(&:to_i) }

nplayers = players.size

my_pos = players.find_index { |i, p, f, u| i == id }

prev_p = players[my_pos-1]
next_p = players[(my_pos+1)%nplayers]

prev_score = 2*prev_p[2] - prev_p[3]
next_score = 2*next_p[2] - next_p[3]

take_from = prev_p

$><< '3'
if prev_score > next_score || prev_score == next_score && prev_p[3] > next_p[3]
    $><< 'T'
else
    $><< 'R'
    take_from = next_p
end

if take_from[3] >= 3
    $><< 'C'
elsif take_from[3] >= 1
    $><< 'F'
else
    $><< 'N'
end

Điều này khá giống với cách tiếp cận của ArtOfCode, ngoại trừ việc kiểm tra xem người hàng xóm nào chúng ta có thể nhận được nhiều điểm hơn và nó chọn Cthay vì Fnếu chúng ta kết thúc với 3 đồng xu trở lên sau vòng quay.

Sau khi viết nó lên, tôi khá chắc chắn rằng một cách tiếp cận tốt hơn sẽ chỉ là tham lam chọn ra những động tác tốt nhất trong tất cả các lần di chuyển, trước khi xoay vòng bằng cách thực hiện (thay vì bám vào một "cố định không bị lật, xoay, thoát khỏi của unflipped "mẫu).

Điều này cũng không tính đến các điểm ẩn được thể hiện bởi các đồng tiền thực sự sở hữu (dựa trên giả định rằng trò chơi sẽ kéo dài đủ số vòng mà tôi có thể sẽ không giữ được tiền của mình dù thế nào đi nữa).


@MegaTom Rất tiếc, cảm ơn vì đã nắm bắt điều đó.
Martin Ender

6

Flipper, Python 2

Flipper thu thập tiền xu và cố gắng biến không bị lật để lật. Flipper không phải là một người chơi thông minh nhưng cố gắng trở thành một lực lượng tích cực trong trò chơi.

import sys, random

# process input data (not used here):
args = sys.argv[1].split(';')
rounds, myid, coins = map(int, args[:3])
players = [map(int, data.split('_')) for data in args[3:]]

# implement strategy using multiples of 'N123ABCXYZRTFU':
options = '12333FFFFFFFFFFF'
print ''.join(random.choice(options) for i in range(3))

Flipper chỉ cần python flipper.py <arg>chạy.


5

SimpleBot, Python 3

SimpleBot là, tốt, đơn giản. Anh ấy đã vạch ra một chiến lược và anh ấy sẽ gắn bó với nó.

Chạy:

python3 main.py

trong đó nội dung của main.pytập tin là:

def main():
    print("3RF")


if __name__ == "__main__":
    main()

5

Cân bằng, Lua

Số dư sẽ cố gắng giữ số dư trong mã thông báo của nó, giảm thiểu tổn thất trong trường hợp ai đó sử dụng RThành động chống lại anh ta. Anh ấy nghĩ rằng phong cách sống này là đúng đắn và nên được áp dụng cho bất kỳ ai không giữ được sự cân bằng tốt của các đồng xu bị lật / không bị lật, vì vậy mọi người gần gũi với anh ta sẽ bị trừng phạt ngay khi điều đó có thể khiến họ mất điểm.

Anh ta cần lệnh sau để chạy:

lua balance.lua

Trường hợp tập tin cân bằng.lua chứa đoạn mã sau:

local datas={}
local arg=arg[1]..";"

-- parse the arguments
-- add some meta datas for debuging purpose/usefulness
arg:gsub("(.-);",function(c)
  if not datas.round
  then
    datas.round=c+0
  elseif not datas.myID
  then
    datas.myID=c+0
  elseif not datas.coins
  then
    datas.coins=c+0
  else
    datas[#datas+1]={}
    datas[#datas].repr=c
    c=c.."_"
    tmp={}
    c:gsub("(.-)_",function(d) tmp[#tmp+1]=d end)
    datas[#datas].id=tmp[1]+0
    datas[#datas].points=tmp[2]+0
    datas[#datas].flip=tmp[3]+0
    datas[#datas].unflip=tmp[4]+0
    if datas[#datas].id==datas.myID
    then
      datas.myOrder=#datas
      datas.myDatas=datas[#datas]
    end
  end
end)

local actions=""
-- construct actions
for i=1,3
do
  -- if we aren't in balance and can grab more coins
  -- we do it
  if #actions==0 and datas.myDatas.unflip<=datas.myDatas.flip/2 and datas.coins>=3
  then
    actions=actions.."3"
    datas.myDatas.unflip=datas.myDatas.unflip+3
    datas.coins=datas.coins-3
  -- if we couldn't grab coins, but aren't in balance, we flip some coins
  elseif datas.myDatas.unflip>datas.myDatas.flip/2
  then
    actions=actions.."F"
    datas.myDatas.unflip=datas.myDatas.unflip-1
    datas.myDatas.flip=datas.myDatas.flip+1

  -- if we didn't have anything to do on our pile, let's punish
  -- the fools who doesn't follow the great Balance principle
  else
    previous=datas.myOrder<2 and #datas or datas.myOrder-1
    following=datas.myOrder>=#datas and 1 or datas.myOrder+1

    lossPrev=-datas[previous].flip + 2*datas[previous].unflip
    lossFoll=-datas[following].flip+ 2*datas[following].unflip
    if lossFoll>0 and lossPrev>0
    then
      actions =actions.."N"
    elseif lossFoll>=lossPrev
    then
      actions=actions.."T"
      datas[following].unflip,datas[following].flip=datas[following].flip,datas[following].unflip
    else
      actions=actions.."R"
      datas[previous].unflip,datas[previous].flip=datas[previous].flip,datas[previous].unflip
    end
  end
end
print(actions)

@Thrax Cảm ơn, đã sửa. Quên làm việc với các giá trị 1 chỉ mục cho dòng này ...
Katenkyo

4

Người gác cổng, Python 3

Anh ta cố gắng dọn dẹp mớ hỗn độn mà những người chơi khác tạo ra bằng tất cả những đồng xu này và đặt chúng trở lại bể bơi.

import sys;
def Parse(S):
    T = S.split(';');
    me = eval(T[1]);
    N = len(T)-3;
    A = list(map(lambda x: list(map(lambda y:int(y),T[3+((2*N+x+me)%N)].split('_'))),range(-3,4)));    
    Dic = {}
    for a in A:
        Dic[a[0]] = a[1:];
    Dic[-1] = [me];
    return Dic;
def Recursive(Dic,me,D):
    if D==3: return '';
    V = Dic[me];
    N = max(Dic.keys());
    Next = (me+1)%N;
    Prev = (N+1+me)%N;
    for i in range(3,0,-1):
        if V[2]>=i:
            Dic[me][2] = Dic[me][2]-i;
            return chr((i-1)+ord('A'))+Recursive(Dic,me,D+1);
    if V[1]>0:
        Dic[me][1] = Dic[me][1]-1;
        Dic[me][2] = Dic[me][2]+1;
        return 'U'+Recursive(Dic,me,D+1);
    if Dic[Next][2]>Dic[Prev][2]:
        return 'T'+Recursive(Dic,Next,D+1);
    return 'R'+Recursive(Dic,Prev,D+1);
Dic = Parse(sys.argv[1]);
me = Dic[-1][0];
print(Recursive(Dic,me,0));

Anh ta cố gắng trả lại tất cả các đồng tiền chưa bị đánh cắp của mình, nếu anh ta có một số đồng xu bị lật, anh ta sẽ tháo chúng ra và nếu anh ta thoát khỏi tất cả các đồng tiền của mình, anh ta sẽ lấy của người khác.


3

Kẻ gian, R

args <- strsplit(commandArgs(TRUE),";")[[1]]
state <- as.data.frame(do.call(rbind,strsplit(args[-(1:3)],"_")), stringsAsFactors=FALSE)
colnames(state) <- c("id","pts","flipped","unflipped")
state$flipped <- as.integer(state$flipped)
state$unflipped <- as.integer(state$unflipped)
nb <- nrow(state)
score <- function(place) 2*state$flipped[place]-state$unflipped[place]
my_place <- which(state$id==args[2])
next_1 <- ifelse(my_place!=nb,my_place+1,1)
next_2 <- ifelse(next_1!=nb,next_1+1,1)
next_3 <- ifelse(next_2!=nb,next_2+1,1)
previous_1 <- ifelse(my_place!=1,my_place-1,nb)
previous_2 <- ifelse(previous_1!=1,previous_1-1,nb)
previous_3 <- ifelse(previous_2!=1,previous_2-1,nb)
n <- 3
out <- c()
while(n){
    M <- N <- score(my_place)
    R <- switch(n,"1"=score(next_1),
                "2"=cumsum(c(score(next_1),score(next_2))),
                "3"=cumsum(c(score(next_1),score(next_2),score(next_3))))
    P <- switch(n,"1"=score(previous_1),
                "2"=cumsum(c(score(previous_1),score(previous_2))),
                "3"=cumsum(c(score(previous_1),score(previous_2),score(previous_3))))
    M <- c(M,M+R[-n])
    N <- c(N,N+P[-n])
    if(any(R>M & R>0)){
        action <- c("R","RR","RRR")[which.max(R-M)]
        out <- c(out, action)
        state[,3:4] <- state[c((nchar(action)+1):nb,seq_len(nchar(action))),3:4]
        n <- n-nchar(action)
    }else if(any(P>N & P>0)){
        action <- c("T","TT","TTT")[which.max(P-N)]
        out <- c(out, action)
        state[,3:4] <- state[c((nb+1-seq_len(nchar(action))),1:(nb-seq_len(nchar(action)))),3:4]
        n <- n-nchar(action)
    }else if(n>1 & all(R[1]+M[1]>c(0,P[1]+M[1],R[1]+R[2]))){
        out <- c(out,"RT")
        n <- n-2
    }else if(n>1 & all(P[1]+M[1]>c(0,R[1]+M[1],P[1]+P[2]))){
        out <- c(out,"TR")
        n <- n-2
    }else{
        out <- c(out, switch(n,"1"="A","2"="1F","3"="2FF"))
        n <- 0
        }
    }
cat(paste(out,collapse=""))

Chạy: Rscript Crook.R

Về cơ bản, nó trao đổi tiền của mình với các nước láng giềng chỉ khi việc trao đổi không đồng đều có lợi. Nếu không có trao đổi có lợi là có thể, thì nó trao đổi tiền xu với đống toàn cầu theo cách giữ nguyên tỷ lệ của nó nhưng tạo ra một số điểm.

Chỉnh sửa: Tôi đã thêm một chút chiều sâu cho bot này bằng cách kiểm tra ngăn xếp của người chơi 2 và 3 tiếp theo thay vì chỉ một cái tiếp theo và kiểm tra xem, nói chung, có ích gì khi xoay nhiều lần không.

Chỉnh sửa lần 2 : Theo ý tưởng của @ MartinBüttner, bot hiện thực hiện "RT" hoặc "TR", nếu nó có ích cho anh ta hơn là cho hàng xóm của mình (nếu tôi không làm hỏng việc triển khai nó :)).


Chỉnh sửa của bạn: Nếu anh chàng bên cạnh bạn có một tấn tiền xu lật, thậm chí có thể tốt nhất để RTRbạn nhận được số điểm từ tiền của anh ta hai lần.
Martin Ender

Thật. Mặc dù nó cũng sẽ cho một trong những người hàng xóm ghi điểm một lần. Nhưng tôi sẽ nghĩ về nó thực sự, nó chắc chắn là một ý tưởng để khám phá.
plannapus

@ MartinBüttner Ok cuối cùng tôi đã tìm ra cách để thực hiện nó trong khi vẫn giữ tinh thần của bot. Cám ơn vì sự gợi ý!
plannapus

@thrax Chỉ để bạn không quên cập nhật bot của tôi khi chạy trò chơi tiếp theo, tôi nghĩ tôi nên cảnh báo bạn rằng phiên bản bot của tôi trong repo github của bạn là một phiên bản cũ.
plannapus

3

Jim, Ruby

dựa trên Xoay vòng tham lam của Martin Büttner .

PlayerId = 0
Points = 1
Flipped = 2
Unflipped = 3

round, id, global, *players = ARGV[0].split(';')
round = round.to_i
id = id.to_i
global = global.to_i

if(round == 1)
    print '3FF'
    exit
end

players.map!{ |s| s.split('_').map(&:to_i) }

nplayers = players.size

my_pos = players.find_index { |a| a[PlayerId] == id }

coin_vals = players.map{|a| a[Flipped]*2 - a[Unflipped]}

move = [-1,1].max_by{|s|
    swap_gain = coin_vals.rotate(s)
    scores = (0...nplayers).map{|i|
        swap_gain[i]+players[i][Points]
    }
    scores.delete_at(my_pos)-scores.max
}
if move == 1
    print 'R'
else
    print 'T'
end

print ['1F', 'FF'][rand 2]

sẽ xoay theo cách này hay cách khác, tùy thuộc vào những gì sẽ cho anh ta nhiều điểm nhất so với người chơi khác giỏi nhất. Sau đó, anh ta lật tiền nhanh chóng.


2

TraderBot

Bot này cố gắng xoay bất cứ khi nào nó là điểm chiếm nhiều điểm nhất trong hành động đó. Nếu nó không thể xoay thì hãy cố gắng loại bỏ những đồng tiền chưa được xử lý hoặc mất thêm một vài thứ để thay đổi chúng trong các hành động sau.

import java.util.ArrayList;

nhập java.util.List;

lớp công khai TraderBot {

class Player{
    private int id;
    private int points;
    private int flip;
    private int unflip;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getPoints() {
        return points;
    }
    public void setPoints(int points) {
        this.points = points;
    }
    public int getFlip() {
        return flip;
    }
    public void setFlip(int flip) {
        this.flip = flip;
    }
    public int getUnflip() {
        return unflip;
    }
    public void setUnflip(int unflip) {
        this.unflip = unflip;
    }


}

int round;
int coins;
int otherMaxPoints = 0;
Player myself = new Player();
List<Player> players = new ArrayList<>();

public static void main (String[] s){
    new TraderBot().play(s);
}

private void play(String[] s){
    parse(s[0]);
    System.out.println(action() + action() + action());
}

private int simRotateNext(){
    int flip, unflip;
    int maxP = Integer.MIN_VALUE;
    int myP = 0;
    for (int i = 0; i < players.size(); i++){
        flip = players.get(i).getFlip();
        unflip = players.get(i).getUnflip();
        int next = i + 1 <= players.size() - 1 ? i + 1 : 0;
        int p = 2 * flip - unflip;
        if (p > maxP && players.get(next).getId() != myself.getId()){
            maxP = p;
        } else if (players.get(next).getId() == myself.getId()){
            myP = p;
        }

    }
    return  myP - maxP;
}

private int simRotatePrev(){
    int flip, unflip;
    int maxP = Integer.MIN_VALUE;
    int myP = 0;
    for (int i = players.size() -1; i > 0; i--){
        flip = players.get(i).getFlip();
        unflip = players.get(i).getUnflip();
        int prev = i - 1 >= 0 ? i - 1 : players.size() - 1;
        int p = 2 * flip - unflip;
        if (p > maxP && players.get(prev).getId() != myself.getId()){
            maxP = p;
        } else if (players.get(prev).getId() == myself.getId()){
            myP = p;
        }
    }
    return  myP - maxP;
}

private int rotateNext(){
    int flip, unflip, nflip, nunflip;
    flip = players.get(0).getFlip();
    unflip = players.get(0).getUnflip();
    for (int i = 0; i < players.size(); i++){
        int next = i + 1 <= players.size() - 1 ? i + 1 : 0;
        nflip = players.get(next).getFlip();
        nunflip = players.get(next).getUnflip();
        players.get(next).setFlip(flip);
        players.get(next).setUnflip(unflip);
        players.get(next).setPoints(players.get(next).getPoints() + 2 * flip - unflip);
        flip = nflip;
        unflip = nunflip;
    }
    return myself.getPoints();
}

private int rotatePrev(){
    int flip, unflip,  nflip, nunflip;
    flip = players.get(players.size() -1).getFlip();
    unflip = players.get(players.size() -1).getUnflip();
    for (int i = players.size() -1; i > 0; i--){
        int prev = i - 1 >= 0 ? i - 1 : players.size() - 1;
        nflip = players.get(prev).getFlip();
        nunflip = players.get(prev).getUnflip();
        players.get(prev).setFlip(flip);
        players.get(prev).setUnflip(unflip);
        players.get(prev).setPoints(players.get(prev).getPoints() + 2 * flip - unflip);
        flip = nflip;
        unflip = nunflip;
    }
    return myself.getPoints();
}

private String action() {
    int next = simRotateNext();
    int prev = simRotatePrev();

    if (next > 0 || prev > 0){
        if (next > prev){
            rotateNext();
            return "T";
        } else {
            rotatePrev();
            return "R";
        }
    }

    if (myself.getUnflip() > 3){
        myself.unflip -= 3;
        myself.points += 3;
        return "C";
    }

    if (myself.getUnflip() > 0){
        myself.unflip -= 1;
        myself.points += 2;
        return "F";
    }

    if (myself.getPoints() > otherMaxPoints){
        return "N";
    } else {
        myself.unflip += 3;
        myself.points -= 3;
        return "3";
    }

}

private void parse(String s){
    String[] ps = s.split(";");
    round = Integer.parseInt(ps[0]);
    myself.setId(Integer.parseInt(ps[1]));
    coins = round = Integer.parseInt(ps[2]);
    for (int i = 3; i < ps.length; i++){
        String[] sp2 = ps[i].split("_");
        if (Integer.parseInt(sp2[0]) == myself.getId()){
            myself.setPoints(Integer.parseInt(sp2[1]));
            myself.setFlip(Integer.parseInt(sp2[2]));
            myself.setUnflip(Integer.parseInt(sp2[3]));
            players.add(myself);
        } else {
            Player p = new Player();
            p.setId(Integer.parseInt(sp2[0]));
            p.setPoints(Integer.parseInt(sp2[1]));
            p.setFlip(Integer.parseInt(sp2[2]));
            p.setUnflip(Integer.parseInt(sp2[3]));
            players.add(p);
            if (p.getPoints() > otherMaxPoints){
                otherMaxPoints = p.getPoints();
            }
        }
    }
}
}

Để chạy: Chỉ cần thêm nó vào cùng thư mục với các bot mặc định và sau đó tạo lớp sau

package players;

import controller.Player;

public class TraderBot extends Player {

    @Override
    public String getCmd() {
        return "java TraderBot";
    }   
}

Sau đó thêm lớp đó vào Player[] playersmảng.


2

Xe lăn

Wheeler đã tính toán di chuyển tốt nhất có thể cho nó khi xoay các đồng tiền.

import java.util.ArrayList;
import java.util.List;

public class Wheeler {

String[] actions = {"TTT", "TTR", "TRR", "TRT", "RRR", "RRT", "RTR", "RTT"};
String paramString;

class Player{
    private int id;
    private int points;
    private int flip;
    private int unflip;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getPoints() {
        return points;
    }
    public void setPoints(int points) {
        this.points = points;
    }
    public int getFlip() {
        return flip;
    }
    public void setFlip(int flip) {
        this.flip = flip;
    }
    public int getUnflip() {
        return unflip;
    }
    public void setUnflip(int unflip) {
        this.unflip = unflip;
    }
    @Override
    public String toString() {
        return "Player [id=" + id + ", points=" + points + ", flip=" + flip + ", unflip=" + unflip + "]";
    }




}

int round;
int coins;
int otherMaxPoints = 0;
Player myself = new Player();
List<Player> players = new ArrayList<>();

public static void main (String[] s){
    new Wheeler().play(s);
}

private void play(String[] s){
    paramString = s[0];
    reset();
    System.out.println(action());
}

private int rotateNext(){
    int flip, unflip, nflip, nunflip;
    flip = players.get(0).getFlip();
    unflip = players.get(0).getUnflip();
    for (int i = 0; i < players.size(); i++){
        int next = i + 1 <= players.size() - 1 ? i + 1 : 0;
        nflip = players.get(next).getFlip();
        nunflip = players.get(next).getUnflip();
        players.get(next).setFlip(flip);
        players.get(next).setUnflip(unflip);
        players.get(next).setPoints(players.get(next).getPoints() + 2 * flip - unflip);
        flip = nflip;
        unflip = nunflip;
    }
    return myself.getPoints();
}

private int rotatePrev(){
    int flip, unflip,  nflip, nunflip;
    flip = players.get(players.size() -1).getFlip();
    unflip = players.get(players.size() -1).getUnflip();
    for (int i = players.size() -1; i > 0; i--){
        int prev = i - 1 >= 0 ? i - 1 : players.size() - 1;
        nflip = players.get(prev).getFlip();
        nunflip = players.get(prev).getUnflip();
        players.get(prev).setFlip(flip);
        players.get(prev).setUnflip(unflip);
        players.get(prev).setPoints(players.get(prev).getPoints() + 2 * flip - unflip);
        flip = nflip;
        unflip = nunflip;
    }
    return myself.getPoints();
}

private String action() {
    int maxPoints = myself.getPoints();
    String action = "1F2";
    for (String s : actions){
        int cPoints = 0;
        for (char c : s.toCharArray()){
            if (c == 'T'){
                cPoints += rotateNext();
            } else {
                cPoints += rotatePrev();
            }
        }
        if (cPoints > maxPoints){
            action = s;
        }
        reset();
    }
    return action;      
}


private void reset(){
    players = new ArrayList<>();
    String[] ps = paramString.split(";");
    round = Integer.parseInt(ps[0]);
    myself.setId(Integer.parseInt(ps[1]));
    coins = round = Integer.parseInt(ps[2]);
    for (int i = 3; i < ps.length; i++){
        String[] sp2 = ps[i].split("_");
        if (Integer.parseInt(sp2[0]) == myself.getId()){
            myself.setPoints(Integer.parseInt(sp2[1]));
            myself.setFlip(Integer.parseInt(sp2[2]));
            myself.setUnflip(Integer.parseInt(sp2[3]));
            players.add(myself);
        } else {
            Player p = new Player();
            p.setId(Integer.parseInt(sp2[0]));
            p.setPoints(Integer.parseInt(sp2[1]));
            p.setFlip(Integer.parseInt(sp2[2]));
            p.setUnflip(Integer.parseInt(sp2[3]));
            players.add(p);
            if (p.getPoints() > otherMaxPoints){
                otherMaxPoints = p.getPoints();
            }
        }
    }
}

}

2

Saboteur, Python 2

import random
moves = '3R'
print '33' + ''.join(random.choice(moves))

Sự ngẫu nhiên có nghĩa là nó có thể sẽ không phá hoại rất tốt, nhưng sau đó tôi nghĩ rằng tôi sẽ đợi nó đến 'kết thúc' (còn lại bao nhiêu lượt / xu) và THEN xoay vòng, sau khi nhìn vào những người chơi có thể tiếp cận gần đó để đánh cắp ... thực sự chỉ thực hiện một vòng quay có vẻ rất kém, vì những người khác cũng có thể sử dụng phép quay. Tôi không nghĩ rằng nó sẽ hoạt động tốt ...


Điều này làm nhiều nhất là chạy đống tiền xu. cũng như cho bản thân và những người khác rất nhiều điểm tiêu cực.
MegaTom

@MegaTom Vâng, tôi đã nghĩ rằng đó sẽ là một tác dụng phụ, tôi hơi lo lắng về công thức tính tổng số tiền tôi đoán. Tôi có thể làm cho nó một số ngẫu nhiên. Và trên những điểm tiêu cực, cho người khác điểm tiêu cực chỉ là một cách khác để giành chiến thắng!
Neal

Bạn không cần nhập sys. : P
mèo

2

Thứ hai, Python 3

Chương trình này sẽ trải qua tất cả 3 kết hợp di chuyển có thể và chọn kết hợp tốt thứ hai.

Bởi vì nếu bạn có nước đi hoàn hảo, đó có thể là một cái bẫy.

Chỉnh sửa: loại bỏ đầu vào nhận xét

import sys
from copy import deepcopy
from random import randint
In=str(sys.argv[1])
def V(n,f=10,t=14):
 n=str(n);z=0;s='';d='0123456789';d1='N123ABCXYZRTFU'
 for i in n:z=z*f+d.index(i)
 while z:z,m=divmod(z,t);s=d1[m]+s
 while len(s)<3:s='N'+s
 return s
In=In.split(';')
number=In[0:3]
players=In[3:]
for x in range(0,len(players)):players[x]=players[x].split('_')
for x in players:
 if number[1] in x[0]:self=x
for x in range(0,len(players)):
 for y in range(0,len(players[x])):
  players[x][y]=int(players[x][y])
for x in range(0,len(number)):number[x]=int(number[x])
Pos=list(map(V,range(0,14**3)))
B=[]
C=[]
P1=deepcopy(players)
N1=deepcopy(number)
for x in range(len(Pos)):
    P=True
    y=Pos[x]
    if '1A'in y or '2B'in y or '3C'in y or 'FU'in y or 'A1'in y or 'B2'in y or 'C3'in y or 'UF'in y:
            P=False#stupid check
    if P:#legality check
        z=0
        players=deepcopy(P1)
        number=deepcopy(N1)
        for x in players:
            if str(number[1]) in str(x[0]):self=x
        for w in range(0,3):
            if y[w] in '3':
                if int(number[2])<3:P=False;break
                else:z-=3;self[3]+=3;number[2]-=3
            if y[w] in '2':
                if int(number[2])<2:P=False;break
                else:z-=2;self[3]+=2;number[2]-=2
            if y[w] in '1':
                if int(number[2])<1:P=False;break
                else:z-=1;self[3]+=1;number[2]-=1
            if y[w] in 'A':
                if int(self[3])<1:P=False;break
                else:z+=1;self[3]-=3;number[2]+=3
            if y[w] in 'B':
                if int(self[3])<2:P=False;break
                else:z+=2;self[3]-=2;number[2]+=2
            if y[w] in 'C':
                if int(self[3])<3:P=False;break
                else:z+=3;self[3]-=1;number[2]+=1
            if y[w] in 'X':
                if int(self[3])<1:P=False;break
                else:self[3]-=1
            if y[w] in 'Y':
                if int(self[3])<2:P=False;break
                else:self[3]-=2
            if y[w] in 'Z':
                if int(self[3])<3:P=False;break
                else:self[3]-=3
            if y[w] in 'F':
                if int(self[3])<1:P=False;break
                else:z+=2;self[3]-=1;self[2]+=1
            if y[w] in 'U':
                if int(self[3])<1:P=False;break
                else:z-=2;self[3]+=1;self[2]-=1
            if y[w] in 'R':
                self[2:4]=players[(players.index(self)+1)%len(players)][2:4]
                z+=int(self[3])*-1
                z+=int(self[2])*2
            if y[w] in 'T':
                self[2:4]=players[(players.index(self)-1)%len(players)][2:4]
                z+=int(self[3])*-1
                z+=int(self[2])*2
    if P:
        C.append(z);B.append((z,y))
c=list(set(C))
c.sort()
c=c[::-1][1];D=[]
for x in B:
    if c in x:D.append(x)
print(D[randint(0,len(D)-1)][1])

Chỉnh sửa: Mã đã in một động thái pháp lý ngẫu nhiên. Nó sẽ trở lại kết quả tốt thứ hai.


1

Bot của quỷ

Mặc dù sản lượng của nó chỉ bằng một nửa số quỷ, nhưng kết quả sẽ khá thảm họa. Lấy 9 xu mỗi lượt, cuối cùng nó cạn kiệt đống tiền. Vì bot này không bao giờ lật bất kỳ đồng nào mà nó mất, điều này cực kỳ tệ cho bất kỳ ai khác ngồi cạnh nó khi có một vòng quay (-9 điểm cho mỗi lượt được thực hiện bởi bot này).

print("333")

Chỉ huy: python3 devil.py

Tôi hy vọng sẽ làm cho một số bot thực sự sau này.


@plannapus Rất tiếc! Tôi đã không nhận thấy điều đó. Cảm ơn đã nói với tôi!
frederick

1

Nhớ tôi, Python 3

Chương trình này chứa một lượng dữ liệu sẵn có đáng kể từ một thử nghiệm đối với bot SecondBest cố định.

nên tìm hiểu về cách di chuyển nào là tốt nhất để sử dụng, nhưng nó không sử dụng đầu vào của người chơi khác.

Chỉnh sửa: loại bỏ tính toán điểm không cần thiết

Chỉnh sửa: đầu vào trình phát không ghi

import sys
file=sys.argv[0].split('\\')[::-1][0]
from copy import deepcopy
from random import randint
In=str(sys.argv[1])
def V(n,f=10,t=14):
 n=str(n);z=0;s='';d='0123456789';d1='N123ABCXYZRTFU'
 for i in n:z=z*f+d.index(i)
 while z:z,m=divmod(z,t);s=d1[m]+s
 while len(s)<3:s='N'+s
 return s
In=In.split(';')
number=In[0:3]
players=In[3:]
for x in range(0,len(players)):players[x]=players[x].split('_')
for x in players:
 if number[1] in x[0]:self=x
for x in range(0,len(players)):
 for y in range(0,len(players[x])):
  players[x][y]=int(players[x][y])
for x in range(0,len(number)):number[x]=int(number[x])
Pos=list(map(V,range(0,14**3)))
B=[]
P1=deepcopy(players)
N1=deepcopy(number)
for x in range(len(Pos)):
    P=True
    y=Pos[x]
    if '1A'in y or '2B'in y or '3C'in y or 'FU'in y or 'A1'in y or 'B2'in y or 'C3'in y or 'UF'in y:
            P=False
    if P:
        players=deepcopy(P1)
        number=deepcopy(N1)
        for x in players:
            if str(number[1]) in str(x[0]):self=x
        for w in range(0,3):
            if y[w] in '3':
                if int(number[2])<3:P=False;break
                else:self[3]+=3;number[2]-=3
            if y[w] in '2':
                if int(number[2])<2:P=False;break
                else:self[3]+=2;number[2]-=2
            if y[w] in '1':
                if int(number[2])<1:P=False;break
                else:self[3]+=1;number[2]-=1
            if y[w] in 'A':
                if int(self[3])<1:P=False;break
                else:self[3]-=3;number[2]+=3
            if y[w] in 'B':
                if int(self[3])<2:P=False;break
                else:self[3]-=2;number[2]+=2
            if y[w] in 'C':
                if int(self[3])<3:P=False;break
                else:self[3]-=1;number[2]+=1
            if y[w] in 'X':
                if int(self[3])<1:P=False;break
                else:self[3]-=1
            if y[w] in 'Y':
                if int(self[3])<2:P=False;break
                else:self[3]-=2
            if y[w] in 'Z':
                if int(self[3])<3:P=False;break
                else:self[3]-=3
            if y[w] in 'F':
                if int(self[3])<1:P=False;break
                else:self[3]-=1;self[2]+=1
            if y[w] in 'U':
                if int(self[3])<1:P=False;break
                else:self[3]+=1;self[2]-=1
            if y[w] in 'R':
                self[2:4]=players[(players.index(self)+1)%len(players)][2:4]
            if y[w] in 'T':
                self[2:4]=players[(players.index(self)-1)%len(players)][2:4]
    if P:
        B.append(y)
Pos=list(B)
B=[]
#
C=[['NNN',0],['NN1',-1],['NN2',-2],['NN3',-3],['NNR',-6],['NNT',-1],['N1N',-1],['N11',-2],['N12',-3],['N13',-4],['N1X',-1],['N1R',-7],['N1T',-2],['N1F',1],['N1U',-3],['N2N',-2],['N21',-3],['N22',-4],['N23',-5],['N2A',-1],['N2X',-2],['N2Y',-2],['N2R',-8],['N2T',-3],['N2F',0],['N2U',-4],['N3N',-3],['N31',-4],['N32',-5],['N33',-6],['N3A',-2],['N3B',-1],['N3X',-3],['N3Y',-3],['N3Z',-3],['N3R',-9],['N3T',-4],['N3F',-1],['N3U',-5],['NRN',-6],['NR1',-7],['NR2',-8],['NR3',-9],['NRA',-5],['NRB',-4],['NRC',-3],['NRX',-6],['NRY',-6],['NRZ',-6],['NRR',-12],['NRT',-7],['NRF',-4],['NRU',-8],['NTN',-1],['NT1',-2],['NT2',-3],['NT3',-4],['NTA',0],['NTX',-1],['NTR',-7],['NTT',-2],['NTF',1],['NTU',-3],['1NN',-1],['1N1',-2],['1N2',-3],['1N3',-4],['1NA',0],['1NX',-1],['1NR',-7],['1NT',-2],['1NF',1],['1NU',-3],['11N',-2],['111',-3],['112',-4],['113',-5],['11B',0],['11X',-2],['11Y',-2],['11R',-8],['11T',-3],['11F',0],['11U',-4],['12N',-3],['121',-4],['122',-5],['123',-6],['12A',-2],['12C',0],['12X',-3],['12Y',-3],['12Z',-3],['12R',-9],['12T',-4],['12F',-1],['12U',-5],['13N',-4],['131',-5],['132',-6],['133',-7],['13A',-3],['13B',-2],['13X',-4],['13Y',-4],['13Z',-4],['13R',-10],['13T',-5],['13F',-2],['13U',-6],['1XN',-1],['1X1',-2],['1X2',-3],['1X3',-4],['1XR',-7],['1XT',-2],['1RN',-7],['1R1',-8],['1R2',-9],['1R3',-10],['1RA',-6],['1RB',-5],['1RC',-4],['1RX',-7],['1RY',-7],['1RZ',-7],['1RR',-13],['1RT',-8],['1RF',-5],['1RU',-9],['1TN',-2],['1T1',-3],['1T2',-4],['1T3',-5],['1TA',-1],['1TX',-2],['1TR',-8],['1TT',-3],['1TF',0],['1TU',-4],['1FN',1],['1F1',0],['1F2',-1],['1F3',-2],['1FR',-5],['1FT',0],['1UN',-3],['1U1',-4],['1U2',-5],['1U3',-6],['1UA',-2],['1UB',-1],['1UX',-3],['1UY',-3],['1UR',-9],['1UT',-4],['1UU',-5],['2NN',-2],['2N1',-3],['2N2',-4],['2N3',-5],['2NA',-1],['2NB',0],['2NX',-2],['2NY',-2],['2NR',-8],['2NT',-3],['2NF',0],['2NU',-4],['21N',-3],['211',-4],['212',-5],['213',-6],['21B',-1],['21C',0],['21X',-3],['21Y',-3],['21Z',-3],['21R',-9],['21T',-4],['21F',-1],['21U',-5],['22N',-4],['221',-5],['222',-6],['223',-7],['22A',-3],['22C',-1],['22X',-4],['22Y',-4],['22Z',-4],['22R',-10],['22T',-5],['22F',-2],['22U',-6],['23N',-5],['231',-6],['232',-7],['233',-8],['23A',-4],['23B',-3],['23X',-5],['23Y',-5],['23Z',-5],['23R',-11],['23T',-6],['23F',-3],['23U',-7],['2AN',-1],['2A2',-3],['2A3',-4],['2AR',-7],['2AT',-2],['2XN',-2],['2X1',-3],['2X2',-4],['2X3',-5],['2XA',-1],['2XX',-2],['2XR',-8],['2XT',-3],['2XF',0],['2XU',-4],['2YN',-2],['2Y1',-3],['2Y2',-4],['2Y3',-5],['2YR',-8],['2YT',-3],['2RN',-8],['2R1',-9],['2R2',-10],['2R3',-11],['2RA',-7],['2RB',-6],['2RC',-5],['2RX',-8],['2RY',-8],['2RZ',-8],['2RR',-14],['2RT',-9],['2RF',-6],['2RU',-10],['2TN',-3],['2T1',-4],['2T2',-5],['2T3',-6],['2TA',-2],['2TX',-3],['2TR',-9],['2TT',-4],['2TF',-1],['2TU',-5],['2FN',0],['2F1',-1],['2F2',-2],['2F3',-3],['2FA',1],['2FX',0],['2FR',-6],['2FT',-1],['2FF',2],['2UN',-4],['2U1',-5],['2U2',-6],['2U3',-7],['2UA',-3],['2UB',-2],['2UC',-1],['2UX',-4],['2UY',-4],['2UZ',-4],['2UR',-10],['2UT',-5],['2UU',-6],['3NN',-3],['3N1',-4],['3N2',-5],['3N3',-6],['3NA',-2],['3NB',-1],['3NC',0],['3NX',-3],['3NY',-3],['3NZ',-3],['3NR',-9],['3NT',-4],['3NF',-1],['3NU',-5],['31N',-4],['311',-5],['312',-6],['313',-7],['31B',-2],['31C',-1],['31X',-4],['31Y',-4],['31Z',-4],['31R',-10],['31T',-5],['31F',-2],['31U',-6],['32N',-5],['321',-6],['322',-7],['323',-8],['32A',-4],['32C',-2],['32X',-5],['32Y',-5],['32Z',-5],['32R',-11],['32T',-6],['32F',-3],['32U',-7],['33N',-6],['331',-7],['332',-8],['333',-9],['33A',-5],['33B',-4],['33X',-6],['33Y',-6],['33Z',-6],['33R',-12],['33T',-7],['33F',-4],['33U',-8],['3AN',-2],['3A2',-4],['3A3',-5],['3AR',-8],['3AT',-3],['3BN',-1],['3B1',-2],['3B3',-4],['3BA',0],['3BX',-1],['3BR',-7],['3BT',-2],['3BF',1],['3BU',-3],['3XN',-3],['3X1',-4],['3X2',-5],['3X3',-6],['3XA',-2],['3XB',-1],['3XX',-3],['3XY',-3],['3XR',-9],['3XT',-4],['3XF',-1],['3XU',-5],['3YN',-3],['3Y1',-4],['3Y2',-5],['3Y3',-6],['3YA',-2],['3YX',-3],['3YR',-9],['3YT',-4],['3YF',-1],['3YU',-5],['3ZN',-3],['3Z1',-4],['3Z2',-5],['3Z3',-6],['3ZR',-9],['3ZT',-4],['3RN',-9],['3R1',-10],['3R2',-11],['3R3',-12],['3RA',-8],['3RB',-7],['3RC',-6],['3RX',-9],['3RY',-9],['3RZ',-9],['3RR',-15],['3RT',-10],['3RF',-7],['3RU',-11],['3TN',-4],['3T1',-5],['3T2',-6],['3T3',-7],['3TA',-3],['3TX',-4],['3TR',-10],['3TT',-5],['3TF',-2],['3TU',-6],['3FN',-1],['3F1',-2],['3F2',-3],['3F3',-4],['3FA',0],['3FB',1],['3FX',-1],['3FY',-1],['3FR',-7],['3FT',-2],['3FF',1],['3UN',-5],['3U1',-6],['3U2',-7],['3U3',-8],['3UA',-4],['3UB',-3],['3UC',-2],['3UX',-5],['3UY',-5],['3UZ',-5],['3UR',-11],['3UT',-6],['3UU',-7],['RNN',-6],['RN1',-7],['RN2',-8],['RN3',-9],['RNA',-5],['RNB',-4],['RNC',-3],['RNX',-6],['RNY',-6],['RNZ',-6],['RNR',-12],['RNT',-7],['RNF',-4],['RNU',-8],['R1N',-7],['R11',-8],['R12',-9],['R13',-10],['R1B',-5],['R1C',-4],['R1X',-7],['R1Y',-7],['R1Z',-7],['R1R',-13],['R1T',-8],['R1F',-5],['R1U',-9],['R2N',-8],['R21',-9],['R22',-10],['R23',-11],['R2A',-7],['R2C',-5],['R2X',-8],['R2Y',-8],['R2Z',-8],['R2R',-14],['R2T',-9],['R2F',-6],['R2U',-10],['R3N',-9],['R31',-10],['R32',-11],['R33',-12],['R3A',-8],['R3B',-7],['R3X',-9],['R3Y',-9],['R3Z',-9],['R3R',-15],['R3T',-10],['R3F',-7],['R3U',-11],['RAN',-5],['RA2',-7],['RA3',-8],['RAA',-4],['RAB',-3],['RAC',-2],['RAX',-5],['RAY',-5],['RAZ',-5],['RAR',-11],['RAT',-6],['RAF',-3],['RAU',-7],['RBN',-4],['RB1',-5],['RB3',-7],['RBA',-3],['RBB',-2],['RBC',-1],['RBX',-4],['RBY',-4],['RBZ',-4],['RBR',-10],['RBT',-5],['RBF',-2],['RBU',-6],['RCN',-3],['RC1',-4],['RC2',-5],['RCA',-2],['RCB',-1],['RCC',0],['RCX',-3],['RCY',-3],['RCZ',-3],['RCR',-9],['RCT',-4],['RCF',-1],['RCU',-5],['RXN',-6],['RX1',-7],['RX2',-8],['RX3',-9],['RXA',-5],['RXB',-4],['RXC',-3],['RXX',-6],['RXY',-6],['RXZ',-6],['RXR',-12],['RXT',-7],['RXF',-4],['RXU',-8],['RYN',-6],['RY1',-7],['RY2',-8],['RY3',-9],['RYA',-5],['RYB',-4],['RYC',-3],['RYX',-6],['RYY',-6],['RYZ',-6],['RYR',-12],['RYT',-7],['RYF',-4],['RYU',-8],['RZN',-6],['RZ1',-7],['RZ2',-8],['RZ3',-9],['RZA',-5],['RZB',-4],['RZC',-3],['RZX',-6],['RZY',-6],['RZZ',-6],['RZR',-12],['RZT',-7],['RZF',-4],['RZU',-8],['RRN',-12],['RR1',-13],['RR2',-14],['RR3',-15],['RRA',-11],['RRB',-10],['RRC',-9],['RRX',-12],['RRY',-12],['RRZ',-12],['RRR',-18],['RRT',-13],['RRF',-10],['RRU',-14],['RTN',-7],['RT1',-8],['RT2',-9],['RT3',-10],['RTA',-6],['RTX',-7],['RTR',-13],['RTT',-8],['RTF',-5],['RTU',-9],['RFN',-4],['RF1',-5],['RF2',-6],['RF3',-7],['RFA',-3],['RFB',-2],['RFC',-1],['RFX',-4],['RFY',-4],['RFZ',-4],['RFR',-10],['RFT',-5],['RFF',-2],['RUN',-8],['RU1',-9],['RU2',-10],['RU3',-11],['RUA',-7],['RUB',-6],['RUC',-5],['RUX',-8],['RUY',-8],['RUZ',-8],['RUR',-14],['RUT',-9],['RUU',-10],['TNN',-1],['TN1',-2],['TN2',-3],['TN3',-4],['TNA',0],['TNX',-1],['TNR',-7],['TNT',-2],['TNF',1],['TNU',-3],['T1N',-2],['T11',-3],['T12',-4],['T13',-5],['T1B',0],['T1X',-2],['T1Y',-2],['T1R',-8],['T1T',-3],['T1F',0],['T1U',-4],['T2N',-3],['T21',-4],['T22',-5],['T23',-6],['T2A',-2],['T2C',0],['T2X',-3],['T2Y',-3],['T2Z',-3],['T2R',-9],['T2T',-4],['T2F',-1],['T2U',-5],['T3N',-4],['T31',-5],['T32',-6],['T33',-7],['T3A',-3],['T3B',-2],['T3X',-4],['T3Y',-4],['T3Z',-4],['T3R',-10],['T3T',-5],['T3F',-2],['T3U',-6],['TAN',0],['TA2',-2],['TA3',-3],['TAR',-6],['TAT',-1],['TXN',-1],['TX1',-2],['TX2',-3],['TX3',-4],['TXR',-7],['TXT',-2],['TRN',-7],['TR1',-8],['TR2',-9],['TR3',-10],['TRA',-6],['TRB',-5],['TRC',-4],['TRX',-7],['TRY',-7],['TRZ',-7],['TRR',-13],['TRT',-8],['TRF',-5],['TRU',-9],['TTN',-2],['TT1',-3],['TT2',-4],['TT3',-5],['TTA',-1],['TTX',-2],['TTR',-8],['TTT',-3],['TTF',0],['TTU',-4],['TFN',1],['TF1',0],['TF2',-1],['TF3',-2],['TFR',-5],['TFT',0],['TUN',-3],['TU1',-4],['TU2',-5],['TU3',-6],['TUA',-2],['TUB',-1],['TUX',-3],['TUY',-3],['TUR',-9],['TUT',-4],['TUU',-5]]
#
points=0
#
dpoints=self[1]-points
z=0
for x in range(len(Pos)):
    y=Pos[x]
    z=0
    for x in C:
     if x[0]==y:z=x[1]
    B.append((z,y))
B.sort()
B=B[::-1]
G=open(file,'r')
H=G.read().split('#')[::-1]
G.close()
G=open(file,'w')
H[3]=H[3].replace(H[3][8:-1],str(self[1]))
J=eval(H[4][3:-1])
A=[B[0][1],dpoints]
P=1
for x in range(0,len(J)):
 if J[x][0]==A[0]:J[x][1]+=A[1];P=0
if P:J.append(A)
H[4]='\nC='+str(J)+'\n'
s=''
for x in H[::-1]:s+=x;s+='#'
G.write(s[:-1])
G.close()
print(B[0][1])

Tôi nghĩ rằng bạn có đầu vào được nhận xét trong dòng # 5
Averroes

Nó nên được chữa ngay bây giờ. Cảm ơn đã chỉ ra điều đó.
Magenta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.