Фон
Manufactoria была продана как игра, но мы, игроки в код, можем видеть ее таким, какой она есть на самом деле: двумерным языком программирования. Язык программирования Manufactoria основан на единой очереди , которая содержит ряд разноцветных маркеров. Указатель инструкций перемещается по игровому полю с помощью конвейерных лент, и он встречает ряд писателей и ветвей, которые читают и пишут в очередь.
Язык очень прост для понимания, поэтому самый быстрый способ выучить его - это сыграть в первые несколько уровней игры (ссылка выше).
Вызов
Ваша задача - создать программу, которая может делить одно число на другое за наименьшее количество времени.
Входными данными для программы будет строка X синих маркеров, за которыми следуют Y красных маркеров. Требуемым выводом будет строка красных маркеров длиной X / Y.
Используемая игровая доска находится на этом официальном уровне соревнования:
Это 13x13 (максимальный размер), и он предварительно оборудован правильными тестами (см. Раздел «Оценка»).
счет
Оценка вашей программы - это общее количество времени, которое требуется программе, чтобы пройти все тесты на официальном уровне конкурса. Общее время указано на экране завершения уровня.
Во время выполнения тестов вам, скорее всего, придется использовать ползунок ускорения 50x в левом нижнем углу, чтобы быстро получать результаты (ускорение времени не влияет на оценку).
Вот список проблем разделения, которые участвуют в тестах:
6/2 = 3
3/3 = 1
4/1 = 4
0/1 = 0
12/4 = 3
12/3 = 4
9/3 = 3
10/2 = 5
Пример ввода / вывода
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:
источник
Ответы:
Счет 3:29
Возможно также частный случай деления на 1,2,3,4. Делает это намного быстрее.
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 ; с10: 5f0; с9: 5f0; с11: 6f3; P11: 7F0; с10: 7F0; P11: 3f0; r10: 6F1; Q8: 5F4; Q8: 6F1; Q9: 6F1; с7: 5F3; с7: 6f3; q10 : 2f0; r10: 1F3; r10: 4F1; Q9: 3F4; Q9: 4F1; с9: 2F3; с8: 3F3; с8: 4F3; r10: 8F1; q10: 9f6; Q9: 9F1; Q9: 8F4; Q9: 7F4 ; с8: 8f3; с8: 9F3; с8: 10f3; с8: 11f3; с8: 12f3; с8: 13f2; с7: 7f2; с8: 7F3; r11: 9F3; r11: 10f0; r10: 10f0; R9: 10f3; г9 : 11f2; P11: 11f6; r11: 12f1; G11: 8f3; B10: 11f2; С16: 10f2; Q17: 10f6; Q17: 11f3; G18: 11f0; с12: 11f1; с12: 10f2; с13: 10f2; с14: 10f2 ; с15: 10f2; с17: 12f0; р16: 12f4; С16: 11f3; С16: 13f1; Q15: 12f0; r15: 13f1; с14: 12f3; с14: 13f0; с13: 13f0; Q17: 7F6; Q17: 9F1; Q18 : 9f6; Q18: 8f5; Q17: 6F1; G16: 6F2; Y18: 6f0; р17: 5f5; R18: 5f0; С16: 5f0; р15: 5f0; r15: 6f3; B15: 7f2; р16: 7F6; r16: 8F1 ; Q14: 5f0; Y14: 4F3; G14: 6F1; р13: 5f0; р13: 6f0; р13: 7F0; р13: 8f0; р13: 9F1; G12: 9f0; с17: 8F1; & CTM = Divide_and_Conquer;Input_will_be_X_blues_followed_by_Y_reds, _output_X / Y_reds; bbbbbbrr: ррр | bbbrrr: г | bbbbr: рррр | г: | bbbbbbbbbbbbrrrr: ррр | bbbbbbbbbbbbrrr: рррр | bbbbbbbbbrrr: ррр | bbbbbbbbbbrr: RRRRR; 13; 3; 0;
источник
Счет: 15:51
Делает деление путем повторного вычитания. Использует Y среди R, чтобы отследить, сколько делителей мы вычли до сих пор. Использует G для подсчета частного.
Например, состояние в начале каждого внешнего цикла (сразу после начальной записи G) для 12/4:
Когда B не осталось, гаджет внизу слева удаляет Rs, а затем выводит # G-1 Rs.
Внутренний цикл снимает по одному B за раз и использует Y для отслеживания положения. Начиная с внешнего цикла:
Внутренняя петля - прямоугольник 3х4 в правом нижнем углу. Расположение остальных, возможно, можно немного улучшить, но внутренняя петля плотная.
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; р15: 11f3; r16: 11f1; р15: 8f0; r15: 9F1; С16: 8f0; с13 : 2f0; с15: 2f0; С16: 2f0; с17: 2f0; с11: 3F3; с11: 4F3; с11: 6f3; с11: 7F3; с11: 8f3; с11: 9F3; с11: 5F3; P11: 10f7; Q11: 11f6 ; Q11: 12f7; r10: 12f2; с10: 10f2; Q16: 10f5; Y14: 6f3; Q14: 5F3; G15: 5f1; с15: 4F1; с15: 3F1; с17: 9F1; с17: 8F1; с17: 7F1; с17 : 6F1; с17: 5f1; с17: 4F1; с17: 3F1; Y16: 9F1; G17: 10f1; Q14: 2F4; G14: 1F3; & CTM = Divide_and_Conquer; Input_will_be_X_blues_followed_by_Y_reds, _output_X / Y_reds; bbbbbbrr: ррр | bbbrrr: г | bbbbr : rrrr | r: | bbbbbbbbbbbbrrrr: rrr | bbbbbbbbbbbrrr: rrrr | bbbbbbbbrrr: rrr | bbbbbbbbbbrr: rrrrr; 13; 3; 0 ;
источник
Счет 20:35
Совершенно другой подход - меньше деталей, но значительно медленнее.
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 ; с11: 5f1; с10: 5f2; с9: 8f3; с9: 9F3; с10: 11f2; с11: 11f1; с11: 9F1; с11: 10f1; с11: 12f2; с13: 8f0; с11: 8f0; с13: 7F0; с14 : 7F0; с14: 6f3; с12: 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; р12: 8f3; Q12: 12f3; R13: 12f0; r8: 10f2; с12: 9F3; с12: 10f3; с12: 11f3; & CTM = Divide_and_Conquer; Input_will_be_X_blues_followed_by_Y_reds , _output_X / Y_reds; bbbbbbrr: rrr | bbbrrr: r | bbbbr: rrrr | r: | bbbbbbbbbbbrrr: rrr | bbbbbbbbbbbbrrr: rrrr | bbbrb ;
источник