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:
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 o
ou substituímos o |
no centro por uma capital O
. O objetivo é fazer n
alteraçõ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=1
sã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=2
sã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 n
que 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:
n
estará na faixa de0-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
n
alterações E o menor número possível de joaninhas, você começará a usar mais de uma joaninha quando estiver aciman=23
. O layout dessas joaninhas não precisa ser o mesmo. De fato, isso nem é possível para algumas entradas, comon=25
oun=50
para 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 é código-golfe , 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.
o
eO
em vez disso. Eu mudei um pouco a redação.n=50
exemplo, eu acredito que você quer dizer o primeiro bug tem 16 pontos e os outros dois cada um tem 17.Respostas:
Carvão ,
8481 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Insira o número total de pontos.
Calcule o número de joaninhas necessárias.
Laço sobre cada joaninha.
Calcule o número de pontos para colocar nesta joaninha.
Imprima a cabeça e a asa direita da joaninha.
Se houver mais de 21 pontos, imprima dois pontos, caso contrário, imprima o verso.
Se o número de pontos for ímpar, imprima outro ponto, caso contrário, imprima o restante das costas.
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.
Reflita a tela para a esquerda, mantendo as costas.
fonte
Python 2 ,
252249238212211213209 bytesExperimente online!
fonte
.replace('A','|O'[b%2])
e usar emc=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"
vez disso?[' o','|O'][i>9]
em' |oO'[i>9::2]
e usando em|
vez de lógico ou. Também virarfor i in range(11)
para umaexec
instrução salva 4 bytes.for
loop, removendo também uma variável desnecessária.JavaScript (ES6),
183186 bytesUsa a mesma fórmula da resposta de TFeld para dividir os pontos entre as joaninhas.
Demo
Mostrar snippet de código
fonte
Befunge,
292279 bytesExperimente 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:
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.
fonte
Rubi ,
203193190 bytesExperimente online!
fonte
{|m|m.
pode ser substituído por{$&.
;b=(n-1)/23+1
pode ser substituído porb=1+~-n/23
; ex=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}
pode ser substituído porx=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}
.%q{XY}
vez de'X'+"Y"
nas oito primeiras linhas e mais algumas fazendo emd=n>0?n/(b=1+~-n/23):b=0
vez den>0?d=n/(b=(n-1)/23+1):d=b=0
.