fb:porticula NoPaste
Stussiger KauderwelschGenerator
Uploader: | theta |
Datum/Zeit: | 31.03.2012 16:54:38 |
'ACHTUNG: DIESER QUELLTEXT IST ABSOLUTER MÜLLL!
'Das Programm erwartet im 1. Kommandozeilenargument die Anzahl der zu erstellenden Wörter.
'Da Umlaute und das Eszett weder unter Linux noch unter Windows im Terminal richtig dargestellt werden, empfiehlt sich eine Umleitung der Ausgabe in eine Datei z.B. ./Stussgenerator 10 > 10Worte.txt
'Der Interpunktionsteil ist FURCHTBAR hässlich, nein katastrophal programmiert, man kann ihn aber natürlich einfach entfernen.
'Es ist ein kleiner Spaß für Zwischendurch. Meinen suuuper Heldenepos mit 60.000 Wörtern habe ich damit in weniger als einer Sekunde fertig gestellt ;)
#include "crt/stdio.bi" 'printf
#Define mit_Interpunktion 1 'falls nicht auskommentieren
#Define c_komma 1/65 'bestimmt, wie sehr die Kommachance durch andere Dinge beeinflusst wird
#Define c_punkt 1/70
#Define c_ausrz 1/100
#Define c_fragz 1/140
#Define c_semik 1/200
#Define c_doppelp 1/100
#Define c_anfz 1/30
#Define c_absatz 1/80
#Define c_grosb 1/20
#Define c_zahl 1/900
#define c_zahl_max 2100 'wie groß eine Zahl maximal sein darf
'==============================================================
#Define hiat_chance 0.26 'Hiat: 2 Vokale hintereinander, eigentlich auch unterschiedliche Silbezugehörigkeit
#Define v_k_mindest 0.5 'bestimmt wie groß das Verhältnis von Vokalen zu Konsonanten mindestens sein muss
#Define v_k_max 1.8 'wie groß das Verhältnis maximal sein darf
#Define v_start_chance 4/10 'Startchance für einen Vokal als ersten Buchstaben
#Define diph_chance 1/10 'Chance auf einen Diphthong: au,ai,...
#Define dk_chance 2/10 'Chance auf einen Laut, der üblicherweise mit zwei konsonantischen Buchstaben dargestellt wird
'Die Chance auf ein a ist 22/(22+25+23+16+18+20+4+9)
'Die Chance auf ein ö dagegen 18/(22+25+23+16+18+20+4+9)
'Die Werte können einfach verändert werden, um zu sehen, wie sich die ausgegebenen Wörter verändern
#Define v_a 22
#Define v_e 25
#Define v_i 23
#Define v_ae 16
#Define v_o 18
#Define v_u 20
#Define v_y 4 'ü
#Define v_oe 9
'----------------------------
#Define v_ai 20
#Define v_ey 16
#Define v_au 22
#Define v_ui 14
#Define v_oei 9
#Define v_yi 10
#Define v_oi 16
'-----------------------------
#Define k_b 16
#Define k_c 18
#Define k_d 24
#Define k_f 25
#Define k_g 25
#Define k_h 16
#Define k_j 13
#Define k_k 26
#Define k_l 23
#Define k_m 25
#Define k_n 30
#Define k_p 15
#Define k_q 5
#Define k_r 25
#Define k_s 26
#Define k_t 26
#Define k_v 18
#Define k_w 15
#Define k_x 7
#Define k_z 18
#Define k_sz 13
'-----------------------------
#Define k_th 23
#Define k_dh 18
#Define k_sh 25 'bzw. sch
#Define k_ng 7
#Define k_pf 7
Function _String(times As Integer,char As String) As String 'Ersatzfunktion für String, funktioniert "richtiger"
Dim w As String
For i As Integer=1 To times
w += char
Next
Return w
End Function
#Macro addTo(char,times,string_)
'Folgendes Verfahren kommt zum Einsatz:
'Ein String wird aus allen Zeichen eines Types(Vokale, Konsonanten, Diphthonge, "Doppelkonsonanten") erstellt:
'je höher die Wahrscheinlichkeit für ein Zeichen, desto öfter kommt es im String vor
'nun wird eine Zufallszahl "gezogen" und geschaut, was an der Stelle im String steht
string_ += _String(times,char)
#EndMacro
#Macro addAll()
addTo("a",v_a,vokale)
addTo("e",v_e,vokale)
addTo("i",v_i,vokale)
addTo("o",v_o,vokale)
addTo("u",v_u,vokale)
addTo("ö",v_oe,vokale)
addTo("ä",v_ae,vokale)
addTo("ü",v_y,vokale)
addTo("ai",v_ai,diphthonge)
addTo("ey",v_ey,diphthonge)
addTo("au",v_au,diphthonge)
addTo("ui",v_ui,diphthonge)
addTo("öi",v_oei,diphthonge)
addTo("üi",v_yi,diphthonge)
addTo("oi",v_oi,diphthonge)
addTo("b",k_b,konsonanten)
addTo("c",k_c,konsonanten)
addTo("d",k_d,konsonanten)
addTo("f",k_f,konsonanten)
addTo("g",k_g,konsonanten)
addTo("h",k_h,konsonanten)
addTo("j",k_j,konsonanten)
addTo("k",k_k,konsonanten)
addTo("l",k_l,konsonanten)
addTo("m",k_m,konsonanten)
addTo("n",k_n,konsonanten)
addTo("p",k_p,konsonanten)
addTo("q",k_q,konsonanten)
addTo("r",k_r,konsonanten)
addTo("s",k_s,konsonanten)
addTo("t",k_t,konsonanten)
addTo("v",k_v,konsonanten)
addTo("w",k_w,konsonanten)
addTo("x",k_x,konsonanten)
addTo("z",k_z,konsonanten)
addTo("ß",k_sz,konsonanten)
addTo("th",k_th,dkonsonanten)
addTo("dh",k_dh,dkonsonanten)
addTo("sh",k_sh,dkonsonanten)
addTo("ng",k_ng,dkonsonanten)
addTo("pf",k_pf,dkonsonanten)
#EndMacro
Dim Shared As String konsonanten,vokale,diphthonge, dkonsonanten
Declare Function gen_Wort() As String
addAll()
'-------------------------------------------------------------------------------------------------------------
#If Defined (mit_Interpunktion)
Dim As Double komma_chance=c_komma,punkt_chance=c_punkt,ausrz_chance=c_ausrz,fragz_chance=c_fragz,semik_chance=c_semik,doppelp_chance=c_doppelp,anfz_chance = c_anfz
Dim As Double absatz_chance= c_absatz,grosb_chance = c_grosb ,zahl_chance = c_zahl
#EndIf
'==============================================================
Dim As String wort
Dim Shared As Double v_chance=v_start_chance 'Chance auf einen Vokal
Const As Integer v_gesamt=v_a+v_e+v_i+v_o+v_u+v_ae+v_oe+v_y
Const As Integer diph_gesamt=v_ai+v_ey+v_au+v_ui+v_oei+v_yi
Const As Integer k_gesamt=k_b+k_c+k_d+k_f+k_g+k_h+k_j+k_k+k_l+k_m+k_n+k_p+k_q+k_r+k_s+k_t+k_v+k_w+k_x+k_z
Const As Integer dk_gesamt=k_sz+k_th+k_dh+k_sh+k_ng+k_pf
Dim Shared As Integer v_k_gesamt = v_gesamt + k_gesamt + diph_gesamt + dk_gesamt
Dim As Integer erstesWort=1,anfz_gesetzt=0
Randomize Timer
for anzahl as Integer=1 to val(Command(1))
wort=gen_Wort()
#If Defined(mit_Interpunktion)
If erstesWort Then
Mid(wort,1,1)=UCase(Mid(wort,1,1))
erstesWort=0
ElseIf Rnd <= komma_chance Then
wort += ","
komma_chance = c_komma
ElseIf Rnd <= punkt_chance Then
wort +="."
punkt_chance = c_punkt
If Rnd <= anfz_chance And anfz_gesetzt Then
Mid(wort,1,1)=UCase(Mid(wort,1,1))
anfz_chance = c_anfz
wort = wort+!"\""
anfz_gesetzt = 0
EndIf
printf("%s ",wort)
anzahl +=1
wort=gen_Wort()
Mid(wort,1,1)=UCase(Mid(wort,1,1)) 'ersten Buchstaben in Großbuchstaben umwandeln
If Rnd <= absatz_chance And Not anfz_gesetzt Then printf(!"\n") : absatz_chance = c_absatz
ElseIf Rnd <= ausrz_chance Then
wort +="!"
ausrz_chance = c_ausrz
If Rnd <= anfz_chance And anfz_gesetzt Then
Mid(wort,1,1)=UCase(Mid(wort,1,1))
anfz_chance = c_anfz
wort = wort+!"\""
anfz_gesetzt = 0
EndIf
printf("%s ",wort)
anzahl +=1
wort=gen_Wort()
Mid(wort,1,1)=UCase(Mid(wort,1,1)) 'ersten Buchstaben in Großbuchstaben umwandeln
If Rnd <= absatz_chance And Not anfz_gesetzt Then printf(!"\n") : absatz_chance = c_absatz
ElseIf Rnd <= fragz_chance Then
wort +="?"
fragz_chance = c_fragz
If Rnd <= anfz_chance And anfz_gesetzt Then
Mid(wort,1,1)=UCase(Mid(wort,1,1))
anfz_chance = c_anfz
wort = wort+!"\""
anfz_gesetzt = 0
EndIf
printf("%s ",wort)
anzahl +=1
wort=gen_Wort()
Mid(wort,1,1)=UCase(Mid(wort,1,1)) 'ersten Buchstaben in Großbuchstaben umwandeln
If Rnd <= absatz_chance And Not anfz_gesetzt Then printf(!"\n") : absatz_chance = c_absatz
ElseIf Rnd <= semik_chance Then
wort +=";"
semik_chance = c_semik
ElseIf Rnd <= doppelp_chance Then
wort +=":"
doppelp_chance = c_doppelp
printf("%s ",wort)
anzahl +=1
wort=gen_Wort()
If Rnd <= 0.5 Then Mid(wort,1,1)=UCase(Mid(wort,1,1)) 'ersten Buchstaben in Großbuchstaben umwandeln
If Rnd <= anfz_chance And Not anfz_gesetzt Then
Mid(wort,1,1)=UCase(Mid(wort,1,1))
anfz_chance = c_anfz
wort = !"\""+wort
anfz_gesetzt = -1
fragz_chance += 2 * c_fragz
ausrz_chance += 2 * c_ausrz
EndIf
If Rnd <= absatz_chance And Not anfz_gesetzt Then
If Rnd <= 0.5 Then Mid(wort,1,1)=UCase(Mid(wort,1,1)) 'ersten Buchstaben in Großbuchstaben umwandeln
printf(!"\n") : absatz_chance = c_absatz
EndIf
ElseIf Rnd <= grosb_chance Then
Mid(wort,1,1)=UCase(Mid(wort,1,1))
grosb_chance=c_grosb
ElseIf Rnd <= zahl_chance Then
zahl_chance = c_zahl
wort = str(Int(Rnd * c_zahl_max +1))
EndIf
printf("%s ",wort)
komma_chance += c_komma
punkt_chance += c_punkt
ausrz_chance += c_ausrz
fragz_chance+=c_fragz
semik_chance+=c_semik
doppelp_chance+=c_doppelp
anfz_chance += c_anfz
absatz_chance += c_absatz
grosb_chance += c_grosb
zahl_chance += c_zahl
#Else
printf("%s ",wort)
#EndIf
next
Function gen_Wort() As String
Dim As String wort
Dim As Integer l,v,k,zahl
Do
'Wortlänge auswürfeln
If Rnd < 0.7 Then '70% Chance
l=Int(Rnd * 4 + 2)
Else '30% Chance
l=Int(Rnd * 7 + 2)
EndIf
wort=""
v=0
k=0
For i As Integer=1 To l
If Rnd <= v_chance Then 'z.B: 1/4 Chance auf Vokal/Diphtong
v +=1
v_chance -= 1.0-hiat_chance 'Wahrscheinlichkeit auf Vokakl/Diphtong reduzieren
If Rnd <= diph_chance Then 'Diphtong
zahl=Int (Rnd* diph_gesamt/2)
wort +=Mid(diphthonge,zahl*2 +1,2)
Else 'kein Diphtong ==============================================================
zahl=Int (Rnd* v_gesamt +1)
wort +=Mid(vokale,zahl,1)
EndIf
Else 'z.B. 3/4 Chance auf Konsonant ==============================================================
v_chance += 1.0-hiat_chance 'Chance auf Vokal steigt nach jedem Konsonanten
k +=1
If Rnd <= dk_chance Then
zahl=Int(Rnd*dk_gesamt/2)
wort += Mid(dkonsonanten,zahl*2 +1,2)
Else
zahl=Int(Rnd*k_gesamt+ 1)
wort += Mid(konsonanten,zahl,1)
EndIf
EndIf
Next
Loop Until v/k>=v_k_mindest And v/k<=v_k_max
Return wort
End Function