Задача: вывести это точное ASCII-искусство паутины в окне:
_______________________________
|\_____________________________/|
|| \ | / ||
|| \ /|\ / ||
|| /\'.__.' : '.__.'/\ ||
|| __.' \ | / '.__ ||
||'. /\'---':'---'/\ .'||
||\ '. /' \__ _|_ __/ '\ .' /||
|| | /. /\ ' : ' /\ .\ | ||
|| | | './ \ _|_ / \.' | | ||
||/ '/. /'. // : \\ .'\ .\' \||
||__/___/___/_\(+)/_\___\___\__||
|| \ \ \ /(O)\ / / / ||
||\ .\' \.' \\_:_// './ '/. /||
|| | | .'\ / | \ /'. | | ||
|| | \' \/_._:_._\/ '/ | ||
||/ .' \ / | \ / '. \||
||.'_ '\/.---.:.---.\/' _'.||
|| '. / __ | __ \ .' ||
|| \/.' '. : .' '.\/ ||
|| / \|/ \ ||
||____/_________|_________\____||
|/_____________________________\|
Источник: Джоан Старк (слегка модифицированный паук и рамка и удаление инициалов ради испытания).
Обязательные символы: _|\/'.:-(+)O
(12) + пробел и новая строка (2)
Правила соревнований:
- Разрешены один или несколько пробелов и / или новых строк.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с соответствующими параметрами, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
code-golf
ascii-art
kolmogorov-complexity
Кевин Круйссен
источник
источник
.
символом 7 символовO
. Должен ли быть один 7 символов после тоже?Ответы:
SOGL V0.12 , 141 байт
Объяснение:
Попробуй здесь! (программа содержит вкладки, так что это лучшее представление программы)
источник
Арнольд С,
1257 1261 12561233 байтаЭто моя первая попытка программирования на высшем языке, поэтому я буду есть свои отрицательные отзывы, поскольку не предлагаю разумного решения этой проблемы, хотя программирование на языке спустилось с небес.
Вот компилятор, если кто-нибудь случайно поставит под сомнение этот алгоритм.
Ошиваться.
источник
TALK TO THE HAND
!vim,
373371 байт<ESC>
является резервным для 0x1B.Ungolfed
Попробуйте онлайн!
И уточнить объяснения вы были даны в детстве: Хотя это правда , что только эмоции пауки чувствуют себя лично ненависть, они являются способны зондирования страх на расстоянии более 50 метров.
источник
<CR>
но строки, заканчивающиеся на<CR>
среднее, дважды нажимают клавишу? Кажется, что в двух приведенных выше случаях ответ будет отрицательным , но затем строки сs/ /_/g
иtr
не заканчиваются,<CR>
но я не могу заставить его работать, не нажимая Enter.<CR>
s были ошибкой, и перевод строки также работает. (Я ввел строки с использованием<C-v><ENTER>
, которое генерирует<CR>
; именно поэтому оно отображается^M
вместо новой строки.) Я изменил код, чтобы исключить эти два дубликата и заменить возврат каретки обычными символами новой строки / перевода строки. Все оставшиеся новые строки должны быть введены точно один раз. (The ungolfed версия все еще имеет несколько дополнительных пустые строк, тем не соответствуют фактическим нажатиям golfed версии именно то , что должно быть набрано, за исключением.<ESC>
С.){ cat foo.vim; echo ':wq'; } | vim a.txt
так что вы не застряли в vim без клавиатуры, подключенной к stdin. Преимущество состоит в том, что я могу фактически запустить программу непосредственно из файла, вместо того, чтобы пытаться набирать его точно каждый раз, когда я делаю изменение. Для этой программы байты и нажатия клавиш эквивалентны, но это не всегда так. Например,<C-v><ENTER>
это три нажатия клавиш, но выдает один байт\r
.Желе ,
206205 байтНиладная ссылка, возвращающая список символов, или полная программа, печатающая искусство.
Попробуйте онлайн!
Можно ли использовать грубую вертикальную симметрию?
Как?
Первые 158 байтов - это очень большое число, записанное в биективной базе 250 с использованием первых 250 байтов кодовой страницы Jelly:
Это число (порядка 10 372 преобразуется в список его цифр в базе 9 (391 число от 0 до 8), а затем три добавляется к 203- й , 204- й , 220- й и 221- й цифрам ( который будет телом пауков):
Затем результат преобразуется в 12 символов левой части (до среднего столбца), включая искусство:
Полные строки затем строятся путем отскока каждой левой строки (которая отражает ее так, как если бы ее последний символ был зеркалом), изменяя все на
(
to)
,\
to/
и the/
to\
, а затем только используя новые значения справа стороны с помощью векторизацииand
с левой стороны от ранее. Результат наконец объединен с новыми строками, чтобы создать искусство:источник
Древесный уголь ,
239238 байтПопробуйте онлайн! Ссылка на подробную версию кода. Большая часть этого просто печатает большую сжатую строку, но повторяющиеся части были закодированы отдельно, чтобы уменьшить длину строки; в частности,
Rectangle
экономит количество байтов, избегая заполнения пробела до 17-го столбца, и даже диагональные линии сохраняют каждый байт.Редактировать: Кажется, что уголь больше не распознает сжатую строку, и его текущее сжатие генерирует более короткую строку, которая сохраняет 51 байт, и позволяет одной из диагональных линий вернуться в строку для дальнейшего 2-байтового сохранения. (Обратите внимание, что это не те счетчики, которые отображаются
-sl
; действительно, даже первоначальный счет был отключен на 1.) Однако есть три дополнительных сбережения, которые также применимы к исходному коду: попробуйте онлайн!B
(Box
) вместоUR
(Rectangle
).↙P×_¹⁶←/
вместо↓P×_¹⁵←_/
.×_¹⁶J⁵¦¹
вместоP×_¹⁶M⁵¦²
.источник
PHP , 380 байт
Попробуйте онлайн!
PHP , 494 байта
Попробуйте онлайн!
источник
брейкфук , 4086 байт
Попробуйте онлайн!
Это просто метод поиска и выбора строки.
Добавлены новые строки для большей читабельности:
источник
---------------------------------------------------------------
вместо чего-то вроде>++++++++[-<-------->]<+
?>
s и<
s, которые появятся позже в коде. Я не знаю, сколько (если таковые имеются) байтов мой подход экономит. Я посмотрю на использование большего количества клеток.>>>
последовательности в дальнейшем, поскольку они просто используются как временное пространство для факторизаций. В частности, если вы заполняете ячейки слева направо, вы можете использовать, например, ячейку 5 в качестве временного пространства для настройки ячейки 4, а затем (поскольку ячейка 5 обнуляется в процессе установки ячейки 4), сохранить новую значение в ячейке 5 при использовании ячейки 6 в качестве временного пробела. До тех пор, пока окончательные значения ячеек не изменятся, вы можете изменить что-либо до первой,.
не изменяя более поздний код.JavaScript (ES6), 471 байт
Упакованный с ES6-вариантом RegPack .
источник
Java (JDK) , 494 байта
Попробуйте онлайн!
Спасибо Кевину Круйссену за то, что он сыграл в гольф несколько байтов, плюс 6 байтов, изменив
Windows-1252
наcp1252
, и на ASCII-только, чтобы немного сжать струну :)Примечание: файл должен быть закодирован как Windows-1252 для подсчета байтов, но его можно безопасно скопировать / вставить в UTF-8 для тестирования!
Длинная цепочка на самом деле является строкой, с символами, сопоставленными с гибким кодировщиком символов (на этот раз я с удовольствием использую CP-1252). Остальное - только метод отображения.
Отображение было найдено с использованием перестановки, сначала инициализированной частотой каждого символа в искусстве ascii. Отображения, приводящие к символам
'"'
и'\\'
были явно отброшены, чтобы быть самой короткой допустимой строкой насколько возможно.Ungolfed
Картографическое открытие
источник
()
случайный символ. Я ничего о без ввода не говорил, так что вы можете использовать неиспользуемое ,Object
который вnull
качестве входных данных. Соответствующий метапост. , О, и вы можете сохранить еще один байт, переключившисьbyte
наint
цикл for-each.r+=a;
эквивалентенr = r + (a)
и с символами, это означает, что они добавляются друг к другу перед объединением, поэтому теперь они рассматриваются какint
s, а полученная строка похожа на127190190190190190190190190190...
. Я написал прокомментируйте это в кодовой версии ungolfed;)Windows-1252
можно играть в гольфcp1252
. Объяснение здесь.b>>4
паренсы не нужны, помните, что побитовый очень, очень низкий приоритетСетчатка ,
465463425 байтПопробуйте онлайн!
источник
C # (.NET Core) ,
935 676 636627 байтПопробуйте онлайн!
Я хотел попробовать другой подход и рисовал RLE. Завершается кодом, который имеет больше байтов, чем сам рисунок (782 байта). Затем я сжал строку RLE, создав словарь с наиболее часто используемыми группами, и после сжатия я создал больше словарей и сжал снова, пока строка больше не могла быть уменьшена. Таким образом, чертеж создается путем расширения этих групп, а затем распаковки с помощью RLE.
источник
Python 2,7,
414 405401 байтПросто распаковывает строку и печатает ее. :)
источник
Z_FILTERED
), которое позволяет избежать заголовков и контрольных сумм. Сбрасывает до 401 байта.print zlib.decompress('fY9BauhADEP3OcXbueUz1j6X6AUEuogP/xeTpCmUGgxK5iFZ5O85xn++a44ZAHPPPEoAcxMPovEbeBFyddLFyRbyi0i6Hpd5HKqTTVTfLmutOmutdTt0zRwzphoVOCETEkGZLrRTBtSATHFSyEAbhocYqgUmEwTu2r9njhlRalA1Eic2XYZ24ZljJlHu9ce/T8XJvTsFc68+vj6Ndl0EV5d27Wg7Z6R9VKlfXWZHC7alql+XMuACrHTOdCyg9OrSha9ohusoUX116QpQVq+1+uy1VlsFpPrqQjWI5PJIMHRxdQHA6oJqTraw4Aexv8HzqG8iSZR75lFOkpljvh9/G89/'.decode('base64'),-9)
compress[obj]() takes no keyword arguments
compress
нет, ноcompressobj
принимает дополнительные аргументы (хотя не как ключевые слова до 3.3, вы должны передавать аргументы позиционно). Создание компрессора, вызовcompressor.compress(thedata)
, затем выполнениеcompresseddata = compressor.flush()
эквивалентно трем шагамzlib.compress
, но вы можете настроитьcompressobj
более точно. Единственным недостатком является то, что с помощьюwbits=-9
средств вы должны пройти ,-9
чтобыdecompress
(так он не знает , чтобы искать заголовок или контрольной суммы).Python 3 ,
404398 байтПопробуйте онлайн!
Тот же чит, что и в версии Python 2.7 , только настроенный для преобразования Py3
bytes
<->str
. Все еще меньше, чем код 2.7, несмотря на дополнительный импорт и требуемое декодирование благодаря Python 3, обеспечивающему кодирование base85 в качестве встроенного, уменьшая размер, необходимый для представления сжатых данных в формате ASCII для печати, на 28 байт.Редактировать: побрили еще шесть байтов путем повторного сжатия,
wbits=-9
чтобы заголовок или контрольная сумма не помещались в данные (в обмен на необходимость добавления,-9
аргумента кzlib.decompress
).источник
Java 8, 719 байт
Можно определенно играть в гольф, но это только начало, и то, что другие игроки в гольф Java могут (попытаться) победить. ;)
Объяснение:
Попробуй это здесь.
источник
брейкфук , 5173 байта
Попробуйте онлайн!
Как это устроено
В двух словах: находит индекс ascii для каждого символа в строке; затем печатает это. Затем найдите индекс ascii для новой строки и напечатайте его. Сполосни и повтори мой сын.
источник
256 байт, машинный код (16-битный x86)
Я надеялся, что смогу обойти хотя бы уголь, но мне не удалось выжать больше из этого (пока).
Выполнение: сохраните на codegolf.com, dosbox, чтобы увидеть результат, на котором вам нужно установить точку останова,
cs:200
и сбросить память вds:400
legth30e
... или вы можете добавить следующий фрагмент, который выгрузит его в стандартный выводЭто моя третья запись в гольф. Предыдущим было шифрование xor .
Опять же: сделано с использованием HT hexeditor , без компилятора , но с использованием Ctrl-a
assemble instruction
.Как
Это заняло немного времени, чтобы сделать это ...
Я начал с простого подхода, с одного квадранта и пытался отразить его. Это привело к ~ 250 байтов и только 2 из 4 квадрантов. Большую часть этого составлял сам первый квадрант, который занимал 204 байта.
Я знал, что это может быть лучше.
Я быстро проверил, что lz4 создает файл с 144 байтами (пропуская заголовки). GZ дает ~ 120 байтов, но, очевидно, я не смог бы создать декомпрессор в 30 или около того байтах.
Итак, еще одной попыткой было создание первого квадранта вручную путем его рисования (включая пропуск, 4-битное кодирование и т. Д.). Это вместе с кодом привело к 164 байтам (хотя это только первый квадрант), хорошо, но я был совершенно уверен, что смогу сделать лучше.
Я придумал некоторую кодировку, которая заканчивается данными в 85 байтов. Наряду с таблицей перевода (которая еще не используется) и декодером у меня получилось 144 байта. NOICE, я = lz4 и уже есть декодер.
Следующим шагом было объединить начальное зеркалирование с ~ 250 попыток в это, это потребовало некоторой настройки данных, но оказалось проще, чем ожидалось, и привело к 184 байтам.
Я понял, что мне понадобятся некоторые дополнительные маркеры для создания горизонтального зеркала, которое расширило данные до 91b и закодировало до 190 байтов (которые позже попали в корзину).
Наряду с горизонтальным зеркалом и окончательным переводом я получил ~ 250 байт.
Мне удалось съесть несколько байтов здесь и там, но мне пришлось добавить эти уродливые символы, которые неправильно отражены. Это дало 259 байт ... Это плохо, потому что я использовал память, начиная с 0x200, и не хотел повторять это.
Я заменил условия в горизонтальном зеркале, чтобы зациклить с помощью таблицы перевода, которая сама по себе не сильно сэкономила, но в сочетании с заменой ошибочных символов на пробелы и их исправлением позже сэкономила несколько байтов, что привело к получению окончательных 256 байтов.
Вы можете увидеть хорошую галерею, которую я сделал, делая это здесь
рассечение
Как и предыдущие записи, эта также опирается на начальные значения , хотя и не так сильно, как предыдущие:
пропустить данные, есть 3 таблицы:
Таблица перевода будет использоваться для горизонтального зеркалирования
Таблица перевода будет использоваться для окончательного замещения, для преобразования кодов в фактические ascii
Закодированные данные, кодировка довольно проста:
заполнить 12 * 17 байтов тем, что станет пробелом (8)
«Распакуйте» данные, как описано в таблице 3. Не забывайте об использовании любимой инструкции AAM и злоупотреблении scasb для пропуска байтов.
Эта часть довольно уродлива, она устанавливает пункт назначения 0x400:
Имейте в виду, что зеркало делается путем злоупотребления std / cld, чтобы пройти
SI
в обратном порядке. Только\/()
символы должны быть отражены, что делается с помощью xor в 0x1BF.Это делает горизонтальное зеркало, используя таблицу 1 и используя замечательный 1-байтовый XLAT
Затем идет скучная часть, которая исправляет 4 "пикселя", я пропущу отсюда, это скучно
Последний шаг перевода в ascii.
Уф! Это было весело.
источник
JavaScript (ES6),
517...459457456433431418409397392 байтаВключает в себя завершающую строку пробелов плюс завершающую пробел в первой строке. Часть этого все еще не оптимально игра в гольф - я потратил много времени на то, чтобы заставить все это работать.
Первоначально основанный на Traktor53, с тех пор отказался от решения 556 байт . Опубликовано с разрешения .
Список дел
Найдите менее дорогой способ палиндромизировать струны.Попробуйте улучшить замену RLE.Посмотрите, могут ли последние 4 замены быть в гольфе любым способом.Расследуйте, приведет ли создание изображения в кварталы к какой-либо значительной экономии - я подозреваю, что нет!источник
string1[string2.indexOf( char) ]|| char
это конструкция, которую я пытался, но не смог сократить байты. Отлично сработано!JavaScript
556468462448438387379 байтМеньше гольфа
компрессия
Оригинальный пост (556 байт) использовал десятичные цифры для обозначения повторения предыдущего символа в паутине. Более поздние версии сжимают левую половину сети в 7-битные символы, где наименьший значащий полубайт - это индекс в наборе символов, а три старших бита указывают количество символов для вывода плюс 1: значения
000
и001
не используются,010
означает 1 символ и111
означает шесть. Эта конструкция избегает производства контрольных символов.Спасибо @Shaggy за полезные советы по переписыванию.
Как это устроено
Верхний левый квадрант был переписан для включения заполнителей для верхней и нижней половин сети:
давая:
который был сжат с помощью
декомпрессия
Распаковка отображает закодированные символы в фактические символы для каждого квадранта. В коде
X
является индексированным списком символов, который варьируется между верхним и нижним веб-разделами. Он предоставляет значения для заполнителей типа «suqh» и жестких отражений символов, таких как «+» и «O».кодирование
Кодирование центрального символа ограничено использованием раскрытия одного символа. Порядок набора символов ограничен, чтобы не сгенерировать символы DEL (0x7F), Grave (0x60) или обратную косую черту (0x5C) во время сжатия.
Это последнее обновление в ответ на активность в вопросе.
источник
.reduce
и.map
что я не мог. Тем временем я изменил алгоритм, чтобы получить 468 байт! Счастливые выходные./// , 463 байта
Попробуйте онлайн!
источник
Баш, 391 байт
Попробуйте онлайн!
Престижность каждому, кто смог победить сжатие вне колышка - это я бросаю в полотенце! Я благодарю людей из Python, которые первыми применили подход zlib / gzip.
источник
Perl 5
439402 байтаВместо того, чтобы использовать base64 / gzip, этот подход заключается в отражении и отражении верхнего левого квадранта с соответствующими заменами.
Попробуйте онлайн
Для интересующихся, комментируемая версия:
источник
C #, 484 байта
Примечание: я не на 100% о том, как их оценить. С верхним и нижним колонтитулами это 544 байта.
Ungolfed:
Попробуйте онлайн!
источник
Ruby 1.9.3,
1102763 байтаПопробуйте онлайн!
источник
puts
и многострочная строка должны занимать ~ 790 байт. Ваша огромная строка для сканирования и код для ее обработки оказываются длиннее, чем наивное решение ...C #,
401 399 397 396389 байтНаписал этот как предлог, чтобы попробовать кодирование Хаффмана
Ungolfed:
Старая версия не разглажена с комментариями:
Попробуйте онлайн!
источник
while(v>0){
for
v/=2
for(int p=0,l=0;v>0;v/=2){
while
занимать то же место, что иfor
.for(;someCondition;someAction);
противfor(;someCondition;)someAction;
противwhile(someCondition)someAction;
. Но в целомfor
действительно корочеwhile
, поэтому я использую почти всегдаfor
себя.Python 2 , 395 байт
Попробуйте онлайн!
источник
Пробел ,
47234584 байтаБуквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.Попробуйте онлайн .
Объяснение:
Я использую подход, описанный в этой статье . Описанный подход заключается в следующем:
Идеальным постоянным значением было то
94
, что я сгенерировал с помощью этой Java-программы . Использование94
даст программу Whitespace общей длиной 7508 байт (7481 + 27 байт для цикла) или 5791 байт (5764 + 27), если мы уже реализуем Duplicate Top (SNS
), где два одинаковых символа смежны.После этого я вручную использовал « Копировать 1-е» (
STSSTN
), « Копировать 2-е» (STSSTSN
) и « Копировать 3-е» (STSSTTN
) (индексируется 1) везде, где бы они сохраняли байты. Который также можно найти в советах Whitespace. Что в итоге привело к программе на 4584 байта, которую вы видите здесь.источник
05AB1E , 204 байта
Попробуйте онлайн.
Убедитесь, что это правильно.
Объяснение:
источник