tło
Fractran to ezoteryczny język programowania Turinga opracowany przez Johna Conwaya. Program Fractran składa się z uporządkowanej listy ułamków. Program rozpoczyna się od przyjęcia jednej liczby całkowitej jako danych wejściowych. Podczas każdej iteracji programu przeszukuje listę pierwszej frakcji, tak że pomnożenie liczby przez tę frakcję daje kolejną liczbę całkowitą. Następnie powtarza ten proces z nowym numerem, zaczynając od początku na początku listy. Gdy na liście nie ma ułamka, który można by pomnożyć przez liczbę, program kończy działanie i podaje liczbę jako wynik.
Powodem, dla którego Fractran jest Turing-complete, jest to, że symuluje maszynę rejestrującą. Rozkład na czynniki pierwsze liczby przechowuje zawartość rejestrów, podczas gdy dzielenie i mnożenie jest sposobem warunkowego dodawania i odejmowania od rejestrów. Poleciłbym przeczytać artykuł w Wikipedii (link powyżej).
Wyzwanie
Twoim zadaniem jest napisanie możliwie najkrótszego programu, który może pobrać prawidłowy program Fractran ze STDIN jako jedynego wejścia i wygenerować prawidłowy program BF do STDOUT, który symuluje program Fractran. Istnieją dwa sposoby symulacji programu Fractran z BF.
UWAGA: Twoja odpowiedź nie jest programem BF. Twoja odpowiedź to kod, który generuje program BF z dowolnego programu Fractran. Celem jest, aby program BF był odpowiednikiem programu Fractran. (technicznie możesz wziąć udział w zawodach w BF, ale byłoby to trudne)
opcja 1
Twój program powinien wypisać program BF, który wykonuje następujące czynności:
- Pobiera dokładnie 1 liczbę z STDIN w postaci odpowiedniego znaku ASCII (ze względu na sposób działania wejścia BF), który jest danymi wejściowymi do programu Fractran.
- Drukuje dokładnie 1 liczbę na STDOUT w postaci odpowiedniego znaku ASCII, który jest wynikiem programu Fractran.
Ta opcja ma reprezentować dokładne dane wejściowe i wyjściowe z maszyny wirtualnej Fractran.
Opcja 2
Kod BF generowany przez program powinien wykonać następujące czynności:
- Wprowadź dane, dzieląc na czynniki pierwsze liczbę już zakodowaną w pamięci (przed uruchomieniem programu). Jeśli wartością wejściową jest 28 (2 * 2 * 7), wówczas w drugiej komórce będzie wartość 2, a w siódmej komórce wartość 1 (wskaźnik zacznie się na komórce 0). Wszystkie pozostałe komórki będą wynosić zero.
- Podaj dane wyjściowe poprzez faktoryzację pierwotną danych wyjściowych zakodowanych w pamięci po zakończeniu programu. Jeśli wynikiem jest 10, wówczas w każdej komórce 2 i 5. musi znajdować się wartość 1. Wszystkie pozostałe komórki o liczbach pierwszych muszą mieć wartość zero. Zawartość innych komórek nie ma znaczenia.
Ta opcja reprezentuje model obliczeniowy stojący za językiem Fractran.
Zasady i wymagania
- Wejście (na górze programu) będzie listą ułamków na STDIN. Będzie jedna frakcja na linię z przecinkiem między licznikiem a mianownikiem. Pusty wiersz oznacza koniec wprowadzania. Ułamki zawsze będą redukowane do najniższych wartości.
- Wyjście twojego programu powinno być jednowierszowym, poprawnym programem BF do STDOUT. Ten program powinien być w stanie symulować ten konkretny program Fractran zgodnie z jedną z dwóch opcji. Dla każdego wejścia wygenerowany program BF powinien być w stanie wygenerować taki sam wynik jak program Fractran.
- Musisz określić, którą opcję wybrałeś.
- Możesz wybrać granice pamięci BF i taśmy oraz określić, czy są one zawijane
- KOD GOLF. Ponadto rozmiar wyjściowych programów BF nie ma znaczenia, tylko rozmiar programu, który dokonuje konwersji.
- Programy powinny składać się wyłącznie z drukowalnego ASCII
Jeśli gdziekolwiek jestem dwuznaczny, nie wahaj się zapytać. Jest to bardzo skomplikowane wyzwanie do opisania.
Ponadto prosimy o przesłanie wygenerowanego przez program kodu BF dla następujących danych wejściowych, aby zapewnić łatwy sposób sprawdzenia, czy program działa:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Ten program oblicza liczbę 1s w binarnym rozwinięciu liczby. Jednak dane wejściowe i wyjściowe są dziwnie sformatowane (jak we wszystkich programach Fractran). Dane wejściowe mają postać 2 ^ A, natomiast dane wyjściowe mają postać 13 ^ B.