Joaninhas simétricas

22

Introdução:

Quando pensamos em joaninhas, geralmente pensamos em um bug vermelho ou laranja escuro com manchas pretas. Embora isso não seja necessário, como também existem pretos com joaninhas manchadas de vermelho / laranja ou joaninhas sem manchas , imaginamos principalmente joaninhas algo como esta joaninha asiática:

insira a descrição da imagem aqui

Outra coisa a notar é que as manchas nas joaninhas são quase sempre simétricas. E é aí que entra esse desafio.

Desafio:

Dado um número inteiro n( >= 0), produza a joaninha ASCII a seguir uma ou várias vezes, com pontos simétricos divididos igualmente entre os dois lados, bem como as duas ou mais joaninhas.

Aqui está o layout padrão da joaninha:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

Se n=0, produzimos a joaninha acima como está.

Quando né maior que zero, preenchemos os espaços do bug da arte ASCII com uma minúscula oou substituímos o |no centro por uma capital O. O objetivo é fazer nalterações nas joaninhas 'vazias', enquanto ainda produz uma saída simétrica (por joaninha) e produzir o mínimo possível de joaninhas.

As saídas tão válidas para n=1são:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

Mas isso seria inválido:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

As saídas válidas para n=2são:

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

O primeiro nque não é mais possível encaixar em uma única joaninha é n=24. Nesse caso, você terá que dividi-lo o mais uniformemente possível em duas joaninhas (você pode optar por produzi-las uma perto da outra ou uma debaixo da outra - com opcionalmente um espaço ou uma nova linha entre elas). Por exemplo:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

OU:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

Regras do desafio:

  • nestará na faixa de 0-1000.
  • Você pode optar por enviar para STDOUT, retornar como String ou matriz / lista de caracteres 2D, etc. Sua chamada.
  • Não são permitidas novas linhas de frente ou espaços em branco desnecessários. Espaços em branco à direita e uma única linha nova à direita são permitidos.
  • Como mencionado acima, quando duas ou mais joaninhas são necessárias, você pode optar por produzi-las uma perto da outra ou uma abaixo da outra (ou uma mistura de ambas ..)
  • Quando duas ou mais joaninhas são impressas uma ao lado da outra, é permitido um único espaço opcional no meio. Quando duas ou mais joaninhas são impressas uma na outra, é permitida uma única nova linha opcional intermediária.
  • Você pode escolher o layout das joaninhas em qualquer etapa da sequência, desde que simétricas e iguais à entrada n.
  • Como o objetivo é ter nalterações E o menor número possível de joaninhas, você começará a usar mais de uma joaninha quando estiver acima n=23. O layout dessas joaninhas não precisa ser o mesmo. De fato, isso nem é possível para algumas entradas, como n=25ou n=50para citar duas.
  • Além disso, às vezes não é possível dividir os pontos uniformemente entre duas ou mais joaninhas. Nesse caso, você terá que dividi-los o mais uniformemente possível, com no máximo uma diferença de 1 entre eles.

Portanto n=50, mantendo as duas últimas regras em mente, essa seria uma saída possível válida (onde o primeiro bug tem 16 pontos e os outros dois têm 17):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.
Kevin Cruijssen
fonte
O que você quer dizer com "o mínimo de alterações possível" na joaninha vazia? Ao colocar n (<24) letras o / O em uma única joaninha, você faz n alterações. Ou você quer dizer mudanças de n-1 para n (para que as saídas variem o mínimo possível quando as entradas variam 1)?
precisa
@ Heimdall Sinto muito pela confusão causada por palavras erradas. Isso foi quando eu tive a idéia de permitir que vários personagens para formar um ponto quando eu pensei deste desafio, mas eu deixei cair este e apenas usado oe Oem vez disso. Eu mudei um pouco a redação.
21417 Kevin Smithijssen #
Para o n=50exemplo, eu acredito que você quer dizer o primeiro bug tem 16 pontos e os outros dois cada um tem 17.
Jon Claus
Este é o meu álbum favorito de Jimi Hendrix.
Reintegrar Monica iamnotmaynard
@iamnotmaynard Talvez eu esteja perdendo algo óbvio, ou você comentou sobre o desafio errado? Eu realmente não ver a ligação entre Jimi Hendrix e joaninhas ..
Kevin Cruijssen

Respostas:

5

Carvão , 84 81 bytes

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

Experimente online! Link é a versão detalhada do código. Explicação:

Nθ

Insira o número total de pontos.

≔⌈∕∨θ¹¦²³η

Calcule o número de joaninhas necessárias.

Fη«

Laço sobre cada joaninha.

≔⁺÷θη‹ι﹪θηζ

Calcule o número de pontos para colocar nesta joaninha.

V_¶I@)↘²↙|/←''-↑!

Imprima a cabeça e a asa direita da joaninha.

↑⎇›ζ²¹OO²

Se houver mais de 21 pontos, imprima dois pontos, caso contrário, imprima o verso.

§|Oζ

Se o número de pontos for ímpar, imprima outro ponto, caso contrário, imprima o restante das costas.

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

Divida o número de pontos por dois e distribua-os entre três linhas de 3, 4 e 3 pontos.

↙»

Vá para o início da próxima joaninha.

‖B←

Reflita a tela para a esquerda, mantendo as costas.

Neil
fonte
8

Python 2 , 252 249 238 212 211 213 209 bytes

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

Experimente online!

  • Guardado 9 bytes graças a Kevin Cruijssen
  • Economizou 18 bytes graças ao Sr. Xcoder
  • Economizou 2 bytes graças a Jonathan Frech
TFeld
fonte
Eu acho que você pode remover o .replace('A','|O'[b%2])e usar em c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"vez disso?
Kevin Cruijssen
230 bytes , transformando [' o','|O'][i>9]em ' |oO'[i>9::2]e usando em |vez de lógico ou. Também virar for i in range(11)para uma execinstrução salva 4 bytes.
Mr. Xcoder
1
E desculpe pela confusão de comentários, mas 218 bytes , misturando a compreensão da sua lista com o forloop, removendo também uma variável desnecessária.
Xcoder
@ Mr.Xcoder Muito obrigado :) #
TFeld 2/17
É suposto produzir o menor número possível de joaninhas, não? Quando coloco 24 a 46 no TIO, ele fornece três joaninhas em vez de duas.
Nick Matteo
7

JavaScript (ES6), 183 186 bytes

Usa a mesma fórmula da resposta de TFeld para dividir os pontos entre as joaninhas.

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

Demo

Arnauld
fonte
6

Befunge, 292 279 bytes

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

Experimente online!

Explicação

A arte ASCII da joaninha é codificada em uma única string Befunge, deslocada em 15, para permitir que os 15 primeiros caracteres imprimíveis sejam reservados para fins especiais. Os dois primeiros desses caracteres especiais representam a nova linha e o |caractere, que de outra forma não seriam imprimíveis. O terceiro não é usado, porque é um ", que não pode ser usado em uma string. Os próximos dois representam os grandes pontos no centro. E os dez restantes são para os pontos nas asas.

Esses caracteres especiais são traduzidos para sua forma final por meio de uma tabela de pesquisa, escrita sobre a primeira parte da primeira linha.

Para facilitar a explicação, este é o código com as várias partes componentes destacadas:

Código fonte com caminhos de execução destacados

*Começamos inicializando a nova linha e o |caractere na tabela de pesquisa, pois eles são constantes.
*Em seguida, lemos o número de pontos do stdin e calculamos o número de joaninhas necessárias.
*Podemos então iniciar o loop externo para o conjunto de bugs, calculando o número de pontos para a próxima joaninha a ser renderizada.
*Para cada joaninha, calculamos se o ponto central grande precisa ser mostrado (se spots%2 == 1) e gravamos o valor apropriado na tabela de pesquisa.
*Da mesma forma, calculamos se o outro par de pontos grandes precisa ser mostrado (se spots/2 > 10), atualizando novamente a tabela de pesquisa. Também calculamos os pontos restantes necessários em cada asa.
*A parte final da inicialização da tabela de pesquisa é um loop que calcula quais dos pequenos pontos precisam ser exibidos. Essencialmente, o algoritmo é: se (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10, então o local precisa ser exibido.
*Em seguida, colocamos a representação em cadeia codificada da joaninha na pilha. Essa é essencialmente uma string simples, mas ficou um pouco complicada quando tentei comprimir as lacunas do código para que a fonte formasse um retângulo.
*Neste ponto, estamos prontos para iniciar o loop de saída, processando os caracteres um por um, convertendo os casos especiais (os pontos, quebras de linha etc.) por meio da tabela de pesquisa construída anteriormente.
*Finalmente, verificamos se exibimos todas as joaninhas necessárias, caso contrário, continuamos de volta ao início do loop externo.

James Holderness
fonte
Bom, eu realmente gosto dos padrões de suas joaninhas para cada estágio, de 1 a 23. Muito diferente do que algumas das outras respostas. +1 de mim. Você se importaria de adicionar uma explicação (depois de terminar de jogar mais)?
55517 Kevin Smithijssen #
1
Estou feliz que você tenha gostado dos padrões. Na verdade, passei bastante tempo testando as diferentes combinações para encontrar um algoritmo que parecesse bom no maior número possível de estágios. Também adicionei um pouco de explicação à minha resposta agora.
21417 James Bonderness
3

Rubi , 203 193 190 bytes

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

Experimente online!

  • Economizou 10 bytes graças a Jordan
Restabelecer Monica iamnotmaynard
fonte
{|m|m.pode ser substituído por {$&.; b=(n-1)/23+1pode ser substituído por b=1+~-n/23; e x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}pode ser substituído por x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Jordan
Você pode salvar outro byte usando em %q{XY}vez de 'X'+"Y"nas oito primeiras linhas e mais algumas fazendo em d=n>0?n/(b=1+~-n/23):b=0vez de n>0?d=n/(b=(n-1)/23+1):d=b=0.
Jordan
@ Jordan Wow, obrigado.
Reintegrar Monica iamnotmaynard