[Challenge Mono-ligne] Calcul d'indice

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4411
Inscription : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par charognard » 13 févr. 2015 23:06

Alors ça tient en 1 ligne ok
Mais si je tape ZZ ça me donne AA au lieu de AAA !


il manque un truc et là ça va être problématique pour la limitation à 80 octets

Au passage je subodore que tu l'as fais sur un G850 ou un truc comme cela car tu dépasse les 80 octets là (sans parler du -1 sur le true des tests booléens).

En 80 c'est tenable et en plus on peut aussi intégrer la gestion majuscules et les minuscules

Avatar de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2498
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

Re: [Challenge Mono-ligne] Calcul d'indice

Message par zpalm » 13 févr. 2015 23:21

gege a écrit : Ah OK j'ai compris !
Voici une solution :

Code : Tout sélectionner

10 A=1:E$="":INPUT B$:FOR I=LEN(B$) TO 1 STEP -1:C=A+ASC MID$(B$,I,1):D=-(C>90):C=C-26*D:A=D:E$=(CHR$ C)+E$:NEXT I:PRINT E$:END
Sur le PC-1403 je suis bloqué sur le NEXT, je n'arrive pas à entrer la fin de la ligne.

Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7180
Inscription : 31 janv. 2008 15:24
Localisation : Banlieue Paârisienne
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par gege » 13 févr. 2015 23:23

Bonjour,
Très très fort Monsieur Charo, c'est bien un G850 !
S ou V ?? :wink:

Tu as bien raison, ajouter un "A" en cas de dépassement semble possible, mais le coup des 80 octets me semble en effet compliqué.

Ton challenge pourrait fièrement figurer parmi les MPO...
Je continue à chercher, et passe sur le 1500.
G.E.

EDIT : on peut un peu gratter avec :

Code : Tout sélectionner

10 A=1:E$="":INPUT B$:FOR I=LEN B$ TO 1 STEP -1:C=A+ASC MID$(B$,I,1):A=-(C>90):C=C-26*A:E$=CHR$ C+E$:NEXT I:PRINT E$
EDIT 2 : Bon je n'avais pas lu les autres solutions, qui utilisent déjà ce principe, et contiennent le coup de la retenue ... :arrow:
Dernière édition par gege le 13 févr. 2015 23:53, édité 4 fois.

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4411
Inscription : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par charognard » 13 févr. 2015 23:27

Attention le choix de la machine à son importance dans le challenge !
et Le 1500 ..... j'en ai trop dis ;)


Sinon je dirais un G850V

Avatar de l’utilisateur
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7180
Inscription : 31 janv. 2008 15:24
Localisation : Banlieue Paârisienne
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par gege » 13 févr. 2015 23:36

charognard a écrit :Sinon je dirais un G850V
8O Encore gagné !
Mais là c'est plutôt le moment de jouer au Loto :lol:
charognard a écrit :Attention le choix de la machine à son importance dans le challenge !
et Le 1500 ..... j'en ai trop dis ;)
Héhé je parie sur le HP71B, qui permet d'accéder aux caractères en indiçant la chaîne.
Alors, 1 partout :?:
J'allume le 71...
G.E.

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4411
Inscription : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par charognard » 13 févr. 2015 23:40

Sur mon premier post je conseille sur SHARP
et mon programme fonctionne parfaitement sur SHARP (du moins certains) sans instructions paranormales ;)

Avatar de l’utilisateur
Rom1500
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 701
Inscription : 29 nov. 2013 17:24
Localisation : Pas très loin de Lyon
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par Rom1500 » 14 févr. 2015 11:34

Ca ne rentre toujours pas sur une ligne… ARGH ! :lol:
10:CLEAR :R=1:INPUT A$:FOR I=LEN A$TO 1STEP -1
20:A=R+ASC MID$ (A$,I,1):R=A>90:B$=CHR$ ((I=1)*R*65)+CHR$ (A-26*R)+B$:NEXT I:BEEP 1:PRINT I;

Mais ça ajoute bien une lettre au début en cas de dépassement.
D'ailleurs elle ne peut être ajoutée qu'au début… d'où CHR$ ((I=1)*R*65)
Dernière édition par Rom1500 le 14 févr. 2015 17:36, édité 1 fois.
Toutes les infos : http://www.pc-1500.info
PC-1500+CE-150 : EU PC1500, PC1500A / JP PC1500, PC1500D, PC1501 / HU PTA4000, PTA4000+16 / US TRS80 PC2 / BR PC-1500RP, PC-1500RP2 / CN PC-1500, PC-1500A, Nanfeng PC-1500A
PC-1600 : PC-1600K V2, CE-1600M, CE-1604L, CE-515P, module 32Ko, module 512Ko
Extensions en boite : CE-150/151/152/153/154/155/156/157/158/159/160/161/162E/163 sans boite

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2288
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: [Challenge Mono-ligne] Calcul d'indice

Message par cgh » 14 févr. 2015 11:56

Bon, cela m'apprendras a pas lire l'enonce jusqu'au bout :roll:

Le programme corrige:

Code : Tout sélectionner

	.CODE
	PUSH	BC
	LD	L,00
strlen:
	LDI	(BC)
	JR	Z,endlen
	INC	L
	JR	strlen
endlen:
	LDA	L
	JR	Z,exitNONE
	PUSH	HL
	DEC	BC
	PUSH	BC
	DEC	BC
	DEC	L
loop:
	LDA	(BC)
	CPA	$Z
	JR	NZ,add+1
	LDA	$@
add+1:
	INC	A
	STD	(BC)
	CPA	$A
	JR	NZ,endloop
	DJC	loop
endloop:
	POP	BC
	POP	HL
	CPA	$A
	JR	NZ,exitNONE
	INC	L
	STI	(BC)
exitNONE:
	AND	(BC),00
	SCF
	POP	BC
	RET
	.END
Le source est relogeable n'importe ou. Ci-dessous liste avec les POKE pour etre implante en &40C5 (tous PC).

Code : Tout sélectionner

POKE &40C5,&FD,&88,&6A,&00,&45,&8B,&03,&60,&9E,&06,&24,&8B,&20,&FD,&A8,&46
POKE &40D5,&FD,&88,&46,&62,&05,&B7,&5A,&89,&02,&B5,&40,&DD,&43,&B7,&41,&89
POKE &40E5,&02,&88,&0F,&FD,&0A,&FD,&2A,&B7,&41,&89,&02,&60,&41,&49,&00,&FB
POKE &40F5,&FD,&0A,&9A
La checksum du code LM est &15B4.

En mode PRO faire:

Code : Tout sélectionner

NEW &40F8
10 INPUT A$:CALL &40C5,A$:PRINT A$:END
Le tout en 79 octets avec le petit programme BASIC. La routine LM ne fait que 51 octets !
On peut l'appeler directement en faisant:

Code : Tout sélectionner

<var$>="votre chaine"
CALL &40C5,<var$>
<var$>
Par exemple:

Code : Tout sélectionner

C$="AYZZ"
CALL &40C5,C$
C$
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4411
Inscription : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par charognard » 14 févr. 2015 16:30

Tu as encore mal lu !
Dans le premier post
Faire un programme en BASIC sur ordinateur...
Parce que en assembleur il n'y a pas de difficulté en fait.

Pour info d'ailleurs le CALL du PC1600 permet directement le passage d'une variable avec le CALL (Voir page 146 du manuel)
Avec, pour les variables alpha, dans DE le pointeur
et dans B la longueur
De cette façon on peut faire plus court.

Exemple : Call &adr,var
Dernière édition par charognard le 14 févr. 2015 16:49, édité 2 fois.

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2288
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: [Challenge Mono-ligne] Calcul d'indice

Message par cgh » 14 févr. 2015 16:36

charognard a écrit :Tu as encore mal lu !
Dans le premier post
Faire un programme en BASIC sur ordinateur...
Il y est !!!! Et il est certainement le plus rapide... :mrgreen:

Code : Tout sélectionner

10 INPUT A$:CALL &40C5,A$:PRINT A$:END
Si c'est comme ca, je vais bouder !
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4411
Inscription : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par charognard » 14 févr. 2015 17:04

De plus à la lecture j'ai l'impression que ZZ ne donne pas AAA!
Me tromperais-je ?

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2288
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: [Challenge Mono-ligne] Calcul d'indice

Message par cgh » 14 févr. 2015 17:10

charognard a écrit :De plus à la lecture j'ai l'impression que ZZ ne donne pas AAA!
Me tromperais-je ?
Oui. Avec "ZZ" on obtient bien "AAA" 8)

C'est sur PC1500. On peut aussi passer une variable a CALL avec CALL adr,var. L'adresse de la variable en est BC (X) et la longueur maximum est en A. Mais je doit calculer la longueur reelle.
Le code assembleur n'est pas obtimise.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque

Avatar de l’utilisateur
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4411
Inscription : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par charognard » 14 févr. 2015 19:38

Rom1500 a écrit :Ca ne rentre toujours pas sur une ligne… ARGH ! :lol:
10:CLEAR :R=1:INPUT A$:FOR I=LEN A$TO 1STEP -1
20:A=R+ASC MID$ (A$,I,1):R=A>90:B$=CHR$ ((I=1)*R*65)+CHR$ (A-26*R)+B$:NEXT I:BEEP 1:PRINT I;

Mais ça ajoute bien une lettre au début en cas de dépassement.
D'ailleurs elle ne peut être ajoutée qu'au début… d'où CHR$ ((I=1)*R*65)
Pas mal, il y a même le BEEP, mais c'est en 2 lignes ;)
J'arrive même a gérer le majuscule/minuscule en 1 LIGNE (Mais sans le BEEP dans ce cas)

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: [Challenge Mono-ligne] Calcul d'indice

Message par C.Ret » 14 févr. 2015 22:58

Juste une petite question.
Si j'entre AZ, la réponse attendue est BA ?

En attendant la version pour Ordinateur de Poche, voici celle pour Commodore C128D:

Code : Tout sélectionner

Octets:       1            2              3         4               5           6            7             8
 3 4     5678901234 5678  90     12345678901234567890123    45678  901  2345678901234   567890123456789    0     123     456789

 1 input a$:b$="":do:c=asc(right$("@"+a$,1)):f=c=90:a$=left$(a$,abs((len(a$)-1)):b$=chr$(1+c+26*f)+b$:loop while f:print a$;b$
Le problème est de mettre le C128D dans ma poche.
En attendant, une version pour Pocket; mais elle fait plus de 80 car.

Code : Tout sélectionner

Octets:              1                   2               4            5                    6              7         8                         9
 3 4     5 6     789 0   123 4  56 789   0      1234567890 1234 567 8901     2345   67   8901234 5678    90123456789012 3    45 6    78 9     0123456
 1 CLEAR : INPUT A$: FOR F=0 TO 1: C=ASC RIGHT$("@"+A$,1): F=C<>90: A$=LEFT$(A$,ABS (LEN A$-1)): B$=CHR$(C+26*F-25)+B$: NEXT F: BEEP 1: PRINT A$;B$:END
Dernière édition par C.Ret le 15 févr. 2015 00:54, édité 5 fois.
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..

remy
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2086
Inscription : 13 mars 2006 16:39
Localisation : Issy
Contact :

Re: [Challenge Mono-ligne] Calcul d'indice

Message par remy » 14 févr. 2015 23:22

Je pense que le

Code : Tout sélectionner

FOR I=LEN A$TO 1STEP -1
... ASC MID$ (A$,I,1)
peut être remplacé par un

Code : Tout sélectionner

FOR I=1 TO LEN A$
... ASC RIGHT$(A$,I)
on gagne quelques octets
PockEmul, Emulateur de pocket Sharp, Canon, Casio, HP, TI, NEC, Panasonic, Sanco, Seiko, General, National, ....
sur Windows, Linux, OS X et Android
Available now on the Google Play Store and the Apple Store

Répondre

Revenir vers « Tous les Pockets »