Dibuja esta taza de café Ascii:
o o o __________ / \ __ El | J | \ El | A | El | El | V | El | El | A | __ / \ __________ /
Puntos Brownie para coffee-script o java :)
El código más corto en bytes, función o programa, nueva línea o espacio en blanco es aceptable, ¡bebe!
Respuestas:
SOGL , 48 bytes
Explicación:
SOGL tiene compresión de cadena incorporada y una de las cosas que tiene es una compresión de diccionario de caracteres. Aún mejor, tiene un tipo de compresión boxstring donde los únicos caracteres disponibles son "/ \ | _- \ n". Entonces, todo el programa es una cadena encerrada en "'(el" está implícito).
La cadena que le di al compresor son (escapó):
fuente
Javascript (ES6),
110104 bytesGuardado 4 bytes gracias a edc65
Cómo funciona
La compresión del arte ASCII original se logra al reemplazar todas las secuencias de 2 a 10 espacios consecutivos y las dos secuencias de 10 guiones bajos consecutivos con un solo dígito:
N
espacios consecutivos se codifica con el dígitoN-1
.9
.Usamos
N-1
más queN
para que nunca tengamos que usar más de un dígito. De ahí la necesidad de++n
al decodificar.La expresión
n>>3
(desplazamiento bit a la derecha) es igual a 0 paran = 1
ton = 7
e igual a 1 paran = 8
(no utilizado) yn = 9
. Por lo tanto,' _'[n>>3]
proporciona un guión bajo9
y un espacio para todos los demás valores encontrados.El único caso especial es la secuencia de 10 espacios consecutivos justo encima de "JAVA". Codificarlo con un
9
entraría en conflicto con las secuencias de subrayado. Por lo tanto, debemos dividirlo en dos secuencias de 5 espacios, codificadas como44
.fuente
f=
). Puede guardar 4 bytes de esta manera: enn>>3
lugar de+!(n&7)
, en9
lugar de_8
(dos veces) y en44
lugar de9
f=
en eso ... ¡Gracias por los bytes guardados!' '
). Pero no estoy seguro exactamente cómo lo hace. ¿Qué hace el cambio de bit? ¿Por qué estamos incrementando n?Gelatina ,
6764 bytes-2 bytes gracias a Dennis (1. eliminar redundantes
”
, y 2. reemplazar transposición y decodificación de longitud de ejecuciónZŒṙ
, con reducción por repetición de elementos,.x/
)Pruébalo en línea!
¿Cómo?
“...“...’
es una lista de dos números comprimidos de base 250:D
se convierte a decimal para obtener dos listas de dígitos:x/
se reduce por repetición de elementos para dar una lista de dígitos (repitiendo el número de la primera lista por el valor correspondiente de la otra):ị
instruye a indexar en la lista de la derecha, una basada y de forma modular (0 índices en el elemento de la derecha). La lista de la derecha,¶_/\|JAVo
es simplemente el carácter utilizado en el orden requerido donde el pilcrow¶
, es el mismo punto de código que un salto de línea.“
No se requiere el socio de cierre de, ya que este es el final del programa:Jelly realiza una impresión implícita de esta lista, que, dado que contiene caracteres, se imprime como si fuera una cadena:
fuente
”
está implícito y se puede reemplazarZŒṙ
conx/
. Además, si bien no tiene bytes, el uso¶
de una nueva línea literal hace que el código sea más legible.CoffeeScript ES6,
214180 bytesCoffeeScript, 135 bytes con codificación rígida
fuente
Python 2,
174172171167 bytesSin codificación rígida.
Sin codificación Base-64.
No Regex
Ahorró 2 bytes al externalizar
'_'*10
y explotar la conversión de Python deTrue -> 1
yFalse -> 0
.Se guardó 1 byte al eliminar espacios en blanco innecesarios.
¡Guardado 4 bytes gracias a @TuukkaX!
fuente
] for
yin [
.[2,7,4]
y[3,4,5,6]
de2,4,7
y3,4,5,6
.PowerShell ,
136124123105 bytesPruébalo en línea!
Gracias a @briantist por encontrar el más corto
-replace
método que sabía que estaba allí en alguna parte.Esto toma la cadena con números en lugar del número requerido de espacios. Luego regexamos
-replace
los dígitos con una expresión de script$(" "*$1)
. Entonces, por ejemplo, la primera línea de la cadena será$(" "*2)o
, la segunda será$(" "*7)o
y así sucesivamente. Debido a las comillas triples, esto se deja como una cadena en la tubería. Volcamos eso aiex
(abreviaturaInvoke-Expression
y similar aeval
), que procesa las expresiones de script y deja la cadena de varias líneas resultante en la tubería. La salida es implícita.fuente
($_,' '*$_)[+$_-in48..57]
, no importa lo que cambie, parece fallar para mí.space
poro
y barfs.GNU sed ,
113112 bytesCodificación básica, almacena 3 espacios como
S
,\n
como@
y 5 subrayados comoU
. Seguiré intentando combinaciones para encontrar algo más corto.Pruébalo en línea!
The trivial solution of printing the string directly is given below. It has 136 bytes, resulting in a compression of 18 %, using the encoding scheme above.
Try it online!
fuente
ss
asS
saves 1 byte.S
storing 3 spaces, nos
. I think I'll edit this one instead, because it keeps the same number of transformations.MATL,
8786838278 bytesThis 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
fuente
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()
.fuente
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:
fuente
\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.
fuente
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)fuente
Common Lisp,
125123122120114 bytesI saved 6 bytes, using idea of just putting enters in string instead of
~&
s.Ideas for improvement welcomed.
fuente
Python3, 206 bytes
fuente
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.
fuente
C - 179
Solution with extensive use of format string:
Here is a more readable version:
fuente
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!
fuente
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.
fuente
GameMaker Language, 138 bytes
fuente
C, 141 Bytes
Usage
Easy Solution, 148 Bytes:
fuente
PHP, 116 bytes
This looks a lot like Arnauld´s answer - and does pretty much the same. Run with
-r
.fuente
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.fuente
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:
fuente
05AB1E, 85 bytes
Try it online!
fuente