Przekształć Fractran w Brainfuck

18

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

  1. 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.
  2. 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.
  3. Musisz określić, którą opcję wybrałeś.
  4. Możesz wybrać granice pamięci BF i taśmy oraz określić, czy są one zawijane
  5. KOD GOLF. Ponadto rozmiar wyjściowych programów BF nie ma znaczenia, tylko rozmiar programu, który dokonuje konwersji.
  6. 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.

PhiNotPi
źródło
Zasadniczo chcesz tłumacza frapran w pieprzeniu mózgu. Wszystko inne jest dość trywialne.
captncraig
@CMP Chcę program, który wyświetla wersję BF programu Fractran. Kod, który dokonuje tej konwersji, nie musi być w formacie BF. Sam program BF ma jeden cel.
PhiNotPi
1
Czy są jakieś ograniczenia dotyczące używanego przez nas tłumacza pieprzenia mózgu? Czy musimy używać komórek wielkości bajtów, czy możemy używać komórek int? Ograniczona pamięć? Zawijasz pamięć? Zawijanie komórek? Czy chcemy czegoś, co sprawi, że zadziała?
captncraig
Wszystko, co chcesz, aby działało, ale proszę podać w swojej odpowiedzi.
PhiNotPi
1
Prawdopodobnie można to rozwiązać za pomocą BF ...
mbomb007 17.04.15

Odpowiedzi:

7

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.

import sys
I=map(eval,sys.stdin)
P='+>,'
Q=''
for i in range(1,256):
 while i:j=i;i=([i*x/y for x,y in I if i%y==0]+[0])[0]
 r=j&255;P+='-[';Q=']<[-'+'+'*r+'.'+'-'*r+']>'+Q
print P+Q

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):

+>,-[-[-[-[-[-[-[-[___]<[-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+.-]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+.-]>
Keith Randall
źródło
1
@PhiNotPi: prawda, być może będę musiał wykryć zapętlenie i specjalny przypadek, który ...
Keith Randall
7
Właściwie myślę, że ustalenie, czy dany program Fractran jest nieskończoną pętlą, czy nie, jest równoznaczne z problemem zatrzymania. Powodzenia z tym. :)
PhiNotPi
1
Ciekawe podejście. Jedynym mankamentem może być to, że specyfikacja frranran mówi, że musi obsługiwać wyjścia większe niż 255, na których wiem, że wiele programów polega, więc wydaje się nieco dziwne przyjmowanie tylko LSB wyniku.
captncraig,
1
@CMP, pytanie wyraźnie stwierdza, że ​​dane wejściowe dla opcji 1 pochodzą z ascii.
stoisko
1
@PhiNotPi określające, czy program się zatrzymuje, różni się nieznacznie od możliwości utworzenia innego programu w innym języku, tak że zatrzymuje się wtedy i tylko wtedy, gdy oryginał się zatrzyma. Pierwsza jest niemożliwa, a druga jest wykonywana codziennie przez kompilatory.
Cruncher
3

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^5kursor. Następnie uruchom dane wyjściowe tego skryptu python. Poczekaj 44 sekundy. Wynik 13^2znajduje się w miejscu, w którym zaczął się kursor. Nie czekałem na odpowiedź 2^7.

s="[->>>+<<<]+["
for l in raw_input().split(','):
 a,b=map(int,l.split('/'))
 s+="[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>["+"[->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]<"*(b-1)+"[->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]<"+"[->+>+<<]>[-<+>]<"*a+"[-]>>[-<<+>>]<<<<<->>>>]<<]<<"
print s+">+<[->-<]>[-<+>]<]>>>[-<<<+>>>]"

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:

[->>>+<<<]+[[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<>+<[->-<]>[-<+>]<]>>>[-<<<+>>>]
boothby
źródło
To fajny pierwszy skrypt Brainfuck, +1. Nawiasem mówiąc, możesz obliczyć za 2^7pomocą mojego interpretera Brainfuck w mniej niż 5 sekund. Czy nie powinno to być raw_input()zamiast raw_input(a może to dziwactwo, o którym nie wiem)?
skopiuj
@ kopiuj, dzięki! masz rację, raw_input()jest konieczne. Nie dziwię się, że kompetentni tłumacze pieprzenia mózgu radzą sobie lepiej niż moja okropna naiwna implementacja Sage.
stoisko
2

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.

L:{$A=<>;
if($/eq$A){last L}
($B,$C)=eval$A;
$D=$E=$F=$G=$H=2;
while($C>1){
if($C%$H==0){
$C/=$H;
$R=">"x$H;
$L="<"x$H;
$D.=$R.'[-'.$L;
$E.=$R.'-'.$L;
if($H>2){$R.="+[->+<]]>[-<+>]<"}
else{$R.="+[-<+>]]<[->+<]>"}
$G=$R.$L.$G;
$H--}$H++}
$H=2;while($B>1){
if($B%$H==0){
$B/=$H;
$F.=">"x$H.'+'.'<'x$H;
$H--}$H++}
$I="+[-$I$D$E+$F$G]";
redo L}print$I

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.

+[-+[-+[-+[-+[-+[-+[-2>>[-<<>>[-<<>>>>>[-<<<<<2>>-<<>>-<<>>>>>-<<<<<+2>>>+<<<>>>>>>>>>>>+<<<<<<<<<<<>>>>>+[->+<]]>[-<+>]<<<<<<>>+[-<+>]]<[->+<]><<>>+[-<+>]]<[->+<]><<2]2>>>>>>>>>>>[-<<<<<<<<<<<2>>>>>>>>>>>-<<<<<<<<<<<+2>>>>>+<<<<<>>>>>>>>>>>+[->+<]]>[-<+>]<<<<<<<<<<<<2]2>>[-<<>>>>>[-<<<<<2>>-<<>>>>>-<<<<<+2>>>>>>>>>>>>>+<<<<<<<<<<<<<>>>>>+[->+<]]>[-<+>]<<<<<<>>+[-<+>]]<[->+<]><<2]2>>>>>[-<<<<<2>>>>>-<<<<<+2>>>>>+[->+<]]>[-<+>]<<<<<<2]2>>>[-<<<2>>>-<<<+2>>+<<>>>+[->+<]]>[-<+>]<<<<2]2>>>>>>>[-<<<<<<<2>>>>>>>-<<<<<<<+2>>+<<>>>>>+<<<<<>>>>>>>+[->+<]]>[-<+>]<<<<<<<<2]2>>[-<<2>>-<<+2>>>>>>>+<<<<<<<>>+[-<+>]]<[->+<]><<2]
PhiNotPi
źródło
1

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.

exec"f=factor;
J=''.join;
Q=L(a,b):Lz:a*z+b*-z;M=Q('<>');
C=Lj,k:(Ll:'[-%s+%s+%s]%s[-%s+%s]%s'%tuple(map(M,[-j,-k,l,-l,l,-l,k])))(j+k);
print '>+[>>>+'+J(map(L(n,m):reduce(Lr,(p,e):'[-%s%s%s[[-]<<+>>]%s<<%s]'%(M(4-p),C(6-p,2),'[-'*(e-1),']'*(e-1),r),f(m),'[-<<<->>>%s]'%J(map(L(p,e):M(4-p)+Q('+-')(e)+M(p-4),f(n/m))))+'<<<'+C(3,2),[map(QQ,x.split('/'))for x in raw_input().split(',')]))+'<<<<+>[-<->]<[->+<]>]'".replace('L','lambda ')

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

>+[>>>+[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[-[[-]<<+>>]]<<[-<<<->>><<-->><+>>-<>>>>>>>+<<<<<<<]]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->>>>>>>[-<<<<<+>>+>>>]<<<[->>>+<<<]<<[[-]<<+>>]<<[-<<<->>>>+<>>>>>>>-<<<<<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[[-]<<+>>]<<[-<<<->>><<->>>-<>>>>>>>>>+<<<<<<<<<]]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<<->>>>-<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[-<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[[-]<<+>>]<<[-<<<->>><<+>><->]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->>>[-<+>>+<]>[-<+>]<<[[-]<<+>>]<<[-<<<->>><<+>>>+<>>>-<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[[-]<<+>>]<<[-<<<->>><<->>>>>+<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<<<<<+>[-<->]<[->+<]>]
boothby
źródło