Используя массив положительных целых чисел A
в качестве входных данных, сгенерируйте программу, которая при повторении для k
времен выводит k
th (1-index) значение массива.
Например, если это массив [1,11]
, выводом должна быть программа, которая выводит 1
, а при повторении дважды выводит 11
. Код, как print(end="1");
в Python 3 работает: print(end="1");
печатает 1 и print(end="1");print(end="1");
печатает 11
Наименьшая сумма длин кода для решения всех тестовых случаев побеждает. Ваш метакод должен решить 500 тестовых случаев за 60 с, а каждый код вашего решения должен вернуться за 10 с. Мета-код и код решения не обязательно должны быть на одном языке, но все решения, которые генерирует ваша метапрограмма, должны быть на одном языке.
Предварительные данные и генератор можно посмотреть здесь . Через 7 дней будет использоваться сумма времени представления (например, 12:34 означает 1234), чтобы быть случайным начальным числом и генерировать другой тестовый пример в качестве окончательного тестового примера.
Конечное начальное число равно 7335 по Гринвичу + 8, поэтому окончательные данные испытаний находятся здесь.
print(end="1");
повторяется 2 разаprint(end="1");print(end="1");
x
. Затемx
должен дать первый элемент списка,xx
должен дать второй элемент списка,xxx
должен дать третий, и так далее.Ответы:
Python 3 , генерирует Stax
Это использует множество стратегий. Большинство стратегий применяются только при определенных условиях, но есть одна резервная стратегия, которую всегда можно использовать. В конце выбирается самая маленькая программа-кандидат.
Попробуйте онлайн!
Обновление: проверка. Выполнение каждой множественности каждой программы будет занимать много времени. Можно запустить их все одновременно. Для этого необходимо использовать небольшой фрагмент кода. Он отвечает за несколько вещей.
Неявный вывод, если есть. Обычно в конце программы stax печатается вершина стека, если не было других выходных данных. При запуске нескольких программ в одном исходном файле это должно быть сделано явно.
Очистите оба стека.
Сброс регистров. Для этих программ используется только регистр x.
Этот шаблон должен применяться после каждой отдельной программы, которая будет выполнена.
Например, ввод
[5,2,7,3]
производит программу Stax3527E|X@
. Все четыре кратности могут быть проверены одновременно.Попробуйте онлайн!
Таким образом, можно протестировать все кратности всех программ за один прогон, предполагая, что ничего не нарушается. Вероятно, это будет самая большая программа из когда-либо выполненных, если все 500 будут выполнены.
источник
Perl 5
-p
, генерирует Perl 5-p
, накладные расходы191713-1 благодаря @Dom Hastings
Счет за один вход будет
length of the input + 13
. Очевидно, что это можно улучшить, генерируя программы самораспаковки для больших входов, но я не буду беспокоиться.Укажите входной массив, разделенный запятыми в одной строке на STDIN.
Попробуйте онлайн!
Запускать конкатенацию результатов
n
без ввода (например, перенаправление из / dev / null)Пример способа запустить его для ввода,
2,6,4,7
и полученная программа повторяется 4 раза:Попробуйте онлайн!
Если вам не нравится результирующая программа, пытающаяся читать из STDIN, используйте эту версию с накладными расходами 17:
Попробуйте онлайн!
Пример способа запустить его для ввода,
2,6,4,7
и полученная программа повторяется 4 раза:Попробуйте онлайн!
Эта версия вылетает после печати требуемого вывода
источник
s/ /,/g;$_="die say+($_)[\$-++],"
?05AB1E , генерирует 05AB1E
Попробуйте онлайн!
Сгенерированная программа для ввода
[5,17,7,13,2]
есть"5 17 7 13 2"#.g<è
.Тестовый набор для [5,17,7,13,2]
Длина сгенерированной программы
len(input) + 5
источник
len(input)
это не количество целых чисел, а длина строки, содержащей их все. Сначала я неправильно понял.APL (Dyalog Unicode)
Анонимный префикс лямбда. Возвращает тело программы.
Попробуйте онлайн!
методы
Это исследует различные методы и возвращает первый пригодный для использования, в конечном счете возвращаясь к универсально применимому методу.
Один элемент
Если список имеет только один элемент, он возвращается как есть.
2, 22 и т. Д.
Одну цифру можно просто повторить, чтобы получить число в 11 раз больше,
Все так же
Мы просто возвращаем самый правый (
⊢
) номер.линейный
f (n) = k × n последовательностей просто вставьте плюс перед первым членом.
Факториал, за которым следуют все 1
Когда первое число n =! M и последующие числа равны 1, тогда
!m
это решение, потому что!m
равно n,m!m
равно 1 и!1
равно 1.б аб аб аб
Поскольку все двузначные числа больше, чем все однозначные числа, рабочий максимум, где передняя часть первого числа приклеена к задней части второго числа, является решением.
Трехстрочный код
Проверьте, является ли любая формула типа
+a×b
действительной.Строка запасной
Длинные последовательности без чисел ниже 5 (потому что 4 - это разрыв строки) могут быть закодированы как символы SBCS.
Отступ смещения строки
Если число меньше 5, мы сдвигаемся на 9, чтобы избежать этого.
Отступать
Простая конкатенация строк
"{⍺←⊃⋄1⌽⍺⊢⍵}"
и⍕
ввода stringified ( ). Например,[3,1,4]
возвращает тело программы{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
.Часть в фигурных скобках является амбивалентной функцией, что означает, что она может быть префиксной или инфиксной функцией. Таким образом, самый левый экземпляр будет работать в режиме префикса, а все остальные в режиме инфикса. Разница между режимами заключается в том
⍺
, имеет ли значение , обозначающее левый аргумент, значение. Если этого не произойдет, ему будет назначена функция⊃
(первая).Объяснение резервного метода
{
…}
Анонимная лямбда:⍺←⊃
Если левого аргумента нет (⍺
), присвойте функцию⊃
(первую)⍺
⋄
тогда:На этом этапе следующий код означает две разные вещи в зависимости от того,
⍺
является ли список чисел (вызов инфикса) или функцией «first» (вызов префикса).Если
⍺
это список номеров:⍺⊢⍵
отбросить левый аргумент в пользу правого аргумента1⌽
поверните этот шаг влевоЕсли
⍺
функция «первая»:⊢⍵
привести правильный аргумент⍺
выбрать первый элемент этого1⌽
поверните его на один шаг (нет на скаляре)Пример выполнения резервного метода
Выполняя
3 1 4
код,{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
назначает «первую» функцию⍺
и, таким образом, возвращает первый элемент;3
,Выполнение
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
позволяет самой правой лямбде «захватывать» левый3 1 4
как свой левый аргумент, поэтому⍺
имеет значение, которое отбрасывается, в пользу3 1 4
которого затем поворачивается на один шаг влево и выдает1 4 3
результат. Затем он используется в качестве единственного аргумента для самой левой лямбды, где⍺
становится «первой» функцией, в результате чего результат становится первым элементом;1
,Выполнение
{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4{⍺←⊃⋄1⌽⍺⊢⍵}3 1 4
позволяет самой правой лямбде «захватить» середину в3 1 4
качестве левого аргумента, который затем отбрасывается в пользу правого аргумента3 1 4
, который при повороте на один шаг влево равен1 4 3
. Затем он используется в качестве правого аргумента средней лямбды, а левый - в3 1 4
качестве левого аргумента. Левый аргумент отбрасывается для правого, который поворачивался на один шаг влево4 3 1
. Затем это становится единственным аргументом самой левой лямбды, поэтому⍺
становится «первой функцией», возвращающей первый элемент;4
,счет
Когда наступит время для тестирования с использованием фактических данных, используйте этот тестовый комплект (связанный с данными предварительного тестирования ). Контрольные примеры помещаются в поле ввода, и выводом будет общее количество байтов всех 500 программ вместе. (Он также выдаст ошибку, но это только потому, что впоследствии он пытается оценить входные данные как есть.)
источник
Уголь
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Выведите буквальную строку
⎚§⪪
.Приведите входной массив к строке, объедините с пробелами и напечатайте.
Выведите буквальную строку
¦ Lυ⊞υω
.Вывод например
5,17,7,13,2
есть⎚§⪪5 17 7 13 2¦ Lυ⊞υω
. Попробуйте онлайн! Объяснение:Очистите холст, чтобы был виден только последний вывод.
Возьмите длину предопределенного списка
u
. Используйте это, чтобы индексировать в список целых чисел, которые были разделены на пробелы, и выводить выбранный элемент.Переместите фиктивную переменную в предварительно определенный список
u
, чтобы следующая копия выводила следующий элемент списка.Общая длина вывода = (длина всех целых чисел во всех списках) + (количество целых чисел во всех списках) + (количество списков * 9) символов (SBCS).
источник
Haskell , генерирует Haskell
Попробуйте онлайн! Для первого теста
[5,2,7,3,2,3,15,10,7,2,14,11,16,16,3,3,4,3,8,4]
он выдает следующую программу:Попробуйте один раз , удвоить и утроить . Это использует тот же подход, что и мой ответ на Haskell: я удваиваю источник, а ты удваиваешь вывод .
Длина каждой сгенерированной программы равна длине входного списка в виде строки плюс 25, таким образом, оценка для доступных на данный момент тестовых случаев равна
12266 + 500 * 25 = 24766
. Это показывает, что отношение кода к данным в основном одинаково, и я сомневаюсь, что возможно написать достаточно маленький код распаковки, который уменьшит оценку. Это может быть возможно, если списки куда больше.источник
Python 2 , генерирует Python 2
Попробуйте онлайн!
Для ввода
сгенерированная программа
что составляет 98 байт.
Адаптировано из этого решения в «Я удваиваю источник, вы удваивает вывод!».
Черт возьми, два коротких ответа появились прежде, чем я закончил писать этот ответ.
источник
k
print
чтобыsys.stdout.write
удалить конечное «что-то».Java 8, генерирует Python 2
Попробуйте онлайн.
Т.е.
[3,4,5,6,7]
генерирует эту программу на Python 2:Попробуйте онлайн один раз ; Попробуйте онлайн дважды ; Попробуйте онлайн три раза .
Сгенерированная программа на Python основана на ответе @ Mr.Xcoder в третий раз за вызов очарования .
Объяснение:
Код Java 8:
Код Python 2:
источник
Bash, вывод программ на Perl 5
Программу Bash можно назвать как
script.sh 1,2,3
.Perl-программа должна вызываться с
-E
флагом.Сгенерированный
perl
код для ввода4,7,8
:Довольно грубая сила. Удаляет элемент массива (
perl
не заботится о том, что массив сначала не существует), устанавливает его, если он еще не установлен. Затем он повторяет первый элемент массива в конце. (END
Блок запускается последним). Выходexec 'true'
из программы, так что дальнейшиеEND
блоки не выполняются.Пример:
источник
Python 2, генерирует C ++
Это не побьет никаких рекордов, мне было интересно подумать, смогу ли я выяснить, как это сделать :). Используйте тот факт, что глобальные переменные запускаются перед main, и поэтому можете увеличивать глобальную переменную, затем используя #ifdef, чтобы убедиться, что main определяется только один раз.
источник
Рунические чары , порождающие руны
Попробуйте онлайн!
Принимает ввод как разделенный пробелами список значений.
Вывод выполнен один раз
Вывод выполнен дважды
Вывод выполнен четыре раза
Использует команду непрерывного числового режима чтения,
´
которая была зафиксирована 12 января, а я нашел этот вопрос 14-го. Эта команда позволяет кодировать произвольные значения длины, так как без этой функции это было бы очень трудно сделать (например,1392
ее нужно было бы представить как1X3+X9+X2+
, требуя как минимум дополнительного цикла); именно ту проблему, которую я хотел решить, когда создал´
команду.В исходном коде,
|
в строках"{Zs$;|1|l;|y"
и"UwR'10<|I+}"
заменяются\n
(которые сидят в сетке , а не изменять его, так как они обычно было бы) сw
обрядовыми командами:74akw
,94/Rakw
,c4akw
, и85akw
. Оригинальные персонажи могут быть буквально чем угодно.|
был выбран в качестве символического заполнителя, который визуально представлял то, что я хотел. Несколько байтов сохранены (если не отмечены единицы) благодаря тому, что нет необходимости рефлексивно добавлять точку входа, так какwR'10<
записываетR
в место, где он уже существует (позиция0,1
), а затем приступает к заполнению своего стека мусором до исчерпания маны, после зацикливания последовательностьU"'i34
.Полученный в результате выходной код работает с помощью команды
w
rite, чтобы изменить первый символ во второй строке наR
перенаправление «влево» (так что только один IP-адрес выполняет оператор печати), с умным использованием длины стека, получаемой из более высоких и более высоких программ, чтобы определить, какой индекс читать. Каждый другой IP-адрес изменяет это же местоположение на ту же инструкцию и завершается. Все остальное не используется.Изображение устарело, но достаточно для объяснения потока.
Каждое выполнение
1Iy
поддерживает способность IP обрабатывать все больший и больший стек (вызванныйl
командой), размер которого позволяет программе определить, сколько существует копий базового исходного кода. Финал1
используется для увеличения предыдущего числаl
до требуемого числа при вращении стека (созданного следующим образом), чтобы получить правильное значение. КомандаZ
отменяет это значение, так что стек вращается в правильном направлении.Затем исходный входной массив кодируется с использованием режима непрерывного чтения, заполненного 0, чтобы избежать постепенного изменения того же значения, чтобы прочитать исходные входные данные. Пробел NOP необходим, чтобы выйти из режима непрерывного чтения и позволить последующим 0 снова заполнить стек.
Оценка должна быть приблизительно равна
3+v.toString().length
для каждой записи массиваv
,+23
для каждого массива. Приблизительно(2.55*total length of input)
или33837
для образца ввода, если я все сделал правильно.Незначительные изменения были внесены в мою ожидаемую окончательную программу из-за побочных эффектов, введенных в той же сборке относительно
s
команды, однако это привело к лучшему результату в то же время.источник