Here are some practical usage examples of magnum.vim.
The classic problem implemented with magnum.vim. Note Rem
for 'remainder'.
let three = magnum#Int(3) let five = magnum#Int(5) for i in range(1, 100) let n = magnum#Int(i) if n.Rem(three).IsZero() && n.Rem(five).IsZero() echo "FizzBuzz" elseif n.Rem(three).IsZero() echo "Fizz" elseif n.Rem(five).IsZero() echo "Buzz" else echo n.Number() endif endfor
Given some UNIX timestamps, determine the average. This is something you can't do with Vim numbers. (Or couldn't: Vim version 7.4.1976 has added support for 64-bit integers when the feature +num64
is enabled.)
let times = [ \ 1390938148, \ 1390759759, \ 1391028429, \ 1390992724, \ 1391100465, \ ] let sum = magnum#ZERO for time in times let sum = sum.Add(magnum#Int(time)) endfor let tally = magnum#Int(len(times)) let average = sum.Div(tally).Number()
You can use this library to prevent integer overflow.
let userinput = input("Please enter a number: ") let int = magnum#Int(userinput) try let n = int.Number() catch /^magnum:/ echo "The number you entered is too big!" endtry
Integer.Number
throws an exception when the Integer value doesn't fit in a Vim number.
The constructor magnum#Int
and the accessor String
both take an optional argument in the range from 2 to 36 to specify the base to be used. These are safer and more powerful than the built-in str2nr
and printf
:
echo magnum#Int('9876543210').String() str2nr('9876543210') echo magnum#Int('base-16?!', 16) str2nr('base-16?!', 16) echo magnum#Int(-0x21d).String(16) printf('%x', -0x21d) echo magnum#Int(74621).String(2) " (1) '9876543210' '1286608618' " (2) throws exception '186' " (3) '-21d' 'fffffde3' " (4) '10010001101111101'
magnum#random#NextInt
is a simple but effective random number generator. For example, enter the command :echo magnum#random#NextInt(magnum#Int(6)).Add(magnum#ONE).Number()
to simulate one die roll.
Here is a more practical example. In Java, Serializable
classes should generally have a field static final long serialVersionUID
that holds a 64-bit signed integer ID.
I like to use a mapping to insert a random long
after the cursor exactly for this purpose:
let two63 = magnum#Int(2).Pow(63) nnoremap <Leader>rl "=magnum#random#NextInt(two63.Neg(), two63).String()<CR>p
Solution to Euler problem 13, 'Large sum': Produce the first ten digits of a large sum.
let numbers = ' \ 37107287533902102798797998220837590246510135740250 \ 46376937677490009712648124896970078050417018260538 \ 74324986199524741059474233309513058123726617309629 \ 91942213363574161572522430563301811072406154908250 \ 23067588207539346171171980310421047513778063246676 \ 89261670696623633820136378418383684178734361726757 \ 28112879812849979408065481931592621691275889832738 \ 44274228917432520321923589422876796487670272189318 \ 47451445736001306439091167216856844588711603153276 \ 70386486105843025439939619828917593665686757934951 \ 62176457141856560629502157223196586755079324193331 \ 64906352462741904929101432445813822663347944758178 \ 92575867718337217661963751590579239728245598838407 \ 58203565325359399008402633568948830189458628227828 \ 80181199384826282014278194139940567587151170094390 \ 35398664372827112653829987240784473053190104293586 \ 86515506006295864861532075273371959191420517255829 \ 71693888707715466499115593487603532921714970056938 \ 54370070576826684624621495650076471787294438377604 \ 53282654108756828443191190634694037855217779295145 \ 36123272525000296071075082563815656710885258350721 \ 45876576172410976447339110607218265236877223636045 \ 17423706905851860660448207621209813287860733969412 \ 81142660418086830619328460811191061556940512689692 \ 51934325451728388641918047049293215058642563049483 \ 62467221648435076201727918039944693004732956340691 \ 15732444386908125794514089057706229429197107928209 \ 55037687525678773091862540744969844508330393682126 \ 18336384825330154686196124348767681297534375946515 \ 80386287592878490201521685554828717201219257766954 \ 78182833757993103614740356856449095527097864797581 \ 16726320100436897842553539920931837441497806860984 \ 48403098129077791799088218795327364475675590848030 \ 87086987551392711854517078544161852424320693150332 \ 59959406895756536782107074926966537676326235447210 \ 69793950679652694742597709739166693763042633987085 \ 41052684708299085211399427365734116182760315001271 \ 65378607361501080857009149939512557028198746004375 \ 35829035317434717326932123578154982629742552737307 \ 94953759765105305946966067683156574377167401875275 \ 88902802571733229619176668713819931811048770190271 \ 25267680276078003013678680992525463401061632866526 \ 36270218540497705585629946580636237993140746255962 \ 24074486908231174977792365466257246923322810917141 \ 91430288197103288597806669760892938638285025333403 \ 34413065578016127815921815005561868836468420090470 \ 23053081172816430487623791969842487255036638784583 \ 11487696932154902810424020138335124462181441773470 \ 63783299490636259666498587618221225225512486764533 \ 67720186971698544312419572409913959008952310058822 \ 95548255300263520781532296796249481641953868218774 \ 76085327132285723110424803456124867697064507995236 \ 37774242535411291684276865538926205024910326572967 \ 23701913275725675285653248258265463092207058596522 \ 29798860272258331913126375147341994889534765745501 \ 18495701454879288984856827726077713721403798879715 \ 38298203783031473527721580348144513491373226651381 \ 34829543829199918180278916522431027392251122869539 \ 40957953066405232632538044100059654939159879593635 \ 29746152185502371307642255121183693803580388584903 \ 41698116222072977186158236678424689157993532961922 \ 62467957194401269043877107275048102390895523597457 \ 23189706772547915061505504953922979530901129967519 \ 86188088225875314529584099251203829009407770775672 \ 11306739708304724483816533873502340845647058077308 \ 82959174767140363198008187129011875491310547126581 \ 97623331044818386269515456334926366572897563400500 \ 42846280183517070527831839425882145521227251250327 \ 55121603546981200581762165212827652751691296897789 \ 32238195734329339946437501907836945765883352399886 \ 75506164965184775180738168837861091527357929701337 \ 62177842752192623401942399639168044983993173312731 \ 32924185707147349566916674687634660915035914677504 \ 99518671430235219628894890102423325116913619626622 \ 73267460800591547471830798392868535206946944540724 \ 76841822524674417161514036427982273348055556214818 \ 97142617910342598647204516893989422179826088076852 \ 87783646182799346313767754307809363333018982642090 \ 10848802521674670883215120185883543223812876952786 \ 71329612474782464538636993009049310363619763878039 \ 62184073572399794223406235393808339651327408011116 \ 66627891981488087797941876876144230030984490851411 \ 60661826293682836764744779239180335110989069790714 \ 85786944089552990653640447425576083659976645795096 \ 66024396409905389607120198219976047599490197230297 \ 64913982680032973156037120041377903785566085089252 \ 16730939319872750275468906903707539413042652315011 \ 94809377245048795150954100921645863754710598436791 \ 78639167021187492431995700641917969777599028300699 \ 15368713711936614952811305876380278410754449733078 \ 40789923115535562561142322423255033685442488917353 \ 44889911501440648020369068063960672322193204149535 \ 41503128880339536053299340368006977710650566631954 \ 81234880673210146739058568557934581403627822703280 \ 82616570773948327592232845941706525094512325230608 \ 22918802058777319719839450180888072429661980811197 \ 77158542502016545090413245809786882778948721859617 \ 72107838435069186155435662884062257473692284509516 \ 20849603980134001723930671666823555245252804609722 \ 53503534226472524250874054075591789781264330331690' let result = magnum#ZERO for n in map(split(numbers), 'magnum#Int(v:val)') let result = result.Add(n) endfor echo result.String()[0:9]
Echoes 5537376230
.
In descending order of sanity.
let void = value.IsZero() let void = value.Eq(magnum#ZERO) let void = value.Cmp(magnum#ZERO) == 0 let void = value.Eq(magnum#Int('0')) let void = str2nr(value.String(16), 16) == eval('0x0')
Only bad ideas here. Don't ever use anything except the first.
Pronounceable Git commit hashesI'm not getting desperate here. This is interesting.
let hash = 'b909f0e074b40c5e543c6409f0eb768d7ff00fb5' let n = magnum#Int(hash, 16) let word = substitute(n.String(36), '[0-9qv-z]', '', 'g')[:7] echo word
Echoes lmireppo
.
For an example of how to extend the capabilities of magnum.vim check out the example given over here.
let a = magnum#Int(-13) let b = magnum#Int(4) echo map(a.DivRem(b), 'v:val.Number()') " [-3, -1] echo map(DivMod(a, b), 'v:val.Number()') " [-4, 3]
That's all for today, thank you for reading.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4