How can I do this?

BlitzPlus Forums/BlitzPlus Beginners Area/How can I do this?

Necromancer(Posted 2014) [#1]
So.. Basically, I want to make this program so that I can type a sentence or string of text and it replaces each letter with a different letter (which I will specify).

For example, let's say I want to replace all T's with F's.

Input: Tootsie Rolls are a tremendous treat for toddlers!

Output: Foofsie Rolls are a fremendous freaf for foddlers!


All I have right now is the basics of the program (the asking for input, etc.), so it wouldn't really make a difference to post my code.

Thanks for any help!


degac(Posted 2014) [#2]
Well... just use REPLACE command to .. replace letters in a string?

http://www.blitzbasic.com/bpdocs/command.php?name=replace&ref=goto


Necromancer(Posted 2014) [#3]
Thanks! Now I have another problem. It was horribly messing up when I decrypted, then I realized that it was going in order. So like, if I changed all s's into d's then changed all d's into h's then all s's were h's, so reverting it back to the original string became impossible using the same algorithm..

string2enc$ = Input("Please type the text you'd like to encrypt: ")
				Print ""
				encstring$ = Replace$(string2enc$,"b","i") 
				encstring$ = Replace$(encstring$,"n","f") 
				encstring$ = Replace$(encstring$,"g","w") 
				encstring$ = Replace$(encstring$,"r","n") 
				encstring$ = Replace$(encstring$,"w","h") 
				encstring$ = Replace$(encstring$,"o","j") 
				encstring$ = Replace$(encstring$,"e","x") 
				encstring$ = Replace$(encstring$,"u","l") 
				encstring$ = Replace$(encstring$,"j","g") 
				encstring$ = Replace$(encstring$,"y","e") 
				encstring$ = Replace$(encstring$,"f","m") 
				encstring$ = Replace$(encstring$,"a","u") 
				encstring$ = Replace$(encstring$,"h","o") 
				encstring$ = Replace$(encstring$,"z","k") 
				encstring$ = Replace$(encstring$,"i","c") 
				encstring$ = Replace$(encstring$,"v","q") 
				encstring$ = Replace$(encstring$,"x","d") 
				encstring$ = Replace$(encstring$,"d","v") 
				encstring$ = Replace$(encstring$,"s","b") 
				encstring$ = Replace$(encstring$,"p","y") 
				encstring$ = Replace$(encstring$,"c","p") 
				encstring$ = Replace$(encstring$,"m","s") 
				encstring$ = Replace$(encstring$,"l","z") 
				encstring$ = Replace$(encstring$,"t","r") 
				encstring$ = Replace$(encstring$,"k","a") 
				encstring$ = Replace$(encstring$,"q","t")


Is there a way to.. perhaps, run all of the Replace's at once?
Or is there some other method of making it so it doesn't replace already changed letters?


GfK(Posted 2014) [#4]
Ditch Replace() - it's not going to do it for you.

Here's what I use (Blitzmax code, mind. Shouldn't be too hard to get it going in BlitzPlus).
Const ENC_KEY:Int = %01101010101011111101000101011101

Local s:String = "Hello World"
s = encryptString(s, ENC_KEY) 'encrypt it
Print s
s = encryptString(s, ENC_KEY) 'put it back
Print s

Function encryptString:String(txt:String, key:Int)
	If txt.Length > 0
		Local out:String
		For Local n:Int = 1 To txt.Length
			out:+Chr(Asc(Mid(txt, n, 1)) ~ key)
		Next
		Return out
	EndIf
End Function



Necromancer(Posted 2014) [#5]
@GfK
Thanks for the response.
I think I understand the logic behind the code you put, but I don't know how to actually use it.. It's been a long, long time since I used blitz, and I've never used anything but the more basic things..

(To sum up that paragraph, I have no idea what to do with the code you posted.)


GfK(Posted 2014) [#6]
Hmm... this might run. Don't have Blitzplus so I can't check. I'm assuming you can use Const and Local. If not just replace both with Global.
Const ENC_KEY% = %01101010101011111101000101011101

Local s$ = "Hello World"
s = encryptString(s, ENC_KEY) 'encrypt it
Print s
s = encryptString(s, ENC_KEY) 'put it back
Print s

Function encryptString$(txt$, key%)
	If Len(txt) > 0
		Local out$
		For Local n% = 1 To Len(txt)
			out = out + Chr(Asc(Mid(txt, n, 1)) Xor key)
		Next
		Return out
	EndIf
End Function



Necromancer(Posted 2014) [#7]
It would appear that it's not having any problem with Local and Const, but it says "Expecting End-Of-File"


GfK(Posted 2014) [#8]
Wondering if you can't define local vars within a For/Next loop in BP.

Const ENC_KEY% = %01101010101011111101000101011101

Local s$ = "Hello World"
s = encryptString(s, ENC_KEY) 'encrypt it
Print s
s = encryptString(s, ENC_KEY) 'put it back
Print s

Function encryptString$(txt$, key%)
	If Len(txt) > 0
		Local out$

		For n% = 1 To Len(txt)
			out = out + Chr(Asc(Mid(txt, n, 1)) Xor key)
		Next
		Return out
	EndIf
End Function


If that doesn't work, somebody else with Blitzplus experience will have to fix it up. I'm sure it's fairly close, though.


Necromancer(Posted 2014) [#9]
I ran this one again:
Const ENC_KEY% = %01101010101011111101000101011101

Local s$ = "Hello World"
s = encryptString(s, ENC_KEY) 'encrypt it
Print s
s = encryptString(s, ENC_KEY) 'put it back
Print s

Function encryptString$(txt$, key%)
	If Len(txt) > 0
		Local out$
		For Local n% = 1 To Len(txt)
			out = out + Chr(Asc(Mid(txt, n, 1)) Xor key)
		Next
		Return out
	EndIf
End Function


And I got it working how I like it.
I wasn't really going for it to do a bunch of crazy symbols, but I still don't REALLY understand this much at all, so I don't know how I could possibly fix that. Besides that, it's great! Thanks for the help.

If you could tell me how to manipulate the algorithm that'd be great.


Matty(Posted 2014) [#10]
The alternative way if you want specific letters to replace other letters like in your initial example is to have an array as a lookup for each character then iterate over the string and replace each character using array lookup one character at a time.