Skip to content
programming languages for all
GitHub

Difference of Squares in Lua

문제

Difference of Squares in LuaFind the difference between the square of the sum and the sum of the squares of the first N natural numbers.

참고할 자료와 개념

for 문

local total = 0
for i = 1, 10 do -- 마지막의 10을 포함합니다.
	total = total + i -- lua에는 += 이 없습니다
end
print(total) --> 55

함수 정의하기

function add(a,b)
	return a + b
end -- 중괄호는 없고 function으로 시작해서 end로 끝납니다.

print(add(1,1)) --> 2

일급함수와 클로저

function add3(a) return add(a, 3) end
print(add3(1)) --> 4

add2 = function (a) return add(a, 2) end
print(add2(1)) --> 3

풀이된 예제

명령형

local function square_of_sum(n)
	local result = 0
	for i=1, n do
		result = result + i
	end
	return result * result
end

local function sum_of_squares(n)
	local result = 0
	for i=1, n do
		result = result + i * i
	end
	return result
end

local function difference_of_squares(n)
	return square_of_sum(n) - sum_of_squares(n)
end

return {
	square_of_sum = square_of_sum,
	sum_of_squares = sum_of_squares,
	difference_of_squares = difference_of_squares
}

함수형

--    > return square(4)
--    16
local function square(n)
	return n * n
end

--    > return sum({1,2,3})
--    6
local function sum(arr)
	local result = 0
	for _, v in pairs(arr) do
		result = result + v
	end
	return result
end

--    > return map({1,2,3}, function (x) return 2 * x end)
--    {2,4,6}
local function map(table, f)
	local t = {}
	for k,v in pairs(table) do
		t[k] = f(v)
	end
	return t
end

--    > return range(3)
--    {1,2,3}
local function range(n)
	local a = {}    -- new array
	for i=1, n do
		a[i] = i
	end
	return a
end

local function square_of_sum(n)
	return square(sum(range(n)))
end

local function sum_of_squares(n)
	return sum(map(range(n), square))
end

local function difference_of_squares(n)
	return square_of_sum(n) - sum_of_squares(n)
end

return {
	square_of_sum = square_of_sum,
	sum_of_squares = sum_of_squares,
	difference_of_squares = difference_of_squares
}

함수형 라이브러리

github luafun/luafunLua Fun is a high-performance functional programming library for Lua designed with LuaJIT's trace compiler in mind.
local f = require( 'fun')

local function square(n)
	return n * n
end

local function square_of_sum(n)
	return square(f.sum(f.range(1, n)))
end

local function sum_of_squares(n)
	return f.sum(f.map(square, f.range(1, n)))
end

local function difference_of_squares(n)
	return square_of_sum(n) - sum_of_squares(n)
end

return {
	square_of_sum = square_of_sum,
	sum_of_squares = sum_of_squares,
	difference_of_squares = difference_of_squares
}

수학

local function square_of_sum(n)
	local total = n * (1 + n) / 2
	return total * total
end

local function sum_of_squares(n)
	return n * (n + 1) * (2 * n + 1) / 6
end

local function difference_of_squares(n)
	return square_of_sum(n) - sum_of_squares(n)
end

return {
	square_of_sum = square_of_sum,
	sum_of_squares = sum_of_squares,
	difference_of_squares = difference_of_squares
}