Este es Calvin . Solo trato de obtener 20 repeticiones para que este usuario pueda chatear en la sala de chat del servidor PPCG Minecraft .
Escriba un programa o función que tome un entero positivo.
Si el número entero es par (2, 4, 6, ...), imprima o devuelva esta cadena de arte ASCII exacta:
__ __ __ __ ___
/\ /\ | |\ | | / | | /\ | |
/ \/ \ | | \ | |-- | |--\ /__\ |-- |
/ \ | | \| |__ \__ | \ / \ | |
Si el número entero es impar (1, 3, 5, ...), imprima o devuelva esta cadena de arte ASCII exacta:
__ __
\ / | | /| | / | / \ __ / | |
\ /\ / | | / | |-- | |--/ \ / |-- |
\/ \/ | |/ | |__ \__ |__| \/ |__ _|_
Puede suponer que la entrada es siempre un número entero positivo.
En ambos casos de salida, opcionalmente puede haber cualquier número de espacios finales hasta el borde derecho de la "T" en cada línea, y / o una nueva línea final. Tenga en cuenta que hay dos columnas de espacios entre cada letra.
El código más corto en bytes gana.
code-golf
ascii-art
kolmogorov-complexity
Retransmisión de chat antiguo
fuente
fuente
Respuestas:
JavaScript (ES6),
343336289267265260 bytesSolo por diversión ... :) (Gracias a Xufox por cortar 46 bytes y animarme a cortar otros 37 por mi cuenta).
Llamado como
a(4)
o similar. Pruébalo aquí:Mostrar fragmento de código
He condensado el espacio en blanco en cadenas de dígitos de
2
a8
(por ejemplo,887
= 23 espacios). Cada dígito se reemplaza con el número correspondiente de espacios.0
representa| |
y1
representa__
. En general, este programa es 170 bytes más corto que las dos cadenas combinadas (203 + 227 = 430), así que estoy feliz. :)Editar: de alguna manera, tiene exactamente la misma longitud que la única otra entrada en este momento ... o_o
Edición 2: ahorrado algo de espacio, cambiando
n%2<1?
an%2?
e intercambiando las cuerdas. También aprovechó el hecho de que los inicios de las dos cadenas son los mismos para reducir otros 5 bytes.Edición 3:
|2|
parecía aparecer mucho, así que simplifiqué cada ocurrenciax
, ahorrando 7 bytes. Las sugerencias de Xufox cortaron otros 40 bytes.Edición 4: la sugerencia de Xufox de reemplazar
\n
con saltos de línea reales dio resultado, eliminando 6 bytes del total. Cambiandox
a0
y__
para1
(inserte una risa malvada aquí), luego combinando todo el (inserte plural de Regex aquí), como lo hizo en su entrada, ahorró 16 bytes adicionales.Edición 5: dado que elegí usar los estándares ES6, utilicé la interpolación de cadena de plantilla personalizada para eliminar 2 bytes finales.
fuente
.replace(/\d/g,d=>' '.repeat(d))
?\n
guardar un byte por salto de línea?Matlab,
343341El número de entrada se proporciona desde stdin.
Ejecución de muestra:
fuente
CJAM,
158149145138 bytesLo anterior usa notación de intercalación, ya que el código contiene caracteres no imprimibles.
Pruébelo en línea en el intérprete de CJam .
Si el enlace permanente no funciona en su navegador, puede copiar el código de esta pasta .
Ejecución de ejemplo
Idea
En lugar de codificar la cadena MINECRAFT (rellenada para lograr una longitud de línea constante) directamente, codificaremos una versión "comprimida" de ella, donde se han transpuesto las filas y columnas.
Después de comprimir y eliminar los avances de línea, esta cadena (llamémosla R ) debe codificarse:
Hay muchas corridas de espacios, por lo que reemplazaremos cada aparición de un triplete espacial con un salto de línea.
Esto nos deja con siete caracteres diferentes (
\n -/\_|
), por lo que asignamos a cada uno un número del 0 al 6 y consideramos los dígitos de la matriz resultante de un número base 7, que luego codificamos como una cadena de bytes.La decodificación funciona invirtiendo los pasos desde arriba.
La cadena reflejada se puede construir a partir de la original.
Si invertimos el orden de las cuatro filas e intercambiamos los sólidos, obtenemos lo siguiente:
De alguna manera similar, pero claramente tendremos que rotar las filas para llevar la fila inferior a la superior:
Eso sería si no fuera por esos subrayados molestos.
Si leemos la cadena original de arriba a abajo e ignoramos los avances de línea (obteniendo así R ) y reemplazamos cada guión bajo seguido de un espacio seguido por un guión bajo antes de cambiar las filas, este es el resultado:
¡Mucho mejor! Todo lo que queda por hacer está suprimiendo el primer espacio de la primera fila (desplazamiento de todos los guiones en la primera fila de la izquierda caracteres), moviendo los guiones fuera de lugar en E y C una fila hacia arriba y desechar el guión sobre T .
Código
fuente
Pyth - 182 bytes
Utiliza el enfoque de codificación base. Dado que la indexación es modular en Pyth, ni siquiera tengo que hacer nada para lo impar, simplemente ponerlo en el orden correcto y usarlo
@Q
. Como beneficio adicional, esto también funciona con números negativos.Intenté solo codificar el primero, luego volteé y cambié las barras, pero la primera y la última línea eran demasiado difíciles.
Podría ahorrar 6 bytes poniendo bytes nulos reales en el código, pero eso es demasiado problema.
Pruébelo en línea aquí .
Se ve muy mal en línea porque el cuadro de salida es demasiado pequeño y se ajusta. Recomiendo jugar con la consola de desarrollo y cambiar el
col-md-5
a acol-md-7
.fuente
JavaScript (ES6),
312,285,281,272,270,263,262260Para ediciones anteriores ver el historial de edición .
Edición 5: en la conversión, cambié el número asociado con
-
(ahora 0) y el espacio en blanco (ahora 1). En el bloque resultante, los números 1, 2 y 3 ya no se usaban tanto. Esto me permitió usar una matriz con los números que faltan.Edición 6: Mejora el literal de la matriz. Intenté esto anteriormente, pero usé
777
y77
como cadenas en lugar de números y noté solo ahora que me había perdido esto.Edición 7: El "código Golfed" es una función, como se especifica en la pregunta y no es necesario
f=
cumplir con esta especificación. Por lo tanto, eliminándolo, ahorrando dos bytes.Ejecutable en Firefox 39:
Se basa en el sistema de números base 6 y cada carácter ASCII representa un número:
Luego, combiné la representación numérica de cada cadena ASCII. Por ejemplo: cuando la primera cadena ASCII contiene una
/
en una posición y la otra contiene una\
en la misma posición , esa posición se convierte en32
base 6 (20
en decimal). Si convierte esto a base 36 (para obtener un número de base 36 por cada dos números de base 6), obtendrák
.Todo esto se hizo de antemano y la función básicamente deshace este proceso.
Ahora las dos respuestas de JavaScript tienen una respuesta diferente cada una, que tiene el mismo conteo de bytes ...PD: Como una nota para mí y una referencia para otros, este es el código que utilicé:
fuente
~NaN == -1
?[…][x]+77
,77
no tiene por qué ser una cadena más), pero la marcha atrás adicional en el código golfed no valió la pena ...isNaN
con1+
y~~(i/6)
coni/6|0
.f=
al principio, pero yo sí. También leí que se acepta eliminarlo, así que lo haré yo mismo, y ahora tengo 260 bytes. ;)CJam, 136 bytes
Lo anterior usa notación de intercalación, ya que el código contiene caracteres no imprimibles.
El salto de línea es únicamente para "legibilidad". Pruébelo en línea en el intérprete de CJam .
Si el enlace permanente no funciona en su navegador, puede copiar el código de esta pasta .
Ejecución de ejemplo
Idea
Este enfoque tiene algunas similitudes con el de mi otra respuesta , pero es mucho más simple y (bastante decepcionante) un poco más corto.
Buscamos una forma de codificar la siguiente cadena:
Después de rellenar cada fila (para lograr una longitud de línea constante), comprimir (transponer filas y columnas) y eliminar los avances de línea, esta cadena debe codificarse:
Vamos a reemplazar cada subcadena
" |||"
con un 0 , cada subcadena" "
con un 1 y los caracteres de"/-_\| "
con 2 a 7 , formando una matriz de base de 8 dígitos, que pueden ser codificados como una cadena de bytes.La decodificación funciona invirtiendo los pasos desde arriba.
Código
fuente
Raqueta,
443434386 bytesSólo por diversión.
Nota: es posible que necesite que la
#lang racket
línea se ejecute en DrRacket.fuente
05AB1E ,
179177176 bytesPruébalo en línea.
Explicación:
es el número comprimido :
Pruébalo en línea.
7в
lo convierte a Base-7 como lista, por lo que obtenemos la lista de dígitos:Pruébalo en línea.
è
indexa cada dígito en la cadena"\n-/\_|"
yJ
luego une toda la lista, lo que nos da lo siguiente:Pruébalo en línea.
2ä
divide la cadena en dos partes.Iè
toma la entrada y la indexa (con ajuste automático) para obtener una de las dos partes, que luego se emite de forma implícita.Muchísimas gracias al compresor ASCII de @MagicOctopusUrn que se utilizó para generar el número comprimido y el transliteral Base-7. Pruébalo en línea. (Después de lo cual el transliterado se ha jugado al golf invirtiendo la cadena y el número en la pila, usando en
в
lugar deB
hacer una lista de dígitos e indexando en la cadena conè
.fuente
C, 251 bytes
Esta es una función
k
que recibe un parámetro e imprime el mensajestdout
.Una versión más legible:
Primero, prepara un mensaje vacío (lleno de espacios). Para cada personaje (p. Ej.
|
O-
), tiene una lista de posiciones para colocar ese personaje.Para cada posición, si se imprime la versión invertida, la posición se voltea. Es decir, su coordenada vertical
y
se reemplaza por4-y
o3-y
(dependiendo de si el carácter es un guión bajo). Además, las direcciones de las barras se invierten; esto se realiza mediante unXOR
con115
.Esta estructura de control también se usa para colocar los caracteres de nueva línea; parece más eficiente agregar 4 coordenadas más a la lista que escribir un bucle explícito.
Hay algunos problemas menores con este sistema. En primer lugar, la letra final T se ve un poco diferente en la versión invertida:
Para generarlo correctamente, el código debe colocar los
|
caracteres después de los_
caracteres.Además, para asegurarme de que la cadena de control contiene solo caracteres ASCII, la codifiqué:
37
agregado a ellos, para cambiarlos al rango ASCII 32 ... 127. Podría agregar un número menor, pero37
evita caracteres como"
y\
, que deben escaparse dentro de los literales de cadena.-
carácter aparece en la posición 137. Para explicar esto, agregué un-
carácter artificial en otra posición (79), que luego se sobrescribe, el carácter|
también aparece en la posición 79.Otra cosa divertida fue que no pude usar la
puts
salida de la cadena, esto produciría una nueva línea final adicional. Así que lo usé en suprintf
lugar.Además, el número
57
aparece 4 veces en el código de golf: la expresión aparentemente larga(w%2?4-i/6-p/57:p/57)*57+p%57
hace posible eliminar la variabley
, haciendo que el código sea más corto.fuente
Perl,
292259246 bytesAprovecha el hecho de que las dos cadenas son en su mayoría similares (por ejemplo, todo el IE y C) y hace que la cadena contenga caracteres que se muestran de manera diferente según la versión que se muestre. por ejemplo, m significa "una barra inclinada hacia adelante para la cadena hacia arriba, una barra inclinada hacia atrás en la invertida". Hace una sustitución de transliteración para mostrar el carácter correcto. Los espacios también se codifican en longitud de ejecución mediante sustituciones de cadenas.
multilínea:
Idea:
Como solo hay 22 columnas únicas en la salida, debería ser posible almacenarlo como 22 * 4 = 88 caracteres con un rango de 0-17 (todos los posibles caracteres de "doble significado"), junto con una búsqueda de 56 caracteres tabla con una entrada en el rango de 0-21 por columna. En teoría, esto podría codificarse con <100 bytes, sin embargo, es difícil hacer que esto sea una ganancia neta debido al código más complicado para decodificarlo.
fuente
CJAM, 206
Las dos imágenes ascii están codificadas en base 216, un byte = 3 caracteres.
Pruébalo aquí
fuente
PowerShell,
275253248 bytesScript de prueba:
Salida:
Ideas principales
El método de compresión es un método extendido de CJam por Dennis ♦:
El script para la compresión:
La cadena de compresión anterior es:
fuente
SAS, 442 bytes
No golfizado:
Pruebas:
Posiblemente podría guardar un poco de código poniéndolos en bloques de entrada, pero eso agrega la restricción de que la macro solo puede ser una vez por paso de datos, lo que creo que viola el espíritu de escribirlo como una macro. (Y sospecho que agregar un mensaje para obtener información en el paso de datos agrega más caracteres).
fuente
bash, 247 bytes
Las cadenas se concatenan y gziped.
fuente
PHP, 225 bytes
Fea, solución de fuerza bruta.
Comprimí y luego base64 codificó las cadenas concatenadas que se mostrarán. El código decodifica, descomprime y divide en partes de 224 caracteres. La primera cadena tiene 224 caracteres sin una nueva línea al final, la segunda tiene 201 caracteres (tampoco una nueva línea después) La paridad del argumento de línea de comando (
$argv[1]%2
) se usa como índice en la matriz generada porstr_split()
.fuente
Haskell, 138 bytes
Esto es un poco hack. Estoy forzando el hash SHA256 de la concatenación de los dos textos de Minecraft, y luego los separo y elijo el texto apropiado en función del parámetro x. Esto es de origen muy poco práctico y no se puede calcular en tiempo real, e incluso puede haber colisiones en el camino por lo que sé.
Debido a que Haskell no puede tener la representación ASCII de ese hash en una cadena, lo estoy leyendo desde un archivo llamado "a", y por lo tanto, he agregado 32 bytes a mi puntaje.
Explicación:
Crea una lista de cada combinación de las letras "/ \ | _-" en 425 letras (la longitud de ambos textos de Minecraft combinados)
Elige el primero que coincida con el hash
El primer texto tiene 225 letras, el otro tiene exactamente 200.
fuente
Javascript (ES6),
403296 bytes(Movido de mi respuesta anterior ) Probar un nuevo método:
Tenga en cuenta que hay algunos caracteres no imprimibles; estos han sido reemplazados por ej
\x83
.La codificación en sí es aproximadamente 40 bytes más corta que la otra, pero el proceso de decodificación es más complejo. Usé el sistema base-216 que otros han usado para codificar el texto. Como referencia, aquí está el código que utilicé:
Básicamente, esto toma el texto ASCII (convertido previamente a la base 6) y lo triplica sobre sí mismo, cambiándolo a la base 216. Luego se agrega 53 para eliminar la mayoría de los caracteres no imprimibles.
Sugerencias bienvenidas!
Aquí está el código original de 403 bytes:
Usando un
for
bucle, unwhile
bucle, cuatro variables que solo se usaron una vez y una tonelada de algoritmos largos para cosas simples. Chico, he mejorado ...fuente
y=[' ','/','|','\\','_','-'],
y en lugar dey[x]
escribir' /|\\_-'[x]
. =)Python, 312 bytes
La función imprime el resultado dado un int
fuente
C, 321 bytes
Codificó la repetición y el índice de caracteres en una cadena.
fuente
Pitón 3, 486
533612fuente
PHP , 263 bytes
Pruébalo en línea!
fuente
Rubí, 290 bytes.
Probablemente una entrada débil y mejorable. Básicamente, una compresión muy simple (artesanal) donde las letras minúsculas significan que muchos espacios (en realidad ord (ch) - espacios 'A') y letras mayúsculas son solo algunos términos comunes que ahorraron unos pocos bytes.
fuente
SOGL V0.12 ,
7271 bytesPruébalo aquí!
La duplicación vertical de SOGL funcionó perfectamente para esto.
fuente
Lienzo , 70 bytes.
Pruébalo aquí!
fuente