-
Notifications
You must be signed in to change notification settings - Fork 3
Usage examples
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.
I'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.