2012-11-20 9 views
6

Bir kod oluşturmak için bir görev verilmiş. olduğupython 2.7'deki bir listeden her elemanın silinmesi

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.

i şimdiye kadar var kodu:: Görev aşağıdaki gibidir Bu listeden ilk n'inci kişiyi kaldıracak

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

ama emin değilim nasıl listesinde döngü için kişi çıkarmaya devam etmek.

İhtiyacım olan adım 3'ü kabul etmem gerekiyor, o zaman craig'i gidermek için ihtiyacım var ve daha sonra craig'den itibaren sayın ve felsefi olan bir sonraki 3. elementi ve bir kişi kalmayıncaya kadar çıkarın.

Bunu nasıl yapabilirim?

+0

kimse bana yardımcı olabilir ????????/ – user1839493

+0

Yani bir seçim yapan kişi her zaman listedeki ilk mi? –

+0

İlk bölüm için kendi kodumu kullandım: sonraki = adım - 1, len (isimler)> 1: names.pop (Next) Next = Next + step Next = (Next - 1)% len (names) baskı isimleri geri dönmek için çalışır [0] isimleri geri dönmek için çalışır ama ben önerdim ikinci bölümü uygulamak çalıştığınızda aswell \t bunu kullanmayı denedim: hayatta kalan adım için isimlerde isim (isim, adım)): hayatta kalmak == isim: ama işe yaramazsa UnboundLocalError diyor: atama geri dönüş adımı – user1839493

cevap

6

Bu iş gibi görünüyor:

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] 

O korsan kurbanlarının isimlerini yazdırır ve kurtulan adını verir:

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

önce başvurulan yerel değişken 'adım' Teşekkürler Lev, bu mükemmel çalışır. Bunu ne kadar takdir ettiğimi bilmiyorsun, bunun için uzun zamandır takıldım. TEŞEKKÜR EDERİZ – user1839493

+0

@ user1839493 Bu, sadece nasıl öğrettiğini öğrenmek yerine nasıl çalıştığını anlamanız durumunda yardımcı olacaktır (yanlış tahmin edersem özür dilerim). Ayrıca, sorunu çözdüyseniz [cevabı kabul edildi olarak işaretleyebilirsiniz] (http://meta.stackexchange.com/a/5235/181223). –

+0

Daha sonra deque kısmını bana açıklayabilir misiniz lütfen? – user1839493

1

Aşağıdaki kod istedi her şeyi yapmalıyız, uygulanması da dahil olmak üzere safeN fonksiyonu:

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 

Düzenleme: Aşağıda, Windows'da IDLE ile çalışırken, yukarıdaki kodların bazı örneklerinin kullanımı gösterilmektedir.

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

Yardımınız için teşekkürler. Noctis Skytower, şimdi – user1839493

+0

görevinin ikinci bölümünü uygulayabiliyorum. İlk bölüm için kendi kodumu kullandım: Sonraki = adım - 1 , len (isimler)> 1: isimleri .pop (Önceki) Sonraki = Sonraki + adım sonraki = (Önceki - 1) i uygulamak için çalışırken% len (isim) baskı adları dönüş adları [0] kurtulan dönmek için çalışır ama ikinci bölümü önerilen aswell – user1839493

+0

çalışmak için görünmüyordu bu kullanmayı denedim: assert isim için isminde assert adı (isimler, adım): sağ kalan ise == adı: ancak işe yaramadı diyor UnboundLocalError: atama – user1839493

İlgili konular