2012-11-20 18 views
6

Mi è stata assegnata un'attività per la creazione di un codice. Il compito è la seguente:eliminazione di ogni ennesimo elemento da un elenco in python 2.7

You are the captain of a sailing vessel and you and your crew have been captured by pirates. The pirate captain has all of you standing in a circle on the deck of his ship trying to decide in which order you should walk the plank. Eventually he decides on the following method:

(a) The pirate captain asks you to pick a number N.

(b) The first person to walk the plank will be the Nth person (starting from you).

(c) The captain will then continue around the circle forcing every Nth person to walk the plank.

(d) Once there is only one person left, that person will be given freedom.

For example: The crew consists of: Andrew, Brenda, Craig, Deidre, Edward, Felicity, Greg and Harriet. Andrew selects N=2. The crew will walk the plank in the order: Brenda, Deidre, Felicity, Harriet, Craig, Greg, Edward. Andrew will be given freedom.

Il codice che ho finora è:

def survivor(names, step): 
    names = ["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"] 
    Next = step - 1 
    names.pop(Next) 
    print names 

Questo eliminerà la prima persona ennesima dalla lista ma non sono sicuro di come scorrere la lista per continuare a rimuovere l'ennesima persona.

Ne ho bisogno quindi presumo step = 3, quindi ho bisogno di rimuovere il craig e poi contare da craig in poi e rimuovere il terzo elemento successivo che è felicità e così via fino a quando rimane una sola persona.

Come posso fare questo?

+0

qualcuno mi può aiutare ????????/ – user1839493

+0

Quindi la persona che fa una scelta è sempre il primo della lista? –

+0

ho usato il mio codice per la prima parte che è: Next = step - 1 while len (nomi)> 1: names.pop (Next) Next = Next + step Next = (Next - 1)% len (nomi) i nomi di stampa restituiscono nomi [0] che funzionano per restituire i sopravvissuti, ma quando provo a implementare la seconda parte suggerisco anche che non sembra funzionare \t ho provato a usare questo: asserire il nome nei nomi per il passaggio nel sopravvissuto (nomi, passo): se sopravvissuto == nome: ma non funziona dice UnboundLocalError: variabile locale 'step' a cui si fa riferimento prima del compito return step – user1839493

risposta

6

Questo sembra funzionare:

from collections import deque 
def survivor(names, step):  
    circle = deque(names) 
    while len(circle) > 1: 
     circle.rotate(1-step) 
     print circle.popleft() 
    return circle[0] 

Esso stampa i nomi delle vittime dei pirati e restituisce il nome del sopravvissuto:

In [17]: crew = ["Andrew", "Brenda", "Craig", "Deidre", 
    ....: "Edward", "Felicity", "Greg", "Harriet"] 

In [18]: survivor(crew, 2) 
Brenda 
Deidre 
Felicity 
Harriet 
Craig 
Greg 
Edward 
Out[18]: 'Andrew' 

In [19]: survivor(crew, 3) 
Craig 
Felicity 
Andrew 
Edward 
Brenda 
Harriet 
Deidre 
Out[19]: 'Greg' 
+0

Grazie a Lev, funziona perfettamente. Non sai quanto apprezzo questo, sono stato bloccato su questo per anni. GRAZIE – user1839493

+0

@ user1839493 Questo sarà di aiuto se capisci come funziona invece di consegnarlo semplicemente all'insegnante (scusa se ho indovinato). Inoltre, puoi [contrassegnare la risposta come accettata] (http://meta.stackexchange.com/a/5235/181223) se risolvesse il tuo problema. –

+0

puoi quindi spiegarmi la parte del deque, per favore? – user1839493

1

Il seguente codice dovrebbe fare tutto ciò che hai chiesto, compreso implementando la funzione safeN:

import collections 
import itertools 

def walk_plank(names, N): 
    "Walk everyone down the plank." 
    circle = collections.deque(names) 
    while circle: 
     circle.rotate(-N) 
     yield circle.pop() 

def save_last(names, N): 
    "Save the last person from walking the plank." 
    for name in walk_plank(names, N): 
     pass 
    return name 

def safeN(names, name): 
    "Find the best N to save someone from walking the plank." 
    assert name in names, 'Name must be in names!' 
    for N in itertools.count(1): 
     if save_last(names, N) == name: 
      return N 

Modifica: Ecco alcuni esempi di utilizzo del codice riportato sopra mentre si lavora con IDLE in Windows.

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> import collections, itertools 
>>> def walk_plank(names, N): 
     "Walk everyone down the plank." 
     circle = collections.deque(names) 
     while circle: 
      circle.rotate(-N) 
      yield circle.pop() 

>>> def save_last(names, N): 
     "Save the last person from walking the plank." 
     for name in walk_plank(names, N): 
      pass 
     return name 

>>> def safeN(names, name): 
     "Find the best N to save someone from walking the plank." 
     assert name in names, 'Name must be in names!' 
     for N in itertools.count(1): 
      if save_last(names, N) == name: 
       return N 

>>> names = 'Andrew Brenda Craig Deidre Edward Felicity Greg Harriet'.split() 
>>> tuple(walk_plank(names, 2)) 
('Brenda', 'Deidre', 'Felicity', 'Harriet', 'Craig', 'Greg', 'Edward', 'Andrew') 
>>> save_last(names, 2) 
'Andrew' 
>>> safeN(names, 'Andrew') 
2 
>>> safeN(names, 'Brenda') 
19 
>>> save_last(names, 19) 
'Brenda' 
>>> tuple(walk_plank(names, 19)) 
('Craig', 'Harriet', 'Andrew', 'Felicity', 'Deidre', 'Edward', 'Greg', 'Brenda') 
>>> 
+0

Grazie per il vostro aiuto Noctis Skytower, ora posso implementare la seconda parte del task – user1839493

+0

Ho usato il mio codice per la prima parte che è: Avanti = passo - 1 mentre len (nomi)> 1: nomi .pop (Next) Next = Avanti + passo successiva = (Next - 1)% len (nomi) nomi di stampa nomi di ritorno [0] che funziona per tornare sopravvissuto, ma quando provo ad attuare la seconda parte suggeriti non sembra funzionare – user1839493

+0

ho provato a usare questo: asserire il nome nei nomi per step in survivor (nomi, passo): se sopravvissuto == nome: ma non funziona dice UnboundLocalError: variabile locale 'step' referenziata prima dell'assegnazione fase di ritorno – user1839493

Problemi correlati