two squares - Fehler unklar

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

two squares - Fehler unklar

Beitragvon Craven » Sonntag 18. November 2007, 02:57

Hi,

Ich komm grad aus unerfindlichen Gründen an dem Script nicht weiter, da mich ein Fehler daran hindert, den ich grad nicht nachvollziehen kann ... Die Uhrzeit kann auch ein Faktor sein. :wink:

Code: Alles auswählen

def twosquares():
    t = raw_input()
    numbers = []
    for a in range(0, t):
        numbers.append(int(raw_input()))
    for a in range(0, t):
        z = int(sqrt(numbers[a])
        if type(numbers[a] - (z ** 2.0)) == type(1.0):
            print("No")
        elif ((z ** 2) + (numbers[a] - (z ** 2))) == numbers[a]:
            print("Yes")


Das Script dürfte selbsterklärend sein. Hier der Fehler:
Traceback (most recent call last):
File "<string>", line 1, in <string>
invalid syntax: <string>, line 1003, pos 68


... also in der Zeile:

Code: Alles auswählen

        if type(numbers[a] - (z ** 2.0)) == type(1.0):


Weiß wer, was den Fehler auslöst, und noch wichtiger, wie ich ihn beheben kann? Die Frage ist bei dem Script eigentlich rhetorisch ... :roll:

Gruß, Phillip
Zuletzt geändert von Craven am Sonntag 18. November 2007, 03:21, insgesamt 1-mal geändert.

Code: Alles auswählen

q = 'q = %s; print q %% repr(q)'; print q % repr(q)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Sonntag 18. November 2007, 03:10

Auch wenn mir die Codeauszug einige Fragen aufwirft, weiß ich trotzdem wo dein Problem liegt:

Code: Alles auswählen

type(float(numbers[a]) - (float(z) ** 2.0))


Schau nochmal genau... Du versucht von einem Type etwas abzuziehen. Also eher:

Code: Alles auswählen

type(float(numbers[a] - (float(z) ** 2.0)))


Wobei ich nich den blassesten Schimmer einer Ahnung habe, was das bewerkstelligen soll. Du könntest auch einfach == float schreiben, anstatt type(1.0) oder... isinstance(foobar, float) O_o Allgemein ... print in einer Funktion?.... Ach, ich hab keine Ahnung. Kenn ja das Skript nicht.

Außerdem wird der type _IMMER_ float sein, du sagst es ja direkt davor oO' Du müsstest schauen ob nachkommastellen vorhanden sind...

//Edit:

Wieso ist oben anderer Code als unten oO'? Ich bin vollkommen verwirrt. Im oberen müsste es funktionieren, im unteren auf keinen Fall. Aber das ändert nichts daran, das's immer Float ist, also die erste Bedingung immer erfüllt wird.
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Beitragvon Craven » Sonntag 18. November 2007, 03:23

So, jetzt ist es mir aufgefallen ... und nachdem ich den Editor zum Teufel gejagt hab, post ichs:

Code: Alles auswählen

def twosquares():
    t = raw_input()
    numbers = []
    for a in range(0, t):
        numbers.append(int(raw_input()))
    for a in range(0, t):
        z = int(sqrt(numbers[a])) # Die gottverdammte Klammer ...
        if type(numbers[a] - (z ** 2)) == type(1.0):
            print("No")
        elif ((z ** 2) + (numbers[a] - (z ** 2))) == numbers[a]:
            print("Yes")


Dass der Code oben und unten verschieden war, lag daran, dass ich in der Zwischenzeit noch herumprobiert und die Zeile kopiert hatte ...

Edit: Mir fällt grade auf, nachdem ich es jetzt endlich ausführen kann, dass es immer ein int ist. Halb vier ist doch zu spät. :roll:
Zuletzt geändert von Craven am Sonntag 18. November 2007, 03:27, insgesamt 1-mal geändert.

Code: Alles auswählen

q = 'q = %s; print q %% repr(q)'; print q % repr(q)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Sonntag 18. November 2007, 03:25

Gut, das mit'r Klammer erscheint mir noch logischer, manchmal sieht man eben den Wald vor lauter Bäumen nicht. Aber trotzdem wird das Ding defintiv immer Float sein.

//Edit: Ach, jetzt auch nich mehr. Bin so verwirrt. 3 verschiedene Codes in wenigen Minuten, zwischen Antwort und Frage. *seufz..

Aber du kannst trotzdem

Code: Alles auswählen

type(numbers[a] - (z ** 2)) == float:


schreiben, dass is'n bissel offensichtlicher.

//Edit2: oder...

Code: Alles auswählen

if isinstance(numbers[a] - (z ** 2), float):
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

Beitragvon Craven » Sonntag 18. November 2007, 03:33

Code: Alles auswählen

        if type(sqrt(numbers[a] - (z ** 2))) == type(1.0):
            print("No")

Auf das wollte ich raus. :roll:

Thx @ BlackVivi, ohne ihn wäre das nicht möglich gewesen. :P

Code: Alles auswählen

q = 'q = %s; print q %% repr(q)'; print q % repr(q)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 18. November 2007, 11:33

Oft hilft es der Übersichtlichkeit, wenn man komplizierte Bedingungen in einfachere Teile aufspaltet.

Hint: `print`ist ein Statement
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Sonntag 18. November 2007, 14:16

Das bleibt trotzdem sehr wirrer Code. Was soll das denn bewirken? Das kann man mit Sicherheit einfacher ausdrücken. Ausserdem kann man direkt über die Liste iterieren statt einen Index zu benutzen. Und wieso steckt das in einer Datei mit mehr als 1000 Zeilen!? Fragen über Fragen…

Edit: Mal so geraten was das Ganze soll:

Code: Alles auswählen

def two_squares():
    numbers = [int(raw_input()) for __ in xrange(int(raw_input()))]
    for number in numbers:
        root = sqrt(number)
        print 'Yes' if root == int(root) and number > 1 else 'No'

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]