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.
źródło
Odpowiedzi:
Python, 182 znaków
Opcja 1, standardowe komórki bajtów. Istnieje tylko 255 możliwych danych wejściowych (0 jako dane wejściowe nie ma tak naprawdę sensu), więc po prostu uruchamiam interpreter Fractran 255 razy w Pythonie i generuję prosty przegląd tabeli programu Brainfuck kodującego wyniki.
Dane wyjściowe dla przykładowego wejścia (
___
= 246 więcej zagnieżdżonych warunków, nie mogę wkleić całego wyniku, ponieważ jest on zbyt duży):źródło
Python, 420 znaków
Wykorzystuje to swego rodzaju połączenie opcji 1 i 2: Zakłada się, że pieprzenie mózgu jest realizowane za pomocą dużych liczb całkowitych (używam implementacji Sage). Wprowadź na przykład program frranran
33/20,5/11,13/10,1/5,2/3,10/7,7/2
. Następnie wstępnie załaduj liczbę, na przykład,2^5
kursor. Następnie uruchom dane wyjściowe tego skryptu python. Poczekaj 44 sekundy. Wynik13^2
znajduje się w miejscu, w którym zaczął się kursor. Nie czekałem na odpowiedź2^7
.To jest mój pierwszy scenariusz. Z pewnością można grać w golfa dalej, ale mam inne rzeczy do zrobienia do późnej nocy.
edytuj: zamiast golfa dalej, pracuję nad rozwiązaniem dla opcji 2. także, oto wynik dla żądanego programu:
źródło
2^7
pomocą mojego interpretera Brainfuck w mniej niż 5 sekund. Czy nie powinno to byćraw_input()
zamiastraw_input
(a może to dziwactwo, o którym nie wiem)?raw_input()
jest konieczne. Nie dziwię się, że kompetentni tłumacze pieprzenia mózgu radzą sobie lepiej niż moja okropna naiwna implementacja Sage.Perl, 326 znaków
Mam nadzieję, że odpowiem na własne pytanie, aby zachęcić więcej odpowiedzi. Oczywiście nie kwalifikuję się do wygrania. Jest to opcja 2 z nieograniczoną pamięcią i komórkami, chociaż działa na zawijanie komórek. Każda frakcja jest konwertowana na pojedynczy blok kodu. Nowe linie są czytelne.
Oto przykładowy wynik. Wykorzystuje to fakt, że inne znaki są ignorowane jako komentarze. Wydaje się również, że jest to bardzo krótki wynik w porównaniu do innych pozycji, chociaż rozmiar wyjściowy nie ma znaczenia technicznego.
źródło
Szałwia, 431 znaków
To jest całkowicie nowe rozwiązanie. Wymyśliłem kilka lepszych sposobów robienia rzeczy w bezruchu i to właściwie wdraża Opcję 2. Dodano nowe linie dla większej przejrzystości. Prawdopodobnie można to jeszcze pograć w golfa, ale wymaga przepisania BF, aby miał niższą głębokość pętli.
Przykładowe dane wyjściowe:
Biorąc pod uwagę wkład
33/20,5/11,13/10,1/5,2/3,10/7,7/2
źródło