|
Dumas Enchanter
Joined: 11 Feb 2003 Posts: 511 Location: USA
|
Posted: Mon Jul 24, 2006 2:01 pm
Decimal To Binary Convertor |
After searching through the forums for any decimal to binary conversion function, I decided to make one of my own. No reason to keep it to myself though.
#ALIAS numtobin {#VAR storage = "";#VAR number %1;#if (@number=0) {#ABORT 1};#UNTIL (@number=0) {#if ((@number\2)=1) {storage = %concat( 1, @storage);#MATH number (@number/2)} {storage = %concat( 0, @storage);#MATH number (@number/2)}}}
just call this alias with the parameter being your decimal number, then assign the value of storage to your own variable. Like so:
Code: |
#VAR test 1234
numtobin @test
#VAR result @storage |
|
|
|
|
Taz GURU
Joined: 28 Sep 2000 Posts: 1395 Location: United Kingdom
|
Posted: Mon Jul 24, 2006 10:21 pm |
Not bad, but for your next trick actually make it a function with #FUNC and call it with @numtobin(<number to convert>) that way you can use it directly in other aliases and triggers.
|
|
_________________ Taz :) |
|
|
|
Dumas Enchanter
Joined: 11 Feb 2003 Posts: 511 Location: USA
|
Posted: Mon Jul 24, 2006 10:58 pm |
Probably is a way. How to do so is out of my means at the moment. Haven't seen a case where #FUNC has been used for looping in anything other than a recursive function.
|
|
|
|
Taz GURU
Joined: 28 Sep 2000 Posts: 1395 Location: United Kingdom
|
Posted: Tue Jul 25, 2006 10:50 am |
Exactly, and this is well suited to recursion.
Quote: |
#FUNC dec2bin {%if("%1"!="0",%concat(@dec2bin(%eval(%1/2)),%mod(%1,2)))} |
|
|
_________________ Taz :) |
|
|
|
Dumas Enchanter
Joined: 11 Feb 2003 Posts: 511 Location: USA
|
Posted: Tue Jul 25, 2006 12:24 pm |
ugh, that is exactly how I was picturing it but for some reason I kept getting hung up on the generic case of "%1" being equal to 0 in the first place, not realising I could just have it so that the variable this would get stored in had a default value of 0.
|
|
|
|
Taz GURU
Joined: 28 Sep 2000 Posts: 1395 Location: United Kingdom
|
Posted: Tue Jul 25, 2006 12:52 pm |
Ok so this same method can be expanded to include other bases. I'll give you base2 to base9 see if you can extend it to handle base10 to base16, I've got the answer it really isn't pretty so you might come up with something better.
Quote: |
#FUNC dec2any {%if("%1"!="0",%concat(@dec2any(%eval(%1/%2),%2),%mod(%1,%2)))} |
Note now that the base is passed in to the function so @dec2any(127,2) will give you 1111111 and @dec2any(127,8) will give you 177.
Since you know I'll be testing with @dec2any(127,16) don't hard code it to give you 7F either |
|
_________________ Taz :) |
|
|
|
edb6377 Magician
Joined: 29 Nov 2005 Posts: 482
|
Posted: Tue Jul 25, 2006 2:40 pm |
Taz is hard at work teaching again :P
|
|
_________________ Confucious say "Bugs in Programs need Hammer" |
|
|
|
Taz GURU
Joined: 28 Sep 2000 Posts: 1395 Location: United Kingdom
|
Posted: Tue Jul 25, 2006 3:14 pm |
Aye!
|
|
_________________ Taz :) |
|
|
|
Dumas Enchanter
Joined: 11 Feb 2003 Posts: 511 Location: USA
|
Posted: Tue Jul 25, 2006 3:40 pm |
I have some training in programming languages, but obviously zMUD scripting is a little different. Have to do things in odd ways sometimes to get what you want. Obviously, to go to base 16 you'd have to have a way to convert 11-16 into A-F.
|
|
|
|
Tarn GURU
Joined: 10 Oct 2000 Posts: 873 Location: USA
|
Posted: Tue Jul 25, 2006 5:28 pm |
Taz wrote: |
extend it to handle base10 to base16, I've got the answer it really isn't pretty
|
Dumas wrote: |
I have some training in programming languages, but obviously zMUD scripting is a little different. Have to do things in odd ways sometimes to get what you want. Obviously, to go to base 16 you'd have to have a way to convert 11-16 into A-F. |
Correction: you map 10-15 to A-F (a hexadecimal digit represents a number between 0 and 15 inclusive, just as a decimal digit represents a number between 0 and 9 inclusive).
Or you could just use the VB script function "Hex" to go straight from base 10 to a base 16 string.
If you want a pure zScript solution, the most obvious way would be to pull groups of 4 bits from the end of your binary representation and use a lookup table to get to the hex digits.
-Tarn |
|
|
|
Guinn Wizard
Joined: 03 Mar 2001 Posts: 1127 Location: London
|
Posted: Tue Jul 25, 2006 5:31 pm |
Quote: |
#FUNC dec2any {%if( "%1"!="0", %concat( @dec2any(%eval(%1/%2),%2), %item( {0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z}, (%mod( %1, %2)+1))))} |
Works to base36
Do I get a gold star? |
|
|
|
Vodoc Apprentice
Joined: 11 Apr 2003 Posts: 119 Location: Sweden
|
Posted: Tue Jul 25, 2006 5:38 pm |
Bah to late but here is my solution using two functions (also works from base 2 to 36):
Code: |
#FUNC dec2any {%if( "%1"!="0", %concat( @dec2any(%eval(%1/%2),%2), @dec2any_translate(%mod( %1, %2))))}
#FUNC dec2any_translate {%if( %1 > 9, %char( 55+%1), %1)} |
Edit:
And here is the any2dec function, I leave it to you to create the any2any function which should be easy by now
Quote: |
#FUNC pow {%if( %2 > 0, %eval( %1 * @pow(%1, %eval(%2-1))), 1)}
#FUNC any2dec {%if(%len(%1)>0,%eval(%eval(%ismember(%left(%1, 1),{0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z})-1)*@pow(%2,%eval(%len(%1)-1))+@any2dec(%right(%1,1),%2)),0)} |
|
|
|
|
Dumas Enchanter
Joined: 11 Feb 2003 Posts: 511 Location: USA
|
Posted: Wed Jul 26, 2006 12:31 am |
See, it is things like this that make me confoozled sometimes. I could probably come up with this, but there are so many oddball things going on that just looking at this gives me a headache.
|
|
|
|
Taz GURU
Joined: 28 Sep 2000 Posts: 1395 Location: United Kingdom
|
Posted: Wed Jul 26, 2006 1:32 pm |
Yes gold star to Guinn, far more elegant than my solution and nicely extended.
Gold star to Vodoc for the any2dec function.
I used to have a whole class of mathematical functions called mathfun but seem to have lost it in all the computer moves I've done, perhaps this will spur me to recreate it.
And I still love the fact there are so many ways of acheiving a goal in zScript. |
|
_________________ Taz :) |
|
|
|
|
|