2017-01-13 2 views
-3

Я программировать эту puzzle и решить ее (я использую 100 монет вместо 26), и в настоящее время все, что я есть:Python: использовать элемент в списке в качестве аргументов функции

def flip(): 
    if (coin == 0): 
     coin = 1 
    if (coin == 1): 
     coin = 0 

def move(): 
    table_one.remove(coin) 
    table_two.append(coin) 

def CoinPuzzle(): 
    table_one = [[1]*20 + [0]*80] 
    table_two = [] 
    #Move 20 coins from table_one to table_two 
    #Flip all 20 coins in table_two 
    #Both tables should have an equal number of 1s 

У меня есть трудно связать отдельные объекты монет с элементами в списке, чтобы я мог выполнять флип и перемещать функции. Я новичок в Python, может ли кто-нибудь помочь мне, как это сделать?

NEW EDIT: Как я должен изменить код, если у меня есть вход, как это:

L=[0]*100 
for i in random.sample(range(100),20): 
    L[i]=1 
[L1,L2]=tables(L) 
+5

Функции 'flip' и' move' требуют параметров и возвращают значения. Вы можете больше узнать о дизайне функций, прежде чем пытаться решить эту проблему. – DyZ

ответ

3

Вот небольшая реализация Python:

import random 
heads_count = 20 
total_coins = 100 

table_one = [True] * heads_count + [False] * (total_coins-heads_count) 
table_two = [] 

def flip(table, coin): 
    table[coin] = not table[coin] 

def move_random(): 
    coin = random.randint(0, len(table_one)-1) 
    table_two.append(table_one[coin]) 
    del table_one[coin] 

for i in range(heads_count): 
    move_random() 

for i in range(heads_count): 
    flip(table_two, i) 

print(sum(table_one)) 
print(sum(table_two)) 
+1

'len ([c для c в table_one, если c])' is 'sum (table_one)'. – DyZ

+0

Удивительный, я не знал, что вы могли бы суммировать bools. Благодаря... –

2

Вот альтернатива версии Стивена. Чтобы упростить чтение, я буду использовать номера из оригинальной головоломки.

Мы используем функцию shuffle, чтобы рандомизировать порядок монет в table_one в одну стадию, а затем использовать нарезку для перемещения heads_count монеты из table_one к table_two. Для того, чтобы перевернуть монеты, мы используем тот факт, что 1 - 0 = 1 и 1 - 1 = 0.

from random import seed, shuffle 

# seed the randomizer so we get repeatable results 
seed(42) 

total_coins = 26 
heads_count = 10 

# Put all the coins in table_one and randomize their order 
table_one = [1] * heads_count + [0] * (total_coins - heads_count) 
shuffle(table_one) 

print('Initial') 
print('Table one:', table_one, sum(table_one), len(table_one)) 

# move heads_count coins to table_two 
table_one, table_two = table_one[heads_count:], table_one[:heads_count] 

#flip all the coins in table_two 
table_two = [1 - coin for coin in table_two] 

print('Final') 
print('Table one:', table_one, sum(table_one), len(table_one)) 
print('Table two:', table_two, sum(table_two), len(table_two)) 

выход

Initial 
Table one: [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1] 10 26 
Final 
Table one: [1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1] 8 16 
Table two: [1, 1, 1, 0, 0, 1, 1, 1, 1, 1] 8 10 

Мы могли бы даже объединить два последних шага в одну заявление:

table_one, table_two = table_one[heads_count:], [1 - coin for coin in table_one[:heads_count]] 
Смежные вопросы