Narysuj filiżankę kawy Ascii:
o o o __________ / \ __ | J | \ | A | | | V | | | A | __ / \ __________ /
Punkty Brownie za skrypt kawowy lub java :)
Najkrótszy kod w bajtach, funkcji lub programie, znak nowej linii lub spacja są dopuszczalne, wypij!
Odpowiedzi:
SOGL , 48 bajtów
Wyjaśnienie:
SOGL ma wbudowaną kompresję łańcuchów, a jedną z jej cech jest kompresja słownika char. Co więcej, ma typ kompresji struny, w której jedynymi dostępnymi znakami są „/ \ | _- \ n”. Cały program jest więc łańcuchem zamkniętym w „” („niejawne”).
Ciąg, który podałem kompresorowi, jest (zmieniony)
źródło
JavaScript (ES6),
110104 bajtówZaoszczędzono 4 bajty dzięki edc65
Jak to działa
Kompresję oryginalnej sztuki ASCII osiąga się przez zastąpienie wszystkich sekwencji od 2 do 10 kolejnych spacji i dwóch sekwencji 10 kolejnych znaków podkreślenia pojedynczą cyfrą:
N
kolejnych spacji jest kodowana cyfrąN-1
.9
.Używamy
N-1
zamiastN
tego, abyśmy nigdy nie musieli używać więcej niż jednej cyfry. Stąd potrzeba++n
dekodowania.Wyrażenie
n>>3
(bitowe przesunięcie w prawo) wynosi 0 don = 1
don = 7
i wynosi 1 don = 8
(nie używane) in = 9
. Dlatego' _'[n>>3]
daje9
znak podkreślenia i miejsce dla wszystkich innych napotkanych wartości.Jedynym szczególnym przypadkiem jest sekwencja 10 kolejnych spacji tuż nad „JAVA”. Kodowanie go za pomocą
9
spowoduje konflikt z sekwencjami podkreślenia. Musimy więc podzielić go na dwie sekwencje po 5 spacji, zakodowane jako44
.źródło
f=
). Możesz zapisać 4 bajty w ten sposób:n>>3
zamiast+!(n&7)
,9
zamiast_8
(dwa razy) i44
zamiast9
f=
... Dzięki za zapisane bajty!' '
). Ale nie jestem pewien, jak to dokładnie robi. Co robi przesunięcie bitów? Dlaczego zwiększamy n?Galaretka ,
6764 bajtów-2 bajty dzięki Dennisowi (1. usuń nadmiarowe
”
i 2. zastąp transpodowanie i dekodowanie długości przebieguZŒṙ
, z redukcją przez powtarzanie elementów,.x/
)Wypróbuj online!
W jaki sposób?
“...“...’
to lista dwóch skompresowanych liczb base-250:D
konwertuje na dziesiętny, aby uzyskać dwie listy cyfr:x/
zmniejsza się przez powtarzanie elementu w celu uzyskania jednej listy cyfr (powtarzanie liczby z pierwszej listy przez odpowiadającą jej wartość drugiej):ị
instruuje, aby zindeksować do listy prawej, opartej i modułowej (0 indeksuje do pozycji skrajnie prawej). Lista po prawej stronie¶_/\|JAVo
jest po prostu znakiem używanym w wymaganej kolejności, w której pilcrow¶
, jest tym samym kodem co linia. Partner końcowy“
nie jest wymagany, ponieważ jest to koniec programu:Galaretka wykonuje niejawny wydruk tej listy, który, ponieważ zawiera znaki, drukuje jak ciąg:
źródło
”
jest niejawny i można zastąpićZŒṙ
zx/
. Ponadto, chociaż nie ma żadnych bajtów, użycie¶
zamiast literału nowej linii sprawia, że kod jest bardziej edytowalny imo.CoffeeScript ES6,
214180 bajtówCoffeeScript, 135 bajtów z kodowaniem na stałe
źródło
Python 2,
174172171167 bajtówBez twardego kodu.
Brak kodowania Base-64.
Bez regex.
Zaoszczędzono 2 bajty, uzewnętrzniając
'_'*10
i wykorzystując konwersjęTrue -> 1
iFalse -> 0
.Zapisano 1 bajt, usuwając niepotrzebne białe znaki.
Zaoszczędź 4 bajty dzięki @TuukkaX!
źródło
] for
iin [
.[2,7,4]
i[3,4,5,6]
do2,4,7
i3,4,5,6
.PowerShell ,
136124123105 bajtówWypróbuj online!
Dzięki @briantist za znalezienie krótszej
-replace
metody, o której wiedziałem, że gdzieś tam jest.Pobiera ciąg z liczbami zamiast wymaganej liczby spacji. Następnie regexujemy
-replace
cyfry za pomocą wyrażenia skryptu$(" "*$1)
. Na przykład pierwsza linia łańcucha będzie$(" "*2)o
, druga będzie$(" "*7)o
itd. Z powodu potrójnego cytowania pozostawia się go jako ciąg w potoku. Zrzucamy to doiex
(skrót odInvoke-Expression
i podobny doeval
), który przetwarza wyrażenia skryptu i pozostawia powstały ciąg wielu wierszy w potoku. Wynik jest niejawny.źródło
($_,' '*$_)[+$_-in48..57]
- bez względu na to, co zmienię, wydaje mi się, że zawodzi.space
przezo
i barfs.GNU sed ,
113112 bajtówPodstawowe kodowanie, przechowuje 3 spacje jako
S
,\n
as@
i 5 podkreśla jakoU
. Będę próbował kombinacji, aby znaleźć coś krótszego.Wypróbuj online!
Trywialne rozwiązanie bezpośredniego drukowania łańcucha podano poniżej. Ma 136 bajtów, co daje kompresję 18%, przy użyciu powyższego schematu kodowania.
Wypróbuj online!
źródło
ss
jakoS
oszczędza 1 bajt.S
przechowywaniem 3 spacji, nies
. Myślę, że zamiast tego edytuję ten, ponieważ zachowuje tę samą liczbę transformacji.MATL,
8786838278 bajtówThis solution breaks the coffee into two pieces: the "bubbles" and the mug. To create the bubbles, we create a sparse matrix with 111 located at three locations and convert it to a character array
For the mug component, we rely upon string compression
Both components are printed to the output and a newline is automatically placed between the components
Try it at MATL Online
źródło
Python 2,
128127 bytes-1 byte thanks to Rod (use multiplication of tuple
('_'*10,)
to avoid a declaration).Try it online!
Note: that double backslash is needed before the line feed.
Everything between the
'''
and'''
is a single string, the two%s
are formatters which get replaced by the content of the trailing%(...)
tuple, which in turn contains two copies of'_'*10
via the tuple multiplication(...)*2
. The'_'*10
performs string multiplication to yield'__________'
.The code traverses the characters,
c
, of that whole string usingfor c in '''...
and creates a new string by joining (join(...)
)either the number of spaces identified by
c
,int(c)
, ifc
is a digitor
c
itself- being a digit is identified by
'0'<c<':'
to save overc.isdigit()
.źródło
u,u
with('_'*10,)*2
and drop theu
declarationJava 8,
294289248 bytesGolfed:
In the spirit of kolmogorov-complexity, this does not hard-code the string to output. Instead, it makes use of the fact that there are many cases of multiple spaces followed by a printable character. It encodes the number of spaces that precede a character in the high-order byte of the character, with the actual ASCII character in the low-order byte.
Ungolfed:
źródło
\u0641
.F
. It should be possible to fit both in there.0x
prefix helped.if
is redundant, for example) and shave off around 1/6th of the size.Befunge,
158105101 bytesTry it online!
The characters in the string are first encoded as indices into a lookup table of the ten possible values. The indices are then grouped into pairs, each pair being combined into a single number (i1 + i2*10) in the range 0 to 99. By carefully choosing the order of the lookup table, we can guarantee that those values will always be valid ASCII characters which can be represented in a string literal.
This is a breakdown of the code itself:
We start by initialising the last element of the lookup table with a newline character (ASCII 10).
We then use a string literal to push the encoded content onto the stack.
Finally we loop over the values of the stack, decoding and outputting two characters at a time.
The last line hold the lookup table: the 9th element is an implied space, and the 10th (newline) is set manually, as explained earlier.
źródło
Retina, 71 bytes
Differently from my other answer, this one was written by hand.
(there's a trailing space at the end)
Try it online!
The principle is still having a "compressed" string from which the cup of coffee can be reconstructed by substitutions. Trying different substitutions it turned out that the only ones worth doing are:
=
turns into__________
(10 underscores)źródło
Common Lisp,
125123122120114 bytesI saved 6 bytes, using idea of just putting enters in string instead of
~&
s.Ideas for improvement welcomed.
źródło
Python3, 206 bytes
źródło
s=' '
variable and use it.'o\n'
has the same length as'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')
orfor x in(' o',7*' '+'o',4*' '+'o',' '+10*'_','/'+10*' '+'\__','|'+3*' '+'J'+6*' '+'| \\','|'+4*' '+'A'+5*' '+'| |','|'+5*' '+'V'+4*' '+'| |','|'+6*' '+'A'+3*' '+'|__/','\\'+10*'_'+'/'):print(x)
, both are 197. Still longer than a 136 hard code.Pyth, 80 bytes
Online interpreter available here.
Simple run-length decoding.
źródło
C - 179
Solution with extensive use of format string:
Here is a more readable version:
źródło
void g(){puts(" o\n o\n o\n __________\n/ \\__\n| J | \\\n| A | |\n| V | |\n| A |__/\n\__________/\n");}
Retina, 99 bytes
This solution was generated automatically using this script.
(there are trailing spaces on many lines)
This works by using numbers 1,2,3,4 in place of some character sequences that are repeated in the target string and then substituting them back.
I know it could be golfed more by tweaking this code or completely changing approach, but since the kolmogorov meta-golf challenge had quite a disappointing outcome I wanted to try using my script on a real challenge.
Try it online!
źródło
3
and then move the substitution up to before the 3. Also you can change2\n
to2\n3
and move this substitution to before the 3. Try it online!1\n__________
to1\n_____
and then change each1
in the main substitution to11
Try it online!Python 3.6
(non-competing)Here's my attempt at Huffman encoding. It's definitely golfable further if anyone wants to take up the idea.
The literal could be compressed further still by converting to base64 or other, and the Huffman tree could be optimized to yield a shorter bitarray still.
źródło
GameMaker Language, 138 bytes
źródło
C, 141 Bytes
Usage
Easy Solution, 148 Bytes:
źródło
PHP, 116 bytes
This looks a lot like Arnauld´s answer - and does pretty much the same. Run with
-r
.źródło
zsh, 86 bytes
Explanation: that string is the gzip-compressed java cup ascii art. I use
printf
, because withecho
,zcat
prints a warning, andecho -e
is one character longer. It doesn't work withbash
orsh
, because they think it's a binary file. Since you can't effectively paste that output from the browser, here's a usable file.źródło
Java 9 / JShell, 299 bytes
Ungolfed:
Usage in JShell:
Encodes each character as ten bits consisting of a count of the number of spaces before the character in the high three bits following by the code point in the low seven bits.
(Since there are only three bits for the count it can't represent more than seven consecutive spaces, and there are ten spaces at one point in the string. These are encoded as a count of six, followed by a space, and then a count of three followed by the next character.)
Sadly, it loses to this trivial 140-byte Java solution:
źródło
05AB1E, 85 bytes
Try it online!
źródło