Кубически слишком утомительно, чтобы вручную писать какой-либо код. Ваша задача - перевести текст ASCII в кубический исходный код.
кубично-
Это просто быстрое сокращение кубов; хранилище имеет более полное руководство и детали.
Кубически это esolang, который я написал некоторое время назад, разработанный, чтобы быть болезненным в использовании. Он содержит два куска памяти, кубик Рубика 3х3х3 и регистр, называемый «блокнотом».
Память
Внутренний кубик Рубика инициализируется так:
000
000 top face
000
111222333444 left, front, right, and back faces, respectively
111222333444
111222333444
555
555 down face
555
После поворота правого лица на 90 ° по часовой стрелке куб памяти будет выглядеть так:
002
002
002
111225333044
111225333044
111225333044
554
554
554
команды
Нецелочисленный символ устанавливает команду по умолчанию. Для каждого целого числа перед тем, как команда по умолчанию будет установлена снова, команда выполняется с этим целым числом. Например, x524y312
будет выполнять команду x
с 5, затем с 2, затем с 4, затем выполнять команду y
с 3, затем с 1, затем с 2.
Целые числа, которые используют команды, представляют индексы лица. Так x0
что будет выполнять x
на лице UP (0-indexed). x1
будет работать x
на левом (1-индексированном) лице и так далее.
Выполнение любой команды с помощью 6
выполнит эту команду со значением блокнота. Выполнение любой команды с любым целым числом более 6 приведет к ошибке.
Вот несколько примеров команд:
R1
- поверните правую грань по часовой стрелке на 90 °, чтобы внутренний куб выглядел как во втором примере вышеR11
- поверните ПРАВУЮ грань по часовой стрелке на 90 ° дважды, идентичноR2
+0
- добавить все значения лица UP в блокнот+000
- добавить все значения лицевой стороны UP в блокнот три раза@6
- напечатать несуществующее 6-ое индексируемое лицо (память) как символ%4
- вывести сумму всех значений на грани BACK в виде целого числа
Полный список команд и синтаксиса доступен в хранилище .
Вызов
Вы возьмете текст ASCII в качестве входных данных и напечатаете кубическую программу в качестве выходных данных.
Примеры (украденные здесь и здесь ):
Input -> Output
Hello, World! -> +53@6+1F2L2+0@6L2F2U3R3F1L1+2@66L3F3R1U1B3+0@6:4U1R1+00@6-000@6*0-4+000@6-00@6+2-000000@6-5+4000@6-00@6/0+00@6:0+0/0+00@6
1$2$3$4$5$6$7$8$9$10$ -> B1+2/2%6@4+00/0%6@4+00/1%6@4+21/1%6@4+30/0%6@4+22/1%6@4+22/1%6@4+40/1%6@4+52/1%6@4+42/1%6@4
правила
- Ваша программа может не содержать словаря, содержащего переводы для 100 тестовых случаев.
- Ваша программа должна завершиться менее чем за 180 секунд (никаких переборов, которые занимают недели).
- Ваша программа должна вывести действительный кубический код, который заканчивается менее чем за 180 секунд.
- Ваша программа будет принимать ввод через стандартный ввод, если вы не хотите связываться с тестовым драйвером.
- Ваша программа должна выводить кубический код, который при запуске выдает только ввод вашей программы. ಠ_ಠ
счет
Вы протестируете свою программу с 100 псевдослучайными строками псевдослучайной длины. (Предоставляется сценарий bash, который сделает это за вас.) Вот как вы забьете:
- Пусть длина выходной программы будет o .
- Пусть длина входной строки будет l .
- Пусть переменная r будет результатом o / l .
- Найти среднее значение всех r : (r 1 + r 2 + r ... + r 100 ) / 100 .
Протестируйте с помощью этого скрипта. Вам придется изменить его в соответствии с инструкциями. Обратите внимание, что программа не проверяет, является ли на выходе правильный кубический код. Если вы не можете заставить скрипт работать, я могу помочь. Пинг меня в кубическом чате .
источник
@6
- печатать сумму несуществующего 6-го индексируемого лица (блокнота) в виде символа" точнее? Это%4
тоже сумма? Являются ли+
команды sum face, затем добавить это ко всем значениям или ...?@6
/%6
просто печатает значение блокнота как символ / целое число.@x
/%x
(где x - любое существующее лицо) добавляет все значения наx
-индексированном лице и печатает сумму в виде символа / целого числа.+
добавляет все значения указанного лица в регистр.Ответы:
С ++ 11, оценка : 6,37
Попробуйте онлайн! (генерировать кубический код из ASCII) и (запускать кубический код)
Объяснение:
{0,9,18,27,36,45}
до{6, 15, 27, 26, 19, 42}
. Что делает этот набор суммы граней полезным, так это то, что gcd равен 1, поэтому, благодаря идентичности Безу, существует способ построить любое числоd
из суммы (или разности) этих чисел.ch
текущему значению блокнотаn
, то, допустимd = ch - n
, мы можем выполнять кубические команды в форме,+{digits from 0 to 5}-{digits from 0 to 5}
такой, что значение блокнота становится равнымch
. Затем просто выполните,%6
чтобы напечатать значение блокнота.d
в виде суммы / разности чисел в наборе сумм граней, я использую алгоритм рюкзака для всех чисел от 0 до 128. Напримерd=1
, программа получает27 - 26 = 1
, поэтому печатает+2-3
, что есть27 - 26 = 1
. Что видно при запуске программы с вводомabc
, выводом программыисточник
@
неявно звоните -@6
его можно сократить@
во всех случаях.Lua, оценка :
85,9113,5013,2012,709,419,329,839,669,129,068,03 (в среднем)Попробуйте онлайн!
Ладно, я не думаю, что смогу больше это оптимизировать.
Эта версия перебирает каждый символ, добавляя c% 9 (где c - десятичное значение символа)
:5+2/1
, затем добавляет части, кратные 9, добавляя значение этого лица. Например::2/1+551@
вывести «e», где:2/1
добавляет 2,+551
добавляет 99 (9 * (5 + 5 + 1) или 9 * 11) и@
печатает вывод. Ввод читается сio.read()
.Оптимизация включает в себя непосредственное добавление / вычитание после печати, если разница между символами кратна 9, деление текущего значения, если это возможно, вместо установки c% 9 с нуля, и повторение символов путем повторной печати текущего значения вместо его пересчета. Кроме того, я реализовал метод Камиля для мгновенной печати любого лица, которое уже содержит целевое значение, и предложение MD XF не использовать
:
в начале, а вместо этого просто начать с+
.источник
local inp = io.read()
наlocal inp = io.read("*all")
. Это решает проблему.:5+124
, вместо этого вы можете просто написать+5124
, что, вероятно, немного снизит счет, если вы правильно его настроите.Кубически , оценка : 86,98
Попробуйте онлайн!
Оказывается, все, что вам нужно, это условные циклы, грань, равная 1, и согласованное поведение конца ввода.
Сложение / вычитание грани ЛЕВЫЙ должно завершить цикл при чтении EOF.
источник
@
неявно звоните -@6
его можно сократить@
во всех случаях.C # (.NET Core) , оценка:
129,9811,7310,829,6210,3310,3210,20-1,2 балла от предложения MD XF использовать
@6666...
вместо@6@6@6@6...
повторяющегося символа и превосходную последовательность инициализацииПопробуйте онлайн!
Моя новейшая версия на самом деле делает некоторые манипуляции с кубом! Ура!
Сначала
Console.Write
было разработано исправление MD XF, которое создает этот куб:Значение этого куба состоит в том, что одна из его сторон имеет сумму 1, что позволяет манипулировать Блокнотом в меньшем масштабе, чем кратное девяти, и, в частности, он упрощает относительное перемещение, вместо того, чтобы начинать с нуля каждый символ; в этом алгоритме как сложение, так и вычитание используются для выбора кратчайшего пути между символами.
Версия инициализации MD XF приводит к тому, что сторона 2 имеет сумму 14, что экономит много байтов вывода для ASCII-расстояний между 14 и 20.
Теперь можно обрабатывать ввод с внутренними символами новой строки, Console.Read () получает отдельные символы до конца файла; см. ссылку TIO, которая должна иметь вход
Побрили пару долей точки, сразу же выведя символ, если его ASCII-значение уже существует на стороне.
Скрипт теста любезно предоставлен MDXF
Предыдущее представление здесь и объяснение:
Это довольно скучно, но, насколько я могу судить, это работает. По общему признанию я только попробовал
Hello, World!
но я управлял выводом в интерпретаторе TIO Cubically, и это выводило "Привет, Мир!" поэтому я предположил, что это работает.Вместо того, чтобы вообще манипулировать кубом, блокнот просто несколько раз увеличивается на сумму 1 грани (9) до тех пор, пока он не получит правильное значение для каждого символа, а затем напечатает его.
источник