Générateur de texte alléatoire paramétrable

broca - 30 nov. 2012 à 21:25
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 2 déc. 2012 à 12:50
Bonjour,
Je suis un ex-informaticien hasbeen.
En 2000, j'ai développé en VB 4 un petit programme qui me plaisait bien. C'est un programme qui génère aléatoirement du texte, et tout est paramétrable, ce qui en fait une sorte de compilateur ou d'interpréteur. Un peu compliqué à première vue mais qui sait, ça peut peut-être intéresser quelqu'un un jour (par exemple pour des jeux de rôles), vu qu'il est vraiment paramétrable.
Ca fait plus de 10 ans que je ne travaille plus, et je suis incapable aujourd'hui de le porter en une version plus récente de VB ni d'en créer un install.exe.
Je n'ai qu'une question: voulez-vous bien que j'archive ça ici, comme un vieil OpenSource?
Ca me fera plaisir, et pardon de ce long message. L'idéal ce serait que ça intéresse quelqu'un, mais bon, faut pas trop demander.
Ci dessous les différents fichiers que j'ai:
------------------------------------------------
Voici la documentation :
------------------------------------------------
AIDE DU GENERATEUR ALEATOIRE A COMBINAISONS ET LISTES PARAMETRABLES

Logiciel libre développé
par Danielitos


1 - Finalité
2 - Exemples du langage de paramétrage
3 - Les trois parties du formulaire
4 - Pour utiliser le programme


1 - Finalité:


Ce programme choisit des combinaisons aléatoires de listes d'éléments eux-mêmes
aléatoires. Combinaisons et listes d'éléments sont paramétrables par l'utilisateur.

L'utilisateur peut entièrement paramétrer à la fois les différentes listes et
même les combinaisons entre ces listes, de sorte que le programme peut aussi
bien tirer des phrases (si l'utilisateur paramétrise des listes noms, verbes et
adjectifs) que des mots bizarres (si l'utilisateur paramétrise des listes consonnes,
voyelles et diphtongues). C'est à l'utilisateur de déterminer ce à partir de quoi
il souhaite que le programme effectue des choix.


2 - Exemples du langage de paramétrage

Le langage de paramétrage est extrêmement simple.


EXEMPLE N° 1:
PARAMETRAGE DE PHRASES ALEATOIRES

Le fichier "paramètres" est le suivant:

1 est 3 = 2
Mais 1 2 1=1
$
*Liste des noms
le mutant
la fleur
le robot
le couloir
le tunnel
le mausolée
$
*Liste des verbes
prend
fabrique
peint
décrit
examine
$
*Liste des adjectifs
= 10
humain(e)
dément(e)
beau/belle
cassé(e)
colérique
noble


Il s'interprète comme suit:

Chaque caractère '*' en colonne 1 indique que la ligne est en commentaire.

Chaque caractère '$' en colonne 1 crée une nouvelle liste pour les lignes
suivantes (jusqu'à rencontrer un nouveau '$' ou la fin des paramètres).

Dans l'exemple, il y a donc trois listes, chacune numérotée par le
programme de 1 à 3.

Dans la liste 1, il y a 6 éléments, dans la liste 2, 5 éléments, et dans
la liste 3, 7 éléments.

En tête des paramètres figure une liste spéciale, celle des combinaisons
possibles. Dans l'exemple, il y a deux combinaisons possibles.

Une combinaison est une ligne qui peut contenir du texte ou des renvois à
des listes, dans ce cas un renvoi est indiqué par le nombre correspondant
au numéro de la liste. Ex: le chiffre 1 renvoie à la liste 1 et signifie
"choisit ici un élément au hasard dans la liste 1". On voit que la
combinaison "1 est 3", si elle est sélectionnée, peut créer une phrase
de type "Le robot est noble"; et en effet, le texte d'une combinaison
(ici le texte de "1 est 2" sont les cinq caractères " est ") est reporté
tel quel dans le texte du tirage, excepté pour certains caractères spéciaux).

Qu'il s'agisse d'une combinaison ou d'un élément de liste, il est possible
d'en indiquer la fréquence. Par défaut, la fréquence est à 1. Le caractère "="
signifie qu'il attribue à une combinaison ou un élément situé à gauche la
fréquence située à droite. Le programme commencera par totaliser les
fréquences d'une liste avant de tirer un chiffre au hasard entre 1 et ce
total pour choisir un élément. Il y a "fréquence" chance sur "total de
fréquences" qu'un élément sorte. Dans l'exemple, il y a deux chances sur
3 que la combinaison "1 est 3" sorte, comme il y a, pour la liste 3, dix
chances sur seize pour que l'adjectif soit rien (une chaîne vide de caractères)
et une chance sur seize pour que ce soit "colérique".

Exemple de tirage: "Mais le couloir peint la fleur".



EXEMPLE N° 2:
PARAMETRAGE POUR UN GENERATEUR DE MOTS BIZARRES

Le fichier "paramètres" est le suivant:

3+2+1+3+2+1 : 4
3+2+1+3+2+1+3+2+1 : 4
$
*Liste 1 des voyelles
a = 4
e =2
i =2
o=2
u=1
$
*Liste 2 des diphtongues
= 6;w;y
$
*Liste 3 des consonnes
= 5
t=4
d=3
s=2
z=1
k=3
g=1
p=1
b=2
l=3
m=2
n=3
r=1
h=3
$Liste des types de mots
nom;verbe;divers


On remarquera, dans les combinaisons de l'exemple, l'usage du caractère
"+" de concaténation entre plusieurs renvois de listes.

On remarquera l'usage de ";" pour placer sur la même ligne plusieurs
éléments de la même liste.

Cet exemple tire des mots à deux ou trois syllabes, chaque syllabe
est de structure consonne-diphtongue-voyelle, mais la diphtongue n'a que
1 chance sur 4 d'apparaître (soit "w", soit "y"), et la consonne peut
être vide dans 5 chances sur 29. Pour chaque mot bizarre, suit " : " et
un type de mot choisi dans la liste n° 4.

Exemple de tirage: "zimwe : nom".


3 - Le langage


Rappel: le format d'une combinaison est n'importe quelle suite de chiffres
et de lettres. Les chiffres collés seront compris comme un même nombre
renvoyant à la liste correspondante crée par "$".

Il est nécessaire que la liste renvoyée dans un nombre de combinaison
existe.

Les paramètres doivent commencer par les combinaisons possibles.

Suivent ensuite les listes. Chaque liste est créée par "$" et se termine soit
au commencement d'une nouvelle liste, soit à la fin des paramètres; une
liste ne peut pas être vide d'élément.


"*" (étoile) : "commentaire"

En colonne 1, ce caractère transforme la ligne en commentaire, la
ligne n'est pas prise en compte

"$" (dollar) : "liste" (présence obligatoire dans le fichier paramètre)

En colonne 1, ce caractère
- termine la liste des combinaisons si celle-ci est ouverte
- termine la liste précédente si celle-ci est ouverte
- définit une nouvelle liste dont les éléments sont les lignes
suivantes, jusqu'à la fin du fichier paramètre ou jusqu'à la
prochaine liste.

NB: tout ce qui suit "$" sur la ligne est considéré comme commentaire
seulement jusqu'à la rencontre d'un ";". Si un "_" existe sur la ligne
commentaire, l'instruction suivante devient du commentaire.

"+" (plus) : "concaténation"

Dans n'importe quelle position, ce caractère permet de séparer des
nombres (exemple: 12 renvoie à la liste "12" tandis que "1+2" renvoie
à la liste 1 et renvoie ensuite à la liste 2.

"=" (égale) : "a pour fréquence"

Dans n'importe quelle position, ce caractère attribue à l'élément situé
à gauche de l'égalité la fréquence (nécessairement numérique) située à
droite de l'égalité. Lorsque "=" est absent, la fréquence est 1 par défaut.

";" (point virgule) : "fin d'instruction"

Normalement, une fin de ligne est une fin d'instruction, mais on peut
mettre plusieurs instructions sur une même ligne en les séparant par ";"
dans n'importe quelle position.

"_" (underscore ou souligné) : "continuation d'instruction ligne suivante"

Normalement, une fin de ligne est une fin d'instruction, mais on peut
mettre une même instruction sur plusieurs lignes grâce à la présence,
pour chaque ligne à continuer, d'un "_" quelque part sur la ligne
dans n'importe quelle position.


4 - Les trois parties formulaire:


La partie "paramètres" paramétrise toutes les possibilités de tirages
aléatoires de combinaisons et des éléments des listes.

La partie "résultats" sert à effectuer, sélectionner et mémoriser les tirages.

Les contrôles "drive", "répertoires" et "fichiers" de la partie droite du formulaire
fournissent la localisation et éventuellement le nom des fichiers "paramètres" et "résultats".


5 - Pour utiliser le programme:


PARAMETRAGE

L'utilisateur entre ou choisit un fichier "paramètres". S'il choisit un fichier
"paramètres", il en indique la localisation et éventuellement le nom au moyen de la partie
"drive, répertoires et fichiers"; il faut répondre 'OUI' à la question "S'agit-il d'un
fichier 'paramètres'?"; il reste alors à cliquer sur "Lire" pour faire apparaître le
fichier dans la boîte de texte correspondante.

Le fichier paramètre est présent dans la boîte de texte. L'utilisateur peut en
modifier le contenu et l'enregistrer, éventuellement sous un autre nom.


VALIDATION DES PARAMETRES

Il faut alors que le programme connaisse ces paramètres, pour cela, cliquer
sur "Appliquer". Cette commande vérifie la syntaxe des paramètres et, en cas de
validité de ceux-ci, prévient l'utilisateur que les tirages sont désormais possibles.


REOUVERTURE OPTIONNELLE D'UN FICHIER "RESULTATS" PRECEDENT

L'utilisateur peut ouvrir un fichier "résultats" existant s'il souhaite en
alimenter un en append. Il suffit d'utiliser la partie "Drive, Répertoires et Fichiers".
Il faut cette fois répondre 'NON' à la question "S'agit-il d'un fichier 'paramètres'?";
il reste alors à cliquer sur "Lire" pour faire apparaître le fichier dans la boîte de texte
correspondante.


TIRAGE ET VALIDATION

A condition que les paramètres aient été validés comme indiqué précédemment,
l'utilisateur a le pouvoir de tirer une combinaison au hasard à l'aide de la
commande "Tirer une combinaison". Le résultat temporaire est stocké dans la boîte
de texte "Tirage:".

Si ce tirage plaît à l'utilisateur, celui-ci peut l'enregistrer en append
dans la boîte des résultats au moyen de la commande flèche-en-bas.


ENREGISTREMENT DES RESULTATS

Il est nécessaire d'avoir au moins saisi un nom de fichier dans "Nom (format
Fichier.Ext)" de la partie "Fichier Résultats", ou bien d'avoir indiqué le nom
du fichier des résultats à l'aide de la partie "drive, répertoires et fichiers".

Il suffit alors de faire "Enregistrer" (nous parlons de la commande située
sous le label "Fichier Résultats".

-----------------------------------------------
Voici un exemple de fichier paramètre .txt
-----------------------------------------------
*Noms tolkienniens pour jeux de rôles;

Top;

coul;

* Annexes optionnelles ;
IntNblitListe Then 'si renvoi à liste inconnue
MsgBox (StrEchec & ArrErr(4) & _
": renvoi à une liste " & IntMaxNum & _
" pour " & IntNblitListe & " liste(s) seulement")
Exit Sub
End If
Exit For 'sortie de boucle
Else 'TRAITEMENT D'UNE LIGNE
' MsgBox ("Longueur V$ = " & Len(V$))
' FRecupLigne V$ 'SEPARATION DE V$ = LIRE SUIVANT
' V$ = GStrFRecupTexte
FRecupInstr V$
V$ = GStrFRInstrReste

StrCar = ""
If GStrFRInstr "" Then
StrCar = Mid(GStrFRInstr, 1, 1)
End If
If StrCar "*" Then
'CONTROLE DES MINIMA ET CHANGEMENT DE MODE
' MsgBox ("Contrôle minima, StrBascule = " & StrBascule)
' comptage de listes
If StrCar = "$" Then
IntNblitListe = IntNblitListe + 1 'comptage du nombre de listes pour contrôle
GTblIntMaxNbEle(IntNblitListe - 1) = -1 'init à aucun poste élément sur liste
IntNbElements = -1 'init à aucun élément sur liste
End If
If IntNblitListe = 0 Then
GIntMaxNbComb = GIntMaxNbComb + 1 'comptage nombre combinaisons
Else
If StrCar "$" Then 'cas élément nouveau
IntNbElements = IntNbElements + 1 'comptage éléments dans liste
GTblIntMaxNbEle(IntNblitListe - 1) = _
IntNbElements 'mémo dernier poste liste en cours
' MsgBox ("GStrFRecupLigne = '" & GStrFRecupLigne & _
' "', IntNblitListe = " & IntNblitListe & _
' "', IntNbElements = " & IntNbElements)
End If
End If
If StrBascule = "Debut Combinaison" Then
If StrCar = "$" Then
MsgBox (StrEchec & ArrErr(0)) 'erreur aucune combinaison
Exit Sub
End If
StrBascule = "Combinaison"
Else
If StrBascule = "Combinaison" _
And StrCar = "$" Then
StrBascule = "Debut Liste"
Else
If StrBascule = "Debut Liste" Then
If StrCar = "$" Then
MsgBox (StrEchec & ArrErr(2)) 'erreur aucun élément dans liste
Exit Sub
End If
StrBascule = "Liste"
End If
End If
End If
'CONTROLE DES SYNTAXES SELON LE MODE
' MsgBox ("Contrôle syntaxique" & StrBascule)
Select Case StrBascule
Case "Combinaison" 'Contrôle d'une combinaison
FTjsSepar GStrFRInstr, "="
If IsNumeric(GStrFTjsSeparD) = False Then 'Si fréquence non numérique
MsgBox (StrEchec & ArrErr(3))
Exit Sub
End If
FPlusHaut Trim(GStrFTjsSeparG) 'trouver le plus haut carac. pour contrôle
' résultat dans GIntFPlusHaut
If GStrFPlusHautErr "" Then 'test code retour
MsgBox (StrEchec & GStrFPlusHautErr)
Exit Sub
End If
If IntMaxNum < GIntFPlusHaut Then 'Stockage plus haut nombre
IntMaxNum = GIntFPlusHaut
End If

Case "Liste"
IntPosEQ = InStr(1, GStrFRInstr, "=")
If IntPosEQ > 0 _
And IntPosEQ < Len(GStrFRInstr) Then
If IsNumeric(Trim("0" + Mid(GStrFRInstr, _
IntPosEQ + 1))) = False Then
MsgBox (StrEchec & ArrErr(3))
Exit Sub
End If
End If
End Select
End If
End If
Next Ind

If IntNblitListe = 0 Then 'si aucune liste déclarée par "$", erreur
MsgBox (StrEchec & ArrErr(6))
Exit Sub
End If

'====================================================================
'SI PAS D'ERREUR DE SYNTAXE, COMPILATION
'====================================================================

'Renseignement du nombre de Listes d'éléments, le nombre comptabilisé
'dans IntNblitListe est littéral tandis que celui de GIntMaxNbListe est
'exprimé en nombre de postes en incluant zéro comme significatif
GIntMaxNbListe = IntNblitListe - 1

'Détermination du plus grand nombre d'éléments dans la table des
'maxima d'éléments dans changue liste

IntNbReserveEle = -1
For Ind = 0 To GIntMaxNbListe
If GTblIntMaxNbEle(Ind) > IntNbReserveEle Then
IntNbReserveEle = GTblIntMaxNbEle(Ind)
End If
Next Ind


' MsgBox ("GIntMaxNbListe=" & GIntMaxNbListe & _
' ",GIntMaxNbComb=" & GIntMaxNbComb & _
' ",GTblIntMaxNbEle(0)=" & GTblIntMaxNbEle(0) & _
' ",GTblIntMaxNbEle(1)=" & GTblIntMaxNbEle(1))

'Réserver le nombre de postes combinaisons
ReDim GTblComb(GIntMaxNbComb) As String
ReDim GTblCombFrequ(GIntMaxNbComb) As Integer

'Réserver le nombre de listes d'éléments et d'éléments dedans
ReDim GTblEle(GIntMaxNbListe, IntNbReserveEle) As String
ReDim GTblEleFrequ(GIntMaxNbListe, IntNbReserveEle) As Integer


'BOUCLE DE COMPILATION
'Init de la boucle de compilation
V$ = Txt1.Text
StrBascule = "Debut Combinaison"

'index de remplissage des tables
IntComb = -1
IntListeEle = -1
IntEle = -1
GIntTotComb = 0 'Init à zéro du total des fréquences de combinaisons

For Ind = 0 To 9999
' MsgBox ("compile" & Ind)
If Len(V$) = 0 Then
Exit For
Else

'Appel de la fonction obtenir une ligne dans GStrFRecupLigne et
'l'enlever dans GStrFRecupTexte
' FRecupLigne V$
' V$ = GStrFRecupTexte
FRecupInstr V$
V$ = GStrFRInstrReste

StrCar = ""
If GStrFRInstr "" Then
StrCar = Mid(GStrFRInstr, 1, 1)
End If

If StrCar "*" Then
If StrCar = "$" Then
' StrBascule = "Debut liste"
IntListeEle = IntListeEle + 1
If IntListeEle < 99 Then 'juste un test dépassem. capacité
GTblIntTotEle(IntListeEle) = 0 'init du total fréquences de la liste
End If
IntEle = -1
StrBascule = "Liste"
Else
Select Case StrBascule
Case "Combinaison", "Debut Combinaison"
If StrBascule = "Debut Combinaison" Then
StrBascule = "Combinaison"
End If
IntComb = IntComb + 1
FTjsSepar GStrFRInstr, "="
GTblComb(IntComb) = GStrFTjsSeparG
GTblCombFrequ(IntComb) = CInt(GStrFTjsSeparD)
GIntTotComb = GIntTotComb + CInt(GStrFTjsSeparD) 'mémo total combinaisons
' MsgBox ("IntComb = '" & IntComb & "' => '" & _
' GStrFTjsSeparG & "'=" & CInt(GStrFTjsSeparD))
Case "Liste"
IntEle = IntEle + 1
FTjsSepar GStrFRInstr, "="
GTblEle(IntListeEle, IntEle) = GStrFTjsSeparG
GTblEleFrequ(IntListeEle, IntEle) = CInt(GStrFTjsSeparD)
GTblIntTotEle(IntListeEle) = GTblIntTotEle(IntListeEle) + _
CInt(GStrFTjsSeparD)
' MsgBox ("IntListeEle = '" & IntListeEle & _
' "' IntEle = '" & IntEle & _
' "' : '" & GStrFTjsSeparG & "'=" & GStrFTjsSeparD & _
' ", total = " & GTblIntTotEle(IntListeEle))
End Select
End If
End If

End If
Next Ind

MsgBox ("Vérification OK, la commande 'Tirer une combinaison' fonctionne")

End Sub
Private Sub FRecupLigne(StrToto As String)
'Le texte StrToto doit être scindé entre GStrFRecupLigne et
'GStrFRecupTexte au niveau du prochain CRLF$ de StrToto
'CRLF$ = deux caractères disant "ligne suivante"
'StrToto ne doit pas être vide

If StrToto = "" Then
MsgBox ("Erreur programme: FRecupLigne, StrToto est vide")
Exit Sub
End If

Dim IntDebCRLF As Integer, CRLF$, IntDebNouvT As Integer, _
IntLongLigne As String

CRLF$ = Chr$(13) + Chr$(10)

IntDebCRLF = InStr(1, StrToto, CRLF$) 'Position prochain CRLF$

If IntDebCRLF = 0 Then 'IL N'Y A PLUS DE SAUT DE LIGNE
GStrFRecupLigne = StrToto ' Tout StrToto dans la ligne
GStrFRecupTexte = "" ' et rien dans le texte

Else 'IL Y A ENCORE UN SAUT DE LIGNE
If IntDebCRLF = 1 Then ' SI RIEN AVANT CE SAUT,
GStrFRecupLigne = "" ' rien dans ligne

Else ' QQCH APRES SAUT
IntLongLigne = IntDebCRLF - 1 ' Longueur de GStrFRecupLigne
' ' = moins 1 à cause de posit. CRLF$
GStrFRecupLigne = Mid(StrToto, _
1, IntLongLigne) 'Extraire GStrFRecupLigne de StrToto
End If

IntDebNouvT = IntDebCRLF + 2 ' Position nouveau début GStrFRecupTexte
' = plus 1 à cause de longueur CRLF$
' et plus 1 à cause de position nouveau
If IntDebNouvT > Len(StrToto) Then ' SI RIEN APRES SAUT
GStrFRecupTexte = "" ' alors si on efface le saut, plus rien
Else ' QQCH APRES SAUT
GStrFRecupTexte = Mid(StrToto, _
IntDebNouvT) ' Renseigner GStrFRecupTexte depuis
End If ' le premier carac. après CRLF$

End If

' MsgBox ("FRecupLigne: GStrFRecupLigne= '" & GStrFRecupLigne & "'")

End Sub
Private Sub FRecupInstr(StrToto As String)
'RECUPERATION D'UNE INSTRUCTION

'Le texte StrToto doit être scindé entre GStrFRInstr et
'GStrFRInstrReste au niveau du prochain CRLF$ de StrToto
'CRLF$ = deux caractères disant "ligne suivante"

'StrToto ne doit pas être vide

'En outre, le caractère ';' induit la rupture de ligne
'tandis que le caractère "_" induit la continuation et annule
'l'effet de CRLF$

If StrToto = "" Then
MsgBox ("Erreur programme: FRecupInstr, StrToto est vide")
Exit Sub
End If

' Dim IntDebCRLF As Integer, IntDebPointVir As Integer, IntDebSouli As Integer, _
' IntDebRupt As Integer, CRLF$, IntDebNouvT As Integer, _
' IntLongLigne As String
Dim CRLF$
CRLF$ = Chr$(13) + Chr$(10)

' IntDebCRLF = InStr(1, StrToto, CRLF$) 'Position prochain CRLF$
' IntDebPointVir = InStr(1, StrToto, ";") 'Position du prochain point virgule
' IntDebSouli = InStr(1, StrToto, "_") 'Position du prochain caractère de soulignement

'Exemples:
' Inst1 Fin-de-texte
' Inst1 ; Inst2 CRLF$
' Inst1 CRLF$ Inst2 ;
' début Inst1 _ divers CRLF$ fin Inst1 CRLF$
' début Inst1 _ divers CRLF$ fin Inst1 ;

'Priorités: ";" > "_" > CRLF$

' If IntDebCRLF = 0 Then 'IL N'Y A PLUS DE SAUT DE LIGNE
' GStrFRecupLigne = StrToto ' Tout StrToto dans la ligne
' GStrFRecupTexte = "" ' et rien dans le texte
'
' Else 'IL Y A ENCORE UN SAUT DE LIGNE
' If IntDebCRLF = 1 Then ' SI RIEN AVANT CE SAUT,
' GStrFRecupLigne = "" ' rien dans ligne
'
' Else ' QQCH APRES SAUT
' IntLongLigne = IntDebCRLF - 1 ' Longueur de GStrFRecupLigne
' ' ' = moins 1 à cause de posit. CRLF$
' GStrFRecupLigne = Mid(StrToto, _
' 1, IntLongLigne) 'Extraire GStrFRecupLigne de StrToto
' End If
'
' IntDebNouvT = IntDebCRLF + 2 ' Position nouveau début GStrFRecupTexte
' ' = plus 1 à cause de longueur CRLF$
' ' et plus 1 à cause de position nouveau
' If IntDebNouvT > Len(StrToto) Then ' SI RIEN APRES SAUT
' GStrFRecupTexte = "" ' alors si on efface le saut, plus rien
' Else ' QQCH APRES SAUT
' GStrFRecupTexte = Mid(StrToto, _
' IntDebNouvT) ' Renseigner GStrFRecupTexte depuis
' End If ' le premier carac. après CRLF$''

' End If

'
' MsgBox ("FRecupLigne: GStrFRecupLigne= '" & GStrFRecupLigne & "'")

Dim IntCar As Integer, IntLongInstr As Integer, IntDebReste As Integer, _
BooDesactiveSaut As Boolean, StrCarac As String

BooDesactiveSaut = False
GStrFRInstr = ""
StrCarac = ""

For IntCar = 1 To 9999
If IntCar > Len(StrToto) Then
' IntLongInstr = Len(StrToto)
' IntLongReste = IntCar
Exit For
End If
StrCarac = Mid(StrToto, IntCar, 1)
If StrCarac = ";" Then
' IntLongInstr = IntCar - 1
' IntLongReste = IntCar + 1
Exit For
End If
If StrCarac = "_" Then
BooDesactiveSaut = True
End If
If StrCarac = Chr$(13) Then 'Chr$(13)
If BooDesactiveSaut = True Then
BooDesactiveSaut = False
Else
Exit For
End If
End If
If InStr(1, "_" & Chr$(13) & Chr$(10), StrCarac) = 0 Then 'Chr$(10) et (13)
GStrFRInstr = GStrFRInstr + StrCarac
End If
Next IntCar

If Len(GStrFRInstr) = Len(StrToto) Then
GStrFRInstrReste = ""
Else
If StrCarac = ";" Or StrCarac = "_" Or StrCarac = "!" Then
IntDebReste = IntCar + 1
Else
If StrCarac = Chr$(13) Then 'Chr$(13)
IntDebReste = IntCar + 2
End If
End If

' IntDebReste = IntCar + 1

If IntDebReste > Len(StrToto) Then
GStrFRInstrReste = ""
Else
GStrFRInstrReste = Mid(StrToto, IntDebReste)
End If

' StrCarac = Mid(GSreFRInstrReste, 1, 1)

End If

End Sub


Private Sub FTjsSepar(StrToto As String, StrBrise)
'Le texte StrToto doit être scindé entre GStrFTjsSeparG et
'GStrTjsSeparD au niveau de StrBrise dans StrToto
'résultat de la tentative dans GIntFTjsSeparResu
'calcul de fréquence dans GIntFTjsSeparFrequ
'Si pas de StrBrise ou si rien à droite de StrBrise, GStrFTjsSeparD vaut "1"
'Le traitement n'est pas numérique car il sert aussi aux contrôles

Dim IntDebBrise As Integer, IntDebD As Integer, _
IntLongG As String, StrTrim As String

IntDebBrise = InStr(1, StrToto, StrBrise) 'Position StrBrise dans StrToto

If IntDebBrise = 0 Then 'AUCUN StrBrise
GStrFTjsSeparG = StrToto ' Tout StrToto dans la partie gauche
GStrFTjsSeparD = "1" ' et 1 dans fréquence ou partie droite

Else 'IL Y A UN StrBrise
If IntDebBrise = 1 Then ' SI RIEN AVANT StrBrise,
GStrFTjsSeparG = "" ' rien dans ligne

Else ' QQCH APRES StrBrise
IntLongG = IntDebBrise - 1 ' Longueur de GStrFTjsSeparG
' ' = moins 1 à cause de posit. de StrBrise
GStrFTjsSeparG = Mid(StrToto, _
1, IntLongG) 'Extraire GStrFTjsSeparG de StrToto
End If

IntDebD = IntDebBrise + Len(StrBrise) ' Position juste apres StrBrise pour GStrFTjsSeparD
' = plus 1 à cause de position nouveau
If IntDebD > Len(StrToto) Then ' SI RIEN APRES StrBrise
GStrFTjsSeparD = "1" ' alors init de fréquence à "1"
Else ' QQCH APRES StrBrise
GStrFTjsSeparD = Mid(StrToto, _
IntDebD) ' Renseigner GStrFTjsSepar depuis
End If ' le premier carac. après StrBrise

End If

StrTrim = Trim(GStrFTjsSeparG)
GStrFTjsSeparG = StrTrim

StrTrim = Trim(GStrFTjsSeparD)
GStrFTjsSeparD = StrTrim

' MsgBox ("FRecupLigne: GStrFRecupLigne= '" & GStrFRecupLigne & "'")

End Sub


Private Sub FPlusHaut(StrToto As String)

'Doit renseigner dans GIntFPlusHaut la plus haute valeur de
' StrToto, parmi ses caractères

'Doit renseigner dans GStrFPlusHautErr un message d'erreur ou rien

'Est un nombre toute séquence de numéros séparée par autre chose

'La combinaison peut être entièrement sans renvoi à une liste

'Appel à la fonction d'extraction d'une séquence FSequC
' Résultat dans GStrFSequCResu, et reste dans GStrFSequCReste
' Est séquence toute suite de caractère soit nombre soit autre

Dim IntDiv As Integer, StrNombre As String, _
IntNombre As Integer, _
StrReste As String

GIntFPlusHaut = 0
StrNombre = ""
StrReste = StrToto
GStrFPlusHautErr = ""

For IntDiv = 0 To 9999

If StrReste = "" Then 'Fin de combinaison atteinte
Exit For
End If

FSequC StrReste 'Obtention séquence suivante
StrReste = GStrFSequCReste 'Mise à jour du reste à traiter
StrNombre = GStrFSequCResu 'Mouvementation du résultat

' If IsNumeric(StrNombre) = True Then 'C'est bien un nombre
If GBooFSequCNombre = True Then

IntNombre = CInt(StrNombre)

If IntNombre = 0 Then 'La liste zéro est interdite
GStrFPlusHautErr = "Renvoi interdit à une liste zéro: " & _
"les listes d'éléments commencent par le nombre 1"
Exit Sub
End If

If IntNombre > GIntFPlusHaut Then 'Stockage du plus haut nombre
GIntFPlusHaut = IntNombre
End If

End If
Next IntDiv

End Sub

Private Sub FSequC(StrToto As String)

'extraction d'une séquence
' Résultat dans GStrFSequCResu, et reste dans GStrFSequCReste
' Est séquence toute suite de caractère soit nombre soit autre
' Indication numéricité dans GBooFSequCNombre

GBooFSequCNombre = False

If StrToto = "" Then
MsgBox ("Erreur programme: FSequC, StrToto est vide")
End If

Dim IntDiv As Integer, IntCarNum As Integer, IntCar1Num As Integer, _
StrCar As String

StrCar = Mid(StrToto, 1, 1)
IntCar1Num = InStr(1, "0123456789", StrCar)

If IntCar1Num 0 Then
GBooFSequCNombre = True
End If

'arrêter IntDiv sur le caractère induisant la rupture de séquence
For IntDiv = 2 To 9999
If IntDiv > Len(StrToto) Then 'si fin de chaîne, IntDiv vaut plus 1
Exit For
End If
StrCar = Mid(StrToto, IntDiv, 1) 'Obtention caractère
IntCarNum = InStr(1, "0123456789", StrCar) 'Test si caractère numérique
If IntCar1Num = 0 And IntCarNum 0 Then 'd'un numéro on passe à un carac.
Exit For
End If
If IntCar1Num 0 And IntCarNum = 0 Then 'd'un carac. on passe à un numéro
Exit For
End If
Next IntDiv

'extraire la séquence située avant la rupture
GStrFSequCResu = Mid(StrToto, 1, IntDiv - 1)
If IntDiv > Len(StrToto) Then
GStrFSequCReste = ""
Else
GStrFSequCReste = Mid(StrToto, IntDiv)
End If
End Sub





Private Sub CmdEnr_Click()
Dim V$, CRLF$, StrLine As String, Ind As Integer, _
IntLong As Integer, IntLongLine As Integer, _
IntLenV As Integer

CRLF$ = Chr$(13) + Chr$(10)

If TxtRecapPathFic.Text = "" _
Or InStr(1, GStrPathFic, ":") = 0 _
Or InStr(1, GStrPathFic, "\") = 0 _
Or InStr(1, GStrPathFic, ".") = 0 Then
MsgBox ("Nom de chemin ou de fichier invalide")
Exit Sub
End If

V$ = Txt1.Text

Open TxtRecapPathFic.Text For Output As #1

IntLong = 0
For Ind = 0 To 9999

If Len(V$) = 0 Then
Exit For
Else
FRecupLigne V$
V$ = GStrFRecupTexte
Print #1, GStrFRecupLigne
End If

Next Ind

Close #1

End Sub

Private Sub CmdEnrResu_Click()
Dim V$, CRLF$, StrLine As String, Ind As Integer, _
IntLong As Integer, IntLongLine As Integer, _
IntLenV As Integer

CRLF$ = Chr$(13) + Chr$(10)

If TxtRecapPFResu.Text = "" _
Or InStr(1, GStrPathFic, ":") = 0 _
Or InStr(1, GStrPathFic, "\") = 0 _
Or InStr(1, GStrPathFic, ".") = 0 Then
MsgBox ("Nom de chemin ou de fichier invalide")
Exit Sub
End If

V$ = TxtResu.Text

Open TxtRecapPFResu.Text For Output As #1

IntLong = 0
For Ind = 0 To 9999

If Len(V$) = 0 Then
Exit For
Else
FRecupLigne V$
V$ = GStrFRecupTexte
Print #1, GStrFRecupLigne
End If

Next Ind

Close #1

End Sub

Private Sub CmdFleche_Click()
'Ajoute le texte de Tirage à celui des résultats
Dim CRLF$
CRLF$ = Chr$(13) + Chr$(10)
If TxtResu.Text "" _
And TxtTir.Text "" Then
TxtResu.Text = TxtResu.Text & CRLF$
End If
TxtResu.Text = TxtResu.Text & TxtTir.Text
End Sub

Private Sub CmdLire_Click()
Dim V$, CRLF$, StrLine As String

If TxtRecapPathFic.Text = "" _
Or InStr(1, GStrPathFic, ":") = 0 _
Or InStr(1, GStrPathFic, "\") = 0 _
Or InStr(1, GStrPathFic, ".") = 0 Then
MsgBox ("Nom de chemin ou de fichier invalide")
Exit Sub
End If

CRLF$ = Chr$(13) + Chr$(10)

Txt1.Text = ""

V$ = ""
StrLine = ""
Open TxtRecapPathFic.Text For Input As #1 ' Open file.
Do While Not EOF(1) ' Loop until end of file.
Line Input #1, StrLine ' Read line into variable.
' MsgBox ("CmdLire,StrLine='" & StrLine & _
' ",Len(StrLine)=" & Len(StrLine) & _
' ",Len(V$)=" & Len(V$))
StrLine = StrLine + CRLF$
' StrLine = Space$(2) + StrLine + CRLF$
V$ = V$ + StrLine
Loop
Close #1

Txt1.Text = V$
End Sub


Private Sub CmdLireResu_Click()
Dim V$, CRLF$, StrLine As String

If TxtRecapPFResu.Text = "" _
Or InStr(1, GStrPathFic, ":") = 0 _
Or InStr(1, GStrPathFic, "\") = 0 _
Or InStr(1, GStrPathFic, ".") = 0 Then
MsgBox ("Nom de chemin ou de fichier invalide")
Exit Sub
End If

CRLF$ = Chr$(13) + Chr$(10)

TxtResu.Text = ""

V$ = ""
StrLine = ""
Open TxtRecapPFResu.Text For Input As #1 ' Open file.
Do While Not EOF(1) ' Loop until end of file.
Line Input #1, StrLine ' Read line into variable.
' MsgBox ("CmdLire,StrLine='" & StrLine & _
' ",Len(StrLine)=" & Len(StrLine) & _
' ",Len(V$)=" & Len(V$))
StrLine = StrLine + CRLF$
' StrLine = Space$(2) + StrLine + CRLF$
V$ = V$ + StrLine
Loop
Close #1

TxtResu.Text = V$
End Sub


Private Sub CmdTermin_Click()
Unload Me
End Sub



Private Sub CmdTirer_Click()
'Tirer une combinaison au hasard entre 0 et GIntTotComb

If GIntMaxNbComb = -1 Then
MsgBox ("Pour prendre en compte les paramètres, cliquer sur 'Appliquer'")
Exit Sub
End If

'To produce random integers in a given range, use this formula:
'Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
'Here, upperbound is the highest number in the range, and
'lowerbound is the lowest number in the range.
' IntSelection = Int((IntMax + 1) * Rnd)
' MyValue = Int((6 * Rnd) + 1)

'Ensuite, s'arrêter sur la combinaison dont la fréquence
'correspond
'ex: comb1=1, comb2=2 ; GIntTotComb = 2 (zéro significatif) ;
' si IntTir littéral = 2, alors il désigne comb2
' IntTir + 1 -> IntBoite
' retirer de IntBoite chaque fréquence (littérale) de combinaison
' jusqu'à ce que IntBoite < fréquence
' IntBoite = 2 > fréquence comb1 ; IntBoite = 1 = 2 - fréquence comb1 0 Then
If IntBoite > GTblCombFrequ(IntDiv) Then
IntBoite = IntBoite - GTblCombFrequ(IntDiv)
Else
Exit For
End If
End If
Next IntDiv

StrComb = GTblComb(IntDiv)

' MsgBox ("Combinaison: " & IntTir & " sur " & GIntTotComb & " = " & StrComb)

'A partir de la combinaison tirée, extraction des séquences jusqu'à
'la fin des séquences de la combinaison
'Pour chaque séquence non chiffre, ajout à TxtTir
'Pour chaque séquence chiffre, ajout d'un élément aléatoire de la liste
'correspondant au nombre

StrReste = StrComb

For IntDiv = 0 To 9999

If StrReste = "" Then 'Fin de combinaison atteinte
Exit For
End If

FSequC StrReste 'Obtention séquence suivante
StrReste = GStrFSequCReste 'Mise à jour du reste à traiter
StrNombre = GStrFSequCResu 'Mouvementation du résultat

If GBooFSequCNombre = False Then 'N'est pas un nombre
If GStrFSequCResu "+" Then
StrAdd = GStrFSequCResu
StrInter = StrInter + StrAdd
If Len(StrInter) > 45 Then
TxtTir.Text = TxtTir.Text + Chr$(13) + Chr$(10) + StrAdd
StrInter = ""
Else
TxtTir.Text = TxtTir.Text + StrAdd
End If
End If
Else
IntNombre = CInt(StrNombre) 'Est un nombre
IntNombre = IntNombre - 1 'Le nombre de la liste rendu non littéral

IntNb = GTblIntTotEle(IntNombre) 'Echelle = total combinaisons
' l'échelle est exprimée littéralement
IntTir = Int((IntNb * Rnd) + 1) 'Nombre au hasard dans l'échelle, littéral

' MsgBox ("Tirage élé StrNombre=" & StrNombre & ",IntNombre=" & IntNombre & _
' ",IntNb=" & IntNb & ",IntTir=" & IntTir)
'
' MsgBox ("Element: liste " & IntNombre & " valeur " & IntTir & _
' " CF Tirage max = " & IntNb & _
' " GTblIntTotEle(IntNombre - 1) = " & GTblIntTotEle(IntNombre))

IntBoite = IntTir

For IntDiv2 = 0 To 999 'Recherche de la fréquence

IntFrq = GTblEleFrequ(IntNombre, IntDiv2)
If IntFrq > 0 Then
If IntBoite > GTblEleFrequ(IntNombre, IntDiv2) Then
IntBoite = IntBoite - GTblEleFrequ(IntNombre, IntDiv2)
Else
Exit For
End If
End If
Next IntDiv2

' TxtTir.Text = TxtTir.Text + GTblEle(IntNombre, IntDiv2)
StrAdd = GTblEle(IntNombre, IntDiv2)
StrInter = StrInter + StrAdd
If Len(StrInter) > 45 Then
TxtTir.Text = TxtTir.Text + Chr$(13) + Chr$(10) + StrAdd
StrInter = ""
Else
TxtTir.Text = TxtTir.Text + StrAdd
End If
' MsgBox (IntTir + 1 & " sur liste " & IntNombre + 1 & " avec max. " & IntNb & _
' " = " & GTblEle(IntNombre, IntDiv2))

End If
Next IntDiv

End Sub

Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub

Private Sub Dir1_GotFocus()
File1.Path = Dir1.Path
End Sub


Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub



Private Sub File1_Click()
Dim StrJoin As String, Resp As Variant
StrJoin = ""

GStrPath = File1.Path
GStrFic = File1.filename

If Right(File1.Path, 1) "\" Then
StrJoin = "\"
End If

GStrPathFic = GStrPath & StrJoin & GStrFic

' TxtRecapPathFic.Text = GStrPathFic
' TxtFic.Text = ""

Resp = MsgBox("Ce fichier est-il un fichier paramètres?", _
vbYesNo, "Sélection d'un type de fichier")

If Resp = vbYes Then
TxtFic.Text = GStrFic
' TxtRecapPathFic.Text = GStrPathFic
Else
If Resp = vbNo Then
TxtFicResu.Text = GStrFic
' TxtRecapPFResu.Text = GStrPathFic
End If
End If

End Sub

Private Sub Form_Load()
Dim V$, CRLF$, StrLine As String

'Charger le chemin de l'appli dans Drive1 et Dir1
Drive1.Drive = App.Path
Dir1.Path = App.Path

Randomize

GIntMaxNbComb = -1 'Init index de table de combinaisons à aucun poste

' Dim Yoyo As String
' Yoyo = "123!456?789?!"
' FRecupInstr Yoyo
' MsgBox (Yoyo & " ->'" & GStrFRInstr & "'" & GStrFRInstrReste & "'")


End Sub



Private Sub TxtFic_Change()
Dim StrJoin As String
StrJoin = ""

GStrPath = File1.Path
GStrFic = TxtFic.Text

If Right(File1.Path, 1) "\" Then
StrJoin = "\"
End If

GStrPathFic = GStrPath & StrJoin & GStrFic
TxtRecapPathFic.Text = GStrPathFic

End Sub


Private Sub TxtFicResu_Change()
Dim StrJoin As String
StrJoin = ""

GStrPath = File1.Path
GStrFic = TxtFicResu.Text

If Right(File1.Path, 1) "\" Then
StrJoin = "\"
End If

GStrPathFic = GStrPath & StrJoin & GStrFic
TxtRecapPFResu.Text = GStrPathFic

End Sub


-----------------------------------------------
FrmGenMots.frx
-----------------------------------------------
T
i
r
a
g
e
-----------------------------------------------
FrmHlp.frm
-----------------------------------------------
VERSION 4.00
Begin VB.Form FrmHlp
BackColor = &H00C0FFC0&
BorderStyle = 1 'Fixed Single
Caption = "Aide du générateur aléatoire à combinaisons et listes paramétrables"
ClientHeight = 7515
ClientLeft = 1320
ClientTop = 600
ClientWidth = 9750
Height = 7920
Left = 1260
LinkTopic = "Form2"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 0
ScaleWidth = 0
Top = 255
Width = 9870
Begin VB.CommandButton CmdOK
Caption = "OK"
Height = 495
Left = 7920
TabIndex = 1
Top = 0
Width = 1455
End
Begin VB.TextBox TxtHlp
BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}
Name = "Times New Roman"
Size = 12
Charset = 0
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 6615
Left = 240
Locked = -1 'True
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 0
Top = 600
Width = 9255
End
End
Attribute VB_Name = "FrmHlp"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Private Sub CmdOK_Click()
Unload Me
End Sub


Private Sub Form_Load()
Dim StrExtr As String, StrToto As String, _
StrTout As String, CRLF$

CRLF$ = Chr$(13) + Chr$(10)

If Right(App.Path, 1) "\" Then
StrToto = App.Path + "\" + "GenComb.txt"
Else
StrToto = App.Path + "GenComb.txt"
End If

Open StrToto For Input As #3
Do While Not EOF(3)
Line Input #3, StrExtr
StrTout = StrTout + StrExtr + CRLF$
Loop

Close #1
TxtHlp.Text = StrTout

End Sub


5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 nov. 2012 à 23:34
Piouf !
Quel coq !
Vindiou, y-avait longtemps qu'on nous avait pas publié la bible !

Je plaisante, mais honnètement, je ne pense pas que qqun puisse avoir le courage de lire un cahier des charges aussi détaillé.
A la fin, il semble y avoir du code.
As-tu donné ce code à manger à ton éditeur VB ?
VB (2005, 2008, 2011, ...) sont capable d'upgrader une appli VB6.
As-tu essayé ?
En quelle version est ton programme ? VB4, donc un projet .MAK
Dans ce cas, il faudra passer par une mise à niveau VB6 avant, mais si tu n'utilises pas de composant (ActiveX) trop complexe, cela devrait être simple.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Je confirme qu'à la fin il y a bien le code source, et il marchait à l'époque, en 2000 (sinon je n'aurais pas publié ici ce code ). Je pense que la mise à niveau est possible à condition de connaître l'équivallent des "fonctions externes" (je ne sais même plus comment on appelait ça ) entre VB 4 et VB 6.

A l'époque, j'avais envie d'un programme générant aléatoirement des mots inventés pour des ConLangs (langues inventées ), ainsi que des poèmes aléatoires. Je ne pense pas qu'il existe un générateur de texte vraiment paramétrable, d'où l'idée de faire ça . Le concept a l'air compliqué , parce que son point de vue est simplement plus en amont qu'un quelconque générateur de texte non paramétrable.

Mais bon, j'essaierai peut-être un jour de me remettre à l'informatique et de recoder ça dans un langage libre . Et s'il se trouve par grand hasard un ou une archéologue pour s'intéresser à cet artefact préhistorique , voici mon adresse chez laposte point net : uliwi

Merci de votre attention.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 déc. 2012 à 15:21
Depuis tout à l'heure, j'ai fait du copier coller de ton code sous VB6 et cela fonctionne - je n'ai pas bien compris le but du programme, mais bon, il n'y a pas d'erreur et les objets utilisés sont tous simples (textbox, commandButton ...)
Par contre, je pensais pouvoir tester la migration sous .Net mais j'ai un souci.
Sous .Net 2005, il m'est arrivé de faire des essais de migration.
Maintenant que je n'ai plus que les VB 2008 et 2010 installés, voilà que cette option de conversion à partir d'un projet VBP (VB6) a disparu.
J'enquête, mais il semble que MS ait abandonné cette fonction pour la laisser aux sociétés tierces et là, ce n'est pas gagné (payant, complexe, ...)
Sous 2008, je n'ai pas de menu "Convertir" et sous 2010, le menu "Convertir" n'a aucun 'wizard' installé.

Je me repencherai dessus ce week-end si j'ai le temps.
En attendant, si qqun sait comment faire apparaitre ces outils de migration sous 2008 ou 2010, je suis preneur.
0
Merci à toi!

(Ah! si je pouvais l'installer chez moi, j'en serai ravi... Bon mais rien d'urgent ni de très utile non plus.)

Un générateur a un but ludique. Un générateur de texte aléatoire en est un exemple (voir ci dessous le genre d'"utilité").

Je réponds ici un peu rapidement avant de partir en w.e., pardon si je suis confus !


Est-ce que ça n'existerait pas déjà quelque part?
-------------------------------------------------------

Je me demande à présent s'il existe déjà un générateur de texte aléatoire entièrement paramétrable. Autrefois non, ça n'existait pas, même assez récemment. Mais il faut que je vérifie. Apparemment, il y a un article wikipedia sur le sujet des générateurs de texte aléatoires.

D'après mes premières recherches sur le sujet, de tels générateurs existeraient, je dois vérifier, et pardon du dérangement si ça existe déjà.


Exemples de générateurs de texte aléatoire pas ou peu paramétrables
------------------------------------------

Voici quelques exemples de générateurs de textes aléatoires trouvés sur Internet
http://francoib.chez-alice.fr/logotron/logotron.htm
http://www.faux-texte.com/patrick-sebastien-3.htm
http://angesatoll.free.fr/index.php?m=c&c=63

http://membres.multimania.fr/guillaumz/generateur.htm
A première vue, ce dernier est certes paramétrable, mais dans un cadre restreint, je suis entrain de le tester.


Exemples de "besoins" différents
--------------------------------

Mettons que j'ai besoin de tirer au hasard des plaques d'immatriculations, je code un programme qui tienne compte de la structure des plaques, avec un certain nombre de lettres, un numéro de département... Au besoin je peux préciser que les 75 sont plus nombreux que les 53, etc. Je peux coder un programme pour ça.

Si un autre jour je dois animer un jeu de rôle (j'ai été MJ), il me faut préciser un certain nombre de "monstres" ayant chacun :
- nombre de points de vie
- armure
- type d'arme et dégat
- dextérité
- éventuellement nombre de pièces d'or
- éventuellement un objet magique
- signe particulier
- comportement...
Je dois coder un autre programme.

Dans mon adolescence et même ensuite, je collectionnais les grammaires et inventais des langues exotiques. On appelle ça des ConLangs. C'était assez long de tirer au sort avec des dés les différents mots du vocabulaire, en tenant compte du fait que les sons n'ont pas tous la même fréquence, ainsi [a] est plus fréquent que [y] et [t] que [p] dans la plupart des langues. Et puis les sons diffèrent d'une langue à l'autre.
Donc pour chaque langue, je pourrais coder un programme différent.
NB: les langues n'ont pas les mêmes séquences de sons, pour faire simple:
- le japonais est formé de syllabes éventuellement allongées, diphtonguées [j] ou suivies d'un [n]
- en arabe, on a Consonne-voyelle et éventuellement consonne pour chaque syllabe
- en sioux, on a une séquence de une à deux consonnes suivies d'une voyelle.
Tandis que l'Ubykh possède 97 consonnes différentes, le tahitien n'en a que 7 il me semble.
Donc il faudrait un programme différent pour répondre précisément à chaque besoin.


Origine et explication de mon programme
---------------------------------------

J'ai ainsi trouvé le besoin d'avoir un seul programme qui soit capable de répondre à différents besoins à condition que je lui précise exactement quoi faire.

Il vérifie puis interprète un fichier d'entrée qui définit des éléments à tirer au sort, éléments qui ont des fréquences éventuellement différentes et qui sont classés dans des listes différentes afin de pouvoir coder des structures comme pour les plaques d'immatriculation ou les syllabes.

D'abord le programme vérifie la cohérence du code du fichier input, puis il exécute ces instructions et alimente un fichier output.

Le défaut, c'est qu'il faut programmer un fichier d'entrée, mais la documentation explique comment faire.

Euh voili voilà, j'espère que c'est à peu près clair. Et encore merci pour avoir regardé!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 déc. 2012 à 12:50
lol, si ça, c'est une réponse rapide ...
Merci pour ces éclaircissements.
Perso, je n'en aurai pas l'utilité.
Même si les phrases générées n'ont pas de sens particulier, voire même utilisent des mots créés de toute pièce, une chose me choque :
Dans un exemple banal "Tu voit le houmu à l'aise" (pourquoi pas)
le "Tu est" avec un T me perturbe.
Y a t-il une règle liée aux conjugaisons de base ?
0
Rejoignez-nous