les chiffres et les lettres sur Spectrum 48K

Tous les Sinclair. Du Mk14 au QL

Modérateur : Politburo

Répondre
phil-nellier
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 16
Inscription : 28 oct. 2011 20:09

les chiffres et les lettres sur Spectrum 48K

Message par phil-nellier » 28 oct. 2011 20:38

Nouveau sur ce forum, je renoue avec la passion qui m'a habitée il y a de cela près de 30 ans lorsque j'ai fait mes premières armes en informatique sur ce petit bijou qu'est le ZX Spectrum.
J'ai toujours cet engin, avec toute une panoplie d'extensions allant du microdrive au lecteur de disquettes 5 pouces 1/4, et même du matériel de rechange. Mais ce qui m'a poussé à replonger dans le monde du Spectrum est l'existence d'émulateurs de qualité... Et dans ce monde où la mémoire ne coûte rien ou presque, où les programmes ne sont plus optimisés mais finissent par fonctionner rapidement à coup d'améliorations successives des performances matérielles, rien ne remplace le plaisir que j'ai eu à gratter jusqu'au moindre octet, à traquer les astuces afin de surmonter les difficultés liées à un matériel de puissance très réduite.
C'est ainsi que, poussé par cette idée de défi, j'ai mis au point un programme des Chiffres et des Lettres où mon vieil ami le Spectrum devient un adversaire avec qui compter !
Mais que de problèmes à traiter, au début je ne savais pas par où commencer. Comment créer un dictionnaire de près de 20000 combinaisons de mots, comment réduire le temps de calcul du "compte est bon" tout en employant une méthode récursive gérant toutes les combinaisons, etc.. La simple programmation en assembleur ne suffisait pas, il m'a fallu plonger dans la recherche d'algorithmes de calcul (division et produit) particulièrement performants, trouver des moyens de limiter le nombre de combinaisons utiles. Et pour les Lettres, trouver une méthode pour générer un nombre de mots assez important alors que la mémoire restante en complément du programme ne permettait a priori qu'un dictionnaire bien pauvre de l'ordre de 4500 mots de 6 lettres de longueur en moyenne.

Je me propose, si ce sujet intéresse, de décortiquer avec vous le détail des astuces et algorithmes utilisés.
Et si certains le souhaitent, je puis aussi vous transmettre le programme résultant en fichier .snap, cela vous permettra de tester si vous êtes meilleurs qu'un petit Spectrum..
Et puis, je ne suis probablement pas le seul à s'être intéressé à ce casse-tête, non ? :lol:

Avatar de l’utilisateur
gilles
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3278
Inscription : 17 avr. 2007 21:25
Localisation : 44
Contact :

Re: les chiffres et les lettres sur Spectrum 48K

Message par gilles » 28 oct. 2011 23:45

un dictionnaire se prête assez bien à une compression type LZ. Mais le temps de réponse risque de devenir un problème.
Il y a probablement des codages spécifiques permettant à la fois la recherche et la décompression.

phil-nellier
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 16
Inscription : 28 oct. 2011 20:09

Re: les chiffres et les lettres sur Spectrum 48K

Message par phil-nellier » 29 oct. 2011 11:24

Merci de cette piste intéressante. Cependant, la taille du code nécessaire à la compression et à la décompression est à mon avis assez conséquente (probablement 5 ko, peut-être 7) et réduirait d'autant la taille du dictionnaire, soit une perte de 20 à 25 % sur les 27 k restant disponibles une fois enlevée la place mémoire occupée par le programme, les variables, la pile de calcul, etc..
Ensuite, le temps de traitement risque de poser effectivement un gros problème, le temps imparti étant de 30 s.
J'ai opté pour une solution nettement moins gourmande en espace mémoire et extrêmement rapide (toutes les correspondances possibles dans un groupe de 10 lettres sont ainsi trouvées en moins de 10 secondes). Voici cette solution.
Les lettres A à Z sont codées en 8 bits de 65 à 90. Un simple décalage les cantonne entre les valeurs 1 à 26, qui ont l'avantage de n'utiliser que les bits 0 à 4, laissant à 0 les bits 5, 6 et 7. Dans ces conditions ces 3 bits peuvent former 7 combinaisons : 001,010,011,100,101,110,111. J'ai donc imaginé d'appliquer sur une ou plusieurs des lettres de chaque mot du dictionnaire un masque ajoutant des valeurs sur les 3 bits concernés. Ensuite des instructions de type AND et OR peuvent aisément isoler les combinaisons, ou restaurer le code original de chaque lettre.
Chacune des valeurs parmi les 7 combinaisons pointe sur une désinence applicable en préfixe ou en suffixe. Parmi des choix possibles, 001 pourra représenter le préfixe RE, 010 le préfixe DE, 011 le préfixe EN, 100 le suffixe e, 101 le suffixe es, 110 le suffixe s, 111 le suffixe r. La langue française contient des dizaines de milliers de mots sur lesquels ont peut greffer des préfixes fréquemment employés, et des suffixes comme ceux que je viens de citer (féminin, féminin plurier, pluriel, r pour infinitif).
En prenant un exemple, le mot GROUPE peut ainsi, en appliquant à chacune des six lettres du mot un masque de désinence, être associé aux désinences "DE", "RE" pour les préfixes, "E", "ES","S","R" pour les suffixes, et donner la série de combinaisons suivante, sachant qu'un préfixe et un suffixe peuvent être employés en même temps:
GROUPE,GROUPES,GROUPEE, GROUPEES,GROUPER,DEGROUPE,DEGROUPEE,DEGROUPES;DEGROUPEES,DEGROUPER,REGROUPE,REGROUPES,REGROUPEE,REGROUPEES,REGROUPER
Donc ici 15 mots à partir d'un seul. Bien sûr en moyenne le gain n'est pas aussi important, dans mon dictionnaire le gain atteint le facteur 5 et me permet d'engranger 20000 possibilités.
Et bien sûr aussi, sont favorisées les combinaisons employant les lettres d,e,n,r,s. Mais cela correspond assez bien aux lettres les plus fréquentes dans notre langue. Et en tout cas le résultat est là :
lors des parties tentées contr l'ordinateur, il s'avère un adversaire de fort bon niveau.

Avatar de l’utilisateur
gilles
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3278
Inscription : 17 avr. 2007 21:25
Localisation : 44
Contact :

Re: les chiffres et les lettres sur Spectrum 48K

Message par gilles » 29 oct. 2011 12:03

la compression n'a pas besoin d'être implémentée dans le programme (mais dans l'outil de conception du dictionnaire, qui peut être développé sur un PC/mac), des implémentations proches du LZ sur Z80 existent en +-200 octets.
Mais cette compression générique n'est effectivement qu'une solution rapide à implémenter mais lente à l'exécution.
Le fait d'utiliser des séquences plus courtes pour coder des chaines completes plus longue tel que décrit est finalement une méthode statique pour une combinaison de compression par dictionnaire.
Pour savoir quelle méthode est la plus adaptée il faut les comparer, mais 5 est déjà un bon taux, si la vitesse de décompression est satisfaisante et adaptée au besoin pas besoin d'aller plus loin.

qqs compressions génériques de la famille LZ adaptées au 8bits (décompression sur le micro 8bit - 6502 Z80 6809):
pucrunch
exomizer

phil-nellier
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 16
Inscription : 28 oct. 2011 20:09

Re: les chiffres et les lettres sur Spectrum 48K

Message par phil-nellier » 29 oct. 2011 13:55

gilles a écrit :Pour savoir quelle méthode est la plus adaptée il faut les comparer, mais 5 est déjà un bon taux, si la vitesse de décompression est satisfaisante et adaptée au besoin pas besoin d'aller plus loin.
qqs compressions génériques de la famille LZ adaptées au 8bits (décompression sur le micro 8bit - 6502 Z80 6809):
pucrunch
exomizer
Ne serait ce que par curiosité (car effectivement ce que j'ai fait répond aux objectifs que je m'étais fixés), je vais tout de même aller voir ces compressions génériques.. Merci du tuyau :roll: :idea:

Avatar de l’utilisateur
gilles
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3278
Inscription : 17 avr. 2007 21:25
Localisation : 44
Contact :

Re: les chiffres et les lettres sur Spectrum 48K

Message par gilles » 29 oct. 2011 14:10

une implémentation Z80 de l'exomizer (que l'on retrouve dans l'archive du site http://hem.bredband.net/magli143/exo/)

Code : Tout sélectionner

;Exomizer 2 Z80 decoder
; by Metalbrain
;
; compression algorithm by Magnus Lind

;input: 	hl=compressed data start
;		de=uncompressed destination start
;
;		you may change exo_mapbasebits to point to any free buffer

deexo:		ld	a,(hl)
		inc	hl
		ld	ixh,a

		ld	b,52
		ld	iy,exo_mapbasebits
		push	de
exo_initbits:	ld	a,b
		sub	4
		and	15
		jr	nz,exo_node1

		ld	de,1		;DE=b2
exo_node1:	ld	c,16
exo_gett4bits:	call	exo_getbit
		rl	c
		jr	nc,exo_get4bits
		ld	(iy+0),c	;bits[i]=b1

		push	hl
		inc	c
		ld	hl,0
		scf
exo_setbit:	adc	hl,hl
		dec	c
		jr	nz,exo_setbit
		ld	(iy+52),e
		ld	(iy+104),d	;base[i]=b2
		add	hl,de
		ex	de,hl
		inc	iy

		pop	hl
		djnz	exo_initbits
		pop	de

exo_mainloop:	ld	c,1		;lenght=1
		call	exo_getbit	;literal?
		jr	c,exo_literalcopy
		ld	c,255
exo_getindex:	inc	c
		call	exo_getbit
		jr	nc,exo_getindex
		ld	a,c		;C=index
		cp	16
		ret	z
		jr	c,exo_continue
		push	de
		ld	d,16
		call	exo_getbits
		pop	de
exo_literalcopy:ldir
		jr	exo_mainloop
exo_continue:	push	de
		call	exo_getpair
		ld	(exo_lenght+1),bc ;Store lenght
		ld	de,512+48	;2 bits, 48 offset
		dec	bc
		ld	a,b
		or	c
		jr	z,exo_goforit	;1?
		ld	de,1024+32	;4 bits, 32 offset
		dec	bc
		ld	a,b
		or	c
		jr	z,exo_goforit	;2?
		ld	e,16		;16 offset
exo_goforit:	call	exo_getbits
		ld	a,e
		add	a,c
		ld	c,a
		call	exo_getpair
		pop	de		;bc=offset
		push	hl		;de=destination
		ld	h,d
		ld	l,e
		sbc	hl,bc		;hl=origin
exo_lenght:	ld	bc,0		;bc=lenght
		ldir
		pop	hl		;Keep HL, DE is updated
		jr	exo_mainloop	;Next!

exo_getpair:	ld	iy,exo_mapbasebits
		ld	b,0
		add	iy,bc
		ld	d,[iy+0]
		call	exo_getbits
		ld	a,c
		add	a,[iy+52]
		ld	c,a
		ld	a,b
		adc	a,[iy+104]
		ld	b,a
		ret

exo_getbits:	ld	bc,0
exo_gettingbits:dec	d
		ret	m
		call	exo_getbit
		rl	c
		rl	b
		jr	exo_gettingbits

exo_getbit:	ld	a,ixh
		srl	a
		ld	ixh,a
		ret	nz
		ld	a,(hl)
		inc	hl
		rra
		ld	ixh,a
		ret

exo_mapbasebits:defs	156	;tables for bits, baseL, baseH

phil-nellier
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 16
Inscription : 28 oct. 2011 20:09

Re: les chiffres et les lettres sur Spectrum 48K

Message par phil-nellier » 29 oct. 2011 17:01

Merci pour le code que j'étudierai à tête reposée. :wink:

Une méthode basée sur la compression décompression doit être examinée pour évaluer son intérêt et sa faisabilité.
Supposons que je dispose au total pour les data d'environ 30000 octets.
Après avoir créé par une méthode quelconque un dictionnaire en clair, il faut donc commencer par générer une version "zippée".

Ensuite, le programme de jeu charge le dictionnaire comprimé.
Si on utilise une routine de recherche (logée au-delà des 30000 octets de RAM réservée aux data à traiter), elle doit faire appel au dictionnaire en décompressant celui-ci par paquets, puis traiter le paquet par la routine de recherche, puis à nouveau décompresser un paquet, et ainsi de suite.
Il est clair que l'algorithme de décompression peut être gourmand en temps, et il faut donc limiter le nombre de décompressions.

En réalité il va falloir trouver un juste milieu entre la taille de la zone compressée et la taille réservée au stockage d'un paquet décompressé à traiter par la routine de recherche.

supposons un taux moyen de compression de 80 %, (ou un facteur de compression de 5).
Si le dictionnaire compressé occupe 20000 octets, 10000 restent utilisables pour des data décompressés. Ces 10000 sont générés à partir de : 10000 / 5 = 2000 octets du
dictionnaire compressé, et il faut donc faire 10 appels pour décomprimer par paquet de 2000 le dictionnaire.

Comparons pour ce facteur de compression cette méthode (numérotée 1) avec la méthode (2) de décompression statique que j'emploie :
rappelons que celle-ci permet d'utiliser les 30000 octets pour le dictionnaire pour générer 5 fois plus de combinaisons que les mots stockés,
soit un taux d'extension exactement identique au facteur de compression de la méthode 1).
Méthode 1 : le dictionnaire total avant compression occupe 20000 x 5 = 100 000 octets
Méthode 2 : le dictionnaire total est équivalent à 30000 x 5 = 150000 octets de données entrées par mots successifs sans codage.
La seconde méthode l'emporte donc largement dans cette hypothèse.

Si D est la taille du dictionnaire avant compression, T la mémoire disponible, n le nombre de paquets
successifs à décompresser, f le facteur de compression (5 pour une compression de 80%), la formule
suivante permet de calculer le taux de compression à obtenir

f=nD/(nT-1)
Appliquons cette formule pour D=150000 octets, et T=30000 octets de RAM
Si on suppose que l'on veut traiter 6 paquets successifs (au-dessous c'est impossible, division par zéro ou résultat négatif)
f prend une valeur de 30 soit un taux de compression de 97 % !
Si on admet de traiter 10 paquets, f=10 et le taux nécessaire est de 90 %
Tout dépend donc de l'efficacité de l'algorithme de compression, mais on voit que la barre est haute !
Cela dit d'autres facteurs interviennent, notamment la longueur des mots obtenus en moyenne dans ma méthode qui va certainement jouer dans la comparaison entre les deux méthodes, mais ce n'est pas très facile à évaluer... :?:

Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Inscription : 10 mars 2006 16:48
Contact :

Re: les chiffres et les lettres sur Spectrum 48K

Message par Xavier » 29 oct. 2011 20:33

Salut,

L'intéret de la compression n'est elle pas dans le stockage?
Il faudra de toute façon décompresser des "bouts" de dico....

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2483
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: les chiffres et les lettres sur Spectrum 48K

Message par C.Ret » 29 oct. 2011 22:21

Bonsoir,

la discussion me semble fort interessante.

Je programme toujours sur mon vieil Commodore (ou son émulateur), entre autre pour l'intérêt et la curiosité et la satistaction de pouvoir comprendre et réaliser facilemetn et rapidement de petit exemple qui me permettent de mieux comprendre l'intérêt de ceraines techniques de programmation qui sur des système pus performant ou plus complee l'échappe en tout ou partie.


Cete discussion me semble donc interressante car elle soulève un point imporant; pour augmenter la performance du programme, faut-il un dictionnaire plus étendu ?
Si oui, la nécessité de le compresser pose un problème d'efficacité.

Qu'un système peu performant doive fournir un résultat dans un temps limité relativemetn court est un challange.
S'il doit, lors de la recherche cnstammetn décompresser le dictionnaire, ne risque-t-il pas de "perdre son temps" et risquer de ne jamais trouver une solution efficace pour peu, par exemple que les mots interessants pour faire des point (mots le plus long - si je me souviens bien des régles de ce jeu) se trouve en fin de dictionnaire.

Une compression non générique, mais basée sur une astuce de l'algorithme de recherche me semble plus adaptée, car alors en quelque sorte, le système en "déployant" uniquement les branches utiles de son dictionnaire fera en quelqeu sorte coup double:
il décompresse sélectivement tout en avançant plus efficacement de sa recherche.


Par ailleurs, je n'ai pas bien compris le principe du codage.
L'astuce de coder les lettre sur 4 bits (les 26 lettre de notre alphabet tiennent sur 5 bits (0 à 31 positions). SUr chaque octet, il reste donc 3 bits pour le "codage" de préfixes ou suffixes.
Si j'ai bien compris, en sélectionnant intelligemment ces suffixes et préfixce, on augmente considèrablement le nombre de mots dans le dictionnaires sans occuper plus de mémoire. Il s'agit bien d'une compression.

Par contre , il y a deux détails qui m'échappent. Ils n'ont rien à voir, mais je n'ai pas bien compris (ou je ne suis pas sûr d'avoir saisi toute la subtilité de la chose).

Sur un mot comme MARCHE, qui contient 6 lettres, on ne pourra donc coder que 6 mots voisins qui auront la racine MARCHE.
Ou alors , il ya une génération automatique des combinaisons ?

Code : Tout sélectionner

                                            DE-  RE-  -E -ES -S -R -??
MARCHE   en ASCII    77 65 82 67 72 69      
         décallé     13  1 18  3  8  5
         Hexa        0D 01 12 03 08 05      20   40   60  80 A0 C0 E0


   2D 01 12 03 08 05  = MARCHE + DEMARCHE

   AD 01 12 03 08 05  = MARCHE + MARCHER

   2D A1 12 03 08 05  = MARCHE + DEMARCHE + MARCHER + DEMARCHER

   2D A1 D2 03 08 05  = MARCHE + DEMARCHE + REMARCHE + MARCHER + DEMARCHER + REMARCHER
Si dan le dictionaire je met 2D 01 12 03 08 05 00, seul le mot MARCHE est présent.
Si par contra je met AD 01 12 03 08 05 00, le dictionnaire contient le mot MARCHE et le verbe MARCHER. Il y adonc deux fois plus de mots dans mon dictionnaire, sans pour autant utiliser un seul octet de plus. OK

Donc, si je comprends bien, les combinaisons sont systèmatiques, il ne faut donc pas entrer le code d'un suffixe ou d'un préfixe s'il une des combinaisons n'est pas possible (aucun exemple ne me viens en tête - mais l'idée me parait bonne).


Seconde question concerne l'adéquation de ces générations de combinaison avec la recherche elle-même. Lors de la recherche, toutes les combinaisons sont-elles essayées, ou y a t il une astuce qui les limite. Par exemple si dans le tirage intial des lettres il n'y a plus de S , etc... ???

Dans le même ordre d'idée, il y a-t-il un dispositif qui limite la recherche aux seuls mots racines possibles (en fonction du tirage inital des lettres). Et dans ce cas, une compression systèmatique ou par un algorithme standard ne vient-elle pas endommager la stratégie du programme de recherche ?
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..

Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Inscription : 10 mars 2006 16:48
Contact :

Re: les chiffres et les lettres sur Spectrum 48K

Message par Xavier » 30 oct. 2011 11:17

Salut,
Oui, le codage sur les assemblages de mots est une bonne idée.
Mais, j'ai travaillé sur le dico de OpenOffice, avec le codage des mots... et parfois, on ce retrouve avec des mots bizarre.
Le plus difficile est le codage des règles grammaticales... avec ses particularités.

MARCHE verbe du premier groupe -> Marcher, Marches, Marche,Marchez, ...

Par contre, on ce retrouve avec des majuscules... donc avec moins de mots.
Dernière édition par Xavier le 02 nov. 2011 11:08, édité 1 fois.

phil-nellier
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 16
Inscription : 28 oct. 2011 20:09

Re: les chiffres et les lettres sur Spectrum 48K

Message par phil-nellier » 30 oct. 2011 12:56

C.Ret a écrit :Bonsoir,


Par contre , il y a deux détails qui m'échappent. Ils n'ont rien à voir, mais je n'ai pas bien compris (ou je ne suis pas sûr d'avoir saisi toute la subtilité de la chose).

Sur un mot comme MARCHE, qui contient 6 lettres, on ne pourra donc coder que 6 mots voisins qui auront la racine MARCHE.
Ou alors , il ya une génération automatique des combinaisons ?
Donc, si je comprends bien, les combinaisons sont systèmatiques, il ne faut donc pas entrer le code d'un suffixe ou d'un préfixe s'il une des combinaisons n'est pas possible (aucun exemple ne me viens en tête - mais l'idée me parait bonne).
Seconde question concerne l'adéquation de ces générations de combinaison avec la recherche elle-même. Lors de la recherche, toutes les combinaisons sont-elles essayées, ou y a t il une astuce qui les limite. Par exemple si dans le tirage intial des lettres il n'y a plus de S , etc... ???
Dans le même ordre d'idée, il y a-t-il un dispositif qui limite la recherche aux seuls mots racines possibles (en fonction du tirage inital des lettres). Et dans ce cas, une compression systèmatique ou par un algorithme standard ne vient-elle pas endommager la stratégie du programme de recherche ?
Nous entrons dans le vif du sujet, et tu as parfaitement saisi la méthode. Et je te répondrai sur les 2 points évoqués :
1) il y a bien génération automatique des combinaisons : l'algorithme cherche d'abord les préfixes, puis essaie d'ajouter un suffixe, en testant la longueur de mot obtenue. Enfin, si aucune de ces combinaisons ne fonctionne, il teste successivement les suffixes seuls. Cela implique de n'entrer que des combinaisons valides. Par exemple, pour le mot DORMI, on pourrait coder le préfixe EN et le suffixe ES, mais cela ne marcherait pas car si le mot combiné ENDORMIES est valide, ce n'est pas le cas de DORMIES sans préfixe. On devra donc arbitrer et choisir ou le préfixe, ou le suffixe mais pas les deux.
2) toutes les combinaisons sont essayées, car vu le temps de traitement de la totalité du dictionnaire (7 à 8 s) il est inutile de chercher à optimiser la recherche :wink:
A voir nos échanges sur cette première partie concernant les lettres, je sens que nous allons bien nous amuser lorsque nous évoquerons la deuxième partie du projet, "le compte est bon", pour lequel il y a nettement plus d'astuces successives pour optimiser l'algorithme, et dont je suis pas sür d'avoir exploré toutes les pistes ! :mrgreen:

Xavier
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 684
Inscription : 10 mars 2006 16:48
Contact :

Re: les chiffres et les lettres sur Spectrum 48K

Message par Xavier » 30 oct. 2011 13:26

Salut,
Outre le fait que le Spectrum, ne soit pas pas bonne machine pour cet exercice...
Pour une vérification simple d'un "Mot", il serait plus rapide de créer une tables CRC ou un checksum, sur l'ensemble des mots.
Avec 26 blocs de vérifications pour la première lettre.
Elle tiendra dans les 30k de la machine...
Cette vérification pourra aiguiller vers le chargement d'un fichier data en "bin" pour une vérification plus pointue.
Donc, mot n°1= CRC:FE Lettre A.
Chargement du bloc "A", puis pointage sur le nombre de lettres... Puis, vérifications des mots purs un composés de la base de donnée.
Le traitement sera assez rapide, mais demande le chargement de la base de données sur microdrive.
Un bon nombre de programmes ont un classement des mots par nombre de lettres...

Pour les mots associés, "LA"+"MES"="LAMES"... il est difficile de jouer sur deux fichiers datas...
Surtout, que les liens pré/suffixes prendrons de la place et demanderont soit le chargement du fichier DATAs "M" et "L", soit les mots de deux lettres et trois lettres...
La machines passera son temps à charger des blocs de 30K.

phil-nellier
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 16
Inscription : 28 oct. 2011 20:09

Re: les chiffres et les lettres sur Spectrum 48K

Message par phil-nellier » 30 oct. 2011 13:55

Bonjour,

Je ne suis pas sûr d'avoir totalement compris ce que tu proposes, mais j'essaie de te répondre sur quelques points essentiels !

Xavier a écrit :Salut,
Outre le fait que le Spectrum, ne soit pas pas bonne machine pour cet exercice...
c'est ce qui fait l'intérêt du problème, évidemment :mrgreen: :mrgreen:
Pour une vérification simple d'un "Mot", il serait plus rapide de créer une tables CRC ou un checksum, sur l'ensemble des mots.
il ne s'agit pas de vérifier un mot, mais de trouver les combinaisons utilisant tout ou partie des lettres d'un tirage
Avec 26 blocs de vérifications pour la première lettre.
Elle tiendra dans les 30k de la machine...
Cette vérification pourra aiguiller vers le chargement d'un fichier data en "bin" pour une vérification plus pointue.
Donc, mot n°1= CRC:FE Lettre A.
Chargement du bloc "A", puis pointage sur le nombre de lettres... Puis, vérifications des mots purs un composés de la base de donnée.
Le traitement sera assez rapide, mais demande le chargement de la base de données sur microdrive.
ceci à mon avis suffit à écarter l'hypothèse suggérée, le chargement sur microdrive prend chaque fois plusieurs secondes et le temps total imparti de 30 s serait bien vite atteint
Un bon nombre de programmes ont un classement des mots par nombre de lettres...
c'est aussi le cas dans mon algorithme, le dictionnaire comprend un en-tête pointant sur les adresses de début,fin de chaque série de mot de longueur n
Pour les mots associés, "LA"+"MES"="LAMES"... il est difficile de jouer sur deux fichiers datas...
Surtout, que les liens pré/suffixes prendrons de la place et demanderont soit le chargement du fichier DATAs "M" et "L", soit les mots de deux lettres et trois lettres...
La machines passera son temps à charger des blocs de 30K.

Avatar de l’utilisateur
gilles
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3278
Inscription : 17 avr. 2007 21:25
Localisation : 44
Contact :

Re: les chiffres et les lettres sur Spectrum 48K

Message par gilles » 30 oct. 2011 14:40

a mon avis xavier propose un algo pour de la vérification alors qu'ici on veut tout parcourir pour chercher les combinaisons possibles et donc le mot le plus long.
On peut toutefois exclure par la premiere lettre puisqu'on n'a que 9? lettres alors on peut ne parcourir que les 9 sections du dico correspondant (gain de x2.5).

[edit]
en fait un peu moins car le tirage des lettres favorise les plus courantes, qui ont malheureusement les plus grandes sections de dico (surtout pour les consonnes).

phil-nellier
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 16
Inscription : 28 oct. 2011 20:09

Re: les chiffres et les lettres sur Spectrum 48K

Message par phil-nellier » 30 oct. 2011 15:16

gilles a écrit :a mon avis xavier propose un algo pour de la vérification alors qu'ici on veut tout parcourir pour chercher les combinaisons possibles et donc le mot le plus long.
On peut toutefois exclure par la premiere lettre puisqu'on n'a que 9? lettres alors on peut ne parcourir que les 9 sections du dico correspondant (gain de x2.5).
c'est bien ce que j'avais compris de l'algo de Xavier, d'où ma première remarque à son message :wink: .

[edit]
en fait un peu moins car le tirage des lettres favorise les plus courantes, qui ont malheureusement les plus grandes sections de dico (surtout pour les consonnes).

Répondre

Revenir vers « Sinclair »