Page 1 of 1

LEN trouble

Posted: 21/09/2009 - 2:28
by Commie_User
I'm having a hell of a time with this bit of string.

What I'm trying to do is change letters in a word, randomly swapping consonents for consonents and vowels for vowels. Here's the BASIC idea:

10 INPUT A$ (for example, BEER)
20 FOR B=1 TO 3 (number of times to change all the letters in one the original word, giving 3 mixups)
30 FOR C=1 TO LEN(A$) (Starts the letter-change cycle from the start of the word to the end)
40 LET X=INT(RND(90)) : IF X<65 THEN 40
(Random number stored in X between 65 and 90, the capitalised alphabet ASCII numbers. Note the statement is a little different as its the BBC Micro convention)
50 < AREA I'M STUCK ON >
60 PRINT CHR$(X);
70 NEXT C
75 PRINT
80 NEXT B
90 END

Now I've got the subroutine down for swapping a vowel only with another vowel. I know about counting into the A$ variable and returning the letters asked for (MID$, etc.). But what I want to do is isolate individual letters in A$ and play with the ASCII number. MID$ and the others only let me return a sequence of letters which is no good.

So, for the second letter of BEER, I want the computer to pick out the ASCII number and send it to the vowel-changer subroutine, whilst B and R are changed for other consonants. Line 50 should be where if the program detects an number which is ASCII for a vowel, it changes the value of X so I can have another vowel. Unchanged from the original randomised, it could be anything.

Re: LEN trouble

Posted: 21/09/2009 - 5:18
by analoq
I don't know Commodore BASIC, so I did a little research. If I understand what you're trying to accomplish I think section A.2 answers your question here:
http://www.commodore.ca/manuals/pdfs/Co ... Manual.pdf

I'd have copy-pasted it but the PDF is encrypted and won't let me :x
But effectively you have to make use of the LEFT and MID functions and reassign the string.

cheers.

Re: LEN trouble

Posted: 21/09/2009 - 7:20
by Chris Abbott
ASC is the analog of CHR$ isn't it? So you'd have pass the right MID$ character into ASC.

Re: LEN trouble

Posted: 21/09/2009 - 11:45
by Commie_User
Phew, I've done it now.

It's still in its rough form, but here's the repaired section of the program:


1285 FOR B=1 TO M
1290 PRINT TAB(5);
1300 FOR C=1 TO LEN(W$)
1301 LET Z=INT(RND(90))
1302 IF Z<65 THEN 1301
1310 LET D=ASC(MID$(W$,C,1))
1350 IF D=65 THEN GOSUB1480
1360 IF D=69 THEN GOSUB 1480
1370 IF D=73 THEN GOSUB 1480
1380 IF D=79 THEN GOSUB 1480
1390 IF D=85 THEN GOSUB 1480
1395
1396
1400 PRINT CHR$(Z);
1430 NEXT C
1440 PRINT
1450 NEXT B
1460 PRINT
1470 PRINT "Another run of words mate? (Y/N)"


I say repaired because I've been trying to follow a type-in listing excercise from the early 80s which doesn't work. Yes, I know I should expect that but I'm a fool to myself. The key is line 1310, which was right in the book but the original exercise screwed up what the program should have done with each number in the string. I then went out to check if that line actually worked in my BASIC. It also neglected to mention that the input string should be capitalised.

Still, all done now and thanks to those who tried to help.

Re: LEN trouble

Posted: 22/09/2009 - 19:55
by beyond
From the top of my head I would do something like this:

Code: Select all

10 v$="AEIOUY"
20 c$="BCDFGHJKLMNPQRSTVWXZ"
30 print"word"; input a$
40 print"reps"; input n
50 for k=1 to n
60 for i=1 to len(a$)
70 j=asc(mid$(a$,i,1)
80 w=0 : if j=65 or j=69 or j=73 or j=79 or j=85 then w=1
90 if w=0 then r$=mid$(c$,1+int(rnd(0)*len(c$)),1)
100 if w=1 then r$=mid$(v$,1+int(rnd(0)*len(v$)),1)
110 print r$;
120 next : print : next
Basically, it's "find out if the next character in the string is a vowel or not. Then pick a random character from the vowels or consonants based on that."

Might work, might not... there is most likely an off by one error in that rnd, can't remember if RND(0) returns [0...1] or [0...1[

Re: LEN trouble

Posted: 23/09/2009 - 2:36
by Commie_User
Thanks.

After re-typing your program, because my interpreter doesn't accept lowercase letters (?), I got this:

word? DELAYED
reps? 3
NNNNN
NNNNN
NNNNN


10 V$="AEIOUY"
20 C$="BCDFGHJKLMNPQRSTVWXZ"
30 PRINT "word"; : INPUT A$
40 PRINT "reps"; : INPUT N
50 FOR K=1 TO N
60 FOR I=1 TO LEN(A$)
70 J=ASC(MID$(A$,I,1))
80 W=0 : IF J=65 OR J=69 OR J=73 OR J=79 OR J=85 THEN W=1
90 IF W=0 THEN R$=MID$(C$,1+INT(RND(0)*LEN(C$)),1)
100 IF W=1 THEN R$=MID$(V$,1+INT(RND(0)*LEN(C$)),1)
110 PRINT R$;
120 NEXT : PRINT : NEXT


Still, never mind. The proggy's all done anyway and in a nice Windows-compatible form. I'll link to it once it's all safe and tucked up online.

Re: LEN trouble

Posted: 23/09/2009 - 5:54
by beyond
Your line 100 has a reference to c$ where it should be v$.

If you're not running it in Commodore Basic, then you probably need to seed the RND function by calling something like RANDOMIZE, but then again RND-functions do behave quite differently depending on what kind of basic you're running.

Re: LEN trouble

Posted: 23/09/2009 - 13:50
by Commie_User
100 IF W=1 THEN R$=MID$(V$,1+INT(RND(0)*LEN(V$)),1)

RUNNING ON BBC:

word? VISIT
reps? 3
ROROR
ROROR
ROROR

word? KIPLING
reps? 3
TUTTUIT
TUTTUIT
TUTTUIT


RUNNING ON COMMODORE:

word? LIPS
reps? 3
FODD
SOKP
HUXC
ROHM

Lovely stuff. Though I wonder why the words aren't re-made for each cycle on the BBC. There's no Randomise function and mine worked alright.

Re: LEN trouble

Posted: 23/09/2009 - 19:32
by beyond
Got this from the BBC BASIC ref manual:

RND
A function which returns a random number. The type and range of the number returned depends upon the optional parameter.

RND returns a random integer 0 - &FFFFFFFF.
RND(n) returns an integer in the range 1 to n (n>1).
RND(1) returns a real number in the range 0.0 to .99999999.

If n is negative the pseudo random sequence generator is set to a number based on n and n is returned.

If n is 0 the last random number is returned in RND(1) format.

X=RND(1)
X%=RND
N=RND(6)

-- so replace RND(0) with RND(1) and then you should be all good... or even better:

Code: Select all

90 IF W=0 THEN R$=MID$(C$,RND(LEN(C$)),1) 
and line 100 the same way...

Re: LEN trouble

Posted: 23/09/2009 - 21:12
by Commie_User
Eee, how splendid! Thanks very much.

10 V$="AEIOU"
20 C$="BCDFGHJKLMNPQRSTVWXYZ"
30 PRINT "word"; : INPUT A$
40 PRINT "reps"; : INPUT N
50 FOR K=1 TO N
60 FOR I=1 TO LEN(A$)
70 J=ASC(MID$(A$,I,1))
80 W=0 : IF J=65 OR J=69 OR J=73 OR J=79 OR J=85 THEN W=1
90 IF W=0 THEN R$=MID$(C$,1+INT(RND(1)*LEN(C$)),1)
100 IF W=1 THEN R$=MID$(V$,1+INT(RND(1)*LEN(V$)),1)
110 PRINT R$;
120 NEXT : PRINT : NEXT


RUN
word? BUMS
rep? 3
FAHW
GOTL
XEHL


That's a treat is that! Though I still like my one better because it can swap consonants for other vowels too if it wants.


And no more talking about it, here it is: http://www.dustybin.org.uk/Red_Arsery.zip . I politicised it as part of the project, so ignore the satire if you please.

And here's the video to go with it (because proper session recordings were made of the game's music): http://www.youtube.com/watch?v=E0CgRKX0gcc .

Other music from the same sessions: http://www.youtube.com/watch?v=N3y1PjGRjVU ,
http://www.youtube.com/watch?v=xvN2ZpUBNUs .

_______________________________________________

And as a side thought, coming off the back of that, wouldn't it have been nice had game publishers truly realised the popularity of computer music in the 80s? Just imagine Rob Hubbard going to some of the small studios dotted 'round London to record proper rock or electro' versions of some of his best selling C64 tracks. Proper contemporary sounds from the synths and rock bands of the time....

Re: LEN trouble

Posted: 23/09/2009 - 21:59
by beyond
Ehm... the 'Y' is missing in the vowel string and should be removed from the consonants :)

Heh, and that actually made me realize that there is an error in the program. The line that sets w does not recognize 'Y' as a vowel. An OR J=XX is missing. My mistake, clearly!

Re: LEN trouble

Posted: 23/09/2009 - 22:52
by Commie_User
I think you'll find the 'Y' mistake was actually mine. I assumed the mistake was yours and 'fixed' it.

But as I say, it works now anyway!

Where does the OR J=XX go then?

Re: LEN trouble

Posted: 26/09/2009 - 11:06
by beyond
In line 80 along with the others.