Le dan un montón de tubos de ensayo ASCII, su tarea es reducir el número de tubos de ensayo utilizados.
Cada tubo de ensayo se ve así:
| |
| |
| |
|~~|
| |
| |
| |
| |
|__|
Obviamente, ~~
es el nivel del agua. El tubo de ensayo también puede estar vacío, en cuyo caso no hay ~~
caracteres dentro. Un solo tubo puede contener hasta 8 unidades de nivel de agua.
Se le da un número finito de tubos de ensayo con diferentes niveles de agua en el interior. Debe verter el agua en la menor cantidad posible de tubos de ensayo y obtener el resultado.
| | | | | | | | |~~| | |
| | | | | | | | | | | |
| | |~~| | | | | | | | |
|~~| | | | | | | | | |~~|
| | | | | | | | ------> | | | |
| | | | | | | | | | | |
| | | | |~~| | | | | | |
| | | | | | | | | | | |
|__| |__| |__| |__| |__| |__|
05 + 06 + 02 + 00 ------> 08 + 05
Como puede ver, los tubos de ensayo se separan con un solo espacio. Los tubos vacíos no deben mostrarse en la salida. Este es el código golf, por lo que gana el código con el menor número de bytes.
Casos de prueba: http://pastebin.com/BC0C0uii
¡Feliz golf!
Respuestas:
Pyth,
484544 bytesPruébalo en línea.
Imprime un único espacio final en cada línea.
fuente
JavaScript (ES6),
159148bytesEmite un salto de línea final. Editar: guardado 11 bytes con algo de ayuda de @Arnauld.
fuente
s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)
debería guardar 4 bytes. Es posible que desee inicializar n a -1 y usarn>>3
y~n&7^i
guardar un byte más.-1
idea, pero pude mejorarlareplace
.1/"\n"
era verdad.Perl, 150 bytes
149 bytes de código +
-n
bandera.No explicaré todo el código, solo algunas cosas:
$l+=9-$.for/~~/g
cuenta la cantidad de agua que hay en la entrada.La segunda parte del código imprime la salida. La idea es colocar tantos tubos llenos como sea posible, y un último que contenga el agua que queda (si la hay). Así que el algoritmo es en 4 partes: imprime la primera línea de agua (la parte superior de los tubos):
say"|~~| "x$v.($@="| | ")x$r
. A continuación, imprimir partes vacías de los tubos hasta que alcanza el nivel de agua del último tubo:say$:=$@x$%for$l%8..6
. A continuación, imprima el nivel en el que el agua del último tubo es:say$@x$v."|~~|"x$r
. A continuación, imprima todos los restantes niveles "vacías":say$:for 2..$l%8;
. Y, por último, imprimir el resultado final:say"|__| "x$%
.Los nombres de las variables dificultan la lectura (
$%
,$@
,$:
) pero permite palabras clave comox
yfor
para ser escrito después de la variable sin un espacio.Para ejecutarlo:
No estoy muy satisfecho con la duración de esta respuesta. Traté de sacar el máximo provecho de mi algoritmo, pero un enfoque diferente probablemente podría ser más corto. Intentaré trabajar en eso pronto.
fuente
Befunge,
144138 bytesPruébalo en línea!
Las primeras dos líneas procesan la entrada, básicamente ignorando todo excepto el primer carácter en cada tubo que podría ser un marcador de nivel. Tomamos el valor ASCII de ese personaje, dividimos por 2 y mod 2 (dándonos 1 o 0 dependiendo de si estamos en un marcador de nivel o no), lo multiplicamos por el número de fila (contando desde 8, dándonos así el valor de nivel para ese tubo) y agréguelo a un total acumulado.
La salida se maneja en las segundas dos líneas, esencialmente comenzando en el extremo derecho de la tercera línea. Primero calculamos el número de tubos tomando el nivel de agua total más 7 dividido por 8. Luego, al iterar sobre las filas de todos los tubos, calculamos el carácter que se mostrará dentro de un tubo específico ( t , contando hasta 0) para un fila dada ( r , cuenta atrás de 8 a 0) de la siguiente manera:
El char_type calculado es -1 para la fila inferior (la base del tubo), 0 para cualquier otra área que no sea un nivel de agua y 1 para el nivel de agua. Por lo tanto, se puede usar como una simple búsqueda en la tabla para que salga el carácter apropiado (puede ver esta tabla al comienzo de la línea 4).
fuente
Haskell, 186 bytes
Ejemplo de uso:
Pone un espacio final en cada línea. Cómo funciona:
El principal problema fue la falta de una función que cuente con qué frecuencia se produce una subcadena en una cadena. Hay
count
enData.Text
, pero la importación que lleva a un montón de conflictos de nombres que son demasiado caros para resolver.fuente
Python, 261 bytes
Siento que hay algo que me falta. Además, si un montón de nuevas líneas son aceptables para la salida en blanco, podría perder algunos bytes. Toma entrada como
'| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'
.fuente
Rubí , 139 bytes
(138 bytes de código más un byte para el
-n
)Pruébalo en línea!
Algunas explicaciones:
Actualización 1: Se agregaron detalles sobre las variables, el
gsub
truco y la faseEND{
...}
Actualización 2: (± 0 bytes en general)
n||=0
lugar den=n||0
(-1 byte)-n
(+1 byte)fuente
Python 3, 404 bytes
Este programa crea la salida prevista completa con los niveles de agua tanto en ASCII como en formatos numéricos.
fuente