tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
0
ZUGRIFFE
1352
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    OnlyFoo OnlyFoo ist offline Mitglied Brokat
    Registriert seit
    Feb 2005
    Beiträge
    470
    Meine Lösung ist in Python geschrieben und hat ein kleines WebInterface, hier zu finden:
    http://olli.keller-delirium.de/quiz/quiz13/

    Es werden Zahlen bis in den Milliarden-Bereich unterstützt. Bei der Audioausgabe allerdings nur bis in den Hunderttausender-Bereich, da ich keine Lust hatte, mehr Samples aufzunehmen. Die Funkion wäre jedoch ganz einfach durch anlegen neuer Samples wie "millionen.wav" und "milliarden.wav" nachzurüsten.

    Rekursive Funktion, die eine Zahl in einen Text umwandelt:

    Code python:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    tens = [ "ein", "zwei", "drei", "vier", "fünf", "sechs",
        "sieben", "acht", "neun", "zehn", "elf", "zwölf" ]
     
    # hier erweiterbar
    higher = [ (9, "milliarden"), (6, "millionen"), (3, "tausend"), (2, "hundert") ]
     
    post = {
        r"^$": "null",
        r"ein$": "eins",
        r"zweizig": "zwanzig",
        r"dreizig": "dreißig",
        r"sechs(zehn|zig)": r"sech\1",
        r"sieben(zehn|zig)": r"sieb\1",
        r"einmill(ion|iarde)": r"einemill\1",
    }
     
    def stringify( n ):
        # Innere rekursive Funktion, die die Zahl n als Text zurück gibt
        def strgen( n ):
            for e, glue in higher:
                if n >= 10 ** e:
                    return strgen( n / 10 ** e ) + glue + strgen( n % 10 ** e )
            
            if n >= 20:
                digit = strgen( n % 10 )
                return (digit + "und" if digit else "") + strgen( n / 10 ) + "zig"
            
            if n >= 13:
                return strgen( n % 10 ) + "zehn"
            
            if n >= 1:
                return tens[n-1]
            
            return ""
        
        result = strgen( long(n) )
        for pat, sub in post.items():
            result = re.sub( pat, sub, result )
        
        return result

    Und eine Funktion, die dann das Audiosample erzeugt:
    Code python:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    # mixt zwei Audiosamples zusammen
    def mix( a, b, start = 0):
        if start < 0:
            start = max( start + len(a), 0)
        
        end = start + len(b)
        if end > len(a):
            a += [0] * (end - len(a))
        
        a[start:end] = imap( lambda a, b: a+b, a[start:], b[0:] )
     
     
    def audiofy( n ):
        # Zahl zu einem String umwandeln, wenn nötig
        if re.match( r"[0-9]+", str(n) ):
            n = stringify( str(n) )
        
        # .wav-Samples laden
        samples = [f[:-4] for f in glob.glob( "*.wav" )]
        samples.sort( lambda a, b: cmp( len(b), len(a) ) )
        
        # Ergebnis generieren
        output = []
        while n:
            # Sample finden, mit dem n beginnt, merken, und anfang von n löschen
            sample = [s for s in samples if n.startswith(s)].pop(0)
            n = n[len(sample):]
            
            # Sample laden und mit einer Überlappung von 0.15 sek mit der
            # bisherigen Ausgabe mischen
            frames = load_wave_file( "%s.wav" % sample )
            mix( output, frames, start = -int(44100 * 0.15) )
        
        # Ausgabe in einen String schreiben und zurück geben
        fp = StringIO.StringIO()
        dump_wave_file( fp, output )
        return fp.getvalue()

    Für den kompletten Code siehe Anhang
    Angehängte Dateien Angehängte Dateien
     

Thema nicht erledigt

Ähnliche Themen

  1. [QUIZ#16] OnlyFoo (Python)
    Von OnlyFoo im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 22.05.10, 17:23
  2. [QUIZ#12] OnlyFoo (Python)
    Von OnlyFoo im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 02.11.09, 17:35
  3. [Quiz#11] OnlyFoo (python)
    Von OnlyFoo im Forum Archiv
    Antworten: 2
    Letzter Beitrag: 25.10.09, 06:22
  4. [QUIZ#10] OnlyFoo (Python)
    Von OnlyFoo im Forum Archiv
    Antworten: 1
    Letzter Beitrag: 10.10.09, 23:10
  5. [QUIZ#09] OnlyFoo (Python)
    Von OnlyFoo im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 20.07.09, 12:34