Нарисуйте эту кофейную чашку Ascii:
о о о __________ / \ __ | J | \ | A | | | V | | | A | __ / \ __________ /
Домовые очки для кофе-сценария или Java :)
Самый короткий код в байтах, функция или программа, завершающий символ новой строки или пробел приемлем, выпей!
Ответы:
SOGL , 48 байтов
Объяснение:
SOGL имеет встроенное сжатие строк, и одна из вещей, которые он имеет, это сжатие словаря символов. Более того, он имеет тип сжатия boxstring, в котором единственными доступными символами являются "/ \ | _- \ n". Таким образом, вся программа представляет собой строку, заключенную в «» («неявно»).
Строка, которую я дал компрессору (экранирована):
источник
JavaScript (ES6),
110104 байтаСохранено 4 байта благодаря edc65
Как это работает
Сжатие оригинального искусства ASCII достигается путем замены всех последовательностей от 2 до 10 последовательных пробелов и двух последовательностей из 10 последовательных подчеркиваний одной цифрой:
N
последовательных пробелов кодируется цифройN-1
.9
.Мы используем,
N-1
а неN
так, чтобы нам никогда не приходилось использовать более одной цифры. Отсюда необходимость++n
при декодировании.Выражение
n>>3
(битовое смещение вправо) равно 0 дляn = 1
ton = 7
и равно 1 дляn = 8
(не используется) иn = 9
. Следовательно,' _'[n>>3]
дает подчеркивание для9
и пространство для всех других встречающихся значений.Единственный особый случай - это последовательность из 10 последовательных пробелов чуть выше "JAVA". Кодирование его с помощью
9
будет конфликтовать с последовательностями подчеркивания. Поэтому нам нужно разбить его на две последовательности по 5 пробелов, закодированные как44
.источник
f=
). Вы можете сохранить 4 байта таким образом:n>>3
вместо+!(n&7)
,9
вместо_8
(дважды) и44
вместо9
f=
в них учел ... Спасибо за сохраненные байты!' '
). Но не уверен, как именно это происходит. Что делает битовый сдвиг? Почему мы увеличиваем n?Желе ,
6764 байта-2 байта благодаря Деннису (1. удалить избыточный
”
и 2. заменить транспонирование и декодирование по длине прогонаZŒṙ
, с уменьшением путем повторения элементов,.x/
)Попробуйте онлайн!
Как?
“...“...’
список двух сжатых чисел base-250:D
преобразуется в десятичную, чтобы получить два списка цифр:x/
уменьшает на повторение элементов, чтобы получить один список цифр (повторение числа из первого списка на соответствующее значение другого):ị
поручает индексировать в список справа, один на основе и модульно (0 индексов в самый правый элемент). Список справа¶_/\|JAVo
- это просто символ, используемый в требуемом порядке, в котором знак «Pilcrow»¶
- это та же самая кодовая точка, что и перевод строки. Закрывающий партнер“
не требуется, так как это конец программы:Jelly выполняет неявную печать этого списка, который, поскольку он содержит символы, печатает, как если бы это была строка:
источник
”
неявный, и вы можете заменитьZŒṙ
наx/
. Кроме того, хотя он не имеет байтов, использование¶
вместо буквального перевода строки делает код более читабельным imo.CoffeeScript ES6,
214180 байтCoffeeScript, 135 байт с жестким кодированием
источник
Python 2,
174172171167 байтНет жесткого кодирования.
Нет кодировки Base-64.
Нет регулярных выражений
Сохранение 2 байтов за счет экстернализации
'_'*10
и использования преобразования PythonTrue -> 1
иFalse -> 0
.Сохраняется 1 байт, удаляя ненужные пробелы.
Сохранено 4 байта благодаря @TuukkaX!
источник
] for
иin [
.[2,7,4]
и[3,4,5,6]
до2,4,7
и3,4,5,6
.PowerShell ,
136124123105 байтПопробуйте онлайн!
Спасибо @briantist за то, что нашел где-то более короткий
-replace
метод, который я знал.Это берет строку с числами вместо необходимого количества пробелов. Затем мы повторно
-replace
выражаем цифры с помощью выражения сценария$(" "*$1)
. Так, например, первая строка строки будет$(" "*2)o
, вторая будет$(" "*7)o
и так далее. Из-за тройных кавычек это остается в виде строки в конвейере. Мы сбрасываем это вiex
(сокращение отInvoke-Expression
и аналогичноeval
), которое обрабатывает выражения сценария и оставляет полученную многострочную строку в конвейере. Вывод неявный.источник
($_,' '*$_)[+$_-in48..57]
- независимо от того, что я изменяю, мне кажется, что она потерпит неудачу.space
наo
и barfs.GNU sed ,
113112 байтБазовая кодировка, она хранит 3 пробела как
S
,\n
а@
5 подчеркивает какU
. Я буду продолжать пробовать комбинации, чтобы найти что-то более короткое.Попробуйте онлайн!
Тривиальное решение прямой печати строки приведено ниже. Он имеет 136 байтов, что приводит к сжатию на 18% с использованием приведенной выше схемы кодирования.
Попробуйте онлайн!
источник
ss
какS
сохраняет 1 байт.S
сохранением 3 пробелов, нетs
. Я думаю, что я отредактирую это вместо этого, потому что это сохраняет то же самое количество преобразований.MATL,
8786838278 байтЭто решение разбивает кофе на две части: «пузыри» и кружка. Чтобы создать пузыри, мы создаем разреженную матрицу с 111, расположенную в трех местах, и преобразуем ее в массив символов
Для компонента кружка мы полагаемся на сжатие строк
Оба компонента выводятся на печать, и между компонентами автоматически помещается новая строка
Попробуйте это на MATL Online
источник
Python 2 ,
128127 байт-1 байт благодаря Rod (используйте умножение кортежа
('_'*10,)
чтобы избежать объявления).Попробуйте онлайн!
Заметка: что двойной обратный слэш будет необходим до строки.
Все между
'''
и'''
является одной строкой, эти два%s
являются форматерами, которые заменяются содержимым конечного%(...)
кортежа, который, в свою очередь, содержит две копии'_'*10
помощью умножения кортежа(...)*2
.'_'*10
Выполняет умножение строки с выходом'__________'
.Код траверса символы,
c
, из этой целой строки , используяfor c in '''...
и создает новую строку путем присоединения (join(...)
)либо количество пробелов , выявленных
c
,int(c)
еслиc
это цифраили
c
сам- быть цифра обозначается ,
'0'<c<':'
чтобы сохранить болееc.isdigit()
.источник
u,u
с('_'*10,)*2
и уронитьu
декларациюJava 8,
294289248 байтGolfed:
В духе колмогоровской сложности это не жестко кодирует строку для вывода. Вместо этого он использует тот факт, что существует много случаев нескольких пробелов, за которыми следует печатный символ. Он кодирует количество пробелов, которые предшествуют символу в старшем байте символа, с фактическим символом ASCII в младшем байте.
Ungolfed:
источник
\u0641
.F
. Должно быть возможно разместить оба там.0x
приставки помогла.if
например, излишним) и сбрить около 1/6 размера.Befunge,
158105101 байтПопробуйте онлайн!
Символы в строке сначала кодируются как индексы в таблицу поиска из десяти возможных значений. Затем индексы группируются в пары, каждая пара объединяется в одно число (i1 + i2 * 10) в диапазоне от 0 до 99. Тщательно выбирая порядок таблицы поиска, мы можем гарантировать, что эти значения всегда будут действительными Символы ASCII, которые могут быть представлены строковым литералом.
Это разбивка самого кода:
Мы начнем с инициализации последнего элемента таблицы поиска символом новой строки (ASCII 10).
Затем мы используем строковый литерал для помещения закодированного содержимого в стек.
Наконец, мы перебираем значения стека, декодируем и выводим по два символа за раз.
Последняя строка содержит таблицу соответствия: 9-й элемент - это подразумеваемое пространство, а 10-й (новая строка) устанавливается вручную, как объяснялось ранее.
источник
Сетчатка , 71 байт
В отличие от моего другого ответа , этот был написан от руки.
(в конце есть пробел)
Попробуйте онлайн!
Принцип все еще имеет «сжатую» нить, из которой чашка кофе может быть восстановлена путем замены. Попробовав разные замены, выяснилось, что стоит сделать только следующие:
=
превращается в__________
(10 подчеркиваний)источник
Common Lisp,
125123122120114 байтЯ сохранил 6 байтов, используя идею просто помещать ввод в строку вместо
~&
s.Идеи по улучшению приветствуются.
источник
Python3, 206 байт
источник
s=' '
переменную и использовать ее.'o\n'
имеет ту же длину, что и'o'+n
.print(*(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'),sep='\n')
или : и тоfor x in(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'):print(x)
и другое 197. Все еще длиннее, чем жесткий код 136 .Pyth, 80 байт
Онлайн переводчик доступен здесь.
Простое декодирование по длине прогона.
источник
С - 179
Решение с широким использованием форматной строки:
Вот более читаемая версия:
источник
void g(){puts(" o\n o\n o\n __________\n/ \\__\n| J | \\\n| A | |\n| V | |\n| A |__/\n\__________/\n");}
Сетчатка , 99 байт
Это решение было создано автоматически с использованием этого сценария.
(на многих строках есть пробелы)
Это работает с использованием чисел 1,2,3,4 вместо некоторых последовательностей символов, которые повторяются в целевой строке, а затем заменяет их обратно.
Я знаю, что это можно было бы сделать лучше, изменив этот код или полностью изменив подход, но, поскольку вызов метамольфу Колмогорова имел довольно неутешительный результат, я хотел попробовать использовать свой сценарий на реальном испытании.
Попробуйте онлайн!
источник
3
а затем переместить подстановку до до 3. Также вы можете перейти2\n
на2\n3
и переместить эту подстановку до 3. Попробуйте это онлайн!1\n__________
на,1\n_____
а затем изменить каждый1
в основной замене, чтобы11
попробовать его онлайн!Python 3.6
(Не конкурирующий)Вот моя попытка кодирования Хаффмана. Это определенно игра в гольф дальше, если кто-то хочет принять идею.
Литерал может быть еще больше сжат путем преобразования в base64 или другое, и дерево Хаффмана может быть оптимизировано для получения еще более короткого битрейра.
источник
Язык GameMaker, 138 байт
источник
C, 141 байт
использование
Простое решение, 148 байт:
источник
PHP, 116 байт
Это очень похоже на ответ Арно - и делает то же самое. Беги с
-r
.источник
zsh, 86 байт
Пояснение: эта строка - сжатый gzip java cup ascii art. Я использую
printf
, потому что сecho
,zcat
печатает предупреждение, иecho -e
на один символ длиннее. Это не работает сbash
илиsh
, потому что они думают, что это двоичный файл. Поскольку вы не можете эффективно вставить этот вывод из браузера, вот пригодный для использования файл.источник
Java 9 / JShell, 299 байт
Ungolfed:
Использование в JShell:
Кодирует каждый символ в виде десяти битов, состоящих из числа пробелов перед символом в старших трех битах, следующих за кодовой точкой в младших семи битах.
(Так как для подсчета есть только три бита, он не может представлять более семи последовательных пробелов, и в одной точке в строке есть десять пробелов. Они кодируются как счетчик шести, за которым следует пробел, а затем число три, за которым следует следующий символ.)
К сожалению, он проигрывает этому тривиальному 140-байтовому решению Java:
источник
05AB1E , 85 байт
Попробуйте онлайн!
источник