Page 1 of 5

Code Puzzles

Posted: Fri Dec 04, 2015 1:10 am
by CrackedP0t
I've come up an idea for making puzzles that should be fun to solve!

The format is this: The puzzle maker posts the last half of a source code file and the whole file's output, and the object is to write the first half.

For example:

The puzzle:

Code: Select all

print(t.a + t.b) -- Outputs 5
The answer:

Code: Select all

local t = {
    a = 2,
    b = 3
}
I'll post the first one and some others, but other people should make some up too!

Re: Code Puzzles

Posted: Fri Dec 04, 2015 1:14 am
by CrackedP0t
First Puzzle:

(Pretty hard)

Code: Select all

a = 1
b = 2
c = 3
d = 4
z = 26

print(a) -- Outputs 1
print(a.b) -- Outputs 1.2
print(a.b + c.d) -- Outputs 4.6
print(d.z) -- Outputs 4.26
You can ask me to run some code with the answer if you want, and I'll give you the output.

(Note: It uses the standard Lua print function, so no replacing it)

Re: Code Puzzles

Posted: Fri Dec 04, 2015 4:34 am
by davisdude

Code: Select all

debug.setmetatable( 1, {
    __index = function( self, i )
        return self + ( _G[i] / ( 10 ^ math.ceil( math.log10( _G[i] ) ) ) )
    end, 
} )

a = 1
b = 2
c = 3
d = 4
e = 26

print(a) -- Outputs 1
print(a.b) -- Outputs 1.2
print(a.b + c.d) -- Outputs 4.6
print(d.e) -- Outputs 4.26
I like it :)

(btw I assume you mean "e" instead of "z" here)
CrackedP0t wrote:

Code: Select all

print(d.z) -- Outputs 4.26
My turn!

Code: Select all

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

Re: Code Puzzles

Posted: Fri Dec 04, 2015 5:46 am
by bobbyjones
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.

Code: Select all

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

Re: Code Puzzles

Posted: Fri Dec 04, 2015 5:32 pm
by CrackedP0t
Slightly simpler solution:

Code: Select all

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
Lovely closure puzzle!

Re: Code Puzzles

Posted: Fri Dec 04, 2015 5:38 pm
by CrackedP0t
Iterator puzzle:

Code: Select all

local t = {"a", "b", "c", "d", "e"}

for i, v in ripairs(t) do
	print(i, v)
	--[[ Outputs:
		5	e
		4	d
		3	c
		2	b
		1	a
	]]
end

Re: Code Puzzles

Posted: Sat Dec 05, 2015 6:36 pm
by Ranguna259
CrackedP0t wrote:Iterator puzzle:

Code: Select all

local t = {"a", "b", "c", "d", "e"}

for i, v in ripairs(t) do
	print(i, v)
	--[[ Outputs:
		5	e
		4	d
		3	c
		2	b
		1	a
	]]
end
Easy, just make ipairs go backwards:

Code: Select all

function ripairs(t)
	local i = #t+1
	return function(t,i)
		i = i-1
		if i == 0 then
			return
		end
		return i,t[i]
	end,t,i
end
Phi puzzle:

Code: Select all

print(phi(0)) --Output: 2
print(phi(1)) --Output: 1.5
print(phi(2)) --Output: 1.6666666666667
print(phi(10)) --Output: 1.6180555555556
print(phi(30)) --Output: 1.61803398875
print(phi(31)) --Output: 1.6180339887499
Read this webpage about phi, especially the section "Phi as a continued fraction".
Good luck ;) .

Re: Code Puzzles

Posted: Sat Dec 05, 2015 9:41 pm
by davisdude
CrackedP0t wrote:Lovely closure puzzle!
Thanks, although I actually intended it to be a closure puzzle (although your solution is much more elegant) :P

Code: Select all

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
Ranguna259 wrote:-snip-

Code: Select all

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
Let me see if I can think of a good puzzle...

edit:

Code: Select all

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

Re: Code Puzzles

Posted: Sun Dec 06, 2015 9:34 am
by NickRock
This one is pretty easy

Code: Select all

printNum(100, 1)

--[[ outputs: 
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
80
79
78
77
76
75
74
73
72
71
70
69
68
67
66
65
64
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
-1

]]

Re: Code Puzzles

Posted: Sun Dec 06, 2015 12:34 pm
by Ranguna259
NickRock wrote:This one is pretty easy

Code: Select all

printNum(100, 1)

--[[ outputs: 
99
98
97
96
95
94
93
92
91
90
89
88
87
86
85
84
83
82
81
80
79
78
77
76
75
74
73
72
71
70
69
68
67
66
65
64
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
-1

]]

Code: Select all

function printNum(s,n)
	for i=s,-1,-n do
		print(i)
	end
end
davisdude wrote:...
Ranguna259 wrote:-snip-

Code: Select all

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
...
Correct :)
davisdude wrote:...

Code: Select all

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
base64 data ? I don't even..