Ваша задача состоит в том, чтобы написать компьютерную программу так, чтобы, когда она разбивается на строки (разбитые на символе новой строки), каждое расположение строк будет выводить различное число от 1 до n! (где n - общее количество строк). Ни одно число не должно быть выведено двумя разными устройствами, и каждое устройство должно выводить число в этом диапазоне. Так как есть n! способы упорядочить строки программы, это означает, что каждое число должно быть выведено одной перестановкой.
Например, программа Python
print 1;"""
print 2;"""
Имеет две договоренности
print 1;"""
print 2;"""
и
print 2;"""
print 1;"""
Первые выходы 1
и вторые выходы 2
.
Вы можете использовать любые выходные форматы, стандартные для языка, который вы используете. Вы не можете принимать какой-либо шаблонный образец. Я думаю, что этот вызов более интересен, если вам приходится работать с любыми форматами, на которых настаивает язык.
счет
Ваша оценка будет равна количеству строк в вашей программе, причем более высокая оценка будет лучше. Вы можете выбрать вывод чисел от 0 до n! -1, если хотите.
источник
n
? Все ли они связаны со счетом ∞?Ответы:
CJam , оценка: ∞
Каждая строка имеет вид
где
x
число от0
доn-1
. Результат находится в диапазоне0
доn!-1
.Попробуйте онлайн! (Для
n=3
.)Кредиты jimmy23013 для кода, который вычисляет фактический индекс перестановки. Я заменил только бит, который читает входные данные, с
];Lx+:L
которыми отбрасывает результат предыдущей строки, а затем добавляет индекс текущей строки в переменнуюL
(которая изначально является пустым массивом).источник
0+:+
) Я думаю, вы можете получить гораздо более короткую версию, используя,m!#
.Perl: ∞
Вытяните на любую длину, которая вам нравится
Быстро исчерпает память, так как использование памяти похоже на O (n ^ n). Однако было бы легко заменить индексатор перестановки кодом O (n), только дольше. Я просто иллюстрирую, как вы можете использовать
END{}
эту задачу в Perl. ВсеEND{}
блоки выполняются во время выхода, но только первый вызванный (последний в коде) будет выводить что-либо из-за/A/
теста, который верен только один разОбратите внимание, что
$m
счетчик должен считаться строкой, потому что как число он будет переполнен (позже, чем конец юниверса, но учитывается принцип). По той же причине я «подсчитываю» количество строк, создавая строкуA
s вместо использования реального счетчика, хотя это переполнение произойдет даже позже.Еще один способ сделать это в Perl:
Это использует тот факт, что в
foo = bar
bar
выполняется послеfoo
. Эта версия, кстати, не сходит с ума во времени и пространстве, но это делает код длиннееЕще одна идея заключается в использовании,
DESTROY
которое имеет преимущество в том, что будет выполнен только один из них. Я не собираюсь повторять код индексации перестановок, два примера которого я уже приводил.Или используя
BEGIN
:источник
Желе , ∞
(Пример с
n=3
.)Попробуйте онлайн!
231311 байт на строку.Для программы со
n
строками строки будут иметь формат;
<i>
ÇQŒ¿$⁼Q$?
где
<i>
представляет числовой литерал,i
и каждая строка имеет различное значение дляi
диапазона от1
доn
. (Значения дляi
фактически не должны быть этими конкретными числами, они просто должны иметь уникальные положительные значения.) Эта программа больше не используетn
в структуре линии.Как?
0
.;1
присоединяет1
к0
или в активном списке.⁼Q$
является условной монадой для оператора if (?
), который проверяет, являются ли элементы списка уникальными. Если это так, ссылка выше называется (Ç
) и другой номер добавляется в список. Если они не уникальны, это означает, что мы перешли к первой ссылке. Повторяющийся элемент удаляется из списка (Q
) и найден индекс перестановки (Œ¿
). Обратите внимание, что0
в начале списка есть, когдаŒ¿
берется, но это не влияет на вывод, так как все значения дляi
являются положительными.Новая функция желе
С новым добавленным
Ƒ
быстрым, мы можем сократить⁼Q$
доQƑ
, сохраняя байт.10 байтов / строка (для однозначных цифр)
Попробуйте онлайн!
источник
Брейн-Флак , 3
Попробуйте онлайн!
Я разместил это в чате ранее, но, надеюсь, разместив его здесь, люди смогут извлечь из него пользу.
объяснение
Начнем с основной программы
Это 2 балла само по себе. Чтобы перейти на следующий уровень, я хочу добавить новую строку. Мое начальное предположение было
Это устанавливает TOS,
2
если оно равно нулю, и ничего не делает иначе. Это на самом деле хорошее начало. С двух других линий , мы можем получить все числа от1
к , за6
исключением4
, потому что есть2
способы вывода2
:и
Для того чтобы исправить это мы делаем нашу линию также установить ,
2
чтобы быть4
. Это можно сделать с помощьюДля ясности это в основном реализует функцию Haskell
Это решает нашу проблему, потому что одна из программ, которые ранее выводили,
2
теперь выводит4
без изменения других программ.источник
Java 7, оценка: ∞
Попробуйте онлайн!
Это может распечатать от 0 до n! -1 . Дополнительные строки имеют следующий формат (где INDEX - это число от 1 до n! -1 ):
Этот метод работает, читая свой собственный источник, чтобы определить, какие классы порядка перечислены в нем. К сожалению, не было более крутого метода, который я мог бы найти, анализируя скомпилированный файл или создавая собственный ClassLoader, благодаря тому, как java выполняет JIT-компиляцию. Я полагаю, что каждый дополнительный класс мог бы просто распечатать статически определенное число, но это казалось более забавным. Это также позволило бы удалить
B
интерфейс, но оценка не основывается на байтах, поэтому я оставлю это для развлечения.Как это работает (высокий уровень):
Читает свой собственный исходный код построчно. Так как каждая строка объявляет новый класс, мы используем отражение, чтобы создать экземпляр нового класса и вызвать его
a
метод, который ему нужен, потому что он реализуетB
интерфейс.источник
Рубин , оценка: ∞
Попробуйте онлайн!
Эта программа имеет 61 байт на строку (для n <10). Он имеет тот же базовый формат, что и решение Дилнана ; первое число в каждой строке будет отличаться от
1
иn
, а второе число в каждой строке будетn
.Я надеялся найти способ избежать включения
n
в программу, но не смог найти.источник
Брейн-Флак , 2 (с
-d
)Попробуйте онлайн!
источник
2
вас можно использовать({}())
и(({}){})
.05AB1E , оценка: 1,114,112
Попробуйте онлайн! 0 индексированные. Символ at в начале каждой строки помещает отдельные символы в глобальный массив. Остальной код выполняется бесполезно, за исключением последней строки, где он объединяет значения в строку, а затем находит свой индекс перестановки. 1,114,112 - это количество возможных символов Unicode на момент написания (конечно, проще всего продемонстрировать кодовые точки 48-57).
источник