Czy maszerowałeś dzisiaj?

9

Dystrybucja Debian Linux (i dystrybucje oparte na Debianie, takie jak Ubuntu, Kali i inne) używają menedżera pakietów o nazwie APT. Aby zainstalować program foo, wpisz w terminalu

sudo apt-get install foo

Jedno małe jajko wielkanocne z APT jest następujące

apt-get moo

Które po wpisaniu wygeneruje następujący wynik

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

Musisz napisać program, który generuje dane wyjściowe EXACT w jak najmniejszej liczbie bajtów. (w tym spacje końcowe i nowa linia)

Oto te same dane wyjściowe z \ndodanym do reprezentowania znaków nowego wiersza i *do reprezentujących końcowe spacje

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

Zgodnie z żądaniem w komentarzach, tutaj jest suma md5 muczenia.

35aa920972944a9cc26899ba50024115  -
James
źródło
1
Myślę, że to APT, a nie umiejętności; aptitude nie ma Super Cow Powers
aditsu zrezygnowało, ponieważ SE to EVIL
@aditsu och, chyba źle zrozumiałem, co to jest. Myślałem, że aptitude to nazwa apt-get.
James
W celach informacyjnych możesz opublikować wynik apt-get moo|md5sum?
Aditsu zakończyło się, ponieważ SE to EVIL
25
Bash, 11 bajtów:: apt-get mooP
Dennis
5
@Dennis nie działa na Arch Linux ... nie może odtworzyć wyniku: P
Otomo

Odpowiedzi:

6

Bash, 95 bajtów

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.

Powyższe jest odwracalnym zrzutem heksadecymalnym. Aby utworzyć plik, uruchom

xxd -r -c 17 > 55918.sh

wklej zrzut heksowy i naciśnij Enter, a następnie Ctrl+ D.

Aby uruchomić utworzony plik, uruchom

bash 55918.sh 2>&-

Wykona się każda inna nazwa pliku.

Wybrałem zopfli jako kompresor, ponieważ jest on kompatybilny z programem zut Coreutils i osiąga lepszą kompresję niż gzip, bzip2 i xz.

zcat<<''odczytuje następujące wiersze (do EOF) i podaje je jako dane wejściowe zcat.

Zauważ, że zcat wydrukuje ostrzeżenie (ponieważ usunąłem sumę kontrolną skompresowanego pliku), podobnie jak bash (ponieważ HEREDOC nie jest zakończony pustą linią). Te ostrzeżenia są drukowane do STDERR (pomijane przez 2>&-), co jest domyślnie dozwolone na zasadzie konsensusu w Meta .

Dennis
źródło
10

CJam, 96

Wykorzystuje to wiele nieprzyjemnych bajtów, więc oto zrzut heksowy:

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-|~."=*?}/|

Możesz uruchomić plik za pomocą interpretera Java; może być konieczne zastosowanie kodowania ISO-8859-1, na przykład:
java -Dfile.encoding=ISO-8859-1 …

Wypróbuj online

Równoważna (i znacznie dłuższa) wersja 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-|~."=*?}/

Wypróbuj online

Wyjaśnienie:

Istnieje 7 znaków, które mają powtórzeń: _o-|~.. Każdy z nich może być zakodowany jako liczba n od 0 do 6. Dla każdej powtarzającej się sekwencji koduję zarówno indeks znaku (n), jak i liczbę powtórzeń (k) w jednym bajcie: 2 * (k * 7 + n)zapisany jako znak z tym kod. I koduję dowolne pojedyncze znaki 2 * c + 1, gdzie, gdzie c jest kodem ASCII. Wszystko idzie w początkowym ciągu, a reszta programu go dekoduje:

{…}/      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

Stara wersja (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

Wypróbuj online

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
6

Pyth, 100

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

Wypróbuj online: demonstracja

r"string"9 run-length-dekoduje ciąg.

edytować:

Oto rozwiązanie 97 znaków: Demonstracja . Bardzo prawdopodobne, że jest to również 97 bajtów (w iso-8859-1). Ale zbyt zmęczony, by zapisywać bajty i robić wyjaśnienia. Chyba jutro wieczorem.

Jakube
źródło
4

GolfScript (107 bajtów)

Jest to bardzo proste kodowanie: znaki nowej linii są zastępowane ^, a spacje są kodowane długością. Wynik zawiera niektóre niedrukowalne znaki, więc przedstawiam go tutaj jako xxdwynik:

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*.

Demo online

Zauważ, że jest to jeden znak krótszy niż odpowiedni kod CJam. Kompromis jest używany 'jako separator dla głównego ciągu (oszczędzając dwa \s, aby uciec "), zapisując i ikonwertując wartości znaków na liczby całkowite w pętli dekodującej i uzyskując wolny znak nowej linii; vs literały znakowe zastępujące literały łańcuchowe jednoznakowe.


Ponieważ to pytanie zostało na krótko oznaczone , Stworzyłem również wersję z tylko (108) znakami do wydrukowania:

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

Zamiast kodowania okresie długości przestrzeni jako znaki ^Ado ^R(i kodowania ^Jjak ^do kolizji uniknąć), pozostawia nietknięte i nowe linie koduje okresie długości jak Ido Y.

Nawiasem mówiąc, mój program GolfScript Kolmogorov ogólnego przeznaczenia tworzy program 120-bajtowy.

Peter Taylor
źródło
1

Lua, 186 178 bajtów

8 bajtów zapisanych dzięki sugestii @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?\"..."

Nie golfowany:

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?\"..."
Nikolai97
źródło
Możesz zapisać 5 bajtów, zastępując wiersz 2a=repeat(" ",17)
James
Ach, dziękuję :) Próbowałem dowiedzieć się, czy mógłbym zrobić coś takiego ...
Nikolai97
1

> <> , 217 bajtów

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

Niestety jest to dość nudna odpowiedź. Zaczyna się od odczytania łańcucha, który wyciąga całą krowę, z nowymi liniami tworzonymi przez dodanie wartości 10 do stosu (a). Następnie przechodzi w pętlę, która po prostu wyciąga krowę.

Pierwotnie utworzyłem pętlę, aby dodać zestaw spacji, ale w rzeczywistości było to droższe bajtowo niż tylko wstawianie spacji.

EDYCJA: Zapomniałem, że ryba jest zapisana jako „> <>”

Blake Doeren
źródło
1

PowerShell, 144 bajty

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

Powyższy kod będzie działał poprawnie w środowiskach, które drukują znaki nowej linii w stylu Uniksa ( \n). Wytwarza prawidłowe dane wyjściowe za pomocą np. Pash w systemie Linux.

Matematycznie, dla PowerShell, $aoptymalne jest posiadanie 8 spacji dla zmiennej, ponieważ mniej oznacza zbyt wiele dodatkowych spacji między zmienną a krową, aby były $bopłacalne, a więcej oznacza, że ​​nie możemy podwoić się w pierwszych dwóch liniach dla głowa.

AdmBorkBork
źródło
4
Argumentowałbym, że „znak nowej linii” jest zależny od ustawień regionalnych / platformy, co sprawia, że ​​twój wynik jest tak samo ważny jak każdy inny.
sleblanc
1. Nie ma czegoś takiego jak „znak nowej linii”. \rjest znakiem powrotu karetki, \njest podawaniem linii. Razem \r\ntworzy nowy wiersz w systemie Windows. 2. PowerShell to nie tylko system Windows. Przetestowałem twój kod za pomocą Pash (implementacja Windows PowerShell dla Mono o otwartym kodzie źródłowym) i dane wyjściowe mają odpowiedni skrót MD5. 3. Z uwagi na powyższe pozwoliłem sobie na cofnięcie postu. Jeśli nie zgadzasz się z tym, prześlij go ponownie na wiki.
Dennis
Bardzo interesujące, @Dennis ... Zdaję sobie sprawę z różnic między \r\ni \n, ale, jak powiedziałem, nie mogłem uzyskać prawidłowego MD5 w systemie Windows bez czegoś rażącego. Ale dziękuję za tę edycję. Najpierw też słyszałem o Pash, więc też dziękuję za to. Zastanawiam się, jak skomplikowane byłoby zbudowanie pod Cygwinem; ;-)
AdmBorkBork
0

Cząsteczka , 145 bajtów

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

Mój pierwszy raz próbował skompresować grafikę ASCII: P


źródło