Construye una baliza

8

En el videojuego Minecraft, puedes obtener balizas y colocarlas en estructuras piramidales para obtener efectos especiales, como la velocidad o el impulso de salto.

Su tarea es, dado un efecto, construir la pirámide de baliza requerida para ello.

Hay múltiples tamaños de pirámides de baliza, necesarios para diferentes efectos. El más grande tiene una 9base de tamaño y el más pequeño tiene una 3base de tamaño .

Estos son los efectos que puede obtener y la pirámide requerida para ellos (como lo especifica la wiki oficial de Minecraft:

3:
  Speed I
  Haste I
5:
  Resistance I
  Jump Boost I
7:
  Strength I
9:
  Regeneration I
  Resistance II
  Jump Boost II
  Speed II
  Haste II
  Strength II

Las balizas se construyen con la base en la parte inferior, luego sube, disminuyendo el tamaño en 2. Una vez que golpeamos 1, debería haber una baliza +en la parte superior.

Una baliza se define como a +, pero necesita una pirámide de soporte para funcionar.

Puede suponer que la entrada es válida (es decir, es uno de los efectos especificados aquí) y, opcionalmente, puede suponer que la entrada está en minúsculas. El #personaje debe usarse en la pirámide y +como el faro.

Ejemplos:

Haste I
 +
###

Resistance I
  +
 ###
#####

Strength I
   +
  ###
 #####
#######

Regeneration I
    +
   ###
  #####
 #######
#########

Speed II
    +
   ###
  #####
 #######
#########

También debe tomar múltiples efectos ya que las pirámides de baliza pueden compartir bloques; sin embargo, una baliza no puede hacer más de un efecto. Debes usar bloques mínimos.

Al tomar múltiples efectos, puede usar cualquier formato de entrada razonable, como una lista, nueva línea separada, etc. Además, puede tomar una lista singleton para balizas individuales si está usando listas.

Para estos ejemplos, solo enumero una solución posible, pero hay varias soluciones aceptables.

Speed I, Haste II
    ++
   ####
  #####
 #######
#########
(another acceptable solution is the following,
these are both valid as they use the same amount of blocks)
    +
   ###
  #####
 #######+
##########
(the following is not valid for the same input; it doesn't use minimal blocks)
    +
   ###
  #####           +
 #######         ###
#########

Strength I, Strength I
   ++
  ####
 ######
########

(no muestre las cosas entre paréntesis, si eso no es lo suficientemente obvio)

Okx
fuente
Parece que la mayor parte de este desafío se trata de la combinación de las pirámides, pero no se describen las reglas para hacerlo (si pueden "compartir" bloques, ¿por qué no podemos simplemente generar el más grande?). (También dice que "podemos" tomar múltiples, cuando creo que quiere decir "debe poder")
Jonathan Allan
@JonathanAllan aclaró.
Okx
No, todavía no conozco la regla para combinar ...
Jonathan Allan
@ JonathanAllan Dije que una baliza no puede hacer más de un efecto. ¿No es eso lo suficientemente claro?
Okx
3
Cuando vi esto por primera vez, pensé que sería trivial, y luego vi la parte de tener múltiples efectos de baliza. : P
HyperNeutrino

Respuestas:

9

Python 2 , 216 195 bytes

def b(e):s=sorted(63372>>len(_)*2-14&3for _ in e)[::-1];f=s[0]+2;r=range(f);print"\n".join(reduce(lambda p,n:[p[i]+"+# "[cmp(i,f-n-2)]for i in r],s[1:],[" "*(f-i-1)+"+#"[i>0]*(2*i+1)for i in r]))

Pruébalo en línea!

La función para imprimir la cadena con la estructura piramidal es b, que se llama con una lista de los efectos como argumento único.

Esto resultó más tiempo de lo que esperaba, pero al menos estaba feliz de haber podido encontrar el tamaño del faro basado en la magia negra.

Editar: fue capaz de reducir el recuento de bytes significativamente combinando la función de reducción en un lambdagracias a la cmpfunción de Python 2 .

notjagan
fuente
44
Bien hecho en tu magia negra;)
Okx
7

Carbón , 75 71 60 54 48 bytes

A⟦⟧βWS⊞βI§14034244⁻Lι⁷FUPsorted⟦β⟧«G→→↖⁺ι¹#¦+Mι↙

Pruébalo en línea!

La respuesta de Python también es mía, ¡pero quería probar mi primera presentación de golf en Charcoal!

También quería asegurarme de poder mantener esa recompensa;)

A⟦⟧β                        assign an empty list to β
WS                         while the next string input ι is truthy: (aka while the input is not an empty line)
    ⊞βI§14034244⁻Lι⁷       push level for ι into β (explained below)
FUPsorted⟦β⟧«             for each level ι in the sorted version of β:
    G→→↖⁺ι¹#                draw a triangle of "#"s with side lengths ι + 1
    ¦+                       draw a "+" (already on top vertex)
    Mι↙                     move down and left by ι cells (preparation for next level)
                             implicit end of for

Todos los nombres de baliza de la misma longitud comparten un nivel de baliza. Como tal, podemos determinar el nivel de baliza de un efecto al mapear la longitud (menos 7 para basarlo en cero) a los números en la cadena "14034244" (hay un 0 para mayor claridad porque la longitud 9 no corresponde a un efecto ) Esta misma idea se usa en mi respuesta de Python, pero con un poco de desplazamiento para producir los números 0-3.

notjagan
fuente
1
¡Gracias por usar carbón! Además, recomendaría agregar la -abandera para imprimir el AST si desea una especie de explicación en el enlace TIO también
solo ASCII
1
Además, 48 bytes , desde el cambio de la entrada a la variable al operador nilary de entrada
solo ASCII
1
Tenga en cuenta, voy a estar actualizando pronto, así que WS⊞υI§14034244⁻Lι⁷F▷sυ«G→→↖⁺ι¹#¦+Mι↙será válida para que tenga en cuenta que υy ▷sserá nuevo
ASCII de sólo
Muchas gracias por los consejos! Espero jugar más al golf en carbón: D
notjagan
2

Jalea , 68 bytes

FṀ‘
0;Ṗ
|Ç€|Ḋ€Ç|
⁽lƑb4‘ị@L€ṢµI‘ż@IṚṭṀṭ0Fs2+\µḅÑ‘Ṭ;0sѵ+ÇÐLị“#+ ”Y;”#

Pruébalo en línea!

Creo que la razón por la que esto es más largo que la respuesta de Carboncillo (aunque pude hacer mi 'magia negra' en 10 bytes) es porque el Carboncillo se construyó para el dibujo bidimensional. Terminé dependiendo de un autómata celular 2D para encontrar las posiciones de #s dadas las posiciones de +s para crear triángulos.

Cómo funciona (enlace principal dividido para facilitar la lectura)

FṀ‘
0;Ṗ
|Ç€|Ḋ€Ç|
⁽lƑb4‘ị@L€ṢµI‘ż@IṚṭṀṭ0Fs2+\µḅÑ‘Ṭ;0sѵ+ÇÐLị“#+ ”Y;”# - Main link, input is list of strings
⁽lƑb4‘ị@L€Ṣ     - list of strings to list of heights (1,2,3,4)
⁽lƑ               - the number 28147
   b4‘            - base 4 and incremented: [2, 3, 4, 2, 4, 4, 1, 4]
        L€        - lengths of each input string
      ị@          - index into the list to get a list of heights
          Ṣµ      - sort and store for the next link:
I‘ż@IṚṭṀṭ0Fs2+\ - get list of coordinates for `+`s
I‘ż@I             - [0,1] between each element. Add [1,1]*n between each pair of elements with difference n
     Ṛ            - Reverse
      ṭṀṭ0        - prepend [0,maximum]
          Fs2     - format the array as a list of coordinate pairs
             +\   - cumulative sum
ḅÑ‘Ṭ;0sÑ        - convert to binary rectangular matrix:
ḅÑ‘               - change each coordinate pair (y,x) to y*width+x (Ñ is the width)
   Ṭ              - boolean array with 1s at the above indices
    ;0            - append a zero for formatting reasons
      sÑ          - split into rows of the right width
µ+ÇÐL           - add locations of `#`s:  the matrix now has 2s at future `+`s, 1s at `#`s, and `0`s at spaces
  ÇÐL             - repeatedly apply a step of the cellular automoton: 1s at `#`s and `+`s, and 0s at space
µ+                - add this to the matrix of `+`s which has 1s at `+`s.
ị“#+ ”Y;”#      - format into a string
ị“#+ ”            - index into the string "#+ ".
      Y           - join by newlines.
       ;”#        - append a `#` character to finish up the formatting.
fireflame241
fuente