Hallo,
ich komm einfach nicht drauf. Ich möchte die Distanz zweier
Nachkommerstellen berechnen dabei soll der Übertrag vernachlässigt
werden. Es geht also nur um die Nachkommerstelle.
Bspl:
0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1
Gibt es da irgend ein Term für den ich suchen muss?
Bin für jeden Hinweis dankbar,
Christian
Tom schrieb:> Differenz bilden und mit math.modf die Vorkommastellen wegwerfen?
Das geht so nicht. Ich habe mir das auch einfacher gedacht und studiere
immer noch darüber.
Rene H. schrieb:> Ich habe mir das auch einfacher gedacht
Na grundsätzlich ist das doch recht einfach: Die beiden Zahlen mit 10
multiplizieren, Nachkommateil abschneiden, Mod 10, dann Differenz,
Differenz womöglich Absolutwert und Mod 5, und als Letztes noch durch 10
teilen. Sind natürlich einige Schritte, alles mit einem Befehl wäre
schöner. (Ich kann das jetzt nicht so mal schnell in Python
hinschreiben, da ich eher Ruby verwende.)
So, ich habe jetzt seit einigen Stunden drüber gegrübelt und
letztendendes eine sehr simple Lösung gefunden. Schon fast zu banal!
Vielleicht kann man es noch vereinfachen, aber hier ist meine Lösung:
def distance(x,y):
... '''x und y sind Nachkommastellen'''
... if abs(x-y)>0.5:
... if x>y:
... return y+1-x
... else:
... return x+1-y
... else:
... if x>y:
... return x-y
... else:
... return y-x
Danke fürs mitknobeln. Endlich kann ich schlafen.
Gruss Christian
>Bspl:>>0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1
Wie lautet denn das Regelwerk, nach dem der Abstand bestimmt wird?
Warum herrscht nicht der Abstand 0.8?
spontan schrieb:>>Bspl:>>>>0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1>> Wie lautet denn das Regelwerk, nach dem der Abstand bestimmt wird?>> Warum herrscht nicht der Abstand 0.8?
der geringste Abstand war gesucht... so jetzt schlaf ich aber wirklich
:)
Salewski schrieb:> Naja, ich hatte beliebige Vorkommastellen angenommen -- aber das war> wohl gar nicht gefordert.
Zumindest in der von Chrisitan selbst gefundenen Lösung werden die
Vorkommastellen ebenfalls nicht berücksichtigt:
Chrisitan schrieb:> def distance(x,y):> ... '''x und y sind Nachkommastellen'''> ... if abs(x-y)>0.5:> ... if x>y:> ... return y+1-x> ... else:> ... return x+1-y> ... else:> ... if x>y:> ... return x-y> ... else:> ... return y-x
Mein Vorschlag in meinem letzten Beitrag tut fast dasselbe, nur dass die
Fallunterscheidungen nicht explizit, sondern versteckt in den beiden
abs-Aufrufen stattfinden.
Nein, die Vorkommastellen müssen nicht berücksichtigt weden. Dennoch
finde ich die beiden letztgenannten Lösungen von Yalu und Salewski
super.
Ist für mich super gelaufen: A) Ich habe selber eine Lösung meines
Problems gefunden.(Und hätte ich mich geärgert, wenn mir gezeigt werden
müsste wie einfach es geht!). Und B) ich hab trozdem was gelernt, es
ging nämlich noch viel eleganter :)
Danke an alle Beteiligten
Christian
Salewski schrieb:> def diff(a, b)> a = (a * 10).to_i % 10> b = (b * 10).to_i % 10> ((a - b).abs % 6).fdiv(10)> end
Die kürzeste Lösung ist nicht automatisch die Beste. Die beste Lösung,
ist die gut lesbare!
spontan schrieb:>>Bspl:>>>>0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1>> Wie lautet denn das Regelwerk, nach dem der Abstand bestimmt wird?>> Warum herrscht nicht der Abstand 0.8?
hätt ich jetzt auch vermutet. Kann das mal einer erläutern wieso sich
das "Abstand" nennt?
Stell die die Zahlenwerte 0≤x<1 auf einem Kreis aufgetragen vor:
1
0,3 0,2
2
__________
3
0,4 / \ 0,1 \
4
/ \ |
5
| | |
6
0,5 | | 0,0 | 0,2
7
| | |
8
\ / |
9
0,6 \__________/ 0,9 |/
10
‾
11
0,7 0,8
Der Abstand zwischen 0,9 und 0,1 entlang des Kreisumfangs ist 0,8 oder
0,2, je nachdem, ob man im Gegenuhrzeiger- oder im Uhrzeigersinn misst.
Hier ist der kürzere der beiden möglichen Abstände gesucht, also 0,2.