Mod 7 tại Vendoria


12

Một thử thách đơn giản của nhà sản xuất. Tính toán modulo đầu vào 7. Đầu vào sẽ ở dạng nhị phân lớn cuối (blue = 1, red = 0). Đầu ra phải ở cùng định dạng.

Các trường hợp thử nghiệm được cung cấp. Phần nhỏ nhất sẽ thắng.

http://pleasefungus.com/Man producoria /? ctm = Mod7; Input: _binary_number_big_endian._Output:_that_binary_number_mod_7;bbb: | brrr: b|brrrr: brbbbbbbbbb 13; 3; 1 ;

(nếu mod đầu vào 7 là 0, đầu ra không có gì.)


"Code-golf" trong trường hợp này có nghĩa là "ít bộ phận nhất"?
John Dvorak

Vì tôi thậm chí không giải quyết được vấn đề gia tăng, tôi không biết làm thế nào để giải quyết vấn đề này. Xưởng sản xuất là niềm vui.
Justin

@JanDvorak: vâng.
Keith Randall

@KeithRandall Chúng tôi không bao giờ gắn thẻ mã golf với nhà máy. Chúng ta nên xóa thẻ ở đây hoặc thêm nó vào các câu hỏi khác.
Howard

@Howard: Tôi muốn nói thêm nó (hoặc mã nhanh nhất hoặc bận rộn hoặc thách thức mã hoặc bất cứ điều gì mô tả tốt nhất về tính điểm) và để cho nhà máy là một thẻ ngôn ngữ đơn giản .
Ilmari Karonen

Câu trả lời:


5

### Nhà sản xuất, 85 bộ phận được đặt

Thuật toán khá đơn giản: Tính toán mô-đun bằng máy trạng thái (phần lớn nhất có tám nhánh - một trong các trạng thái được sao chép cho mục đích hậu cần), sau đó mã hóa và thu thập kết quả. Vì hầu hết mọi kết quả đều chứa một chữ số, một bước nén bổ sung được sử dụng để giảm số lượng phần.

Được thiết kế trong yEd, sau đó được phiên âm sang producoria.

Theo tôi, cách sử dụng quá nhiều băng tải.


5

58 43 phần

Ảnh chụp màn hình trên mod7 43 phần giảm ở producoria

http://pleasefungus.com/Man producoria /? lvl = 33 & code = c16: 9f0; q15: 9f3; q14: 9f3; q13: 9f3; c12: 9f3; c16: 10f1; r15: 10f3; r14: 10f3; ; q12: 10f4; p11: 10f4; c16: 11f1; i15: 11f7; q14: 11f7; q13: 11f7; q12: 11f7; c11: 11f2; r15: 12f3; b14: 12f3; : 13f0; c13: 13f0; r13: 12f3; y10: 3f3; c10: 4f2; g10: 5f1; q10: 6f4; y11: 3f0; q11: 4f6; r11: 5f3; p11: 6f; ; i12: 5f3; : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1; ;

Ý tưởng đầu tiên của Keith Randall về việc chuyển đổi đầu vào thành unary là khá tốt, vì vậy tôi đã đánh cắp nó. ;-) Thuận tiện, tôi chỉ dành một chút thời gian để tối ưu hóa các bộ chuyển đổi nhị phân nhỏ sang đơn nguyên ở Vendoria , vì vậy chỉ cần chọn một trong những giải pháp gần như hoạt động của tôi * từ thử thách đó và kết hợp nó với bộ đếm mod-7 được tối ưu hóa nhanh chóng.

Thiết kế này hiện đang ở điểm mà việc đưa các robot từ trên xuống dưới bắt đầu yêu cầu các băng tải bổ sung vô dụng. Bất kỳ sự giảm bớt bộ phận đáng kể nào có thể sẽ đến từ việc thiết kế lại bố cục để cao hơn và hẹp hơn.

(* Thách thức đó đòi hỏi a) thiết kế phải phù hợp với bảng 7 × 7 và b) đầu ra đơn nguyên phải ở trong các điểm đánh dấu màu đỏ. Nếu bạn nhìn vào phần chuyển đổi nhị phân sang đơn nhất của máy ở trên, bạn sẽ lưu ý rằng, với một hoặc hai phần phụ, nó có thể dễ dàng đáp ứng một trong hai yêu cầu, nhưng than ôi, không phải cả hai.)


Đây là phiên bản 58 phần trước:

Ảnh chụp màn hình của bộ giảm tốc mod 7 phần 58 ở Vendoria, với các trạng thái được dán nhãn

http://pleasefungus.com/Man producoria/?lvl=32&code=g12:2f3;q13:13f5;c14:13f0;c15:12f3;c9:6f2;c9:7f1;c9:8f1;c9:9f1; ; c10: 5f3; i10: 6f5; c10: 7f2; c10: 9f0; b11: 3f2; p11: 4f1; c11: 5f1; p11: 6f2; p11: 7f2; c11: 8f3; p11: 8 : 3f2; c12: 4f2; c12: 5f0; r12: 6f3; c12: 7f3; i12: 8f1; i12: 9f5; y12: 10f3; c13: 3f2; c13: 4f3; i13: 5f3; ; i13: 8f0; c13: 9f1; c14: 3f3; c14: 4f2; p14: 5f5; c14: 6f1; p14: 7f6; p14: 8f7; r14: 9f3; c15: 4f3; c15: 4 : 7f3; i15: 8f6; c15: 9f3; q15: 10f7; c15: 11f3; r12: 12f2; p13: 12f7; b14: 12f0; b14: 11f3; b12: 11f3; y14: 10f3; ; 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 ;

Giống như giải pháp của Jan Dvorak , điều này cũng dựa trên FSM 7 trạng thái. Tôi đã gắn nhãn các cổng tương ứng với từng trạng thái trong ảnh chụp màn hình để dễ đọc hơn. Tuy nhiên, bộ máy nhà nước thực sự là một phần dễ dàng; phần khó khăn là tạo ra đầu ra cuối cùng với số lượng cổng tối thiểu.

Một mẹo tôi thấy hữu ích là vòng lặp sao chép cuối cùng giúp chuyển mọi thứ được viết trước điểm đánh dấu màu vàng đến hết (đồng thời tước bỏ điểm đánh dấu màu xanh lá cây): điều này cho phép tôi sử dụng sự lặp lại trong các bit đầu ra bậc cao bằng cách tạo đầu ra dưới dạng:

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

Điều này cho phép tôi chủ yếu kết hợp các đường dẫn đầu ra cho đầu ra 2, 4 và 5 (tất cả bắt đầu bằng BR) và 3 và 6 (bắt đầu bằng BB).


Tôi đã tìm thấy không có lỗ hổng trong thiết kế của bạn. Tốt công việc tiết kiệm không gian.
John Dvorak

Thi thiên Đây là một thử nghiệm tuyệt vời cho các triển khai dựa trên máy trạng thái như thế này: số 8890 = BRRRBRBRBBBRBR sẽ cho đầu ra 0, truy cập mọi trạng thái hai lần (và trạng thái 0 một lần nữa ở cuối) và thực hiện mọi chuyển đổi trạng thái có thể một lần.
Ilmari Karonen


0

Tôi thực sự không biết mình đang làm gì nhưng nó hoạt động và tôi có thể là người chiến thắng (nếu chỉ các trường hợp thử nghiệm là đủ bằng chứng). : D

nhập mô tả hình ảnh ở đây

EDIT: Tối ưu hóa nó 2 lần, bây giờ nhỏ hơn một chút. (Đã xóa rác)


Trên thực tế tôi không biết nếu nó sẽ làm việc với số lượng lớn hơn (hoặc khác với các trường hợp thử nghiệm).
Leo Pflug

1
-1 chỉ hoạt động cho các trường hợp thử nghiệm. Nếu số bắt đầu bằng 111, nó sẽ luôn được báo cáo là chia hết cho 7. Điều này đơn giản là không đúng.
John Dvorak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.