Witam. Napisałem sobie klasę w C++, która symuluje program napisany w Brainfucku.
Klasa nazywa się BFSim i konstruujemy ją programem podanym jako string:
#include <iostream>
#include "bfsim.h"
using namespace std;
int main()
{
string helloworld = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.";
BFSim sim(helloworld);
string output;
int ret = sim.run("",output);
cout << "Wyjscie programu: " << output << endl;
cout << "Kod bledu: " << BFSim::translateError(ret) << endl;
return 0;
}
Klasę można użyć w dowolny sposób, nawet można zrobić jakiś wizualny "kompilator".
W pliku bfsim.h łatwo zobaczyć jakie parametry można podać metodom.
Napisałem również dodatkowo funkcję, która generuje rozwiązania problemów w Brainfucku.
Jak ona działa?
Losuje wszystkie możliwe programy o zadanej długości (z lekką optymalizacją, żeby nie losował zupełnie bezsensownych programów), po wygenerowaniu programu sprawdza czy program dobrze zwraca wyniki dla zadanych wejść i czy nie zwiesza się.
Oczywiście czas trwania rośnie wykładniczo, więc jeśli chcesz na szybko napisać 12 znakowy kod w Brainfucku albo sprawdzić czy jakiś poszczególnych fragmentów nie da się przyspieszyć to polecam. Pewnie rozwiązanie nie jest do końca najszybsze, ale wydaje mi się, że dobrze się sprawuje.
W załączniku wrzucam dwa projekty napisane w Code:
- widoczny wyżej Hello World!
- przykład generowania rozwiązania
Chętnie posłucham uwag. Jeśli znajdziecie błąd to śmiało zgłaszajcie!