ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
1352
1352
EMPFEHLEN
-
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
Ähnliche Themen
-
[QUIZ#16] OnlyFoo (Python)
Von OnlyFoo im Forum ArchivAntworten: 0Letzter Beitrag: 22.05.10, 17:23 -
[QUIZ#12] OnlyFoo (Python)
Von OnlyFoo im Forum ArchivAntworten: 0Letzter Beitrag: 02.11.09, 17:35 -
[Quiz#11] OnlyFoo (python)
Von OnlyFoo im Forum ArchivAntworten: 2Letzter Beitrag: 25.10.09, 06:22 -
[QUIZ#10] OnlyFoo (Python)
Von OnlyFoo im Forum ArchivAntworten: 1Letzter Beitrag: 10.10.09, 23:10 -
[QUIZ#09] OnlyFoo (Python)
Von OnlyFoo im Forum ArchivAntworten: 0Letzter Beitrag: 20.07.09, 12:34





Login





