Seite 1 von 1
FuzzyClock
Verfasst: Sonntag 25. Juli 2004, 20:10
von DER Olf
wunderschönen guten abend!
ich habe heute nacht um halb 3 mein modul
fuzzy_clock
zu Ende gebracht.
das ist eine funktion, die die uhrzeit in umgangssprache als string zurückgibt.
bsp:
"Viertel nach Drei"
oder
"Um Eins"
oder
"Kurz vor Zwei"
auf die idee kam ich durch Muetze1 von developia.de, der auf seiner Homepage (
www.muetze1.de) die komponente FuzzyClock für Delphi geschrieben hat. er selbst hatte die idee von seinem alten Atari 1040 übernommen.
und hier ist es nun:
http://der-olf.paebbels.net/python/fuzzy_clock.py
sprachverbesserungen bezüglich der uhrzeit nehme ich gerne an.
achso: es ist mir bekannt, dass die uhrzeiten in anderen teilen deutschlands andere namen haben.
ich komme aus nordhessen, und deswegen habe ich das modul auf meine umgangssprache zugeschnitten.
habt spaß!
mfg Olf
Verfasst: Sonntag 25. Juli 2004, 21:13
von Dookie
Hi Olf,
da gibts ja einige ifs weg zu optimieren:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: cp1252 -*-
"""
Module: fuzzy_clock.py
Description: German Version,
rebuild of an VCL
component from
Muetze1 (http://www.muetze1.de)
Author: Florian "LizardKing" Löber
Date: 25.07.2004
Version: 1.0
Requires: Python2.3
"""
import time
def fuzzy_clock():
__time = time.localtime()
int_h = __time[3]
int_min = __time[4]
zeit = ["Zwölf", # 0 / 12
"Eins",
"Zwei",
"Drei",
"Vier",
"Fünf",
"Sechs",
"Sieben",
"Acht",
"Neun",
"Zehn",
"Elf"]
mitternacht = "Mitternacht"
viertel = "Viertel"
halb = "Halb "
kurz = "Kurz"
vor = " vor " # with 2 whitespaces
nach = " nach "
um = "Um "
dreiviertel = "Dreiviertel "
def minutes(hour):
""" a function to check
the minutes """
if hour == 0 and int_min == 0:
return mitternacht
if hour > 12: # das spart einige if's
hour -= 12
if int_min == 0:
return um + zeit[hour]
elif int_min == 1:
return kurz + nach + zeit[hour]
elif int_min <= 10:
return zeit[int_min] + nach + zeit[hour]
elif int_min < 14:
return zeit[15-int_min] + vor + viertel + nach + zeit[hour]
elif int_min == 14:
return kurz + vor + viertel + nach + zeit[hour]
elif int_min == 15:
return viertel + nach + zeit[hour]
elif int_min == 16:
return kurz + nach + viertel + nach + zeit[hour]
elif int_min < 20:
return zeit[int_min-15] + nach + viertel + nach + zeit[hour]
elif int_min < 29:
return zeit[30-int_min] + vor + halb + zeit[(hour + 1) % 12]
elif int_min == 29:
return kurz + vor + halb + zeit[(hour + 1) % 12]
elif int_min == 30:
return halb + zeit[(hour + 1) % 12]
elif int_min == 31:
return kurz + nach + halb + zeit[(hour + 1) % 12]
elif int_min < 41:
return zeit[int_min-30] + nach + halb + zeit[(hour + 1) % 12]
elif int_min < 44:
return zeit[45-int_min] + vor + dreiviertel + zeit[(hour + 1) % 12]
elif int_min == 44:
return kurz + vor + dreiviertel + zeit[(hour + 1) % 12]
elif int_min == 45:
return _3viertel + zeit[(hour + 1) % 12]
elif int_min == 46:
return kurz + nach + viertel + vor + zeit[(hour + 1) % 12]
elif int_min < 51:
return zeit[int_min-45] + nach + dreiviertel + zeit[(hour + 1) % 12]
elif int_min < 59:
return zeit[60-int_min] + vor + zeit[(hour + 1) % 12]
elif int_min == 59:
return kurz + vor + zeit[(hour + 1) % 12]
else:
# here error messages or so
pass
# call the function
_fuzzy_clock = minutes(int_h)
return _fuzzy_clock
# test it
if __name__ == "__main__":
f = fuzzy_clock()
print f
Gruß
Dookie
Verfasst: Sonntag 25. Juli 2004, 22:53
von DER Olf
danke Dookie!
aber was ist % für ein Operator?
<entschuldigung>ja...also es war ja schon spät^^</entschuldigung>
mfg Olf
Verfasst: Montag 26. Juli 2004, 00:06
von Dookie
% ist module, also der ganzzahlige Rest einer Division.
Gruß
Dookie
Verfasst: Montag 26. Juli 2004, 09:14
von DER Olf
so, ich habe jetzt die optimierte version geuppt.
mfg Olf
Verfasst: Montag 26. Juli 2004, 17:40
von mawe
Hi!
Ich hab auch mal versucht ein paar if's wegzuoptimieren. Herausgekommen ist das:
Code: Alles auswählen
from time import localtime
viertel = ["Punkt","viertel","halb","dreiviertel","Punkt"]
stunde = ["Zwoelf","Eins","Zwei","Drei","Vier","Fuenf","Sechs","Sieben","Acht",
"Neun","Zehn","Elf","Zwoelf"]
pre = ""
def fuzzy(hour,min):
hour = hour%12
rest = min%15
mult = min/15
if mult > 0:
hour+=1
if rest == 0:
pre=""
elif rest == 1:
pre="kurz nach "
elif rest < 10:
pre = str(rest) + " nach "
elif rest < 14:
pre = str(15-rest) + " vor "
mult+=1
if mult == 1:
hour+=1
elif rest == 14:
pre = " kurz vor "
mult+=1
if mult == 1:
hour += 1
print "Es ist " + pre + viertel[mult] + " " + stunde[hour]
if __name__ == '__main__':
hour = localtime()[3]
minute = localtime()[4]
fuzzy(hour,minute)
Naja, es ist keine 1:1 Umsetzung von Olf's Script, vor allem fällt mir gerade auf, daß
Um und
Mitternacht fehlen

, aber ich glaube es funktioniert.
UPDATE: Kleiner Bugfix: jetzt wird auch z.B. 7:12 richtig angezeigt
Gruß, mawe
Verfasst: Montag 26. Juli 2004, 18:13
von DER Olf
das ist doch das tolle an OpenSource...jeder kanns modifizieren
mfg Olf
Verfasst: Montag 26. Juli 2004, 19:29
von Dookie
So ich hab mich auch nochmal dran versucht.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Modul: fuzzyclock2
Description: Beschreibung
Version: 0.1
Copyright: 2004 by Fritz Cizmarov fritz@sol.at
Created: 26. Jul. 2004
Last modified: 26. Jul. 2004
License: free
Requirements: Python2.3
Exports: Classes and Functions to export
"""
import time
class FuzzyClock(object):
__slots__ = ["the_time"]
format = "Es ist %s%s%s%s"
zahlen = ("Zwölf", "Eins", "Zwei", "Drei",
"Vier", "Fünf", "Sechs", "Sieben",
"Acht", "Neun", "Zehn", "Elf")
quartal = ("", "Viertel nach ", "Halb ", "Dreiviertel ")
minuten = "Minuten"
kurz = "kurz"
nach = " nach "
vor = " vor "
kurz_vor_nach = (1, 14, 16, 29, 31, 44, 46, 59)
mitternacht = "Mitternacht"
def __init__(self, the_time=None):
super(FuzzyClock, self).__init__()
if the_time is None:
self.the_time = time.localtime()
else:
self.the_time = the_time
def __str__(self):
stunde = self.the_time[3]
minute = self.the_time[4]
minuten = ""
vor_nach = ""
stunden = self.mitternacht
if (stunde, minute) != (0,0):
stunde %= 12
quartal = self.quartal[((minute+7) / 15) % 4]
tmp = minute % 15
if tmp == 0:
vor_nach = ""
elif tmp <= 7:
minuten = self.zahlen[tmp]+" "+self.minuten
vor_nach = self.nach
else:
minuten = self.zahlen[15-tmp]+" "+self.minuten
vor_nach = self.vor
if minute > 22:
stunde = (stunde+1) % 12
if minute in self.kurz_vor_nach:
minuten = self.kurz
stunden = self.zahlen[stunde]
return self.format % (minuten, vor_nach, quartal, stunden)
def __call__(self):
self.the_time = time.localtime()
return str(self)
if __name__ == "__main__":
import random
print FuzzyClock()
print "Und noch eine Zufallszeit zum testen:"
stunde = random.randint(0,23)
minute = random.randint(0,59)
print "%02i:%02i %s" % (stunde, minute, FuzzyClock((0,0,0,stunde,minute)))
Gruß
Dookie
Verfasst: Dienstag 27. Juli 2004, 09:59
von DER Olf
hi.
mir war gestern abend ein wenig langweilig, deswegen hab ich einfach mal nen doppelklick auf die fuzzy clock gemacht.
und siehe da: bei deinem ersten versuch Dookie, hat sich ein fehler eingeschlichen.
um ca. 9 uhr oder 9.30 (kA so genau) war es 1 uhr
hui, dein zweiter versuch sieht aber auch nicht schlecht aus

(habs aber nicht getestet)
mfg Olf.