Proste wyzwanie Manufaktury. Oblicz moduł wejściowy 7. Dane wejściowe będą zapisywane w formacie binarnym big-endian (niebieski = 1, czerwony = 0). Dane wyjściowe powinny być w tym samym formacie.
Dostarczone przypadki testowe. Wygrywa najmniejsza liczba części.
(jeśli wejściowy mod 7 to 0, nic nie wypisuje).
code-golf
manufactoria
Keith Randall
źródło
źródło
Odpowiedzi:
Algorytm jest dość prosty: oblicz moduł za pomocą maszyny stanów (największa część z ośmioma gałęziami - jeden ze stanów jest powielony dla celów logistycznych), a następnie koduj i zbieraj wyniki. Ponieważ prawie każdy wynik zawiera jedną cyfrę, zastosowano dodatkowy krok kompresji w celu zmniejszenia ilości części.
Zaprojektowany w YEd, a następnie przepisany do Manufaktury.
Moim zdaniem wykorzystuje zdecydowanie za dużo taśm przenośnikowych.
źródło
5843 częścihttp://pleasingfungus.com/Manufactoria/?lvl=33&code=c16:9f0;q15:9f3;q14:9f3;q13:9f3;c12:9f3;c16:10f1;r15:10f3;r14:10f3;b13:10f3 ; q12: 10f4; p11: 10f4; c16: 11f1; i15: 11f7; q14: 11f7; q13: 11f7; q12: 11f7; c11: 11f2; r15: 12f3; b14: 12f3; c12: 12f3; c15: 13f0; c14 : 13f0; c13: 13f0; r13: 12f3; y10: 3f3; c10: 4f2; g10: 5f1; q10: 6f4; y11: 3f0; q11: 4f6; r11: 5f3; p11: 6f4; b11: 7f1; i12: 4f7 ; c12: 5f3; q12: 6f0; g12: 2f3; c12: 3f3; p13: 4f6; y13: 3f0; c13: 5f0; c12: 7f3; b12: 8f3; & ctm = Mod7; Input: _binary_number_big_endian._Output: _numer_batowy : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;
Pomysł Keitha Randalla na konwersję danych wejściowych na jednoargumentowy był całkiem dobry, więc go ukradłem. ;-) Dogodnie, spędziłem trochę czasu optymalizując małe konwertery binarne na unary w Manufakturze , więc właśnie wybrałem jedno z moich prawie działających rozwiązań * z tego wyzwania i połączyłem je z szybko zoptymalizowanym licznikiem mod-7.
Ta konstrukcja jest teraz w punkcie, w którym przenoszenie robotów z góry na dół zaczyna wymagać dodatkowych, niepotrzebnych przenośników. Wszelkie dalsze znaczące redukcje części prawdopodobnie wynikną z przeprojektowania układu, aby był wyższy i węższy.
(* To wyzwanie wymagało a) zaprojektowania, aby zmieściło się na płycie 7 × 7, oraz b) jednostkową mocą wyjściową, która ma być w czerwonych znacznikach. Jeśli spojrzysz na powyższą część konwertera danych binarnych na jednoargumentowe, zauważysz, że z jedną lub dwiema dodatkowymi częściami może z łatwością spełnić oba wymagania, ale niestety nie oba.
Oto poprzednia 58-częściowa wersja:
http://pleasingfungus.com/Manufactoria/?lvl=32&code=g12:2f3;q13:13f5;c14:13f0;c15:12f3;c9:6f2;c9:7f1;c9:8f1;c9:9f1;c10:4f3 ; c10: 5f3; i10: 6f5; c10: 7f2; c10: 9f0; b11: 3f2; p11: 4f1; c11: 5f1; p11: 6f2; p11: 7f2; c11: 8f3; p11: 9f3; b11: 10f2; c12 : 3f2; c12: 4f2; c12: 5f0; r12: 6f3; c12: 7f3; i12: 8f1; i12: 9f5; y12: 10f3; c13: 3f2; c13: 4f3; i13: 5f1; c13: 6f3; c13: 7f2 ; i13: 8f0; c13: 9f1; c14: 3f3; c14: 4f2; p14: 5f5; c14: 6f1; p14: 7f6; p14: 8f7; r14: 9f3; c15: 4f3; q15: 5f0; c15: 6f3; c15 : 7f3; i15: 8f6; c15: 9f3; q15: 10f7; c15: 11f3; r12: 12f2; p13: 12f7; b14: 12f0; b14: 11f3; b12: 11f3; y14: 10f3; y15: 13f0; & ctm = Mod7 ; Input: _binary_number_big_endian._Output: _that_binary_number_mod_7; bbb: | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;
Podobnie jak rozwiązanie Jana Dvoraka , jest ono również oparte na 7-stanowym FSM. Oznaczono bramki odpowiadające każdemu stanowi na zrzucie ekranu, aby ułatwić czytanie. Jednak sama maszyna stanowa jest naprawdę łatwą częścią; trudną częścią jest generowanie końcowego wyniku przy minimalnej liczbie bramek.
Jedną sztuczką, którą uznałem za przydatną, była ostatnia pętla kopiowania, która przesuwa beczkę wszystko zapisane przed żółtym znacznikiem do końca (jednocześnie usuwając zielony znacznik): pozwoliło mi to wykorzystać powtórzenie w bitach wyjściowych wysokiego rzędu o generowanie wyników jako:
To pozwala mi w większości łączyć ścieżki wyjściowe dla wyjść 2, 4 i 5 (które zaczynają się od
BR
) oraz 3 i 6 (które zaczynają się odBB
).źródło
60 części
Moje rozwiązanie jest całkiem inne. Najpierw konwertuje binarne na jednoargumentowe, a następnie robi mod 7. Nie jestem w stanie pokonać Ilmari.
źródło
Właściwie nie miałem pojęcia, co robię, ale działa i mogę być zwycięzcą (jeśli tylko przypadki testowe byłyby wystarczającym dowodem). :RE
EDYCJA: Zoptymalizowałem go 2 razy, teraz trochę mniej. (Usunięto śmieci)
źródło
111
, zawsze będzie zgłaszana jako podzielna przez 7. To po prostu nieprawda.