Fibonacci
Description
The Fibonacci sequence is a set of integers (the Fibonacci numbers) that starts with a zero, followed by a one, then by another one, and then by a series of steadily increasing numbers. The sequence follows the rule that each number is equal to the sum of the preceding two numbers.
The Fibonacci sequence begins with the following 14 integers:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 ...
Each number, starting with the third, adheres to the prescribed formula. For example, the seventh number, 8, is preceded by 3 and 5, which add up to 8.
The sequence can theoretically continue to infinity, using the same formula for each new number. Some resources show the Fibonacci sequence starting with a one instead of a zero, but this is fairly uncommon.
Using Truebit to Execute Fibonacci
We use Truebit to execute the Fibonacci task to get a verified result.
The code
You can find the Fibonacci example within the folder truebit-nextgen-examples/function-tasks/<language>/fibonacci.
π src ββ π main.rs π Cargo.toml π Cargo.lock
π src ββ π main.c π compile.sh
π src ββ π main.cpp π compile.sh
π src ββ π main.js π dist ββ π main.js π package-lock.json π package.json
π src ββ π task.py
Source
main.rs
fn fibonacci(n: u32) -> u64 {
if n == 0 {
return 0;
} else if n == 1 {
return 1;
}
let mut a = 0;
let mut b = 1;
let mut c = 0;
for _i in 2..=n {
c = a + b;
a = b;
b = c;
}
return c;
}
fn run_task(input: String) -> String {
fibonacci(input.parse().unwrap()).to_string()
}
fn main() {
let input: String =
std::fs::read_to_string("input.txt").expect("Could not read from input.txt");
let output: String = run_task(input);
std::fs::write("output.txt", output).expect("Could not write to output.txt");
}main.c
#include <stdio.h>
#include <stdlib.h>
unsigned long long fibonacci(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
}
unsigned long long a = 0;
unsigned long long b = 1;
unsigned long long c = 0;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
char* runTask(const char* input) {
int inputValue = atoi(input);
unsigned long long result = fibonacci(inputValue);
char* output = (char*)malloc(20);
sprintf(output, "%llu", result);
return output;
}
int main() {
FILE* inputFile = fopen("input.txt", "r");
if (inputFile == NULL) {
perror("Error opening input.txt");
return 1;
}
char inputBuffer[256];
if (fgets(inputBuffer, sizeof(inputBuffer), inputFile) == NULL) {
perror("Error reading input.txt");
fclose(inputFile);
return 1;
}
fclose(inputFile);
char* output = runTask(inputBuffer);
FILE* outputFile = fopen("output.txt", "w");
if (outputFile == NULL) {
perror("Error opening output.txt");
free(output);
return 1;
}
fprintf(outputFile, "%s", output);
fclose(outputFile);
free(output);
printf("output.txt\n");
return 0;
}main.cpp
#include <iostream>
#include <fstream>
using namespace std;
unsigned long long fibonacci(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
}
unsigned long long a = 0;
unsigned long long b = 1;
unsigned long long c = 0;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
string runTask(const string& input) {
int inputValue = stoi(input);
return to_string(fibonacci(inputValue));
}
int main() {
ifstream inputFile("input.txt");
if (!inputFile) {
cerr << "Could not read from input.txt" << endl;
return 1;
}
string input;
getline(inputFile, input);
inputFile.close();
string output = runTask(input);
ofstream outputFile("output.txt");
if (!outputFile) {
cerr << "Could not write to output.txt" << endl;
return 1;
}
outputFile << output << endl;
outputFile.close();
cout << "Output written to output.txt" << endl;
return 0;
}fibonacci.js
import fs from 'fs';
function fibonacci(n) {
if (n === 0) {
return 0;
} else if (n === 1) {
return 1;
}
let a = 0;
let b = 1;
let c = 0;
for (let i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
function runTask(input) {
return fibonacci(parseInt(input)).toString();
}
let data = fs.readFileSync('input.txt', 'utf8')
const output = runTask(data);
fs.writeFileSync('output.txt', output)def fibonacci(n):
"""Calculate the nth Fibonacci number iteratively."""
if n == 0:
return 0
elif n == 1:
return 1
a, b = 0, 1
for _ in range(2, n + 1):
c = a + b
a = b
b = c
return c
def run_task(input_string):
"""Convert input string to integer, compute Fibonacci, and return as string."""
return str(fibonacci(int(input_string)))
def main():
"""Main function to read, process, and write Fibonacci number to a file."""
try:
with open("input.txt", "r") as file:
input_string = file.read().strip()
except FileNotFoundError:
print("Error: The file 'input.txt' does not exist.")
return
except Exception as e:
print(f"An error occurred while reading 'input.txt': {e}")
return
try:
output_string = run_task(input_string)
except ValueError:
print("Error: Input must be an integer.")
return
except Exception as e:
print(f"An error occurred while processing the input: {e}")
return
try:
with open("output.txt", "w") as file:
file.write(output_string)
except Exception as e:
print(f"An error occurred while writing to 'output.txt': {e}")
if __name__ == "__main__":
main()In/Out parameters
In order to send parameters to the Truebit task, you need to open the "input.txt" file and get the value from there. For now, only one input parameter is allowed.
let input: String = std::fs::read_to_string("input.txt").expect("Could not read from input.txt");FILE* inputFile = fopen("input.txt", "r");
if (inputFile == NULL) {
perror("Error opening input.txt");
return 1;
}
char inputBuffer[256];
if (fgets(inputBuffer, sizeof(inputBuffer), inputFile) == NULL) {
perror("Could not read from input.txt");
fclose(inputFile);
return 1;
}
fclose(inputFile);ifstream inputFile("input.txt");
if (!inputFile) {
cerr << "Could not read from input.txt" << endl;
return 1;
}
string input;
getline(inputFile, input);
inputFile.close();let data = fs.readFileSync('input.txt', 'utf8')with open("input.txt", "r") as file:
input_string = file.read().strip()In order to retrieve the output value from the Truebit task, you need save it in the "output.txt" file.
std::fs::write("output.txt", output).expect("Could not write to output.txt");FILE* outputFile = fopen("output.txt", "w");
if (outputFile == NULL) {
perror("Error opening output.txt");
free(output);
return 1;
}
fprintf(outputFile, "%s", output);
fclose(outputFile);
free(output);ofstream outputFile("output.txt");
if (!outputFile) {
cerr << "Could not write to output.txt" << endl;
return 1;
}
outputFile << output << endl;
outputFile.close();
fs.writeFileSync('output.txt', output)with open("output.txt", "w") as file:
file.write(output_string)Try out
We will use the Truebit CLI to compile and try our source code. Once the code is finished, we will deploy it to the coordination hub so that everyone who knows the namespace and taskname.
Step 1: Create the fibonacci source code
Within the src folder you will find a file called main in the case of Rust, C, C++, JS, and task.py in the case of Python. This is the fibonacci implementation that will be used for testing purpose.
Step 2: Build the source code
Execute the build command against Truebit node to get an instrumented Truebit task
truebit build truebit-nextgen-examples/function-tasks/js/fibonacci/dist -l jsOutput
Building the function task
Your function task is ready.
Use the following TaskId for execution or deployment:
js_391426a3fca881a6b3a05c49e33113e0d1829c3cca46f64b51f2d336c71cd184Step 3: Try the code
Execute the start command against the Truebit node to test our Algorithm. You will need to submit the instrumented task id + the input parameter.
truebit start js_391426a3fca881a6b3a05c49e33113e0d1829c3cca46f64b51f2d336c71cd184 10Output
Executing the function Task
Execution Id: e406e754-b90b-4c62-9394-2cf0bb2c5647
Task executed with status: succeed
Task executed with result: 55
Task resource usage:
βββββββββββββββββ¬ββββββββββββββββ¬ββββββββββββββββ¬ββββββββ¬ββββββββββββββ¬βββββββββββ
β (index) β Unit β Limits β Peak β Last status β Capacity β
βββββββββββββββββΌββββββββββββββββΌββββββββββββββββΌββββββββΌββββββββββββββΌβββββββββββ€
β Gas β 'Steps' β 1099511627776 β 'N/A' β 1907033199 β 577 β
β Nested calls β 'Calls' β 65536 β 6387 β 6352 β 10 β
β Frame memory β 'Bytes' β 524288 β 20115 β 19073 β 26 β
β System memory β '64 Kb pages' β 2048 β 87 β 'π« 1' β 24 β
βββββββββββββββββ΄ββββββββββββββββ΄ββββββββββββββββ΄ββββββββ΄ββββββββββββββ΄βββββββββββStep 4: Deploy the task
Last, but not least, Execute the deploy command to deploy our task to the coordination hub, so that anyone with the namespace, taskname and the API key can execute it.
truebit deploy <namespace> <taskname> --taskId js_391426a3fca881a6b3a05c49e33113e0d1829c3cca46f64b51f2d336c71cd184Output
The function task has been deployed successfully.
The Task <taskName> version <version> was registered successfully in namespace <namespace>Last updated
Was this helpful?