Это ограниченный источник , Колмогоров-сложность , код-гольф вызов для получения фиксированного выхода без ввода.
Формат вывода, однако, является гибким - он может быть распечатан на стандартный вывод, напечатан на стандартную ошибку, возвращен как список символов, возвращен как список байтов или возвращен как список целых чисел. Если вы думаете, что-либо еще кажется разумным, просто спросите в комментариях!
Вот простой, большой буква ASCII art CODEGOLF :
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Без каких-либо переносов (или завершающих пробелов в любых строках) длина составляет 256 символов:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Индексы (основанные на 0) непробельных символов:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255
Вы не можете использовать ни один из этих 97 байтов в своем коде, но должны создать список (или аналогичным образом вывести) эти байты в указанном порядке с заменой отсутствующих байтов на 32-й байт в кодовой странице, которую вы используете (во многих, многих кодовые страницы пробел).
Вы можете включить красивые печатные * новые строки (но без пробелов в строках), если это поможет.
Например, используя кодовую страницу Jelly, этот вывод приемлем:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... но это так:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... и так:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255]
(Этот последний является допустимым выводом списка на любом языке с любой кодовой страницей, и можно также использовать любое разумное форматирование списка.)
Вот код Python 3, который показывает недоступные байты ASCII.
* Хотя сама печать может и не быть такой красивой!
источник
$%&*123456=ADHKRY]``ghosvz}~
и нет новой строки?array_map(function($n){return sprintf("%6b",$n);},...)
без$
(я мог бы сделать это) И без}
(без понятия). Да; Я хочу упаковать данные!Ответы:
Python 2 ,
321203 байтаПопробуйте онлайн!
Объяснение:
шиворот навыворот:
cfjdbljcibkeajjejiljjlcbjddlafklebajjlceljdeadficijflealkeklkljadfbbckjebclk
число,25731972618407747697792173390589410779249734035626759409848989703511287412985
закодированное разрешенными символами (Не123456
разрешено)reduce(lambda x,y:x+repr('abcdefijkl'.find(y)),'cfjdbl..bclkf','')
отображает строку в ее десятичную строку:reduce(lambda x,y:x+y,'..','')
такой же как''.join('..')
(Нетo
разрешено)repr('..')
вместоstr('..')
(неs
разрешено)'abcdefijkl'.find(y)
сопоставляет символ с цифрой.enumerate(bin(int(...)))
преобразует числовую строку в двоичную строку и перечисляет. Это дает пары[(0,0), (1,b), (2,1), (3,1), ...]
map(lambda(i,x):(x>'0'and i-8-8-8-8)+8+8+8+8, ... )
преобразует перечисленный список в конечный результат.map(lambda(i,x):.. , .. )
вместо[... for(i,x)in ...]
(неo]
разрешено)lambda(i,x): ..
преобразует каждую пару (индекс, значение) в индекс или32
.(x>'0'and i-8-8-8-8)+8+8+8+8
такой же как:x>'0'and i or 8+8+8+8
, (Неo
разрешено)[8+8+8+8,i][x>'0']
или[8<<9-7,i][x>'0']
(не]
разрешено)8+8+8+8
=32
(Не23
разрешено)Это означает, что программа по сути такая же как:
источник
C (gcc) , 318 байтов
Попробуйте онлайн!
Это что-то вроде путешествия ...
1. Сжатие списка
Каким-то образом нам нужно будет проверить, является ли данное целое число одной из специальных кодовых точек. Любой «голый» список будет слишком длинным, поэтому мы используем контрольный список. Этот список имеет ненулевое значение в кодовых точках, которые «ограничены», и нулевое значение в тех, которые не являются.
К сожалению, это все еще занимает 512 байт, чтобы получить список (похоже
0,0,7,7,0,7,0,...
). Это можно сократить с помощью битовой маски.Чтобы использовать битовую маску, мы разбиваем каждый байт на две части. Первые 3 бита будут выбирать маску из массива, а последние 5 битов будут выбирать бит в массиве. Мы не можем уменьшать массив дальше, потому что 32-битные целые числа, используемые по умолчанию, не поддерживают более 2 ^ 5 = 32 бит.
Используя эталонную реализацию, я написал:
Я смог сгенерировать соответствующие значения для этого нового массива с помощью команды
echo "obase=16;ibase=2;$(./a.out | rev)" | bc
. Это передает вывод вышеуказанной программы (./a.out
)rev
программе, которая переворачивает каждую строку. Он печатает это вместе с заголовком bc, который устанавливает выходную базу равной 16, а входную базу равной 2. Таким образом, bc преобразует двоичные цифры в шестнадцатеричную битовую маску.Полученный массив можно увидеть в этом «бета» решении:
2. Работа с ограничениями
Существует множество ограничений, которые необходимо наложить на приведенный выше код. Здесь я прохожу каждый из них 1 на 1.
Это чувствуется и в других языках: без присваивания в C очень сложно получить какие-либо гарантированные значения в переменных. Самый простой способ для нас - написать нашу функцию в виде полной программы. Первому аргументу
main
будет передано значение, равноеargc
1, если оно вызывается без аргументов.Единственный циклические конструкции в C являются
for
,while
иgoto
все из которых содержат недопустимые символы. Это оставляет нас с помощью рекурсии. Основная функция будет начинаться с 1 и повторяться до тех пор, пока аргумент не станет> 256, при этом она будет внутренне уменьшать аргумент, чтобы использовать значение с 0 индексами.Значения в приведенном выше массиве являются шестнадцатеричными, даже если они преобразуются в десятичные, они содержат некоторые ограниченные символы, в частности 123456 (AD может быть в нижнем регистре). Чтобы обойти это, каждая константа XORed с другой, так что ограниченные символы удаляются. 1 становится 9 ^ B, 2 становится C ^ E, 3 становится B ^ 8, 4 становится 8 ^ C, 5 становится 9 ^ C, а 6 становится 9 ^ F (есть больше способов сделать это, я выбрал этот способ) ,
Ограничения не оставляют нам много функций печати.
putchar
иputs
оба ограничены, уходяprintf
. К сожалению, мы должны отправитьprintf
строку формата, в идеале "% c". У всех таких строк есть тот неприятный знак процента, который мы хотим удалить. К счастью, мы предполагаем, что машина с прямым порядком байтов (потому что, очевидно, это то, что использует TIO, и это довольно типично). Построив целое число, байты которого в памяти равны 0x25 (%), 0x63 (c), 0x00 (\ 0), чему угодно (не имеет значения, после нулевого терминатора), мы можем просто передать его адрес,printf
и он примет его это строка Один такой номер, который работает, -989830363 (0xC5006325). Это легко создать при ограничениях 77707-989908070.По-прежнему существует проблема, заключающаяся в том, что мы не можем ссылаться на какие-либо значения (потому что мы не можем присвоить их и потому что мы не можем использовать &), поэтому мы должны использовать литерал массива (int []) {...}. Мы фактически используем это и для массива битовой маски, описанного выше.
Мы не можем использовать ']' или '}', чтобы закрыть наши массивы или функции. К счастью, у Си есть орграфы и триграфы, которые работают.
:>
станет]
, пока??>
станет}
. Для этого требуется, чтобы gcc-trigraphs
переключился, так как он игнорирует триграфы по умолчанию (в нарушение стандарта).Мы не можем использовать,
&
чтобы замаскировать биты нашего индекса, и мы не можем использовать его,%
чтобы получить старомодный способ. Поэтому мы полагаемся на специфическое поведение реализации. В частности, мы сдвигаем наши 32-разрядные целые числа достаточно далеко влево, чтобы потерять биты, а затем обратно вправо. Например, чтобы получить последние 5 бит нашего числа, мы сначала сдвигаем его влево на 27 бит (оставляяabcde00000...
), а затем сдвигаем его вправо на 27 бит (оставляя...00000abcde
).Нам нужно еще несколько буквальных значений в коде - они взяты из JS-ответа Арно, плюс 27 (по вышеуказанной причине) добавлено мной как
9+9+9
.3. Соединение
Вот описание источника со всеми этими изменениями вместе.
источник
?:
расширение g ++ , используйте битовое смещение по модулю 32, 273 байта-trigraphs
опций на некоторых компиляторах Си, а?:
требует gcc, который требует-trigraphs
.брейкфук , 635 байт
Попробуйте онлайн!
В ответ на то, что меня наконец-то избили в Javascript, я сделал все возможное для этого:
1 байт сохранен благодаря наличию 32 в ячейке 0 и приращению ячейки 1 (единственная причина, по которой я изначально использовал ее в другом случае, была из-за быстрого исправления, когда OrjanJohansen указал, что я не могу использовать
]
)1 байт сохранен уменьшением третьей ячейки (изначально в 0) для генерации
255
=-1
2 байта сохраняются путем печати пробелов между символами 31 и 36 без использования,
<>
но вместо этого просто останавливаются на 32 для печати из ячейки 0 при увеличении с 31 до 33.мозговой трах , 639 байт
Попробуйте онлайн!
Сначала мы генерируем число 32. Затем мы просто увеличиваем одну ячейку и переключаем печать между этой ячейкой и ячейкой, содержащей 32. Постоянно растущие числа - это то, что Brainfuck хорошо делает.
Приятно побить Javascript с помощью Brainfuck, это случается не часто!
источник
]
это не разрешенный персонаж. Хотя вы все равно сможете это исправить и победить Javascript. :)]
это не разрешено, я думаю, что мой ответ BF сейчас, вероятно, является оптимальным.JavaScript (SpiderMonkey) ,
1918159814871431 байтСохранено 56 байтов благодаря @ user202729
Попробуйте онлайн!
Как?
То, что
=
не разрешено, является шоу-убийцей в JS. Мы не можем делать какие-либо переменные, и мы также не можем использовать любую функцию стрелки.+
-
/
|
^
<<
>>
8<<98
8<<2
источник
32
как8<<9-7
сохраняет байт для каждого32
.32 = 8<<98
Haskell,
623617614594360342 байтаРедактировать: -234 байта благодаря @Lynn, найдя кодировку шаблона в виде строки. -18 байт благодаря @ Örjan Johansen.
Попробуйте онлайн!
Как это устроено
источник
(id:pure(\_->8+8+8+8))
поuntil((||" XXXX XXX XXXX XXXXX XXX XXX X XXXXXX X X X X X X X X X XX X X X X XXX X XX X X X XXXX X X X X X X X X X X X XXXX XXX XXXX XXXXX XXXX XXX XXXXX X"!!i<'X').(<1))pred 1
и сохранить кучу байтов.filter
вместоuntil
ветвления (иcycle
чтобы избежать лишнего++pure(...)
).Brain-Flak -r,
41904188 байтПопробуйте онлайн!
Это немного сложно для Brain-flak, так как мы не можем использовать
]
или}
. Имеются в виду только полезные символы<>()
.Вот программа на Haskell, которая помогла мне написать это
Это просто подсчет пропусков, где пробелы должны быть и выдвигать их по отдельности.
источник
{}
компьютерного поиска, можно найти оптимальное за конечное время.JavaScript (SpiderMonkey) ,
1001919789441 байтПопробуйте онлайн!
Наконец-то бьет БФ !!!
Главная идея
Конвертировать каждый символ длинной строки строки в ее индекс или 32, в зависимости от значения.
Array.prototype.map
? Как получить массивГрубая сила, чтобы увидеть, какие объекты доступны через доступ к свойствам объекта (потому что
]
это не разрешено, поэтому доступны только свойства с именем, совпадающим с идентификатором).RegExp.prototype.exec
возвращает подобный массиву объект при совпадении. Если аргумент не указан, по умолчанию используется аргументundefined
, поэтому он/u/.exec()
совпадает и возвращает массив.Получить 2 произвольных разных значения для 2 разных персонажей
Мы хотим иметь
(x,y)=>x=='0'?32:y
, но мы не можем использовать=
.Вместо этого мы собираемся сделать
Мы можем
map
использовать строку для некоторой функции, но=>
это не разрешено, поэтому можно использовать только несколько функций. Может иметь связанныеthis
и некоторые связанные аргументы (поэтому он имеет форму(x,y,z)=>pre_filled_function.call(pre,filled,args,etc,x,y,z)
)После рассмотрения списка функций (
repeat exec bind create map indexOf replace fill find reduce filter findIndex call bind apply
) я решаю, что будут использоваться следующие функции (после рассмотрения всех других комбинаций)repeat
: число -> разные строки.find
: thisArg -> первый элемент в массиве соответствует.Общая идея будет:
где
somefunction
учитываетthis
аргумент (x
) и первый аргумент (elem1
илиelem2
) и возвращает, соответствует ли он.Последняя функция стрелки переписана на
[].find.bind([elem1,elem2],somefunction)
.Массив буквальный
Мы можем использовать regex exec для получения массива
fill
с разными значениями. Например,/()/.exec()
возвращает массив длины 2, тогда мы можем заполнить его, как нам нужно.Что
somefunction
нам нужно?Нам нужен тот, который возвращает истинное / ложное значение, зависит от
this
(это 1 из 2 функций, которые мы собираемся вернуть) и первый аргумент (должен быть строкой или массивом).Для этого я использовал
indexOf
- он возвращает ложное значение, если первый аргумент является префиксомthis
аргумента.Представлять литералы функции
источник
TI-Basic (серия 83), 578 байт
TI-Basic имеет свою особую «кодовую страницу» со странными вариантами оформления, такими как перемещение символа пробела до 0x29, так что 0x20 может быть
randM(
командой.Сложно понять, как заставить TI-Basic выводить правильный тип объекта. Строки не будут работать по нескольким причинам: нет способа сослаться на токен без использования токена, а также нам не разрешен
"
символ. Мы не можем просто написать список, потому что{
и}
запрещены. Мы позволили[
и]
символы для матриц, а 1 по 256 матрица не работает, так как матрицы разрешены в большинстве 99 строк и столбцов. Мы не можем использовать→
для присвоения переменных, и мы не можем получить в списке переменныхʟ
илиL₁
вL₆
любом случае.Итак, здесь мы записываем сложную логическую формулу с неравенствами, которая говорит, что когда символ является одним из тех, которые мы хотим вывести. Затем мы используем
seq(
команду для создания списка с1
этими позициями и в0
других местах. Оттуда другаяseq(
команда и некоторая арифметика заканчивают работу.Это была захватывающая часть; остальное - игра в гольф с константами, и я, вероятно, не сделал этого как можно больше. Один из приемов, которые я использую, заключается в том, что по умолчанию
Xmax
10,XFact
4 иΔTbl
1.источник
(
это запрещено.[A](I,J)
, и из того, что я понимаю, вы хотите сделать что-то вроде[A](int(I/99),I-99int(I/99))
чтения всех элементов матрицы[A]
- мы также не можем этого сделать. (Кстати,)
это также запрещено. К счастью, нам не нужно закрывать конечные скобки, но это ограничивает то, как мы можем использовать много команд.)Brain-Flak -r, 3894 байта
Попробуйте онлайн!
Я написал программу для генерации оптимальной программы Brain-Flak для любого выхода. Предположить, что:
<>
не используетсятогда это решение оптимально.
источник
Python 2 ,
162157 байтПредупреждение : непечатные символы впереди!
Попробуйте онлайн!
На основе существующего ответа TFeld , но с некоторыми изменениями:
0xe0/7
вместо8+8+8+8
представления 32. ( программа для поиска кратчайшего представления числа )bytearray
для представления огромного литерала.A
bytearray
похож на a вstr
том, что он итеративен, однако при итерации он дает целые числа, а не символы. Мы можем использовать его для кодирования литерала base-N иreduce(lambda x,y: x*N+y, my_bytearray)
для его декодирования.Поскольку файлы Python 2 по умолчанию не имеют кодировки, можно использовать только символы в ASCII (0..127). Нулевой байт, переводы строки, обратная косая черта и кавычки занимают еще 1 байт.
Кроме того, невозможно использовать все базы.
Я написал программу, чтобы найти кратчайшее представление
n
, учитывая эти ограничения.источник