... по крайней мере, для некоторого определения "само-модификации".
Задание
В этих проблемах, ваша задача состоит в том, чтобы написать три строки A
, B
и C
которые удовлетворяют следующие свойства.
Строка
B
имеет длину не менее 1.Для каждого
n ≥ 0
, строка является допустимой программой (имеется в виду полностью исполняемая программа или определение функции) на выбранном вами языке программирования. Индекс указывает повторение, поэтому это означает , что строки , , , и т.д. Каждая программа занимает одну строку в качестве входных данных, и возвращает одну строку в качестве вывода.ABnC
AC
ABC
ABBC
ABBBC
Для любого
m, n ≥ 0
, если программа запускается с вводом , она возвращается . Для входных данных, не имеющих этой формы, программа может делать все что угодно, включая сбой.ABmC
ABnC
ABm*n+1C
Некоторые примеры в формате program(input) -> output
:
AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC
Правила и оценки
Ваша оценка - это общая длина A
иC
, чем ниже, тем лучше. Обратите внимание, что хотя B
счет не учитывается, он должен быть получен A
и C
как в первом примере.
Стандартные лазейки запрещены. Программам не разрешен прямой или косвенный доступ к их собственному исходному коду (кроме случаев, когда они передаются в качестве входных данных). Вы должны определить строки A
, B
и C
в своем ответе каким-то образом, и рекомендуется объяснить свое решение.
источник
Пиф, 10
Мы разбили источник на две строки. Первая строка A, вторая строка Bs. Поскольку A находится на первой строке, первая
w
просто печатает A - легко, готово.В Pyth ведущие нули - это отдельные токены, так оно и есть на
[00)
самом деле[0, 0]
. Обратите внимание, что первая строка заканчиваетсяl[
, а вторая строка состоит из0000...
. Так что наl[
самом деле подсчитывает количество Bs в этой программе. Втораяw
читается во второй строке ввода - это число Bs ввода. Отсюда простое умножение, приращение и вывод множества нулей.источник
Сетчатка ,
2519 байтПример
ABC
кода:Код имеет два шага замены:
изменить вход
AB^mC
вAB^(m*n)C
изменив каждыйB
наB^n
:]\]
соответствует каждомуB
входу и ничему другому благодаря экранированию в строках шаблона]]...]]
являетсяB^n
менять
B^(m*n)
кB^(m*n+1)
поm`^]*$
занимая линию только]
с]$0]
добавив к нему дополнительную пару]]
таким образом, чтобы эта строка не соответствовала первому регулярному выражениюЯ добавил 3 байта в счет для
-s
многострочного флага, который необходим, чтобы весь код Retina мог быть в одном файле.2 байта сохранены благодаря @ MartinBüttner.
источник
Python 3, 51 байт
Пример использования:
Функция вычисляет
n*m+1
с ,(1+len("xxx")*(len(s)-51))
где естьm
x
«ы в строке (xxx
часть являетсяB^m
). Умножение строки"x"
на это число дает,B^(n*m+1)
и функция беретA
иC
выводит данные и объединяет их все для полученияAB^(n*m+1)C
.Тот же подход в J:
J 35 байт
источник
CJam, 22
Пример выполнения:
что переводится как
с вводом как
который дает следующий вывод:
Как это работает :
Давайте посмотрим на какие программы
AC
иABC
как они выглядят:Мы замечаем, что
C
=B_~
Давайте посмотрим на то, что
B
делает:Теперь давайте посмотрим, что
AC
будет делать бег без какого-либо ввода:Вау, выход есть
ABC
.Мы в основном считаем, сколько
B
существует в коде. Тогда сколько их на входе (используя длину). Умножьте их, увеличьте в два раза (так какC
также естьB
) и добавьте,_~
чтобы получитьC
Попробуйте онлайн здесь
источник
Haskell , 50 байтов
f
это функция, принимающая и возвращающаяString
.Строка B - это просто один пробел, а C начинается с одного.
Попробуйте онлайн!
_:b=" "
присваивает всем кроме первого пробела в строковом литерале значениеb
, равное m программы B копий программы.s
является входной строкой.a:c<-words s
разбивает его на разделенные пробелами слова, так чтоa
становится A иc
становится списком слов, составляющих C. Копии B игнорируются, так какwords
сжимает несколько пробелов (чего избегает остальная часть программы).drop 50s
является строкой длиной, равной числу n из B копий на входе.drop 50s>>b
объединяет столько копийb
, давая мн пробел.unwords$a:(drop 50s>>b):c
объединяет все строки обратно вместе с пробелами. Поскольку(drop 50s>>b)
в список добавлено дополнительное «слово» , есть также дополнительное место для соединения, автоматически добавляющее +1 к умножению.источник
Матлаб, 85
Впервые я выполнил такую абстрактную задачу, поэтому для меня это было больше проблемой кодирования, чем проблемой код-гольфа!
Три строки без кавычек:
Как это работает: я разбил входной аргумент на пробел, так что
n
его можно определить по количеству строковых частей. Б работает как своего рода счетчик, чтобы получитьm
. Для восстановления ответа я использую A и C из разбиения, повторяю B m * n + 1 раз, и я вставляю пробелы, используя их значение ASCII, чтобы не возникало нежелательных разбиений в C.РЕДАКТИРОВАТЬ: упс, случайно посчитал A + B
источник
C (gcc) , 81 байт
Требование идентифицировать строки кажется противоречащим тому, что мы допустили произвольное поведение для незаконного ввода, если только у нас нет довольно слабых стандартов того, что влечет за собой идентификация. Естественно, я взял интерпретацию, которая проливает большинство байтов.
Попробуйте онлайн!
источник
TI-Basic (серия 83), 65 байт
Сегмент A (33 байта):
Сегмент Б:
Сегмент C (32 байта):
Я действительно взволнован тем, что нашел этот похожий на квинну вызов! Большинство квин не работают в TI-Basic без хотя бы небольшого обмана, потому что нет способа избежать
"
символа. (В обоих смыслах слова «escape».) Но здесь мы получаем входную строку с помощьюInput
команды, и ввод"
там отлично.Здесь все еще есть некоторая глупость TI-Basic: пустая строка недопустима, поэтому наивное решение вставки строки
"XXX...XX"
в цикл не будет работать, когда n = 0. Вместо этого мы вручную вычисляем значение mn + 1 и вставляем строку"X"
много раз.Постоянные магические
27
и28
в программе, немного не от подсчета байт 33 и 32, потому чтоStr1
,sub(
иlength(
два байта маркеры , которые только способствуют 1 к длине струны.Если мы вместо новой строки используем строки
:
, похоже, что можно сохранить несколько байтов, не добавляя конечные кавычки, но на самом деле это не работает. Прежде всего, вам нужен шестнадцатеричный редактор, прежде чем вы сможете добавить символ новой строки в строку: вы не можете просто набрать его, потому что если вы нажмете клавишу ВВОД во времяInput
команды, она отправит ввод. Когда я попробовал подход с использованием шестнадцатеричного редактора, я получил странную ошибку переполнения буфера, которая изменила содержимое моей программы, так что не пытайтесь сделать это дома с помощью вашего дорогого калькулятора.источник
Java 11,
13565 + 26 = 91 байтA
В
С
Попробуйте онлайн здесь (у TIO пока нет Java 11, так что вместо этого используется вспомогательный метод
String::repeat()
).Ungolfed:
источник