Ти сьогодні причаївся?


9

У дистрибутиві Debian Linux (та дистрибутивах на основі Debian, таких як Ubuntu, Kali та інші) використовується менеджер пакунків під назвою APT. Для встановлення програми fooви введете термінал

sudo apt-get install foo

Одне маленьке пасхальне яйце APT - це наступне

apt-get moo

Який після введення дасть наступний висновок

                 (__) 
                 (oo) 
           /------\/ 
          / |    ||   
         *  /\---/\ 
            ~~   ~~   
..."Have you mooed today?"...

Ви повинні написати програму, яка виробляє цей точний вихід у якомога менше байтах. (включаючи пробіли та новий рядок)

Ось такий же вихід із \nдоданим для представлення символів нового рядка та a *для представлення пробілів

                 (__)*\n
                 (oo)*\n
           /------\/*\n
          / |    ||***\n
         *  /\---/\*\n
            ~~   ~~***\n
..."Have you mooed today?"...\n

Як вимагається в коментарях, ось md5sum mooing.

35aa920972944a9cc26899ba50024115  -

1
Я думаю, що це APT, а не здатність; Здатність не має Super Cow Powers
aditsu киньте, тому що SE - EVIL

@aditsu о, я думаю, я неправильно зрозумів, що таке здатність. Я думав, що здатність - це ім'я apt-get.
Джеймс

Для довідки, чи можете ви розмістити вихід apt-get moo|md5sum?
aditsu кинути, тому що SE - EVIL

25
Баш, 11 байт:: apt-get mooP
Денніс

5
@Dennis Не працює в Arch Linux ... не може відтворити результат: P
Otomo

Відповіді:


6

Баш, 95 байт

0000000: 7a 63 61 74 3c 3c 27 27 0a 1f 8b 08 01 01 01 01 01  zcat<<''.........
0000011: 02 03 53 40 07 1a f1 f1 9a 0a 5c 98 c2 f9 f9 a8 c2  ..S@......\......
0000022: fa ba 60 10 a3 8f 2c aa af 50 03 a2 6a 40 24 42 58  ..`...,..P..j@$BX
0000033: 0b 28 11 03 54 ab 1f 83 6a 70 5d 1d 8c e0 d2 d3 d3  .(..T...jp]......
0000044: 53 f2 48 2c 4b 55 a8 cc 2f 55 c8 cd cf 4f 4d 51 28  S.H,KU../U...OMQ(
0000055: c9 4f 49 ac b4 57 02 ca 70 01                       .OI..W..p.

Сказане вище - оборотний гексдумп. Щоб створити файл, виконайте

xxd -r -c 17 > 55918.sh

вставте шестигранну кнопку і натисніть Enter, потім Ctrl+ D.

Щоб запустити створений файл, виконайте його

bash 55918.sh 2>&-

Будь-яке інше ім’я файлу буде робити.

Я вибрав zopfli як компресор, оскільки він сумісний з програмою Coreutils zcat і досягає кращого стиснення, ніж gzip, bzip2 та xz.

zcat<<''прочитає наступні рядки (до EOF) і подасть їх як вхідні дані zcat.

Зверніть увагу, що zcat надрукує попередження (оскільки я зняв контрольну суму стислого файлу), як і башти (оскільки HEREDOC не закінчується порожнім рядком). Ці застереження друкуються на STDERR (придушене 2>&-), що дозволено за замовчуванням на основі консенсусу щодо Meta .


10

CJam, 96

Тут використовується багато неприємних байтів, тож ось шістнадцятковий дамп:

00000000  22 ee 51 1e 53 41 15 ee  51 20 53 41 15 9a 5f 5a  |".Q.SA..Q SA.._Z|
00000010  b9 5f 41 15 8c 5f 41 f9  38 24 2a 15 7e 55 1c 5f  |._A.._A.8$*.~U._|
00000020  b9 30 5f b9 41 15 a8 26  2a 26 2a 15 36 45 91 c3  |.0_.A..&*&*.6E..|
00000030  ed cb 41 f3 df eb 41 db  20 cb c9 41 e9 df c9 c3  |..A...A. ..A....|
00000040  f3 7f 45 36 15 22 7b 69  32 6d 64 5c 5f 63 5c 37  |..E6."{i2md\_c\7|
00000050  6d 64 22 20 5f 6f 2d 7c  7e 2e 22 3d 2a 3f 7d 2f  |md" _o-|~."=*?}/|

Ви можете запустити файл за допомогою інтерпретатора java; може знадобитися використання кодування ISO-8859-1, наприклад:
java -Dfile.encoding=ISO-8859-1 …

Спробуйте в Інтернеті

Еквівалентна (і значно довша) версія ASCII:

[238 81 30 83 65 21 238 81 32 83 65 21 154 95 90 185 95 65 21 140 95 65 249 56 36 42 21 126 85 28 95 185 48 95 185 65 21 168 38 42 38 42 21 54 69 145 195 237 203 65 243 223 235 65 219 32 203 201 65 233 223 201 195 243 127 69 54 21]:c
{i2md\_c\7md" _o-|~."=*?}/

Спробуйте в Інтернеті

Пояснення:

Є 7 символів , які мають повтори: _o-|~.. Кожен з них може бути закодований як число n від 0 до 6. Для кожної повторюваної послідовності я кодую як індекс символу (n), так і кількість повторень (k) в одному байті:, 2 * (k * 7 + n)записаний як символ із цим код. І я кодую будь-які окремі символи як 2 * c + 1, де c - ASCII код. Все йде в початковому рядку, а решта програми розшифровує його:

{…}/      for each character in the string
  i       convert to integer (extended-ASCII code)
  2md     integer division by 2, obtaining the quotient (q) and remainder (r)
           r decides whether it's a repetition or single character
  \_      swap q and r, and duplicate q
  c\      convert q to character and move it before the other q
           this is for the r=1 case (single character)
  7md     divide q by 7, obtaining the quotient (k) and remainder (n)
  "…"=    get the corresponding character from that string (decoding n)
  *       repeat the character k times
  ?       use the single character or the repetition, depending on r

Стара версія (109):

" H(_2) 
 H(o2) 
 B/-6\/ 
 A/ | 4|2 3
 9* 2/\-3/\ 
 C~2 3~2 3
.6"{_'M,48>&{~*}&}/3/"Have you mooed today?"`*N

Спробуйте в Інтернеті


6

Піта, 100

r"17 (__) 
17 (oo) 
11 /6-\/ 
10 / |4 ||3 
9 *  /\\3-/\ 
12 ~~3 ~~3 
3.\"Have you mooed today?\"3."9

Спробуйте в Інтернеті: Демонстрація

r"string"9 run-length - декодує рядок.

редагувати:

Ось 97-річне рішення: Демонстрація . Ймовірно, це також 97 байт (у iso-8859-1). Але занадто втомився, щоб записувати байти і робити пояснення. Завтра ввечері, я думаю.


4

GolfScript (107 байт)

Це дуже просте кодування: нові рядки замінюються ^, а пробіли кодуються довжиною. Результат містить кілька символів, які не можна роздрукувати, тому я представляю його тут як xxdвихід:

0000000: 2711 285f 5f29 015e 1128 6f6f 2901 5e0b  '.(__).^.(oo).^.
0000010: 2f2d 2d2d 2d2d 2d5c 2f01 5e0a 2f01 7c04  /------\/.^./.|.
0000020: 7c7c 035e 092a 022f 5c2d 2d2d 2f5c 015e  ||.^.*./\---/\.^
0000030: 0c7e 7e03 7e7e 035e 2e2e 2e22 4861 7665  .~~.~~.^..."Have
0000040: 0179 6f75 016d 6f6f 6564 0174 6f64 6179  .you.mooed.today
0000050: 3f22 2e2e 2e27 7b2e 3332 3c7b 2220 222a  ?"...'{.32<{" "*
0000060: 7d2a 7d25 225e 222f 6e2a 0a              }*}%"^"/n*.

Демонстрація в Інтернеті

Зауважте, що це на один символ коротше відповідного коду CJam. Компроміс використовується 'як роздільник для основного рядка (збереження двох \s для виходу з "), збереження a iдля перетворення знакових символів у цілі числа в циклі декодування та отримання вільного останнього нового рядка; vs наявність символьних літералів для заміни односимвольних рядкових літералів.


Оскільки це питання було коротко помічено , Я також зробив версію з лише (108) символами для друку:

'Y(__)I
Y(oo)I
S/------\/I
R/I|L||K
Q*J/\---/\I
T~~K~~K
..."HaveIyouImooedItoday?"...'{.82-.*82<{72-' '*}*}%

Замість того , щоб кодують вступна довжину просторів , як символи ^Aдо ^R(і кодування , ^Jяк ^зіткнення під уникнути), він залишає незайманий і новий рядок кодує вступну довжину , як Iдо Y.

Між іншим, моя програма загального призначення GolfScript Kolmogorov виробляє 120-байтну програму.


1

Луа, 186 178 байт

8 байтів збережено завдяки пропозиції @DJ McMayhem

p=print s=" "a=s:rep(17)b=s:rep(9)p(a.."(__) ")p(a.."(oo) ")p(b.."  /------\\/ ")p(b.." / |    ||   ")p(b.."*  /\\---/\\ ")p(b.."   ~~   ~~   ")p"...\"Have you mooed today?\"..."

Безголівки:

p=print --Save the print function for later use
s=" " --Space character
a=s:rep(17) --string.rep(string, times) repeats the given string
b=s:rep(9)
p(a.."(__) ") --print out the lines
p(a.."(oo) ")
p(b.."  /------\\/ ")
p(b.." / |    ||   ")
p(b.."*  /\\---/\\ ")
p(b.."   ~~   ~~   ")
p"...\"Have you mooed today?\"..."

Ви можете зберегти 5 байт, замінивши рядок 2 наa=repeat(" ",17)
Джеймс

Ах, дякую :) Я намагався зрозуміти, чи
можу

1

> <> , 217 байт

!v"                 (__) "a"                 (oo) "a"           /------\/ "a"          / |    ||   "a"         *  /\---/\ "a"            ~~   ~~   "a"..."c3*2-"Have you mooed today?"c3*2-"..."a!
 >r>l0)?v;
    ^   o<

На жаль, це досить нудна відповідь. Він починається з зчитування рядка, який витягує всю корову, з нових рядків, зроблених додаванням значення 10 в стек (a). Потім він переходить у петлю, яка просто витягує корову.

Я спочатку робив цикл для додавання в набір пробілів, але насправді це був більш дорогий байт, ніж просто введення пробілів.

EDIT: Забули, що риба написана як "> <>"


1

PowerShell, 144 байти

$a="        "
"$a$a (__) "
"$a$a (oo) "
"$a   /------\/ "
"$a  / |    ||   "
"$a *  /\---/\ "
"$a    ~~   ~~   "
'..."Have you mooed today?"...'

Вищевказаний код буде працювати належним чином у середовищах, які друкують нові рядки у стилі Unix ( \n). Він дає правильний вихід з, наприклад, Pash в Linux.

Математично для PowerShell $aоптимальним є наявність 8 пробілів для змінної, оскільки менше означає занадто багато додаткових пробілів між змінною та коровою, щоб зробити це $bвартістю, а більше означає, що ми не можемо подвоїтись у перших двох рядках для голова.


4
Я можу стверджувати, що "символ нового рядка" залежить від локальної / платформи, що робить ваш вихід таким же, як і будь-який інший.
sleblanc

1. Немає такого поняття, як "символ нового рядка". \r- це повернення вагона, \nлінійний податок. Разом \r\nформує новий рядок для Windows. 2. PowerShell - це не тільки Windows. Я перевірив ваш код за допомогою Pash (реалізація Windows PowerShell для Mono з відкритим кодом), і вихід має відповідний хеш MD5. 3. Через те, що я сказала, я взяв на себе сміття від вашої посади. Якщо ви не згодні з цим, будь ласка, повторно викіньте його.
Денніс

Дуже цікаво, @Dennis ... Я знаю про відмінності між \r\nі \n, але, як я вже сказав, я не зміг отримати правильний MD5 для Windows без чогось неприємного. Дякую за цю редакцію. Спершу я теж чув про Паш, тож спасибі і за це. Цікаво, наскільки складно це було б будувати під Cygwin ... ;-)
AdmBorkBork

0

Молекула , 145 байт

"   "_____:a"  (__) 
";a____"  (oo) 
";a__"  /------\\/ 
";a__" / |    ||   
";a__"*  /\\---/\\ 
";a____"~~"b"~~
...\"Have you mooed today?\"..."

Я вперше намагаюся стиснути мистецтво ASCII: P

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.