Seite 2 von 3

Re: zahl die auf 5 endet überspringe

Verfasst: Donnerstag 5. Januar 2012, 16:38
von snafu
Der problembär möchte offenbar nicht wahrhaben, dass es meist bessere/anerkanntere Antworten gibt als die seinigen, da diese ein Problem oft weniger umständlich lösen, aber zum Teil auch mal ein bißchen mathematischen Sachverstand erfordern. Aus diesem Umstand heraus konstruiert er sich leider mehr oder weniger eine Art Verschwörung des Forums gegen ihn - so scheint es zumindest. Hierbei wird problembär auch nicht müde, bei jeder sich bietenden Gelegenheit insbesondere Anfänger vor den besagten Forumskätzern zu warnen, die alle immer irgendwas gegen seinen Programmierstil haben und ihn alle nur ärgern wollen. :twisted:

Re: zahl die auf 5 endet überspringe

Verfasst: Donnerstag 5. Januar 2012, 16:49
von deets
Ganz besonders gelungen ist auch immer seine Argumentationslinie gegen "pythonisches" programmieren: wenn es der Interpreter schluckt, dann ist es auch richtig! Punkt!

Ich habe mir darum mal erlaubt, ihm seine ganz persoenliche sortier-Funktion zu widmen, die ein bisschen beschraenkt ist (um ein anderes Wort das mit besch... anfaengt zu vermeiden)

Code: Alles auswählen


import tempfile, os, random, shutil


def problembaer_sort(l):
    d = tempfile.mkdtemp()
    for entry in l:
        with open(os.path.join(d, str(entry)), "w") as outf:
            pass
    res = [int(h) for h in os.listdir(d)]
    shutil.rmtree(d)
    return res


l = range(10)
random.shuffle(l)
print l

print problembaer_sort(l)
Man sehe & staune - es funktioniert! Ob er das jetzt wohl auch immer verwenden wird?!

Re: zahl die auf 5 endet überspringe

Verfasst: Freitag 6. Januar 2012, 02:08
von Leonidas
Also ich habe ja erwartet, dass man die Zahl in einen String in Binär umwandelt und dann auf "101$" matcht.... :twisted:

Re: zahl die auf 5 endet überspringe

Verfasst: Freitag 6. Januar 2012, 08:47
von /me
deets hat geschrieben:Man sehe & staune - es funktioniert!
Da würde ich doch noch Raymond Hettingers wunderbares sleep_sort vorschlagen das allerdings auf Integer-Werte beschränkt ist.

Code: Alles auswählen

from threading import Thread
import time

def worker(n, emit):
    time.sleep(n)
    emit(n)
    print(n)


def sleep_sort(s):
    result = []
    emit = result.append
    threads = [Thread(target=worker, args=(x, emit)) for x in s]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    return result

if __name__ == '__main__':
    import random

    s = list(range(10))
    random.shuffle(s)
    print('Shuffled:', s)
    print('Sorted:', sleep_sort(s))

Re: zahl die auf 5 endet überspringe

Verfasst: Freitag 6. Januar 2012, 12:25
von Kebap
Ich möchte hier nicht zu sehr auf dem problembär herumhacken, den ich gerade zum ersten Mal bemerke. Tatsächlich kann ich seine ursprüngliche Motivation auch nachvollziehen und gutheißen: Manchmal sind Antworten und Code-Vorschläge so weit von dem des Threadstarters entfernt, dass man befürchten kann, dass der womöglich nichts damit anfangen könnte, und irgendwo alleine verzweifelt. Aber gut: Das ist in jedem Fall unterschiedlich, und die meisten melden sich so oder so nicht zurück, egal ob man ihnen geholfen oder sie überfordert hat. Mein Vorschlag: Einfach antworten, dass man nix verstanden hat, dann wird doch auch gern detailierter erklärt. So, genug Trolle gefüttert für heute, hoffentlich war es nahrhaft und hilft durch den kommenden, langen Winter.

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 03:13
von pixewakb
derdon hat geschrieben:/me: Man kann auch einfach die Bedingung umkehren und sich so das continue-Statement sparen:

Code: Alles auswählen

>>> for i in xrange(1, 21, 2):
...     if i % 5 and i % 10:
...         print i
... 
1
3
7
9
11
13
17
19
Kann mir mal jemand die obige Code-Zeile erklären:

Code: Alles auswählen

if i % 5 and i % 10
Die Konstruktion raffe ich nicht. Statt xrange muss es range heißen?

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 04:44
von Leonidas
pixewakb hat geschrieben:Kann mir mal jemand die obige Code-Zeile erklären:

Code: Alles auswählen

if i % 5 and i % 10
"Bedingung gilt wenn Zahl weder durch 5 noch durch 10 teilbar". Was gemacht wird ist die Modulo-Operation, die den Ganzzahligen Restwert einer Division zurückgibt. 6 % 5 wäre 1, 5 % 5 wäre 0. Also wenn bei Modulo etwas anderes als Null rauskommt, dann heißt es dass die Zahl teilbar ist. Und es wird eben sowohl Teilbarkeit durch 5 als auch durch 10 geprüft. Wenn beide Zahlen != 0 sind (, ist das Ergebnis != 0, und damit "falsch".
pixewakb hat geschrieben:Die Konstruktion raffe ich nicht. Statt xrange muss es range heißen?
Nein, ``xrange`` stimmt so. ``range`` gibt eine Liste zurück, aber um über die Zahlen zu iterieren brauchst du die gesamte Liste nicht, es reicht ein iterierbares Objekt, und ein solches gibt ``xrange`` zurück.

Vergleiche im der Python-Interpreter was rauskommt wenn du ``range(10)`` und ``xrange(10)`` eingibst.

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 09:40
von /me
pixewakb hat geschrieben:Kann mir mal jemand die obige Code-Zeile erklären:

Code: Alles auswählen

if i % 5 and i % 10
Leonidas hat sie erklärt, aber man sollte noch darauf hinweisen, dass die Bedingung natürlich nicht auf die Anforderung zutrifft und falsch ist. Das ist keine Umkehrung der von mir ursprünglich vorgeschlagenen Logik mit dem continue-Statement.

Im Prinzip funktioniert das nur, weil durch das xrange(1, 21, 2) ohnehin nur ungerade Zahlen genommen werden. Lass im xrange die 2 wegfallen, so dass der Defaultwert von 1 für den Step angenommen wird und du siehst den Algorithmus kläglich an der 10 scheitern.

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 10:39
von snafu
Leonidas hat geschrieben:Vergleiche im der Python-Interpreter was rauskommt wenn du ``range(10)`` und ``xrange(10)`` eingibst.

Code: Alles auswählen

>>> range(10)
range(0, 10)
>>> xrange(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined
:o :o :o

Im Ernst: Den Umstand, dass Py3k genutzt werden könnte, sollte man inzwischen gerade bei Anfängern immer bedenken. Damit meine ich natürlich nicht, dass die Anfänger so doof sind und alle Python 3.x nutzen, sondern dass sie die Situationen der beiden parallel existierenden Versionszweige evtl nicht kennen.

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 11:25
von Leonidas
Also der Threadstarter hat zumindest Python 2 verwendet, darauf habe ich mich dann auch bezogen.

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 18:31
von sma
Leonidas hat geschrieben:Also ich habe ja erwartet, dass man die Zahl in einen String in Binär umwandelt und dann auf "101$" matcht.... :twisted:
Schreib ich, schreib ich's nicht...? Ach, verdammt: Das funktioniert natürlich nicht. Ich sage nur bin(25).

Stefan

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 19:26
von /me
sma hat geschrieben:
Leonidas hat geschrieben:Also ich habe ja erwartet, dass man die Zahl in einen String in Binär umwandelt und dann auf "101$" matcht.... :twisted:
Schreib ich, schreib ich's nicht...? Ach, verdammt: Das funktioniert natürlich nicht. Ich sage nur bin(25).
Dann muss man doch einen einfacheren Ansatz wählen, nämlich eine Primfaktorzerlegung. Die Primfaktoren sammelt man in einer Liste, sortiert sie aufsteigend und wenn das dritte Element 5 ist, dann ist man schon fast fertig.

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 19:31
von Dobi
auf ein Canvas malen, letzte Ziffer ausschneiden und in ein neuronales Netz werfen, das auf Nullen und Fünfen trainiert ist ;)

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 19:55
von bb1898
/me hat geschrieben: Dann muss man doch einen einfacheren Ansatz wählen, nämlich eine Primfaktorzerlegung. Die Primfaktoren sammelt man in einer Liste, sortiert sie aufsteigend und wenn das dritte Element 5 ist, dann ist man schon fast fertig.
Wenn das dritte Element 5 ist, endet die Zahl auf 0. Und wenn gleich das erste Element 5 ist? Immer vorausgesetzt, Du sammelst die _verschiedenen_ Primfaktoren in einer Liste, sonst wird's entweder unübersichtlich oder langweilig.

Re: zahl die auf 5 endet überspringe

Verfasst: Samstag 7. Januar 2012, 23:30
von sma
/me hat geschrieben:
sma hat geschrieben:
Leonidas hat geschrieben:Also ich habe ja erwartet, dass man die Zahl in einen String in Binär umwandelt und dann auf "101$" matcht.... :twisted:
Schreib ich, schreib ich's nicht...? Ach, verdammt: Das funktioniert natürlich nicht. Ich sage nur bin(25).
Dann muss man doch einen einfacheren Ansatz wählen, nämlich eine Primfaktorzerlegung. Die Primfaktoren sammelt man in einer Liste, sortiert sie aufsteigend und wenn das dritte Element 5 ist, dann ist man schon fast fertig.
15 zerlegt sich in 3 * 5 und einen IndexError...?

Oder 135, was 3 * 3 * 3 * 5 ist und wo da an dritter Stelle eine 3 steht. Du willst ja in einer *Liste* sammeln, keinem Set. :)

Stefan

Re: zahl die auf 5 endet überspringe

Verfasst: Sonntag 8. Januar 2012, 05:17
von Leonidas
Geben wir auf, das Problem ist zu schwer für uns.

Re: zahl die auf 5 endet überspringe

Verfasst: Sonntag 8. Januar 2012, 11:49
von BlackJack
Also mein C64 schafft das. In Forth:

Code: Alles auswählen

\ Skip numbers ending in 5            bj

: divisible? ( n m -- t/f )
  mod 0= ;

: main ( -- )
  20 1 do
    i 5 divisible? not
    i 10 divisible?
    or if i . then
  loop ;

Re: zahl die auf 5 endet überspringe

Verfasst: Sonntag 8. Januar 2012, 13:07
von Hyperion
Jetzt wollte ich mal schnell in COMMODORE BASIC V2 punkten und nun klappt das nicht:

Code: Alles auswählen

10 for i=1 to 20:if right$(str$(i),1)<>"5" then print i:next
@BlackJack: Kannst Du mir erklären, wieso das nach den Zahlen 1-4 abbricht? Klappen String-Vergleiche in BASIC nicht?

Re: zahl die auf 5 endet überspringe

Verfasst: Sonntag 8. Januar 2012, 14:16
von BlackJack
@Hyperion: Der Zeichenkettenvergleich ist nicht das Problem, sondern dass sich das ``THEN`` auf den Rest der Zeile bezieht. Das ``NEXT`` wird also bei 5 nicht mehr ausgeführt und es geht in der nächsten Zeile weiter. Die gibt es nicht → Programmende.

Re: zahl die auf 5 endet überspringe

Verfasst: Sonntag 8. Januar 2012, 14:25
von Hyperion
BlackJack hat geschrieben:@Hyperion: Der Zeichenkettenvergleich ist nicht das Problem, sondern dass sich das ``THEN`` auf den Rest der Zeile bezieht. Das ``NEXT`` wird also bei 5 nicht mehr ausgeführt und es geht in der nächsten Zeile weiter. Die gibt es nicht → Programmende.
Ah... danke. Früher hätte ich das gewusst.
Also hier kurz die funktionierende Version:

Code: Alles auswählen

10 for i=1 to 20:if right$(str$(i),1)<>"5" then print i
20 next
(Welcher Basic-Dialekt klappte hier ganz gut für das Syntax-Highlighting? Vergesse ich immer wieder)