С такими задачами, как « Вывод» такой же длины, что и код, и « Создать вывод в два раза длиннее кода» , я подумал об отдельной, но схожей задаче.
Задача состоит в том, чтобы произвести вывод. Это может быть строка, список символов или любой другой формат вывода вашей программы по умолчанию. Однако ваш вывод всегда должен быть одинаковой длины, независимо от ввода. И что более важно, выходные данные должны быть разными для разных входов .
вход
Единственное целое число , диапазоны которого определяются выбором языка. Если ваш язык имеет целые числа переменной длины, диапазон составляет .
Выход
Строка или список символов, или печать в STDOUT или STDERR. Вы можете использовать только один из этих методов. Выходные данные должны быть одинаковой длины независимо от входных данных, но вы сами должны определить, какая это длина. Вывод может не содержать цифр 0-9
или знака минус-
. Выход должен быть детерминированным .
Вы должны быть в состоянии доказать, что для каждого выхода есть только один возможный вход , либо формальным доказательством, аргументом, либо перебором.
Это кодовый вопрос о гольфе, так что сбрите все лишние байты. Все языки приветствуются, чем больше, тем лучше!
Ответы:
JavaScript (ES8), 33 байта
Ожидается ввод в диапазоне безопасных целых чисел JS:−253≤n<253 .
Возвращает строку из 76 символов.
Попробуйте онлайн!
Как?
Шаг 1
Вход сначала преобразуется в двоичный. Это сохраняет ведущий знак минус для отрицательных чисел.
Примеры:
123
→"1111011"
-77
→"-1001101"
Шаг 2
Результирующая строка кодируется в base-64.
Это означает, что каждый блок из 1-3 символов будет превращен в новый блок из 4 символов. Это преобразование безопасно, потому что ни один из полученных блоков не содержит запрещенных символов (цифр или знака минус).
3-символьные блоки
Один конечный блок из 1 или 2 символов должен быть закодирован, если длина двоичной строки не кратна 3:
1-символьные блоки
2-символьные блоки
Шаг 3
Конечный результат дополняется завершающими пробелами.
источник
Python 3 ,
4939 байтПопробуйте онлайн!
-10 байт благодаря отрицательной семерке
Преобразует целое число в шестнадцатеричное и добавляет пробелы до 9 символов. Затем удваивает ASCII-код каждого символа в строке (некоторые распространяются за пределы ASCII в Unicode, но Python прекрасно справляется с этим), выводя список символов.
Это работает, потому что каждая цифра, в том числе
-
, отображается на другой символ ASCII. Нет целых чисел между-2147483648
и2147483648
равны, поэтому преобразование их в шестнадцатеричные и предшествующие пробелы не сделает их равными. Затем отображение их на разные кодовые точки не приводит к коллизиям, поэтому в диапазоне по-прежнему нет двух значений, которые приводят к одинаковым выходным данным.Python 3 ,
595647 байтПопробуйте онлайн!
-3 байта благодаря Джитсе
-9 байт благодаря отрицательной семерке
Тот же алгоритм, но с использованием
map
вместоfor
цикла.источник
map
подходе, заменивlist( ... )
на[* ... ]
"%9x"%i
`4e9+n`
05AB1E ,
115 байтов-6 байтов, переносящих подход @Stephen, так что убедитесь, что его голосовали!
Выходы списка до 100 символов, с100−(input length) количество
@
( в два раза пространство элемент кода), и все-0123456789
преобразуется вZ`bdfhjlnpr
(два раза ASCII кодовых).Попробуйте онлайн.
Объяснение:
Оригинальный 11- байтовый ответ:
Попробуйте онлайн (ограничено
1000
вместо2147483648
).Объяснение:
Длина вывода всегда составляет 2 147 483 648 символов. Он выведет2147483648−|n|−1 количество пробелов, дополненных |n| количество новых строк с добавлением либо «a», если n<0 либо «b», если n≥0 .
источник
бред ,
4829281613 байтЭта программа требует ячейки, гдеcn∈N , но если вы хотите получить согласованные результаты, убедитесь, что cn<256
Очевидно, что вывод будет уникальным независимо от того, какое число вы введете (−∞<n<∞ ). Если целое число короче, программа будет дополнять вывод, чтобы точно соответствовать ∞ байтами, поэтому длина всегда одинакова.
Этот ответ немного запутывает задачу, поскольку в нем не говорится, что результат должен быть конечным.
Попробуйте онлайн!
Оригинал, ответ 28 байт:
Этот будет дополнять вывод до28- 1 байтов. Механизм преобразования чисел здесь работает так же. Эта программа предполагает то же, что и программа выше.
источник
Python 3 , 39 байт
Попробуйте онлайн!
Включает заданное число в двоичное строковое представление (дополненное пробелами), затем отображает символы
(space)-01
вcaab
сstr.translate
функцией.источник
Желе , 4 байта
Монадическая ссылка, принимающая целое число, которое выдает список из 52 символов.
Попробуйте онлайн!
Как?
Так...
источник
Рубин , 27 байт
Попробуйте онлайн!
('%34b'%n)
Преобразует целое число в его двоичное представление, используя..1
для обозначения отрицательного числа (это означает, что он представляет бесконечно длинный префикс 1 с), и подставляет это значение до 34 символов, используя пробелы. Затем мы заменяем0
s на 'a', а1
s на 'h', чтобы создать представление маниакальной базы 2: строки типа "haaahahahaaha" с добавлением пробелов и иногда..
. Поскольку каждый шаг здесь обратим, это 1: 1.Изменить: Пусть запись покажет, что @manatwork опубликовал это идентичное решение первым. К сожалению. Я должен был освежиться.
источник
Желе , 6 байт
Попробуйте онлайн!
Поскольку в Jelly есть целые числа произвольной длины, эта монадическая ссылка принимает целое число в диапазоне± 231 и возвращает длину 7 буквенной строки. Это работает путем добавления232 и затем распаковывать в заглавные буквы.
источник
C (gcc) , 38 байт
Попробуйте онлайн!
Это расширяет каждый бит входного целого числа в байт, равный 0 или 1 (оба являются непечатаемыми символами, но против этого правила нет). Таким образом, вывод всегда составляет 32 байта и гарантированно будет уникальным.
источник
f(a){putchar(a&1);f(a/2);}
C # (интерактивный компилятор Visual C #) , 35 байт
Попробуйте онлайн!
источник
x = int.MinValue
что это нельзя отрицать.Haskell, 31 байт
Попробуйте онлайн!
Добавляет
2^60
к вводу, чтобы полученное число имело одинаковое количество цифр для всего диапазона ввода. Превратитесь в строку и сдвиньте каждый символ на 10 позиций вправо в порядке ASCII (0
->:
...9
->C
).источник
C # (интерактивный компилятор Visual C #) , 52 байта
Попробуйте онлайн!
Другой подход к решению ac # использует тот факт, что модуль c # отрицателен для отрицательных чисел. Я полагаю, что вы могли бы сбрить один или два байта, если разрешите не отображаемые символы ('\ 0' и т. Д.), Обновив,
+65...
чтобы не смещать значение символа до значения, удобного для чтения человеком.источник
Perl 5
-MDigest::MD5=md5_hex -p
, 23 байтаПопробуйте онлайн!
Ранее:
Perl 5
-p
, 29 байтПопробуйте онлайн!
Преобразует число в его 64-битное двоичное представление, затем транслитерирует
0
и1
вa
иb
, соответственно.источник
T-SQL,
73 7061 байтЯ просто заменяю цифры (и
-
) буквами, после того,STR
как целые числа дополняются до 11 символов. Нет преобразования в шестнадцатеричный или двоичный код не требуется.TRANSLATE
был введен в SQL 2017Ввод осуществляется через уже существующую таблицуT с колонкой INT N В соответствии с нашими правилами IO . Диапазон типа - 231≤ n < 231 ,
INT
данных в SQLРЕДАКТИРОВАТЬ : Сохранены 3 байта путем замены заполнения вручную преобразованием в CHAR (11), который является символьным форматом фиксированной ширины, который автоматически дополняется пробелами.
РЕДАКТИРОВАТЬ 2 : Сохранено 9 байтов с использованием
STR()
функции вместоCAST
.STR
преобразует число в текстовую строку, дополненную до указанной длины.источник
APL (Dyalog Unicode) , 28 байт
Попробуйте онлайн!
Простой Dfn, принимая целочисленный аргумент. Пользы
⎕IO←0
.TIO ссылается на контрольный пример от
-2^10
до2^10
.0~⍨
Часть удаляет дубликаты0
из аргументов.Как:
источник
Japt , 6 байт
Я думаю, что это правильно. Вдохновлен решением Стивена Python, поэтому, пожалуйста,
+1
ему.Попытайся
источник
Мальболге , 2708 байт
Этот ответ очень обманчив, потому что он всегда выдает одинаковое количество ввода, равное∞ ,
Попробуйте онлайн!
источник
Perl 6 , 12 байт
Попробуйте онлайн!
Аноним Любая лямбда, которая принимает число и строку ИЛИ с 11
@
с. Это отображает цифры наpqrstuvwxy
и тирm
, затем подушечки строки из 11 символов с@
систочник
Perl 5 (-p), 9 байт
Попробуйте онлайн!
Bitwxise-xor ввода со строкой
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
.источник
Wolfram Language (Mathematica) ,
4433 байтаПопробуйте это с меньшим доменом
-2 спасибо Грегу Мартину
Печать13 ! + n 14 ! и перевод строки. Работает на домене[ - 13 ! , 14 ! - 13 ! ) , который является надмножеством [ - 231, 231) ,
>>
, за которой следует строковое представление из 523069747202 символов спискаNull
s дополняетсяTrue
s на длинуУчитывая размер вывода, я включил тестовый пример с меньшей областью[ - 24, 24) вместо
источник
2^31
и2^32
к13!
и14!
соответственно. В связи с потерей некоторой «краткости» на выходе ....Stax , 6 байт
Запустите и отладьте его
Процедура:
источник
PHP ,
6454 байта-10 байт, используя
strtr
функцию вместо ручной замены символов.Попробуйте онлайн!
Наибольшее возможное значение int в PHP на данный момент
9223372036854775807
19 цифр, с учетом знака минус в отрицательных числах, это будет 20. Приведенный выше код заменяет знак минус (-
) наA
символ, а каждая цифра от0
до9
на символ отD
доM
а затем дополняет строку справа пробелом, чтобы всегда иметь длину 20 символов. Например, выход для ввода-9876543210
-"AMLKJIHGFED "
.Выходной сигнал является уникальным для каждого целого числа входных и вы можете получить обратно на вход, удаляя все пробелы, заменяя
A
с-
и заменитьD
наM
с0
к9
.PHP , 44 байта
Попробуйте онлайн!
Это та же идея, что и ответ Арно . Преобразует ввод в двоичный файл, а затем преобразует его в base-64. Также дополняет его до 88 символов (наибольшая длина для
-9223372036854775807
которых составляет 88 символов) с пробелом справа, чтобы всегда получать одинаковую длину в выводе.источник
Сетчатка 0.8.2 , 21 байт
Попробуйте онлайн! Всегда выводит 11 символов из диапазона
n
.z
. Объяснение:Переведите печатные символы ASCII в строчные буквы. Это
-
соответствуетn
и0
..9
чтобыq
..z
. (Это действительно повезло, что цифры от 16 до 25 печатных символов ASCII!)Добавить 10
o
с. Так как ввод будет содержать от 1 до 11 символов, теперь от 11 до 21 символа.Извлеките первые 11 символов. Поскольку в нем менее 22 символов, он будет совпадать только один раз.
источник
Древесный уголь , 9 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Всегда выводит 10 пробелов и заглавных букв. Объяснение:
источник
R , 37 байт
Попробуйте онлайн!
Похоже, что результат является случайным, но это не так! Ввод используется в качестве начального числа генератора псевдослучайных чисел, и затем мы получаем один из26 ! = 4 ⋅ 1026 перестановки алфавита. Вывод всегда имеет длину 51 (26 букв + 25 пробелов).
Все еще существует проблема обеспечения того, чтобы все результаты были разными. Мы заканчиваем с232≈ 4 ⋅ 109 перестановки (из 4 ⋅ 1026 ). Если мы притворимся, что перестановки распределены случайным образом равномерно, то вероятность того, что все перестановки различны, можно вычислить, следуя тем же вычислениям, что и для задачи дня рождения . Вероятность того, что 2 конкретных выхода идентичны10- 17 Таким образом, первое приближение вероятности того, что все 232 выходы отличаются
что достаточно близко к 1 для меня.
источник
брейкфук ,
2019 байт-1 байт благодаря Кшиштофу Шевчику
Попробуйте онлайн!
Выводит число с каждой цифрой и тире, сопоставленные 255 минус их порядковое значение, дополненное до 255 символов с байтами NUL.
источник
-[>,[->-<]>.[-]<<-]
R ,
4037 байтПопробуйте онлайн!
Альтернатива ответу Робина Райдера ; это, безусловно, детерминированный.
Это преобразует входные данные в
raw
вектор из 32 байтов, каждый из которых представляет собой шестнадцатеричное число00
или01
представляет биты целого числа. Затем мы принуждать кlogical
путем сравнения0
, поэтому00
отображаетсяFALSE
и01
вTRUE
. Затем нам нужно удалить по одной букве из каждой,FALSE
чтобы гарантировать вывод одинаковой длины, произвольно выбранный какS
. Результат печатается (с пробелом) на длину 169.источник
Zsh , 43 байта
Попробуйте онлайн!
Это решение обходит
long long
пределы целых чисел Zsh, работая только с символами. Для удобства чтения я добавил только 30 символов, но замена30
на99
этот метод позволит работать со всеми числами от-1E99+1
до1E100-1
.Эффект интерпретации десятичных кодов как шестнадцатеричных заключается в следующем:
Zsh , 46 байтов
Попробуйте онлайн!
Объявляет x как двоичное число, дополненное нулями до ширины 66. Затем отображает
0
→a
и1
→b
. Мы также сопоставляем2
и-
a, так как эти символы печатаются в[[-]][base]#[num]
нотации. Чтобы увидеть, как$x
выглядит до замены, а также ограничения Zsh в разборе целочисленных типов, проверьте выходные данные отладки в ссылке TIO.источник
Java (JDK) , 42 байта
Попробуйте онлайн!
Во-первых, это создает шестнадцатеричное представление ввода, дополненное слева пробелами, которое обеспечивает такое же ограничение длины (8 символов), удаляет знак минуса и сохраняет каждый промежуточный вывод уникальным.
Это дает строку с 17 различными возможными символами:
0123456789abcdef
и пробел.Затем каждый символ передается и отображается путем добавления 64 к его кодовой точке, если это цифра или пробел. По сути, это приводит к следующему сопоставлению:
0123456789abcdef<space>
сpqrstuvwxyabcdef`
17 различными символами, поэтому никакие два числа не приведут к одинаковому результату.источник
Баш , 30 байт
Попробуйте онлайн!
Чтобы доказать, что вывод уникален, я просто погуглил столкновения MD5 и не нашел результатов в целых числах между- 231 а также 231 , Чтобы избежать появления запрещенных символов в выходных данных, просто переведите эти символы в заглавные буквы. Выходные данные всегда имеют одинаковую длину по определению и гарантированно не содержат никаких запрещенных символов.
источник