Construa um farol

8

No videogame Minecraft, você pode obter beacons e colocá-los em estruturas semelhantes a pirâmides para fornecer efeitos especiais, como aumento de velocidade ou salto.

Sua tarefa é, com efeito, construir a pirâmide de farol necessária para isso.

Existem vários tamanhos de pirâmides de farol, necessários para diferentes efeitos. O maior tem uma 9base de tamanho e o menor tem uma 3base de tamanho .

Estes são os efeitos que você pode obter e a pirâmide necessária para eles (conforme especificado no wiki oficial do 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

Os faróis são construídos com a base na parte inferior e, em seguida, aumentam, diminuindo o tamanho em 2. Quando atingimos 1, deve haver um farol +no topo.

Um farol é definido como um + , mas precisa de uma pirâmide de suporte para funcionar.

Você pode assumir que a entrada é válida (ou seja, é um dos efeitos especificados aqui) e, opcionalmente, você pode assumir que a entrada está toda em minúscula. O #personagem deve ser usado na pirâmide e+ como farol.

Exemplos:

Haste I
 +
###

Resistance I
  +
 ###
#####

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

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

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

Você também deve ter vários efeitos, pois as pirâmides de beacon podem compartilhar blocos - no entanto, um beacon não pode fazer mais de um efeito. Você deve usar blocos mínimos.

Ao realizar vários efeitos, você pode usar qualquer formato de entrada razoável, como uma lista, uma nova linha separada etc. Além disso, você pode usar uma lista de singleton para beacons únicos, se estiver usando listas.

Para esses exemplos, listo apenas uma solução possível, mas existem várias soluções aceitáveis.

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
   ++
  ####
 ######
########

(não coloque coisas entre parênteses, se isso não for óbvio o suficiente)

Okx
fonte
Parece que a maior parte desse desafio é sobre a combinação das pirâmides, mas você não descreve as regras para fazê-lo (se elas podem "compartilhar" blocos, por que não podemos apenas produzir o maior?). (Além disso, você dizer que "pode" tomar múltipla, quando eu acho que você quer dizer "deve ser capaz de")
Jonathan Allan
@JonathanAllan Esclarecido.
Okx
Não, eu ainda não sei a regra para combinar ...
Jonathan Allan
@ JonathanAllan Eu disse que um farol não pode fazer mais do que um efeito. Isso não está claro o suficiente?
Okx
3
Quando olhei pela primeira vez, pensei que seria trivial e depois vi a parte de ter vários efeitos de farol. : P
HyperNeutrino

Respostas:

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]))

Experimente online!

A função para imprimir a string com a estrutura da pirâmide é b , chamada com uma lista dos efeitos como seu argumento único.

Isso acabou por mais tempo do que eu esperava, mas pelo menos fiquei feliz por encontrar o tamanho do farol com base na magia negra.

Edit: conseguiu reduzir significativamente a contagem de bytes combinando a função de redução em um lambdaagradecimento à cmpfunção do Python 2 .

notjagan
fonte
4
Bem feito em seu magia negra;)
Okx
7

Carvão , 75 71 60 54 48 bytes

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

Experimente online!

A resposta Python também é minha, mas eu queria tentar minha primeira finalização de golfe em Charcoal!

Eu também queria ter certeza de que posso segurar essa 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 os nomes de beacon do mesmo comprimento compartilham um nível de beacon. Assim, podemos determinar o nível de sinal de um efeito, mapeando o comprimento (menos 7 para basear em zero) para os números na sequência "14034244" (existe um 0 para maior clareza, porque o comprimento 9 não corresponde a um efeito ) Essa mesma idéia é usada na minha resposta em Python, mas com deslocamento de bits para produzir os números de 0 a 3.

notjagan
fonte
1
Obrigado por usar o carvão vegetal! Além disso, eu recomendo adicionando a -abandeira para imprimir a AST se você quiser um tipo de explicação na ligação TIO bem
ASCII-only
1
Além disso, de 48 bytes , a partir mudando a entrada para a variável do operador nilary entrada
ASCII somente
1
Observe que estarei atualizando em breve, portanto WS⊞υI§14034244⁻Lι⁷F▷sυ«G→→↖⁺ι¹#¦+Mι↙será válido, portanto, lembre-se disso υe ▷sserá novo
somente ASCII
Muito obrigado pelas dicas! Estou ansioso para jogar mais em Charcoal: D
notjagan
2

Geléia , 68 bytes

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

Experimente online!

Eu acho que a razão pela qual isso é mais longo que a resposta do carvão vegetal (embora eu tenha sido capaz de fazer minha 'magia negra' em 10 bytes) é porque o carvão vegetal foi construído para o desenho bidimensional. Eu terminei dependendo de um autômato celular 2D para encontrar as posições de #s dadas as posições de +s para criar triângulos.

Como funciona (link principal dividido para facilitar a leitura)

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
fonte