Skip to content

Instantly share code, notes, and snippets.

@marcoonroad
Last active August 29, 2015 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marcoonroad/23d441de2d7f51bb26d4 to your computer and use it in GitHub Desktop.
Save marcoonroad/23d441de2d7f51bb26d4 to your computer and use it in GitHub Desktop.
Lua não é forte o suficiente para o problema (ou não).

[DESAFIO / LANGUAGE WAR]

Implemente um programa em sua linguagem favorita, aonde o usuário digita um número x qualquer, e o programa calcula a soma dos x primeiros números pares da sequência fibonacci, imprimindo depois, a soma dos algarismos desse número.

Por exemplo, quando x <- 5, a resposta é 17, pois:

  1. A sequência fibonacci é [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ...].
  2. Os 5 primeiros números pares são [0, 2, 8 e 34, 144].
  3. O somatório disso tudo é 188 (List::Util::sum @array).
  4. Somando os algarismos, 1 + 8 + 8 -> 17 (substring de string).

Rode o programa para o caso X = 100000 usando o comando:

echo 100000 | time ./programa

Confira se a resposta é 282042 e poste aqui o código fonte e o tempo de execução. Ganha a linguagem que tiver o código mais elegante e rápido.

De: @robotlolita

Fonte: https://gist.github.com/robotlolita/11200576

--// Implementação Simples em Lua por @marcoonroad. //--

local x = tonumber (io.read ( ))
--> local x = 20 <-- limite razoável de lua

local seq = { 1, 1 } --// array para a sequencia de fibonacci //--

setmetatable (seq, {
	--// fibonacci usando memoization, too fast bro //--
	__index = function (array, i)
		array[i] = array[i - 1] + array[i - 2]
		return array[i]
	end
})

local res, idx, k = 0, 1, 1

while idx < x do
	if seq[k] % 2 == 0 then
		res = res + seq[k]
		--// como Lua não tem indices começando com 0, //--
                --// tive que deixar de lado o loop "FOR" //--
		idx = idx + 1
	end
	k = k + 1
end

res = tostring (res)

--// para cada digito na string, acumule seu digito //--
local som = 0
for dig = 1, #res do
	som = som + tonumber (string.sub (res, dig, dig))
end

print ("A soma dos digitos de " .. res .. " é " .. tostring (som) .. ".")

--// end of script //--
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment