Introducción
En este desafío, se le da como entrada la representación ASCII de la red (superficie desplegada) de un cuboide rectangular (cuadro 3D). El formato es este:
....+--+.......
....|##|.......
....|##|.......
....|##|.......
+---+--+---+--+
|###|##|###|##|
+---+--+---+--+
....|##|.......
....|##|.......
....|##|.......
....+--+.......
Cada cara del cuboide es un rectángulo de #
s rodeado de +-|
caracteres. El exterior de la red está lleno de .
s. La red siempre tendrá la misma orientación: hay una cara central rodeada por sus cuatro caras vecinas, y la contraparte de la cara central está en el borde derecho de la entrada. La entrada se rellena con .
s en forma rectangular y no contendrá filas o columnas adicionales de .
s.
La tarea
Su tarea es tomar como entrada un diagrama como el anterior, y calcular el volumen del cuboide que representa, que es solo el producto de su altura, ancho y profundidad. Puede tomar la entrada como una cadena delimitada por una nueva línea o una matriz de cadenas.
La longitud de cada borde es la distancia entre los +
caracteres en sus dos extremos. Por ejemplo, el borde horizontal +--+
tiene una longitud 3 y el borde vertical
+
|
|
|
+
tiene una longitud 4. La longitud mínima de un borde es 1. El ejemplo del cuboide anterior tiene un volumen 2 * 3 * 4 = 24.
Reglas y puntaje
Puede escribir un programa completo o una función, y gana el conteo de bytes más bajo.
Casos de prueba
.++..
+++++
+++++
.++..
1
...++....
...||....
...||....
+--++--++
+--++--++
...||....
...||....
...++....
3
..+-+....
..|#|....
+-+-+-+-+
|#|#|#|#|
|#|#|#|#|
+-+-+-+-+
..|#|....
..+-+....
12
.+---+.....
++---++---+
||###||###|
||###||###|
||###||###|
++---++---+
.+---+.....
16
....++.....
....||.....
....||.....
....||.....
+---++---++
|###||###||
|###||###||
|###||###||
+---++---++
....||.....
....||.....
....||.....
....++.....
16
...+--+......
...|##|......
...|##|......
+--+--+--+--+
|##|##|##|##|
+--+--+--+--+
...|##|......
...|##|......
...+--+......
18
....+--+.......
....|##|.......
....|##|.......
....|##|.......
+---+--+---+--+
|###|##|###|##|
+---+--+---+--+
....|##|.......
....|##|.......
....|##|.......
....+--+.......
24
....+-----+..........
....|#####|..........
....|#####|..........
....|#####|..........
+---+-----+---+-----+
|###|#####|###|#####|
|###|#####|###|#####|
|###|#####|###|#####|
|###|#####|###|#####|
+---+-----+---+-----+
....|#####|..........
....|#####|..........
....|#####|..........
....+-----+..........
120
Respuestas:
Retina ,
2928 bytesPruébalo en línea!
Hay muchas formas de abordar esto en Retina, dependiendo de qué área quieres multiplicar con qué lado, por lo que no estoy seguro de cuán óptimo es esto, pero en realidad ya es mucho más corto de lo que pensé que sería.
Actualmente tengo otras dos soluciones en el mismo número de bytes que parecen un poco más golfables que el enfoque anterior:
Aunque en estos podría guardar un byte cada uno si supongo que la entrada termina con un salto de línea final, pero prefiero no tener que depender de eso.
Y otro, aún a 28 bytes (este en realidad multiplica tres lados en lugar de multiplicar un área por un lado):
Explicación
La idea principal es multiplicar el área de la cara en la parte superior por la longitud del lado vertical que toca el borde de longitud de la entrada.
Usaré la siguiente entrada como ejemplo (tiene longitudes laterales 2, 3 y 4, por lo que un área de 24):
Etapa 1: transliterar
La expresión regular
\G\..+¶
coincide con una línea que comienza con.
y es inmediatamente adyacente a la línea anterior. Entonces esto coincide con todas las líneas que contienen la cara superior. El escenario en sí se convierte.
enx
y todos los demás personajes (cualquiera de|+-#
) eny
. Esto nos da el siguiente resultado:Esto tiene una columna más de la
y
que necesitamos para representar el área de la cara superior. Arreglamos esto con la siguiente etapa.Etapa 2: reemplazar
Entonces, hacemos coincidir un
y
precedido por unx
(que es exactamente uno de ellos por línea) y los eliminamos a ambos de la cadena. Obtenemos esto:Entonces ahora tenemos el área de la cara superior representada por el número de
y
s.Etapa 3: reemplazar
Nuestro objetivo aquí es multiplicar esta área
A
por la longitud del lado faltante, que es el número|
al principio de una línea más 1. Sin embargo, en realidad es más fácil multiplicar por un númeron+1
porque ya tenemos una copia deA
la cadena . Si reemplazamos lasn
cosas conA
, terminamos conn+1
copias deA
. Esto nos facilita mucho las cosas.Por lo tanto, simplemente reemplazamos cualquier
|
inmediatamente después de un salto de línea con todo en frente del partido. Esto destroza la cadena bastante y la hace un poco más grande de lo que necesitamos, pero el número dey
s termina siendo el resultado que estamos buscando:Etapa 4: partido
Todo lo que queda es contar el número de
y
s, que se imprime como un número decimal al final.fuente
Python 2, 57 bytes
Una función que toma una lista de cadenas.
Determina las 3 dimensiones por separado:
l[0].find('+')
El índice del primero
+
en la primera fila.-~l[0].count('-')
El número de
-
signos en la primera fila.~`l`.count("'|")
El número de filas que comienzan con el
|
símbolo, a través de la representación de cadena de la lista que tiene un símbolo de comillas antes.62 bytes:
Una función que toma una lista de cadenas e imprime el resultado.
Encuentra una dimensión
a
como índice de+
en la primera fila. Las otras dos dimensiones se infieren de él y del ancho y alto del rectángulo de entrada.Una alternativa de 63 bytes, que encuentra las dimensiones por separado:
fuente
Bash + coreutils,
83, 77 bytesEDICIONES:
Golfed
Explicado
Transformar con sed :
Deshágase de las nuevas líneas usando backticks, anexe)
Alimentar la expresión resultante a bc
Prueba
Pruébalo en línea! (usa expansión aritmética bash, en lugar de bc , ya que esta última no está disponible)
fuente
Caracoles , 19 bytes
Pruébalo en línea.
La idea es que comencemos en algún lugar del borde más a la derecha de la red, y luego viajemos a algún lugar en la cara más inferior. La longitud del borde y el área de la cara se multiplican por el mecanismo de contar todas las rutas coincidentes.
fuente
JavaScript (ES6), 67
91Prueba
fuente
Rubí, 44
Funciona según un principio similar a otras respuestas: encuentre el primero
+
para encontrar la profundidad, encuentre el siguiente.
después+
del ancho, y cuente el número|
al final de la línea y agregue 1 para encontrar la altura.sin golf en el programa de prueba
fuente
05AB1E , 21 bytes
Sea
W
yH
sea, respectivamente, el ancho y el alto de la entrada, no el cuadro. Luego, las dimensiones de la cajaA
,B
yC
siga estas reglas:La siguiente figura muestra lo que
A
,B
yC
son, en términos de nombres de borde:De ahí las fórmulas anteriores. Este programa calcula
A
, deduce los valores deB
yC
y, finalmente, calcula su producto.Pruébalo en línea!
Versión anterior - Enfoque diferente - 26 bytes
fuente
Befunge 93 , 56 bytes
Pruébalo en línea!
Explicación:
El volumen de la caja se puede calcular multiplicando el número de
.
s en la primera línea antes de cualquier otro carácter, por el número de+
e-
s en la primera línea - 1, y el número de líneas que comienzan con un|
+ 1.Tuve que mover las líneas IP hacia arriba en lugar de hacia abajo para usar la vertical si estaba en la tercera línea. Si la IP bajaba por las líneas, el vertical if forzaría a la parte superior de la pila a ser 1 al golpear el siguiente horizontal si, enviándolo en la dirección incorrecta.
fuente
Haskell,
6456 bytesPruébalo en línea!
Explicación
Se espera que la entrada sea una lista de cadenas para cada línea, por lo que en
f
el parámetro sex
encuentra la primera línea yr
una lista de las líneas restantes.fst(span(>'+')x)
devuelve el.
prefijo de la primera línea como una cadena, por lo quelength(fst(span(>'+')x))
es la primera dimensiónd1
.['-' | '-' <- x]
devuelve una cadena de todos-
en la primera línea, por lo que1 + length['-' | '-' <- x]
produce la segunda dimensiónd2
.|
se puede contar el número de en la primera fila, también lo1 + length['|' | '|':_ <- r]
es la tercera dimensiónd3
.Las comprensiones de la lista de 2. y 3. se pueden acortar
1+sum[1|'-'<-x]
y1+sum[1|'|':_<-r]
crear una lista de las mismas para cada aparición de '-' o '|' y luego tomando la suma. Podemos poner aún más el exterior1+
en la lista por comprensión añadiendo-
ax
y"|"
ar
cedersum[1|'-'<-'-':x]
ysum[1|'|':_<-"|":r]
. Ahora podemos combinar ambas comprensiones de listas poniendo ambos predicados en la misma comprensión:sum[1|'|':_<-"|":r,'-'<-'-':x]
convenientemente, esto calcula exactamente el producto de las dos dimensiones porque para las listasF
yG
la siguiente comprensión de listas es el producto cartesianoF x G =[(a,b)|a<-F,b<-G]
.Finalmente, en lugar de multiplicar 1. con la combinación de 2. y 3. podemos usar el
>>
operador en las listas:F>>G
repite losG
length F
tiempos y concatena el resultado. Por lo tanto,fst(span(>'+')x)>>[1|'|':_<-"|":r,'-'<-'-':x]
repite la lista ded2*d3
losd1
tiempos, produciendo una lista ded1*d2*d3
los que luego se resumen para obtener el volumen.fuente
lines
.Java 8,
185129 bytesgracias a Zgarb por -56 bytes
golfizado:
sin golf:
Explicación
a*b*h = ((length_of_line-2*h-1)/2)*(number_of_lines-2*h-1)*h
donde
a
yb
son las dimensiones de la base yh
es la altura. Puede encontrarh
contando las primerash
líneas donde comienza con a.
.fuente
Java, 112 bytes
Expandido:
fuente
Powershell,
6867 bytesNota:
"$args"|% i*f +
es un atajo para"$args".indexOf('+')
Explicación
Buena explicación tomada de la respuesta de Osable :
Sea
W
yH
sea, respectivamente, el ancho y el alto de la entrada, no el cuadro. Luego, las dimensiones de la cajaA
,B
yC
siga estas reglas:La siguiente figura muestra lo que
A
,B
yC
son, en términos de nombres de borde:Y
C
es la posición del primero+
en la primera línea de la entrada.Script de prueba:
Salida:
fuente
Wolfram Language (Mathematica) , 64 bytes
Pruébalo en línea!
Utiliza el número de
.
,|
y\n
personajes de la entrada a resolver para el volumen. Parece estúpido porque hay una nueva línea real en lugar de\n
.Si
A
,B
yC
son los lados, entonces. = 2C(A+2C)
,| = 5B+4C-9
y\n = B+2C
, entonces podemos resolver el volumenABC
en términos de estos tres recuentos de caracteres.fuente