Гольф ASCII-арт


31

Давайте попробуем сыграть в гольф в этом произведении ascii-art, представляющем человека, играющего в гольф

      '\. , |> 18 >>
        \. '. |
       О >> 'о |
        \. |
        / \. |
       / /. ' |
 JGS ^^^^^^^ `^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^

Источник: JGS - http://www.retrojunkie.com/asciiart/sports/golf.htm

Правила:

  • Вход не разрешен
  • Внешние ресурсы запрещены
  • Выходными данными должен быть именно этот текст, отображаемый моноширинным шрифтом (консоль ОС, консоль JS, тег HTML <pre>, ...), включая начальный и конечный разрыв строки.
  • Допускаются окружающие или двойные кавычки (консоль JS добавляет двойные кавычки при выводе строки, это нормально)

Лучшим ответом будет тот, который использует меньше символов на любом языке.

Повеселись!


2
«именно этот текст»: включая пустую строку в начале? включая пустую строку в конце? с трейлинговой новой строкой или без? (То есть 0, 1 или 2 новых строки в конце?)
Мартин Эндер

@ m.buettner выходные данные должны иметь ровно один разрыв строки впереди и один разрыв строки перевода строки / новую строку. (и цитирует, если вы не можете избежать их) :)
xem

1
Этот ASCII больше похож на выстрел в крикет
Mr. Alien

@ Mr.Alien Я видел это в недавнем выступлении Мартина Клеппе: speakerdeck.com/aemkei/… (видео: youtube.com/watch?v=zy-2ruMHdbU )
xem

Ответы:


14

CJam, 62 символа

"Ⴀ지尦렒>Ä΀ྀ㸀⡅쇋蒧ʸ鿀ʃ케袧Ƽ蟀ʄ導뤷쀂萯Ű⋥ἀ਎밊耧台 ⢙⿶ꝍ㕟劢햟騤꩏脽啎"2G#b128b:c~

Попробуйте онлайн.

Тестовый забег

$ base64 -d > golf.cjam <<< IgHhgqDsp4DlsKbroJLujJ8+w4TOgOC+gOO4gOKhheyHi+iSp8q46b+AyoPsvIDvoIPuhKvooqfGvOifgMqE5bCO66S37ICC6JCvxbDii6XhvIDgqI7rsIrvgYvogKflj7DCoOKimeK/tuqdjeOVn+WKou2Wn+mopO+em+qpj+iEve6arOWVjiIyRyNiMTI4Yjpjfg==
$ wc -m golf.cjam
62 golf.cjam
$ cjam golf.cjam

      '\                   .  .                        |>18>>
        \              .         ' .                   |
       O>>         .                 'o                |
        \       .                                      |
        /\    .                                        |
       / /  .'                                         |
 jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
$

Как это работает

2G#b преобразует предыдущую строку в целое число, считая его числом base-65536.

128b:cпреобразует это целое число обратно в строку ( 110 байт ), считая его числом base-128, которое ~затем выполняет:

"
^F'^@\^S.^B.^X|^@>^@1^@8^@>^@>^@
^H\^N.^I'^A.^S|^@
^GO^@>^@>^I.^Q'^@o^P|^@
^H\^G.&|^@
^H/^@\^D.(|^@
^G/^A/^B.^@')|^@
^A"2/{)iS*}%"jgs"'^7*'`'^51*N

(каретная запись)

2/{)iS*}%

разбивает строку на пары по два символа и выполняет следующие действия для каждой пары: выталкивает второй символ строки, преобразует его в целое число и повторяет строку " "много раз.

Например, ".("становится ". ", потому что код символа ASCII (равен 40.

В заключение,

"jgs"'^7*'`'^51*N

толкает строку "jgs", символ ^повторяется 7 раз, `символ ^повторяется 51 раз и перевод строки.


1
Действительно здорово, но когда я беру версию 62char из pastebin и "пробую онлайн", перед последней строкой "jgs ..." отсутствует разрыв строки
xem

@xem: Вы копировали из раздела RAW Paste Data ? Если я копирую отформатированный код, я получаю тот же результат.
Деннис

15

Руби, 107

Я подумал, что на самом деле попытался бы «сгенерировать» изображение в коде (вместо использования какой-либо существующей функции сжатия):

S=?\s*351+?^*60
"⠀鰇𗀈렜렟🀸쐺⠾𗁇롖鱠롢🁶⡷𓱿뢋鲝𛲞🂯⢰𗂹룁🃨⣩볲𗃳룸🄡⤢봪봬뤯鴰🅚⥛𚥝𙵞𜵟𘅧".chars{|q|S[511&r=q.ord]=(r>>10).chr}
puts S

В этом массиве есть непечатаемые символы.

Вот шестнадцатеричное представление файла, чтобы показать также непечатаемые символы:

0000000: 533d 3f5c 732a 3335 312b 3f5e 2a36 300a  S=?\s*351+?^*60.
0000010: 22e2 a080 e9b0 87f0 9780 88eb a09c eba0  "...............
0000020: 9ff0 9f80 b8ef a0b9 ec90 baee 80bb efa0  ................
0000030: bcef a0bd e2a0 bef0 9781 87eb a196 e9b1  ................
0000040: a0eb a1a2 f09f 81b6 e2a1 b7f0 93b1 bfef  ................
0000050: a280 efa2 81eb a28b e9b2 9df0 9bb2 9ef0  ................
0000060: 9f82 afe2 a2b0 f097 82b9 eba3 81f0 9f83  ................
0000070: a8e2 a3a9 ebb3 b2f0 9783 b3eb a3b8 f09f  ................
0000080: 84a1 e2a4 a2eb b4aa ebb4 aceb a4af e9b4  ................
0000090: b0f0 9f85 9ae2 a59b f09a a59d f099 b59e  ................
00000a0: f09c b59f f098 85a7 222e 6368 6172 737b  ........".chars{
00000b0: 7c71 7c53 5b35 3131 2672 3d71 2e6f 7264  |q|S[511&r=q.ord
00000c0: 5d3d 2872 3e3e 3130 292e 6368 727d 0a70  ]=(r>>10).chr}.p
00000d0: 7574 7320 53                             uts S

Спасибо Ventero за некоторые значительные улучшения! (Он в основном сократил код на 50%.)


Хорошее усилие! Я надеялся на такие ответы, которые не просто gzip ASCII;)
xem

1
Во второй строке можно 6.times{|i|S[i+1]=' '*55+?|}сохранить 2 символа.
августа

@voidpigeon Ах, спасибо. Я на самом деле начал с этого, но сначала думал, что мне нужно iбудет не раз. Хороший улов!
Мартин Эндер

2
Надеюсь, вы не возражаете, если я упомяну еще несколько способов сократить это! Использование S.fill{' '*55+?|}вместо экономит несколько символов (вы должны будете определить , Sкак ['']*7, изменить , putsчтобы puts p,S,pи вычесть 1 из всех у координат , хотя). Затем, используя varargs в f ( def f(*p,c)), вы можете сохранить []вызовы функций. Ох, и вы можете бросить ()вокруг y,x.
Вентеро

1
Если вы делаете S одномерный, вы можете сохранить еще 55 символов;) Вот код, если вы не хотите делать это самостоятельно.
Вентеро

13

bash + iconv + машинный код DosBox / x86 (104 97 96 95 символов)

echo ↾각슈삨੽₲ɻ庲錿ʴ⇍罋곹삄ૃ蘊尧⺓⺂粘ㄾ㸸ਾ岈⺎➉⸠粓蜊㹏褾鄮漧粐蠊蝜꘮੼⾈葜꠮੼⾇⼠⺂ꤧ੼樠獧惇૳|iconv -futf8 -tucs2>o.com;dosbox o*

Я предлагаю поместить это в скрипт в пустой директории, почти гарантировано, что копирование в терминале все сломает; еще лучше, вы можете взять готовый скрипт здесь .

Ожидаемый результат: ожидаемый результат

Как это работает

Часть bash - это просто средство запуска, которое использует iconvдля «распаковки» .comфайл из символов сценария UTF-8 и запускает его с помощью DosBox.

Обратите внимание, что это накладывает некоторые ограничения на содержание, так как не все входные последовательности могут быть интерпретированы как UCS-2 iconvбез жалоб; например, по какой-то причине многие операции, связанные с bxрегистром, приводили к хаосу в зависимости от того, где я их использовал, поэтому мне приходилось обходить эту проблему несколько раз.

Теперь Unicode просто использует преимущества правил «подсчета символов»; Фактический размер (в байтах) скрипта намного больше исходного .COMфайла.

Извлеченный .comфайл

00000000  be 21 01 ac 88 c2 a8 c0  7d 0a b2 20 7b 02 b2 5e  |.!......}.. {..^|
00000010  83 e0 3f 93 b4 02 cd 21  4b 7f f9 ac 84 c0 75 e4  |..?....!K.....u.|
00000020  c3 0a 0a 86 27 5c 93 2e  82 2e 98 7c 3e 31 38 3e  |....'\.....|>18>|
00000030  3e 0a 88 5c 8e 2e 89 27  20 2e 93 7c 0a 87 4f 3e  |>..\...' ..|..O>|
00000040  3e 89 2e 91 27 6f 90 7c  0a 88 5c 87 2e a6 7c 0a  |>...'o.|..\...|.|
00000050  88 2f 5c 84 2e a8 7c 0a  87 2f 20 2f 82 2e 27 a9  |./\...|../ /..'.|
00000060  7c 0a 20 6a 67 73 c7 60  f3 0a 0a 00              ||. jgs.`....|
0000006c

и имеет длину 108 байт. Источник NASM для этого:

    org 100h

start:
    ; si: pointer to current position in data
    mov si,data
    ; load the character in al
    lodsb
mainloop:
    ; bx: repetition count
    ; - zero at startup
    ; - -1 after each RLE run
    ; - one less than each iteration after each "literal" run
    ; the constant decrement is not really a problem, as print
    ; always does at least one print, and there aren't enough
    ; consecutive literal values to have wraparound

    ; if the high bit is not set, we have a "literal" byte;
    ; we prepare it in dl just in case
    mov dl,al
    ; then check if it's not set and branch straight to print
    ; notice that bx=0 is fine, as print prints always at least one character
    ; test the top two bits (we need the 6th bit below)
    test al,0xc0
    ; to see if the top bit was set, we interpret it as the sign bit,
    ; and branch if the number is positive or zero (top bit not set)
    jge print
rle:
    ; it wasn't a literal, but a caret/space with a repetition count
    ; space if 6th bit not set, caret otherwise
    mov dl,' '
    ; exploit the parity bit to see if the 6th bit was set
    jnp nocaret
    mov dl,'^'
nocaret:
    ; lower 6 bits: repetition count
    ; and away the top bits and move in bx
    ; we and ax and not al because we have to get rid of the 02h in ah
    and ax,3fh
    xchg ax,bx
print:
    ; print bx times
    mov ah,2
    int 21h
    dec bx
    jg print
    ; read next character
    lodsb
    test al,al
    ; rinse & repeat unless we got a zero
    jnz mainloop
end:
    ret
data:
    ; here be data
    incbin "compressed.dat"
    ; NUL terminator
    db 0

Все это просто декомпрессор compressed.dat, формат которого выглядит следующим образом:

  • если старший бит не установлен, выведите символ как есть;
  • в противном случае младшие 6 битов являются счетчиком повторений, а второй старший бит указывает, должен ли он печатать пробел (бит не установлен) или каретку (бит установлен).

compressed.datв свою очередь генерируется с использованием скрипта Python из исходного текста.

Все это можно найти здесь .


10

Питон, 156

print'''
%6s'\%19s.  .%24s|>18>>
%8s\%14s.%9s' .%19s|
%7sO>>%9s.%17s'o%16s|
%8s\%7s.%38s|
%8s/\%4s.%40s|
%7s/ /  .'%41s|
 jgs'''%(('',)*19)+'^'*7+'`'+'^'*51

Это использует форматирование строки с пробелом для некоторого базового сжатия.


7

PHP, 147

Это выполняется в командной строке и выводится непосредственно на консоль:

php -r 'echo gzinflate(base64_decode("41IAA/UYBUygB0bYQY2doYWdHReMG4OhEwrUsRpRA9Pob2eHRRNccz5OjXAbcboQl0b9GBK0IWnUB0IFPXUFEjRmpRfHQUBCHOmAiwsA"));'

6

Perl - 127 129 130 132 135 137 145

print q(
6'\19.2.24|>18>>
8\14.9'1.19|
7O>>9.17'o16|
8\7.38|
8/\4.40|
7/1/2.'41|
1jgs^^^^^^^`0
)=~s/\d++(?!>)/$"x$&||'^'x51/reg

Спасибо Ventero и m.buettner за помощь в оптимизации RegEx .


Вы можете сохранить одного персонажа сs/\d+(?!8?>)/%$&s/rg
Ventero

@ Ventero спасибо за предложение.
core1024

2
Вы можете сохранить еще один, используя собственнический квантификатор :/\d++(?!>)/
Мартин Эндер,

@ m.buettner Я этого не знал.
Узнавать что-то

4

GCC C - 203 байта

Я решил повеселиться с этим. Это компилирует мою версию MinGW и выводит ожидаемый текст.

Пробелы добавлены для ясности.

char*v="\n ú'\\ í.  . è|>18>>\n ø\\ ò. ÷' . í|\n ùO>> ÷. ï'o ð|\n ø\\ ù. Ú|\n ø/\\ ü. Ø|\n ù/ /  .' ×|\n jgs^ù`^Í\n";
main(g,o,l){
    for(;*v;
        g=!g&*v<0&l?-*v++:g){
        v+=!(l=*v-35);
        putchar((g-=g>0)?o:(o=*v++));
    }
}

Ни один из сайтов для онлайн-вставки кода не позволяет использовать однобайтовые символы вне диапазона ASCII, поэтому мне пришлось избегать их для загруженного примера. Это в остальном идентично, хотя. http://codepad.org/nQrxTBlX

Вы также всегда можете проверить это с помощью собственного компилятора.


4

LOLCODE, 590 символов

Потому что LOLCODE iz perfik language 4 golfin: iz easy 2 полностью запутан и не многословен.

HAI
HOW DUZ I D C T
I HAZ A O
I HAZ A N ITZ 0
IM IN YR LOOP UPPIN YR N TIL BOTH SAEM N AN T
O R SMOOSH O AN C MKAY
IM OUTTA YR LOOP
FOUND YR O
IF U SAY SO
VISIBLE ""
VISIBLE SMOOSH "  '\" AN D " " 19 AN ".  ." AN D " " 24 AN "|>18>>" MKAY
VISIBLE "    \              .         ' .                   |"
VISIBLE "   O>>         .                 'o                |"
VISIBLE SMOOSH "    \       ." AN D " " 38 AN "|" MKAY
VISIBLE SMOOSH "    /\    ." AN  D " " 40 AN "|" MKAY
VISIBLE SMOOSH "   / /  .'" AN D " " 41 AN "|" MKAY
VISIBLE SMOOSH "jgs^^^^^^^`" AN D "^" 51 MKAY
VISIBLE ""
KTHXBYE

Я уверен, что не знаю, но у меня есть LOLCODE интерпретатор, а http://repl.it кажется 2 не похожим на funcshuns.

(Tranzlashun великодушно предоставлен роботами http://speaklolcat.com , потому что я говорю spell lolcat)


Версия кода с отступом, пробелами и комментариями (комментарии LOLCODE начинаются с BTW):

HAI BTW All LOLCODE programs start with HAI
    HOW DUZ I D C T BTW Function declarations follow the form "HOW DUZ I <func-name>[ <func-arg1>[ <func arg2>[ ...]]]". In this case, D is a function that repeats a YARN C (YARN is the equivalent of string in LOLCODE) NUMBR T (NUMBR = int) times.
        I HAZ A O BTW Variable declarations follow the form "I HAZ A <var-name>"

        I HAZ A N ITZ 0 BTW Variables can be intialised when declared by appending " ITZ <init-value>" to the declaration 
        IM IN YR LOOP UPPIN YR N TIL BOTH SAEM N AN T BTW Loops follow the form "IM IN YR LOOP <action> TIL <condition>" where action and condition are "UPPIN YR N" and "BOTH SAEM N AN T", respectively, in this case
            O R SMOOSH O AN C MKAY BTW "R" assigns a new value to a variable. YARN (string) concatenation follows the form "SMOOSH <str-1> AN <str-2>[ AN <str-3>[...]] MKAY"
        IM OUTTA YR LOOP BTW "IM OUTTA YR LOOP" ends LOLCODE loops

        FOUND YR O BTW "FOUND YR <value>" returns a value
    IF U SAY SO BTW "IF U SAY SO" ends functions

    VISIBLE "" BTW "VISIBLE" prints its argument to stdout
    VISIBLE SMOOSH "  '\" AN D " " 19 AN ".  ." AN D " " 24 AN "|>18>>" MKAY BTW The function I wrote above only "pays off" in terms of characters added/saved when repeating 19 or more characters (the function call itself takes 8 characters, assuming a one-character first argument and a 2-digit second one; you need to factor in the added quotes (2 characters), spaces (4) and ANs (4) for 18 total extra characters; and possible SMOOSH/MKAY)
    VISIBLE "    \              .         ' .                   |"
    VISIBLE "   O>>         .                 'o                |"
    VISIBLE SMOOSH "    \       ." AN D " " 38 AN "|" MKAY
    VISIBLE SMOOSH "    /\    ." AN  D " " 40 AN "|" MKAY
    VISIBLE SMOOSH "   / /  .'" AN D " " 41 AN "|" MKAY
    VISIBLE SMOOSH "jgs^^^^^^^`" AN D "^" 51 MKAY
    VISIBLE ""    
KTHXBYE BTW "KTHXSBYE" ends LOLCODE programs

хаха, хорошая компрессия, нравится: D
Джошуа

3

Питон - 205 203 197

i="""
G^y`G^MsGgGj!G
G|!o'G.!H/!G/!M
G|!n.!J\G/!N
G|!l.!M\!N
G|!VoG'!W.!O>HO!M
G|!Y.!G'!O.!T\!N
G>H8G1G>G|!^.!H.!Y\G'!L
G""".replace('!','G ')
o=''
j=140
while j:j-=2;o+=ord(i[j+1])%70*i[j]
print o

Строка iперемежает символы в ascii art с их мультипликатами, представленными как символы, все в обратном порядке. Кроме того, я экономлю немного места, используя '!' вместо 'G', iа затем просто заменить его.


3

Питон (145)

'eJzjUgAB9RgFTKAHRthBjZ2hhZ0dF5SHphuhSx2rCTVQff52dlj0wPXm49IHtw+n83Do048hQRdCnz4QKuipE6sNqC8rvTgOAhLiSAdcAG/9Ri8='.decode('base64').decode('zip')

Не очень оригинально, я знаю.


2

Javascript ( ES6 ) 193 175 байт

Редактировать: Модифицированный RegPack v3 для поддержки новых строк, использования for inцикла для сохранения 3 байтов и удаления eval для неявного вывода на консоль.

_="\nx'\\w{. z~|>18>>\n~\\~x.~ 'z{yx O>>~z 'owy~\\xzwxy~/\\{zw~yx / /  .'ww~ y jgs}`}}}}}}}^^\n~x  }^^^^^^^{   z .wy|\nx{{w~~";for(i of "wxyz{}~")with(_.split(i))_=join(pop())

Использование сжатия xem в Unicode: 133 символа

eval(unescape(escape('𧰽𘡜𫡸𙱜𧁷𮰮𘁺嵃🠱𞀾🡜𫡾𧁜屮𛡾𘀧𮡻𮑸𘁏🠾岍𘀧𫱷𮑾𧁜𮁺𭱸𮑾𛱜𧁻𮡷峀𮀠𛰠𛰠𘀮𙱷𭱾𘁹𘁪𩱳𯑠𯑽𯑽𯑽𯑞𧡜𫡾𮀠𘁽𧡞𧡞𧡞𧡻𘀠𘁺𘀮𭱹𯁜𫡸𮱻𭱾割𞱦𫱲𚁩𘁯𩠠𘡷𮁹𮡻𯑾𘠩𭱩𭁨𚁟𛡳𬁬𪑴𚁩𚐩𧰽𪡯𪑮𚁰𫱰𚀩𚐠').replace(/uD./g,'')))

отличный! <3 пост-обработки RegPack! psst, вы можете сделать это в 143b: xem.github.io/obfuscatweet
xem

@ xem 143 символа, но намного больше байтов
nderscore

да извините, 143 символа. вопрос говорит, что вы можете считать символы. во всяком случае, подход regpack более интересен, чем unicode-obfuscation;)
xem

2
FWIW, mothereff.in/byte-counter - это инструмент, который считает как символы, так и байты (согласно UTF-8).
Матиас Биненс

2

ES6, 155 символов

Просто пробую другой подход:

Запустите это в консоли Firefox JS.

Каждый символ Юникода имеет следующую форму: \ uD8 [ascii charcode] \ uDC [количество повторений].

"𒠁𘀆𙰁𧀁𘀓𛠁𘀂𛠁𘀘𯀁🠁𜐁𞀁🠂𒠁𘀈𧀁𘀎𛠁𘀉𙰁𘀁𛠁𘀓𯀁𒠁𘀇𣰁🠂𘀉𛠁𘀑𙰁𫰁𘀐𯀁𒠁𘀈𧀁𘀇𛠁𘀦𯀁𒠁𘀈𛰁𧀁𘀄𛠁𘀨𯀁𒠁𘀇𛰁𘀁𛰁𘀂𛠁𙰁𘀩𯀁𒠁𘀁𪠁𩰁𬰁𧠇𨀁𧠳𒠁".replace(/../g,a=>String.fromCharCode(a[c='charCodeAt']()&255).repeat(a[c](1)&255))

(Строка Unicode сделана с помощью: http://jsfiddle.net/LeaS9/ )


-3:.replace(/../g,a=>String.fromCharCode(a[c='charCodeAt']()&255).repeat(a[c](1)&255))
nderscore

о, отлично, спасибо!
xem

2

PHP

Способ 1, более простой (139 байт):

Использование предварительно спущенной строки.

<?=gzinflate(base64_decode('41IAA/UYBUygB0bYQY2doYWdHReMG4OhEwrUsRpRA9Pob2eHRRNccz5OjXAbcboQl0b9GBK0IWnUB0IFPXUFEjRmpRfHQUBCHOmACwA='));?>

Метод 2, кодирование серий пробелов в буквы алфавита (192 байта):

<?=preg_replace_callback('#[D-NP-Zu]#',function($e){return str_repeat('a'<$e[0]?'^':' ',ord($e[0])-66);},"
H'\U.D.Z|>18>>
J\P.K' .U|
IO>>K.S'oR|
J\I.WS|
J/\F.ZR|
I/ /D.'ZS|
 jgs^^^^^^^`u
")?>

2

PowerShell, 192 188 119

 -join('̠§Üঠ®Ġ®ఠü¾±¸ľРÜܠ®Ҡ§ ®ঠüΠÏľҠ®ࢠ§ïࠠüРÜΠ®ጠüР¯ÜȠ®ᐠüΠ¯ ¯Ġ®§ᒠü êçóϞà᧞'[0..70]|%{"$([char]($_%128))"*(+$_-shr7)})

Часть выше содержит несколько не символов. Шестнадцатеричный дамп:

00: 002D 006A 006F 0069 │ 006E 0028 0027 008A  -join('
10: 0320 00A7 00DC 09A0 │ 00AE 0120 00AE 0C20  ̠§Üঠ®Ġ®ఠ
20: 00FC 00BE 00B1 00B8 │ 013E 008A 0420 00DC  ü¾±¸ľРÜ
30: 0720 00AE 04A0 00A7 │ 00A0 00AE 09A0 00FC  ܠ®Ҡ§ ®ঠü
40: 008A 03A0 00CF 013E │ 04A0 00AE 08A0 00A7  ΠÏľҠ®ࢠ§
50: 00EF 0820 00FC 008A │ 0420 00DC 03A0 00AE  ïࠠüРÜΠ®
60: 1320 00FC 008A 0420 │ 00AF 00DC 0220 00AE  ጠüР¯ÜȠ®
70: 1420 00FC 008A 03A0 │ 00AF 00A0 00AF 0120  ᐠüΠ¯ ¯Ġ
80: 00AE 00A7 14A0 00FC │ 008A 00A0 00EA 00E7  ®§ᒠü êç
90: 00F3 03DE 00E0 19DE │ 0027 005B 0030 002E  óϞà᧞'[0.
A0: 002E 0037 0030 005D │ 007C 0025 007B 0022  .70]|%{"
B0: 0024 0028 005B 0063 │ 0068 0061 0072 005D  $([char]
C0: 0028 0024 005F 0025 │ 0031 0032 0038 0029  ($_%128)
D0: 0029 0022 002A 0028 │ 002B 0024 005F 002D  )"*(+$_-
E0: 0073 0068 0072 0037 │ 0029 007D 0029       shr7)})

Схема кодирования - RLE с длиной, закодированной выше 7 младших битов, которые являются символом для отображения.


1

Питон - 236

s=' ';print('\n'+6*s+"'\\"+19*s+'.  .'+24*s+"|>18>>\n"+8*s+'\\'+14*s+'.'+9*s+"' ."+19*s+"|\n       O>>"+9*s+'.'+17*s+"'o"+16*s+'|\n'+8*s+"\\       ."+38*s+'|\n'+8*s+"/\\    ."+40*s+"|\n       / /  ."+42*s+"|\n jgs^^^^^^^`"+51*'^'+'\n')

1

JS (190b) / ES6 (146b) / ES6 упакованы (118 знаков)

Запустите это в консоли JS:

JS:

"\n7'\\20.3.25|>18>>\n9\\15.10'2.20|\n8O>>10.9 9'o17|\n9\\8.39|\n9/\\5.41|\n8/2/3.'42|\n2jgs^^^^^^^`".replace(/\d+/g,function(a){return 18==a?a:Array(+a).join(' ')})+Array(51).join("^")+"\n"

ES6:

"\n6'\\19.2.24|>0>>\n8\\14.9'1.19|\n7O>>9.17'o16|\n8\\7.38|\n8/\\4.40|\n7/1/2.'41|\n1jgs58`101\n".replace(/\d+/g,a=>' ^'[a>51|0].repeat(a%51)||18)

ES6 упакован: ( http://xem.github.io/obfuscatweet/ )

eval(unescape(escape('𘡜𫠶𙱜𧀱𞐮𜠮𜠴𯀾𜀾🡜𫠸𧁜𜐴𛠹𙰱𛠱𞑼𧁮𝱏🠾𞐮𜐷𙱯𜐶𯁜𫠸𧁜𝰮𜰸𯁜𫠸𛱜𧀴𛠴𜁼𧁮𝰯𜐯𜠮𙰴𜑼𧁮𜑪𩱳𝐸𨀱𜀱𧁮𘠮𬡥𬁬𨑣𩐨𛱜𩀫𛱧𛁡🐾𙰠𧠧𦱡🠵𜑼𜁝𛡲𩑰𩑡𭀨𨐥𝐱𚑼𯀱𞀩').replace(/uD./g,'')))

Благодаря @nderscore!


1
ES6 до 158: (понижается до 124 символов со сжатием Unicode)"\n6'\\19.2.24|>18>>\n8\\14.9'1.19|\n7O>>9.17'o16|\n8\\7.38|\n8/\\4.40|\n7/1/2.'41|\n1jgs^^^^^^^`".replace(/\d+/g,a=>18-a?' '.repeat(a):a)+"^".repeat(50)+"\n"
nderscore

о, отлично, я не знаю, повторить
xem

@nderscore не извиняйся, это здорово :), но последняя строка в моей консоли Firefox кажется прерывистой
xem

146: "\n6'\\19.2.24|>0>>\n8\\14.9'1.19|\n7O>>9.17'o16|\n8\\7.38|\n8/\\4.40|\n7/1/2.'41|\n1jgs58`101\n".replace(/\d+/g,a=>' ^'[a>51|0].repeat(a%51)||18)(stackexchange добавляет невидимые символы разрыва строки после 41 | \ ‌)
nderscore

Спасибо, я обновил ответ, и он работает. :) Я также добавил еще 158b anwser, возможно, у вас будет идея улучшить его!
xem

1

ES6, 163b / 127 символов

Еще один подход, благодаря @nderscore.

Выполните это в консоли Firefox

JS (163b):

"\n'\\..|>18>>\n\\. '.|\nO>>    .'o|\n\\.&|\n/\\.(|\n//.')|\njgs<`h\n".replace(/[^'`Og\n>\\,-8j-|]/g,a=>" ^"[a=a.charCodeAt(),a>53|0].repeat(a%53))

Упаковано (127c):

eval(unescape(escape('𘡜𫠆𙱜𧀓𛠂𛠘𯀾𜐸🠾𧁮𒁜𧀎𛠉𙰁𛠓𯁜𫠇𣰾🠉𛠑𙱯𔁼𧁮𒁜𧀇𛠦𯁜𫠈𛱜𧀄𛠨𯁜𫠇𛰁𛰂𛠧𚑼𧁮𐑪𩱳🁠𪁜𫠢𛡲𩑰𫁡𨱥𚀯𦱞𙱠𣱧𧁮🡜𧀬𛐸𪠭𯁝𛱧𛁡🐾𘠠𧠢𦱡👡𛡣𪁡𬡃𫱤𩑁𭀨𚐬𨐾𝐳𯀰𧐮𬡥𬁥𨑴𚁡𙐵𜰩𚐠').replace(/uD./g,'')))

Я уверен, что @nderscore найдет улучшение :)
xem

Я думаю, что SE ломает некоторых персонажей в этом решении. Используя подход, аналогичный тому, который я сделал с другим вашим ответом, это сводится к 163: jsfiddle.net/2Fbxq/3
nderscore

Ну, это отличное улучшение (и очень хорошая скрипка). Я обновляю ответ.
xem

1

Питон, 70 символов UTF-16

挣摯湩㩧呕ⵆ㘱䕂
print砧RԘꁌ䘇䇘鶍薡ᶝ谗ꚋꄝᵍᆫ〵ﺍ癶㑘㗁ࣔᆷ஧楱返䄡鈛絆吠叐嘧䠟噣煺М쐤ຑꀀ䜮'.decode(稧楬b')

Конечно, вам, вероятно, придется использовать шестнадцатеричную версию:

23 63 6F 64 69 6E 67 3A 55 54 46 2D 31 36 42 45 0A 00 70 00 72 00 69 00 6E 00 74 00 27 78 9C E3 52 00 03 F5 18 05 4C A0 07 46 D8 41 8D 9D A1 85 9D 1D 17 8C 8B A6 1D A1 4D 1D AB 11 35 30 8D FE 76 76 58 34 C1 35 E7 E3 D4 08 B7 11 A7 0B 71 69 D4 8F 21 41 1B 92 46 7D 20 54 D0 53 27 56 1F 48 63 56 7A 71 1C 04 24 C4 91 0E 00 A0 2E 47 05 00 27 00 2E 00 64 00 65 00 63 00 6F 00 64 00 65 00 28 00 27 7A 6C 69 62 00 27 00 29 00

или версия base64:

I2NvZGluZzpVVEYtMTZCRQoAcAByAGkAbgB0ACd4nONSAAP1GAVMoAdG2EGNnaGFnR0XjIumHaFNHasRNTCN/nZ2WDTBNefj1Ai3EacLcWnUjyFBG5JGfSBU0FMnVh9IY1Z6cRwEJMSRDgCgLkcFACcALgBkAGUAYwBvAGQAZQAoACd6bGliACcAKQA=

Первая «строка» программы объявляет кодировку UTF-16. Весь файл - UTF16, но интерпретатор Python всегда интерпретирует строку кода в ASCII (так и есть #coding:UTF-16BE). После новой строки начинается текст UTF-16. Это просто означает, print'<data>'.decode('zlib')где текст является дефлированной версией целевого изображения ASCII. Некоторое внимание было уделено тому, чтобы в потоке не было суррогатов (что могло бы испортить декодирование).


1
Ну, первая строка заставила меня подумать: «О, здорово, кто-то сделал Unicode Python»
seequ

здорово! Можете ли вы сделать то же самое в ~ 35b с UTF-32? :)
xem

zipвместо того, чтобы zlibсохранить один символ.
Сис Тиммерман

@xem: большинство символов перестают быть действительными UTF-32 (символы должны быть <= 0x10ffff).
nneonneo

1
@CeesTimmerman: на самом деле выбор, zlibа не zipочень целенаправленный. zlibчетное количество символов.
nneonneo

1

C # - 354 332

используя Систему;
используя System.IO;
использование System.IO.Compression;
класс X
{
    static void Main (строка [] args)
    {
        var x = Convert.
        Console.WriteLine (новый StreamReader (новый DeflateStream (новый MemoryStream (x), CompressionMode.Decompress)). ReadToEnd ());
    }
}

Немного в гольф:

с использованием системы, с помощью System.IO, используя System.IO.Compression, класс X {статической силы Main () {вар х = Convert.FromBase64String ( "41IAA / UYBUygB0bYQY2doYWdHReMG4OhEwrUsRpRA9Pob2eHRRNccz5OjXAbcboQl0b9GBK0IWnUB0IFPXUFEjRmpRfHQUBCHOmAiwsA"); Console.WriteLine (новый StreamReader (новый DeflateStream (новый MemoryStream (х), (CompressionMode) 0)) ReadToEnd ());.}}

Это не очень удачно, если у вас все еще есть имена переменных длиннее, чем у персонажа. Или ненужные вещи, как string[] args.
Джои

Не знаю правил, но в C # нет другого пути, и код нужно компилировать, поэтому это максимально короткий вариант.
Эрез Робинсон

1
Mainне нужно иметь никаких аргументов, он все равно будет компилироваться (в отличие от Java). Удаление этого и встраивание xприводит к этому уже 333. Вы можете сохранить другой байт, удалив пробел между аргументами в DeflateStreamctor. Вы можете использовать приведение для члена enum:, (CompressionMode)0что приводит нас к 324. Так что я бы сказал, что это еще не самый короткий вариант ;-)
Joey

Правильно, вы ..
Эрез Робинсон

1

bzip2, 116

Увидев ответ CJAM, я решил, что этот тоже должен быть квалифицирован.

$ wc -c golf.txt.bz2 
116 golf.txt.bz2
$ bzip2 -dc golf.txt.bz2

  '\                   .  .                        |>18>>
    \              .         ' .                   |
   O>>         .                 'o                |
    \       .                                      |
    /\    .                                        |
   / /  .'                                         |
jgs^^^^^^^`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

$

Я сомневаюсь, что требуется дальнейшее объяснение. :)


1
Использование Bubblegum с DEFLATE уменьшает его до 77 байт. Попробуйте онлайн!
Майлз


0

Vim, 99 нажатий клавиш

63i^<Esc>0R jgs<C-O>7l`<Esc>O<Esc>55I <Esc>A|<Esc>Y5PA>18>><Esc>7|R'\<Down>\<Down><Left><Left>O>><Down><Left><Left>\<Down>\<Down><Left><Left><Left>/<Up>/<Down>/<Right><Right>.'<Up>.<Right><Up>.<Right><Right><Up>.<Right><Right><Right><Up>.<Right><Right><Right><Up>.<Right><Right>.<Right><Right><Down>'<Right>.<Down><Right>'o

вероятно гольф

Объяснение:

63i^<Esc>0R jgs<C-O>7l`<Esc>
Bottom line, 63 '^'s, replace the beginning with ' jgs', then move 7 caracters to the right and replace one character with '`'

O<Esc>55I <Esc>A|<Esc>
Above current line, add one line and insert 55 spaces, then a trailing '|'

Y5PA>18>><Esc>
Copy that line and paste it above five times. Cursor ends up in topmost line. Append '>18>>'

7|R'\<Down>\<Down><Left><Left>O>><Down><Left><Left>\<Down>\<Down><Left><Left><Left>/<Up>/<Down>/<Right><Right>.'<Up>.<Right><Up>.<Right><Right><Up>.<Right><Right><Right><Up>.<Right><Right><Right><Up>.<Right><Right>.<Right><Right><Down>'<Right>.<Down><Right>'o
Go to 7th column, enter Replace-mode, and replace spaces with golfer and golf ball trail. Arrow keys are used to move around, since it uses fewer keypresses to use the arrow keys instead of <C-o>+movement for up to three keypresses.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.