twice = random( 1, 5, 2 )
print( twice() ) -- x (from 1 to 5)
print( twice() ) -- x
print( twice() ) -- nil
thrice = random( 2, 10, 3 )
print( thrice() ) -- y (2-10)
print( thrice() ) -- y
print( thrice() ) -- y
print( thrice() ) -- nil
GitHub | MLib - Math and shape intersections library | Walt - Animation library | Brady - Camera library with parallax scrolling | Vim-love-docs - Help files and syntax coloring for Vim
Here is my solution to davisdude's puzzle. I do not have one to offer though.
I should add this was my first time writing a closure. Didn't even use google. #pro.
function random( low, high, howMany)
local low = low
local high = high
local howMany = howMany
local t = {}
local function randomAmount()
t[howMany] = (t[howMany] or howMany)-1
if t[howMany] >= 0 then
return math.random(low,high)
end
end
return randomAmount
end
twice = random( 1, 5, 2 )
print( twice() ) -- x (from 1 to 5)
print( twice() ) -- x
print( twice() ) -- nil
thrice = random( 2, 10, 3 )
print( thrice() ) -- y (2-10)
print( thrice() ) -- y
print( thrice() ) -- y
print( thrice() ) -- nil
local function random(a, b, n)
local i = 0
return function()
i = i + 1
return i <= n and math.random(a, b) or nil
end
end
twice = random( 1, 5, 2 )
print( twice() ) -- x (from 1 to 5)
print( twice() ) -- x
print( twice() ) -- nil
thrice = random( 2, 10, 3 )
print( thrice() ) -- y (2-10)
print( thrice() ) -- y
print( thrice() ) -- y
print( thrice() ) -- nil
function random( low, high, times )
return setmetatable(
{
coroutine.create( function()
for i = 1, times do
coroutine.yield( math.random( low, high ) )
end
while true do coroutine.yield( nil ) end
end )
}, {
__call = function( tab, ... ) return select( 2, coroutine.resume( tab[1], ... ) ) end
}
)
end
local function phi( times, _value, _times )
_value, _times = _value or 1, _times or 0
if _times > times then return _value
else return phi( times, 1 + ( 1 / _value ), _times + 1 ) end
end
data = [[
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
]]
print( getLargestProduct( data, 4 ) ) --> 5832
print( getLargestProduct( data, 13 ) ) --> 23514624000
-- In case you can't tell, the second number represents the number of consecutive digits
GitHub | MLib - Math and shape intersections library | Walt - Animation library | Brady - Camera library with parallax scrolling | Vim-love-docs - Help files and syntax coloring for Vim
local function phi( times, _value, _times )
_value, _times = _value or 1, _times or 0
if _times > times then return _value
else return phi( times, 1 + ( 1 / _value ), _times + 1 ) end
end