Seite 1 von 2

individuelle Zahl x mal erneut um 1 erhöhen

Verfasst: Samstag 30. August 2008, 02:21
von zypral
Erstmal einen "guten Morgen",

nachdem ich mich mittlerweile die halbe Nacht durch's Internet gewühlt habe, bitte ich euch um die Lösung für ein, für euch sicherlich triviales, Problem.

Der Benutzer soll in meinem Skript 2 Eingaben tätigen, Zahl und Anzahl der Erhöhungen.

Beispiel:
Zahl = 150
Anzahl der Erhöhungen = 4

Python soll nun folgende Berechnung durchführen (und genau da hapert es bei mir):
150 + 151 + 152 + 153
oder
(150) + (150 + 1) + (150 + 2) + (150 + 3)

Allerdings fehlt mir dazu jeglicher Ansatz um dies zu erreichen. Das "Problem" ist ja auch, dass anstatt der 150 und der 4 auch jede beliebige andere Zahl genommen werden kann / soll.

Bei der Eingabe von 327 und 9 sollte dann
327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335
oder
(327) + (327 + 1) + (327 +2) + (327 + 3) + (327+ 4) + (327 + 5) + (327 + 6) + (327 + 7) + (327 + 8)
berechnet werden.

Ich hoffe ich konnte erklären woran es bei mir hapert und was ich erreichen möchte.

Es wäre schön, wenn ihr mir sagen könntet wie das Skript an dieser Stelle zu schreiben ist oder ihr mir auch nur einen Link gibt, wo im Idealfall genau dieses behandelt wird.

PS: Das bei der Anzahl der Erhöhung 4 und 9 eigentlich nur 3 bzw. 8 mal erhöht wird ist mir bewusst und passt auch so. ;-)

LG
zypral

Re: individuelle Zahl x mal erneut um 1 erhöhen

Verfasst: Samstag 30. August 2008, 05:23
von numerix
Hallo, willkommen im Forum!
zypral hat geschrieben:nachdem ich mich mittlerweile die halbe Nacht durch's Internet gewühlt habe, bitte ich euch um die Lösung für ein, für euch sicherlich triviales, Problem.
Ja, ist trivial und du hättest es einfach haben können: Lesen im Tutorial, ein paar Seiten, dann verstehen und Problem selbst lösen.

Es gibt eine ganz einfache, kurze Lösung, ein einziger Ausdruck, fertig.
Aber den verrate ich dir nicht, denn vermutlich möchte dein Lehrer, dass ihr euch Gedanken über einen Algorithmus macht und deine Schwierigkeiten damit zeigen, dass das auch nötig ist.

Lösungsidee:
Du beginnst mit einer Zahl a (z.B.150) und erhöhst sie n-mal (z.B. 4). Dazu verwendest du sinnvollerweise eine Schleife. Als Zwischenschritt zur endgültigen Lösung könntest du zunächst ein Miniprogramm schreiben, dass den Anwender zur Eingabe von a und n auffordert und dann die Zahlen a, a+1, a+2 etc. einfach nur ausgibt. Wenn du das geschafft hast, dann könntest du dir Gedanken machen - und evtl. nochmal nachfragen - wie man diese Zahlen dann addieren kann.

Verfasst: Samstag 30. August 2008, 08:02
von BlackJack

Code: Alles auswählen

from itertools import count, izip, repeat
from operator import add


def main():
    print reduce(add,
                 (a + b
                  for a, b in izip(repeat(input('Zahl: '),
                                          input('Wiederholungen: ')), count())),
                 0)
SCNR :twisted:

Verfasst: Samstag 30. August 2008, 09:03
von audax
int(raw_input()), niemals input() ;)

Verfasst: Samstag 30. August 2008, 09:45
von audax

Code: Alles auswählen

from itertools import chain, izip, repeat, count
from functional import compose
import operator as op

ask_int = compose(int, raw_input)


print sum(chain(
        *izip(
            repeat(ask_int('Zahl: '), ask_int('Wiederholungen: ')), count())))

für compose:
http://audaxxx.de/functional-0.2.tar.gz

;)

Verfasst: Samstag 30. August 2008, 09:46
von sma
Na mit raw_input funktioniert BlackJack Ausdruck nicht, denn er braucht ja int-Objekte und keine Strings. Das input() war sicherlich schon mit Bedacht gewählt.

Stefan

PS: Die Summer von X bis X + N zu berechnen ist wie die Summe von 0 bis N-1 plus N * X zu berechnen und der gute Gauß wusste schon, wie man diese Summe in einer geschlossenen Formel angeben kann.

Verfasst: Samstag 30. August 2008, 09:48
von audax
sma hat geschrieben:Na mit raw_input funktioniert BlackJack Ausdruck nicht, denn er braucht ja int-Objekte und keine Strings. Das input() war sicherlich schon mit Bedacht gewählt.
Das glaube ich nicht, Tim.

int(raw_input("Foo")) ist, was man nutzen sollte, niemals raw_input.
Zahl: __import__("os").remove(__import__("sys").argv[0])

Verfasst: Samstag 30. August 2008, 12:16
von zypral
Ich danke euch. Zwar verstehe ich das meiste von eurem Code noch nicht, aber ich werde mich da schon reinfuchsen. Aber ich weiss jetzt wenigstens wo ich ansetzen muss.

@ numerix

Bei mir gibt es keinen Lehrer, diese Zeiten sind bei mir schon einige Jahre her. ;-)
Ich bringe mir Python in meiner Freizeit aus reinem Interesse selbst bei (bisherige Programmiererfahrung = 0). Deshalb habe ich auch keinen Ansatz dafür gefunden, da es meine aktuellen Kenntnisse doch noch ein ganzes Stück übersteigt. :?

Verfasst: Samstag 30. August 2008, 12:57
von audax
Versuchs nicht sondern bediene dich deiner mathematischen Kenntnisse ;)

Unser Code ist nicht ganz ernst gemeint. Er funktioniert zwar, ist aber ein bischen arg weit fortgeschritten für dich :D

Verfasst: Samstag 30. August 2008, 14:47
von zypral
So klappt es, aber gibt es dabei noch etwas zu verbessern?

Code: Alles auswählen

exist = input("Vorhanden: ")
needed = input("Benoetigt: ")

a = 0
list = []
for i in range (needed):
    a1 = exist + a
    exist, a = a1, 1
    list.append(a1)
print sum(list)
Um auf meinen Eingangspost zurückzukommen:
Als "Vorhanden" wird z.B. 150 und als "Benoetigt" z.B. 4 eingetragen.

Verfasst: Samstag 30. August 2008, 15:08
von roschi
hallo!

man kann das ganze auch so machen:

Code: Alles auswählen

# eine endlosschleife starten
while True:
  try:
    x = int(raw_input("Zahl: "))
    n = int(raw_input("Wie oft? "))
  except ValueError: continue  # wenn keine zahlen eingegeben wurden, schleife neu starten -> neu fragen
  break  # wenn man bis hier hin gekommen ist (eingaben sind gueltige zahlen), schleife abbrechen

y = x  # eine kopie von x erzeugen

# jetzt eine schleife starten, die n mal ablaeuft
# dazu eine liste mit n zahlen erzeugen, bei der bei jedem schleifendurchlauf
# ein eintrag aus der zahlen-liste in i gespeichert wird
for i in xrange(1, n):
  y += x+i  # y mit x+i addieren

print y  # das endergebnis ausgeben
such dir aus, was dir am besten gefaellt. :)

mfg
roschi

PS: Es wurde hier schon so oft gesagt: Nimm kein 'input()' wenn es nicht unbedingt notwendig ist! das kann eine grosse sicherheitsluecke im programm sein, weil das, was du da reinschreibst, ausgefuehrt wird. 'int(raw_input())' konvertiert dir die eingaben genau so in integer.

Verfasst: Samstag 30. August 2008, 15:08
von Darii
Außer dem schon erwähnten raw_input ist es ein bisschen kompliziert. Wozu hast du denn i, wenn du es nicht benutzt?

Code: Alles auswählen

exist = int(raw_input("Vorhanden: "))
needed = int(raw_input("Benoetigt: "))

liste = [] # Du solltest es vermeiden vorgegebenen Namen wie list zu überschreiben
for i in range (needed):
    liste.append( exist + i )
print sum(liste)
@roschi

Code: Alles auswählen

y = x
Erzeugt keine Kopie von x.

Code: Alles auswählen

In [18]: x = 23

In [19]: y = x

In [20]: y is x

Out[20]: True

Verfasst: Samstag 30. August 2008, 15:14
von EyDu

Code: Alles auswählen

a= int(raw_input("Vorhanden: "))
b= int(raw_input("Benoetigt: "))

print sum(range(a, a+b))

Verfasst: Samstag 30. August 2008, 15:14
von roschi
@Darii:
ja, sorry, das war etwas falsch ausgedrueckt.
ich meinte, dass 'y = x' den wert aus x in y schreibt.

mfg
roschi

Verfasst: Samstag 30. August 2008, 15:18
von roschi
OEHM, ja!
so gehts natuerlich auch ^^

mfg
roschi

Verfasst: Samstag 30. August 2008, 15:24
von DasIch
Vergiss dass es input gibt, list ist ein Built-in dass du nicht überschreiben willst/solltest.
Statt range nimm doch gleich xrange welches einen Iterator zurückliefert, dass ist schneller und solange du die Liste nicht brauchst imho die bessere Lösung.

Desweiteren ist `a` und Zeile 8 völlig überflüssig.

EDIT: Mist zu spät :shock:

Verfasst: Samstag 30. August 2008, 15:40
von EyDu
Ach mist, da habe ich wieder die offensichtliche Lösung vergessen:

Code: Alles auswählen

(lambda f, b, x: f(f,b,x))(lambda f, b, x: x and b+x+f(f, b, x-1)-1, int(raw_input("base:")), int(raw_input("x:")))

Verfasst: Samstag 30. August 2008, 15:51
von veers
Und noch eine.. ;)

Code: Alles auswählen

a = int(raw_input())
b = int(raw_input())
c = b-1
print a*b+ (c+1)*(c/2)+(c%2*((c/2)+1))

Verfasst: Samstag 30. August 2008, 18:10
von yipyip
Hab' auch noch einen...

Code: Alles auswählen

def adder(a, i, acc=()):

  if i >= 0:
    return adder(a, i-1, acc=((a, i),) + acc)
  else:
    return acc

a = int(raw_input('a? '))
i = int(raw_input('i? '))
print sum(a + i for a, i in adder(a, i-1))
:wink:
yipyip

Verfasst: Samstag 30. August 2008, 22:06
von Darii
Warum benutzt eigentlich niemand einen Generator?

Code: Alles auswählen

def calc(x, y):
    while y:
        y -= 1
        yield x + y

x = int(raw_input('x := '))
y = int(raw_input('y := '))

print sum(calc(x, y))