2016-09-29 2 views
0

Für ein bestimmtes Puzzle online musste ich (jeden Python verwenden) jeden Kleinbuchstaben, der von drei Großbuchstaben auf beiden Seiten umgeben ist, greifen. So sollten zum Beispiel in 'WExWQPoKLGnnNMOkPPOQ' die Buchstaben ok ausgedruckt werden. Trotz der Suche nach griff nach einer planlos Lösung selbst, eine spezifische Lösung von einem anderen Teilnehmer meiner Aufmerksamkeit: Eine Python-Puzzle-Forloop-Lösung sezieren

import string 
word = "" 
for i in range(len(code) - 8): 
if [c for c in code[i:i+9] if c in string.lowercase] == [code[i], code[i+4], code[i+8]]: 
    word += code[i+4] 

ich mich gefragt, ob jemand diesen Code für mich brechen könnte. Ich habe einige spezifische Fragen, sondern ein Überblick wäre toll zu:

  • warum code[i:i+9] kein TypeError: Can't convert 'int' object to str implicitly produzieren?
  • Was macht string.lowercase in diesem Fall?
  • warum nimmt code[i:i+9] neun Zeichen anstelle von sieben (sechs Großbuchstaben und die Kleinbuchstaben in der Mitte)?
  • warum prüfen, ob code[i+8] ergibt wahr wenn [i+4] (der Kleinbuchstabe, der das Puzzle der Anforderung erfüllt) ist 4 Leerzeichen auf der linken Seite, vor allem da nur drei Zeichen rechts oder links von der 'richtigen' Buchstaben relevant sind?

Das Rätsel selbst sind hier zu finden: http://www.pythonchallenge.com/pc/def/equality.html (den Quellcode prüfen)

+0

wow das ist eine gespenstische Puzzle – thesonyman101

+0

Warum der Ausgang für Ihr Beispiel 'ist OK' statt 'K '? –

+0

Wegen menschlichem Fehler, jetzt behoben! –

Antwort

3

why does code[i:i+9] not produce a TypeError: Can't convert 'int' object to str implicitly?

Warum sollte es? Es ist einfach eine Slice-Notation, i ist ein Int, code ist eine Zeichenfolge.

what does string.lowercase do in this instance?

Es ist eine Konstante, die alle Kleinbuchstaben enthält. (Es existiert nicht mehr in Python 3, wie es locale abhängig ist.)

why does code[i:i+9] grab nine characters instead of seven(six uppercase and the lowercase in the middle)?

Entsprechend die tatsächlichen Beschreibung des Problems muss der Klein Großbuchstaben „mit genau drei umgeben“ sein. So können Sie die 7 nicht nur überprüfen können, müssen Sie die alle 9.

why bother checking if code[i+8] evaluates to true if [i+4](the lowercase letter that satisfies the requirement's puzzle) is 4 spaces to the left, especially since only three characters to the right or left of the 'correct' letter are relevant?

Ebenso ist es nicht nur die drei Zeichen, die relevant sind, ist es die 4. Die vierte braucht, ist ein Klein zu sein.

Was dieser Code tut es, dass es das 9-Buchstaben-Slice filtert, um nur den Kleinbuchstaben zu behalten, und prüft, ob das genau der 1., 5. und letzte Buchstabe ist.

+0

@StefanPochmann behoben. – njzk2

+0

Ah, ich sehe jetzt, warum du neun brauchst, ich habe meine Lösung angeguckt und fühle mich schuldig, dass ich die ganze Zeit "Import re" habe. ** GENAU ** könnte nicht mutig genug für mich sein, haha. warum dann erzeugt mein Code einen Fehler type 'kann nicht' str 'und' int 'Objekte in Zeile 4 verketten: –

+0

http://pastebin.com/dSsrxNjL –

1

Bei jeder Iteration extrahiert code[i:i+9] eine Folge von 9 aufeinanderfolgenden Buchstaben in der Zeichenfolge code. Zum Beispiel das erste Mal WExWQPoKL. Die nächste Iteration ergibt ExWQPoKLG.

Bei jeder Iteration sollten die Positionen 1,2,3 und 5,6,7 aus diesen 9 Buchstaben Großbuchstaben sein und daher nicht auf dem Ergebnis [c for c in code[i:i+9] if c in string.lowercase] erscheinen. Nur Positionen 0,4 und 8 (die Positionen in Python erinnern an 0). Wenn das der Fall ist, bedeutet das, dass das Zeichen an Position 4 (Mitte) von 3 Großbuchstaben links (1,2,3) und rechts (5,6,7) umgeben ist.

Das bedeutet, wenn die Zeichenfolge code "ABCdEFG" ist, wird der Buchstabe "d" nicht von dem von Ihnen geposteten Code zurückgegeben.Ich würde es ändern:

import string 
code ="ABCdEFGhIJK" 
word = [] 
for i in range(len(code) - 6): 
    if [c for c in code[i:i+7] if c in string.lowercase] == [code[i+3]]: 
    word += code[i+3] 

print word 
print code 

Diese Drucke (python2)

['d', 'h'] 
ABCdEFGhIJK 
Verwandte Themen