Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Stussiger KauderwelschGenerator

Uploader:Mitgliedtheta
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