Manufactoria中的Mod 7


12

一个简单的制造挑战。计算输入模7。输入将采用大端二进制(蓝色= 1,红色= 0)。输出应采用相同的格式。

提供了测试用例。最小的零件数获胜。

http://pleasingfungus.com/Manufactoria/?ctm=Mod7;输入:_binary_number_big_endian._输出:_that_binary_number_mod_7; bbb:| brrr:b | brrrr:br | bb:bb | bbrrb:brr | brrrrb:brb | bbrb:bbr; 13; 3; 1 ;

(如果输入mod 7为0,则不输出任何内容。)


在这种情况下,“代码高尔夫球”是指“最下部”?
John Dvorak 2014年

由于我什至没有解决增量问题,因此我不知道如何解决此问题。Manufactoria很有趣。
贾斯汀2014年

@JanDvorak:是的。
Keith Randall

@KeithRandall我们从来没有用制造厂标记过代码高尔夫球。我们应该在此处删除标签,或者将其添加到其他问题中。
霍华德

@霍华德:我想说一下(或者最快的代码繁忙的海狸代码的挑战,或者最能说明得分的东西),然后将制造工厂作为简单的语言标签
Ilmari Karonen 2014年

Answers:


5

### Manufactoria,放置了85个零件

该算法非常简单:使用状态机(具有八个分支的最大部分-为了逻辑目的而复制一个状态)来计算模量,然后编码并收集结果。由于几乎每个结果都包含一位数字,因此采用了额外的压缩步骤来减少零件数量。

在yEd中设计,然后转录为Manufactoria。

我认为使用太多的传送带。


5

58 43个零件

在Manufactoria中减少43部分mod7的屏幕截图

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;输入:_binary_number_big_endian._输出:_that_binary_bb_mod_d :| brrr:b | brrrr:br | bb:bb | bbrrb:brr | brrrrb:brb | bbrb:bbr; 13; 3; 1 ;

Keith Randall最初将输入转换为一元的想法非常好,所以我偷了它。;-)方便起见,我只是花了一些时间在Manufactoria中优化小型二进制到一元转换器,因此从该挑战中选择了我的一种几乎可行的解决方案*,并将其与快速优化的mod-7计数器相结合。

现在,这种设计正处于从顶部到底部使机器人开始使用时就需要其他无用的额外传送带的地步。重新设计布局使其更高和更窄,可能会大大减少零件数量。

(* 这项挑战要求a)将设计安装到7×7的板上,并且b)一元输出以红色标记显示。如果您看一下上面机器的二进制到一元转换器部分,您会注意到,通过增加一个或两个额外的部分,它可以轻松满足任一要求,但可惜不能同时满足这两个要求。)


这是以前的58部分版本:

Manufactoria中由58部分组成的mod 7减速器的屏幕截图,带有状态标记

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 ;输入:_binary_number_big_endian._输出:_that_binary_number_mod_7; bbb:| brrr:b | brrrr:br | bb:bb | bbrrb:brr | brrrrb:brb | bbrb:bbr; 13; 3; 1 ;

Jan Dvorak的解决方案一样,它也基于7状态FSM。我在屏幕截图中标记了与每个状态相对应的门,以使其更易于阅读。但是,状态机本身确实很容易。棘手的部分是使用最少的门产生最终输出。

我发现有用的一个技巧是最终的复制循环,该循环将黄色标记之前写入的所有内容都移至末尾(同时还剥离了绿色标记):这使我可以利用高位输出位的重复生成的输出为:

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

这使我可以将输出2、4和5(均以开头BR)以及3和6(均以开头)的输出路径进行组合BB


我发现您的设计没有缺陷。在节省空间方面做得很好。
约翰·德沃夏克

附言 对于这样的基于状态机的实现,这是一个不错的测试:数字8890 = BRRRBRBRBBBRBR应该给输出0,访问每个状态两次(最后一次返回状态0),并进行每个可能的状态转换一次。
Ilmari Karonen


0

我实际上不知道我在做什么,但是它行得通,我可能会成为赢家(如果仅测试用例就足够了)。:D

在此处输入图片说明

编辑:优化了2倍,现在小了一点。(已清除垃圾)


实际上,我不知道它是否可以使用更大的数字(或与测试用例不同的数字)。
Leo Pflug 2014年

1
-1仅适用于测试用例。如果数字以开头111,则始终会被7整除。这是不正确的。
John Dvorak 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.