Szybko podziel się w Manufakturze

10

tło

Manufaktura została wprowadzona na rynek jako gra, ale my, golfiści, widzimy ją taką, jaka naprawdę jest: dwuwymiarowy język programowania. Język programowania Manufaktury opiera się na jednej kolejce , która zawiera serię kolorowych znaczników. Wskaźnik instrukcji porusza się po planszy za pomocą przenośników taśmowych i napotyka szereg pisarzy i gałęzi, które czytają i piszą do kolejki.

Język jest bardzo łatwy do zrozumienia, więc najszybszym sposobem na naukę jest zagranie pierwszych kilku poziomów gry (link powyżej).

Wyzwanie

Twoim wyzwaniem jest stworzenie programu, który może podzielić jedną liczbę na inną w jak najkrótszym czasie.

Wejściem do programu będzie ciąg X niebieskich znaczników, a następnie Y czerwonych znaczników. Wymaganym wyjściem będzie ciąg czerwonych znaczników o długości X / Y.

Plansza do wykorzystania znajduje się na tym oficjalnym poziomie konkursu:

http://pleasingfungus.com/Manufactoria/?ctm=Divide_and_Conquer;Input_will_be_X_blues_followed_by_Y_reds,_output_X/Y_reds;bbbbbbrr:rrr|bbbrrr:r|bbbbr:rrrr|r:|bbbbbbbbbbbbrrrr:rrr|bbbbbbbbbbbbrrr:rrrr|bbbbbbbbbrrr:rrr|bbbbbbbbbbrr: rrrrr; 13; 3; 0

Ma wymiary 13 x 13 (maksymalny rozmiar) i jest wstępnie wyposażony we właściwe testy (patrz sekcja punktacji).

Punktacja

Wynik twojego programu to łączny czas, jaki zajmuje programowi zaliczenie wszystkich testów na oficjalnym poziomie konkursu. Całkowity czas podany jest na ekranie ukończenia poziomu.

Podczas uruchamiania testów najprawdopodobniej będziesz musiał użyć suwaka przyspieszenia 50x w lewym dolnym rogu, aby szybko otrzymać wyniki (przyspieszenie czasowe nie wpływa na wynik).

Oto lista problemów z podziałem związanych z testami:

 6/2 = 3
 3/3 = 1
 4/1 = 4
 0/1 = 0
12/4 = 3
12/3 = 4
 9/3 = 3
10/2 = 5

Przykład I / O

12/3=4
in:  BBBBBBBBBBBBRRR
out: RRRR

10/2=5
in:  BBBBBBBBBBRR
out: RRRRR

9/3=3
in:  BBBBBBBBBRRR
out: RRR

0/1=0
in:  R
out: 
PhiNotPi
źródło
Fajne rzeczy, ta gra! Naprawdę nie dawałem czasu na grę w golfa, ale to zapamiętam.
tomsmeding

Odpowiedzi:

6

Ocena 3:29

Może być także przypadek specjalny dzielący przez 1,2,3,4. Sprawia, że ​​jest to znacznie szybsze.

wprowadź opis zdjęcia tutaj

http://pleasingfungus.com/Manufactoria/?lvl=34&code=c9:13f2;c10:13f2;c11:13f2;p12:2f7;y13:2f0;p11:2f0;c11:4f3;c10:3f0;p11:5f0 ; c10: 5f0; c9: 5f0; c11: 6f3; p11: 7f0; c10: 7f0; p11: 3f0; r10: 6f1; q8: 5f4; q8: 6f1; q9: 6f1; c7: 5f3; c7: 6f3; q10 : 2f0; r10: 1f3; r10: 4f1; q9: 3f4; q9: 4f1; c9: 2f3; c8: 3f3; c8: 4f3; r10: 8f1; q10: 9f6; q9: 9f1; q9: 8f4; q9: 7f4 ; c8: 8f3; c8: 9f3; c8: 10f3; c8: 11f3; c8: 12f3; c8: 13f2; c7: 7f2; c8: 7f3; r11: 9f3; r11: 10f0; r10: 10f0; r9: 10f3; r9 : 11f2; p11: 11f6; r11: 12f1; g11: 8f3; b10: 11f2; c16: 10f2; q17: 10f6; q17: 11f3; g18: 11f0; c12: 11f1; c12: 10f2; c13: 10f2; c14: 10f2 ; c15: 10f2; c17: 12f0; p16: 12f4; c16: 11f3; c16: 13f1; q15: 12f0; r15: 13f1; c14: 12f3; c14: 13f0; c13: 13f0; q17: 7f6; q17: 9f1; q18 : 9f6; q18: 8f5; q17: 6f1; g16: 6f2; y18: 6f0; p17: 5f5; r18: 5f0; c16: 5f0; p15: 5f0; r15: 6f3; b15: 7f2; p16: 7f6; r16: 8f1 ; q14: 5f0; y14: 4f3; g14: 6f1; p13: 5f0; p13: 6f0; p13: 7f0; p13: 8f0; p13: 9f1; g12: 9f0; c17: 8f1; & ctm = Divide_and_Conquer;Input_will_be_X_blues_followed_by_Y_reds, _output_X / Y_reds; bbbbbbrr: rrr | bbbrrr: r | bbbbr: rrrr | r: | bbbbbbbbrrr: rbr bbbbrrrbbrrrb:;

Keith Randall
źródło
Powinienem był to przewidzieć, ale i tak dobra robota. Chciałbym, żeby silnik gry pozwolił mi stworzyć więcej niż 8 przypadków testowych. Czy w przyszłości powinienem stworzyć więcej wyzwań związanych z Manufakturą?
PhiNotPi
1
Jasne, lubię ich.
Keith Randall
4

Wynik: 15:51

wprowadź opis zdjęcia tutaj

Czy dzieli przez powtarzające się odejmowanie. Korzysta z Y między R, aby śledzić, ile dzielnika odejmowaliśmy do tej pory. Używa Gs do zliczania ilorazu.

Na przykład stan na początku każdej zewnętrznej pętli (zaraz po początkowym module zapisującym G) dla 12/4 to:

BBBBBBBBBBBB RRRR G
BBBBBBBB RRRR GG
BBBB RRRR GGG
RRRR GGGG

Gdy nie ma już Bs, gadżet w lewym dolnym rogu obciąża Rs, a następnie generuje # G-1 Rs.

Wewnętrzna pętla rozdziela po jednym B na raz i używa Y do śledzenia pozycji. Zaczynając od zewnętrznej pętli:

BBBBBBBB RRRR GG
BBBBBBB RYRRR GG
BBBBBB RRYRR GG
BBBBB RRRYR GG
BBBB RRRR GG

Pętla wewnętrzna to pudełko 3x4 w prawym dolnym rogu. Układ pozostałych można prawdopodobnie nieco poprawić, ale wewnętrzna pętla jest ciasna.

http://pleasingfungus.com/Manufactoria/?lvl=34&code=c11:13f2;g12:2f3;p12:3f7;c13:3f3;p13:4f3;b12:4f2;r14:4f3;p14:7f7;r13:7f2 ; q14: 8f7; g13: 8f2; p14: 9f4; r13: 10f2; p14: 10f7; b15: 10f0; q14: 11f7; p15: 11f3; r16: 11f1; p15: 8f0; r15: 9f1; c16: 8f0; c13 : 2f0; c15: 2f0; c16: 2f0; c17: 2f0; c11: 3f3; c11: 4f3; c11: 6f3; c11: 7f3; c11: 8f3; c11: 9f3; c11: 5f3; p11: 10f7; q11: 11f6 ; q11: 12f7; r10: 12f2; c10: 10f2; q16: 10f5; y14: 6f3; q14: 5f3; g15: 5f1; c15: 4f1; c15: 3f1; c17: 9f1; c17: 8f1; c17: 7f1; c17 : 6F1, C17 5f1, C17 4F1, C17 3F1; Y16: 9f1, G17: 10f1, P14: 2f4, G14: 1F3; & CTM = Divide_and_Conquer; Input_will_be_X_blues_followed_by_Y_reds, _output_X / Y_reds; bbbbbbrr: rrr | bbbrrr: r | bbbbr : rrrr | r: | bbbbbbbbbbbbrrrr: rrr | bbbbbbbbbbbbrrr: rrrr | bbbbbbbbbrrr: rrr | bbbbbbbbbbrr: rrrrr; 13; 3; 0 ;

Keith Randall
źródło
Dzięki radykalnej reorganizacji części twojego projektu udało mi się zmniejszyć wynik do 13:28 z 53 częściami.
PhiNotPi
2

Wynik 20:35

Zupełnie inne podejście - mniej części, ale znacznie wolniej.

rozwiązanie div

http://pleasingfungus.com/Manufactoria/?lvl=34&code=p12:2f3;g11:2f3;b11:3f3;c12:4f2;c11:4f2;c13:2f3;c13:3f3;c13:4f3;c12:5f3 ; c11: 5f1; c10: 5f2; c9: 8f3; c9: 9f3; c10: 11f2; c11: 11f1; c11: 9f1; c11: 10f1; c11: 12f2; c13: 8f0; c11: 8f0; c13: 7f0; c14 : 7f0; c14: 6f3; c12: 7f3; y14: 5f0; y10: 6f1; y11: 7f1; g12: 6f2; g9: 11f2; g10: 10f0; q9: 10f3; q13: 5f7; q13: 6f7; b11: 6f1 ; b10: 9f1; p10: 7f1; r9: 7f2; p10: 8f4; p12: 8f3; q12: 12f3; r13: 12f0; r8: 10f2; c12: 9f3; c12: 10f3; c12: 11f3; & ctm = Divide_and_C_be_s , _output_X / Y_reds; bbbbbbrr: rrr | bbbrrr: r | bbbbr: rrrr | r: | bbbbbbbbbbbbrrrr: rrr | bbbbbbbbbbbbrrr: rrrr | bbbbbbbbbrrr: rrr | bbbbbbbbbbrr: rrrrr; 13; 3; 0 ;

Howard
źródło