Probablemente conozca la pregunta retórica de si un vaso está medio lleno o medio vacío . Me estoy cansando un poco de la frase, así que decidí que es hora de eliminar esta confusión sobre la plenitud o el vacío del vidrio mediante programación.
Su tarea es escribir un programa que tome una representación artística ASCII de un vidrio feo y genere un arte ASCII de un vidrio agradable correspondiente . También tiene que decidir si el vidrio es full
, o mostly full
, y generar esto también (lo hacen 4 valores de salida constantes y distintos).mostly empty
empty
TL; DR
La entrada es un arte ASCII de un vidrio ( #
caracteres) y un líquido ( a-z
) distribuidos aleatoriamente dentro y fuera del vidrio. El líquido dentro del vidrio se cae y se acumula en su fondo, el líquido afuera se desecha. Imprima un arte ASCII del vidrio después de que el líquido se haya asentado en el fondo. Determine qué tan lleno está el vidrio y dé salida también.
Gafas feas y bonitas
Un vaso en general es un contenedor hecho de #
personajes con una parte inferior, dos paredes laterales y sin parte superior.
- Las gafas válidas no tienen agujeros en ellas. (Todos los
#
personajes tienen que estar conectados). - Habrá al menos dos
#
caracteres en cada línea del arte ASCII de entrada, o ninguno. No habrá una línea con exactamente una#
. - La línea superior del arte ASCII de entrada siempre tendrá exactamente dos
#
. - Las gafas válidas tienen exactamente un mínimo local en su muro de
#
caracteres delimitador . Esto significa que el líquido no puede quedar atrapado en alguna parte. - La pared delimitadora de un vaso no tendrá máximos locales.
- No habrá ninguna
#
debajo del fondo del cristal. - El interior del vidrio siempre será un espacio conectado .
- Puede haber espacios en blanco iniciales / finales y nuevas líneas en la entrada.
Ejemplos de gafas válidas e inválidas:
VALID (possible input to your program):
# #
# #
####
# #
# #
# #
# #
# #
# #
##
# #
# #
### #
# #
####
# #
# #
# #
# #
# #
########
# #
# #
# ###
# ###
# ###
#####
INVALID (you won't get one of those as input to your program):
# #
# Has a hole.
####
# #
# # This is also considered a hole.
##
# #
# # Less than two # on a line.
#
## #
# # More than two # on the first line.
###
#
# # Less than two # on the first line.
###
# #
# # # More than one local minimum.
# # # # Liquid might get trapped.
### # #
###
# #
# #
#### Interior is not a connected space.
# #
# #
####
# #
# #######
# ### #
# ## # Has a local maximum.
# # #
# #
# #
######
# #
# #
# #
#####
# # <--- # below the bottom of the glass.
# #
# # # This is also a glass with a hole. The #'s aren't all connected.
# # #
# #
#######
Un vaso feo es un vaso con líquido flotando en su interior.
- El líquido está representado por las letras minúsculas
a-z
. - No habrá líquido por encima de la primera línea de
#
caracteres. Esto significa que no es necesario permitir que el líquido caiga en el vidrio. - Puede haber líquido fuera del vaso. . Este líquido se desechará al convertir el vidrio feo en un buen vaso.
Ejemplos de gafas feas :
# y b # i
x v#p q l# l
a # a zj # p g
g #ppcg c#
u # r n # r
##########
Discard Keep Discard
<-- There will never be liquid above the glass
# tz g#
#y abc # d
av z#ox s # l
c#y abth# b
#vg y rm# a
########
e a b c d <-- Discard this as well (not within interior)
Un buen vaso es un vaso donde todo el líquido se ha acumulado en el fondo.
- De abajo hacia arriba, el interior de un bonito vaso consiste en una serie de líneas que están completamente llenas de letras, seguidas, como máximo, de una línea que no está completamente llena de letras, y luego una serie de líneas que están vacías.
- Es posible que no haya líquido fuera del interior de un buen vaso.
Conversión de un vaso feo en un vaso bonito
- El líquido dentro del vaso se cae y se acumula en el fondo.
- El líquido fuera del vidrio se desecha.
- Al convertir un vaso feo en un vaso bonito, deben conservarse las letras exactas. Por ejemplo, si el vidrio feo tiene tres
a
's', el buen vidrio también debe tener tresa
''. (La soda no se convierte de repente en agua). - Las letras dentro del vaso bonito no tienen que ser ordenadas.
- La forma del vidrio tiene que ser preservada. No
#
se pueden agregar ni eliminar caracteres. - Se permite cualquier cantidad de espacios en blanco iniciales / finales y nuevas líneas.
Determinación de la plenitud del vidrio.
- Un vaso es
full
si todo su espacio interior está lleno de letras. - Es
mostly full
si el 50% o más del espacio interior está lleno. - Sus
mostly empty
si se llena menos del 50% del espacio interior. - Es
empty
si no hay letras en el cristal. - Puede haber cualquier número de nuevas líneas y espacios adicionales entre el vidrio artístico ASCII y la salida de plenitud.
- El programa puede generar valores distintos (¡pero constantes!) Para los 4 niveles de plenitud del vidrio, no tiene que imprimir las cadenas exactas anteriores. Especifique qué valor representa qué nivel de plenitud.
Ejemplos de E / S
Example 1 input:
# y b # i
x v#p q l# l
a # a zj # p g
g #ppcg c#
u # r n # r
##########
Example 1 output:
# #
# #
# #
#ppcglqb #
#yprazjnc#
##########
mostly empty
Example 2 input:
# tz g#
#y abc # d
av z#ox s # l
c#y abth# b
#vg y rm# a
########
e a b c d
Example 2 output:
# #
# bc #
#oxysa#
#ygabth#
#vgtyzrm#
########
mostly full
Example 3 input:
# #
# g # f
###ih # d
a c # # e
b ####
Example 3 output:
# #
# #
### g#
#hi#
####
mostly empty
Example 4 input:
#ab#
#cd#
####
Example 4 output:
#cb#
#da#
####
full
Example 5 input:
# # h
# #
a # # g
b# # f
c # #
# # e
d ##
Example 5 output:
# #
# #
# #
# #
# #
# #
##
empty
Example 6 input:
# b az#
#y s ###
###### t
l u
Example 6 output:
# z #
#ybsa###
######
mostly full
Example 7 input:
# # g
# b #f
# c###
#da ### i
# e###
##### h
Example 7 output:
# #
# #
# ###
#de ###
#abc###
#####
mostly empty
Misceláneos
- Este es el código de golf, por lo que gana la respuesta más corta.
- Si es posible, proporcione un enlace a un intérprete en línea que pueda usarse para ejecutar su programa en las entradas de ejemplo proporcionadas, por ejemplo tio.run
fuente
Respuestas:
Retina , 56 bytes
Pruébalo en línea!
La codificación de salida es
0\n0
para lleno,0\n1
para vacío,1\n0
para mayormente lleno y1\n1
para mayormente vacío (en otras palabras, el primer bit indica "mayormente" y el segundo bit indica "vacío").Explicación
Comenzamos convirtiendo todos los espacios y letras fuera del cristal
!
. Esto se hace combinando una línea que comienza hasta la primera#
o combinando una línea que no contiene#
ay transliterando todos los espacios y letras en esas coincidencias.Ordenar todos los espacios y letras. Dado que las letras tienen puntos de código más altos que los espacios, esto ordena todas las letras hasta el final, lo que significa que está en la parte inferior del cristal. Esto también sucede para ordenar las letras entre sí, pero el orden de las letras en el resultado es irrelevante.
Ejecución en seco: imprima el resultado de reemplazar todo
!
con espacios, pero en realidad no aplique este cambio a la cadena de trabajo. Esto imprime el bonito vaso.Descartar todos
#
,!
y avances de línea, por lo que sólo nos quedamos con los espacios y letras en el interior del vidrio (siendo clasificada).Ejecución en seco: imprime el número de coincidencias de un espacio seguido de una letra. Esto encontrará como máximo una coincidencia, y eso solo si hubiera espacios y letras dentro del vaso, es decir, el vaso está mayormente (lleno / vacío).
Eliminar repetidamente un espacio seguido de una letra. Esto "cancela" letras y espacios, de modo que terminamos con solo ese tipo de carácter que aparece más a menudo dentro del cristal.
Cuente el número de coincidencias de esta expresión regular, que da
1
si quedan espacios (es decir, el vaso estaba [en su mayoría] vacío) y0
si no quedan (es decir, el vaso estaba exactamente al 50% o más y, por lo tanto, [en su mayoría] lleno )fuente
C, 190 bytes
¡Gracias a @ l4m2 por guardar 17 bytes!
Salidas 0 para vaso vacío, 1 para vaso vacío en su mayoría, 2 para vaso lleno y 3 para vaso lleno.
Primero recorre la cadena de entrada contando el espacio dentro del cristal, marcando las letras que están dentro del cristal y cambiando todas las letras a espacios. Luego, recorre la cuerda hacia atrás colocando todas las letras que estaban en el cristal en la parte inferior del cristal.
Pruébalo en línea!
Desenrollado:
fuente
i
que parece, ya que la función siempre deja su valor en 0 al final.char l[strlen(g)]
si C99 lo permite, ya que es más corto y not = *p-35 ? t : !t
->t ^= *p==35
si t es siempre 0 o 1&&(*p=32)
->?*p=32:0
char l[strlen(g)],*p=g
->char*p=g,l[strlen(g)]
Python 2 , 342 bytes
Pruébalo en línea!
fuente
Perl 5 , 197 bytes
Pruébalo en línea!
Salidas:
fuente