FuzzyClock

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

danke Dookie!

aber was ist % für ein Operator?

<entschuldigung>ja...also es war ja schon spät^^</entschuldigung>

mfg Olf
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

% ist module, also der ganzzahlige Rest einer Division.

Code: Alles auswählen

for i in xrange(13,25):
    print i, i % 12
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

so, ich habe jetzt die optimierte version geuppt.

mfg Olf
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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 :oops:, aber ich glaube es funktioniert.

UPDATE: Kleiner Bugfix: jetzt wird auch z.B. 7:12 richtig angezeigt

Gruß, mawe
Zuletzt geändert von mawe am Dienstag 27. Juli 2004, 07:31, insgesamt 1-mal geändert.
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

das ist doch das tolle an OpenSource...jeder kanns modifizieren :lol: :lol:

mfg Olf
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

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 :lol: :lol:

hui, dein zweiter versuch sieht aber auch nicht schlecht aus ;)
(habs aber nicht getestet)

mfg Olf.
Antworten