Mod 7 w Manufakturze

12

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.

http://pleasingfungus.com/Manufactoria/?ctm=Mod7;Input:_binary_number_big_endian._Output:_that_binary_number_mod_7;bbb:|brrr:b|brrrr:br|bb:bb|bbrrb:brr|brrrbbbbbbbr 13; 3; 1 ;

(jeśli wejściowy mod 7 to 0, nic nie wypisuje).

Keith Randall
źródło
„code-golf” w tym przypadku oznacza „najmniej części”?
John Dvorak
Ponieważ nawet nie rozwiązałem problemu przyrostowego, nie mam pojęcia, jak to rozwiązać. Manufaktura jest fajna.
Justin
@JanDvorak: tak.
Keith Randall
@KeithRandall Nigdy nie otagowaliśmy code-golfa manufakturą. Powinniśmy usunąć tag tutaj lub dodać go do innych pytań.
Howard
@Howard: Powiedziałbym, że dodaj go (lub najszybszy kod lub zajęty bóbr lub wyzwanie kodowe lub cokolwiek, co najlepiej opisuje punktację) i niech manufaktura będzie prostym znacznikiem językowym .
Ilmari Karonen

Odpowiedzi:

5

### Manufactoria, 85 części umieszczonych

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.

John Dvorak
źródło
5

58 43 części

Zrzut ekranu przedstawiający 43-częściową redukcję mod7 w Manufakturze

http://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:

Zrzut ekranu 58-częściowego reduktora mod 7 w Manufakturze z oznaczonymi stanami

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:

0:  Y   ->
1: BY   ->   B
2:  YBR ->  BR 
3:  YBB ->  BB
4: RYBR -> BRR
5: BYBR -> BRB
6: RYBB -> BBR

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ę od BB).

Ilmari Karonen
źródło
Nie znalazłem wady w twoim projekcie. Dobra robota w zakresie oszczędzania miejsca.
John Dvorak
Ps. Oto fajny test dla implementacji opartych na automatach stanowych, takich jak ta: liczba 8890 = BRRRBRBRBBBRBR powinna dać wynik 0, odwiedzając każdy stan dwa razy (i stan 0 jeszcze raz na końcu) i biorąc każdą możliwą zmianę stanu jeden raz.
Ilmari Karonen
2

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.

wprowadź opis zdjęcia tutaj

Keith Randall
źródło
Wiesz, prawdopodobnie mógłbyś, gdybyś zoptymalizował ten konwerter .
Ilmari Karonen
0

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

wprowadź opis zdjęcia tutaj

EDYCJA: Zoptymalizowałem go 2 razy, teraz trochę mniej. (Usunięto śmieci)

Leo Pflug
źródło
Właściwie nie wiem, czy będzie działać z większymi liczbami (czy innymi niż przypadki testowe).
Leo Pflug
1
-1 działa tylko dla przypadków testowych. Jeśli liczba zaczyna się od 111, zawsze będzie zgłaszana jako podzielna przez 7. To po prostu nieprawda.
John Dvorak