Coccinelles symétriques

22

Introduction:

Lorsque nous pensons aux coccinelles, nous pensons généralement à un insecte rouge ou orange foncé avec des taches noires. Bien que cela ne soit pas nécessairement vrai, car il existe également des coccinelles tachetées de rouge / orange ou des coccinelles sans taches , nous imaginons principalement des coccinelles quelque chose comme cette coccinelle asiatique:

entrez la description de l'image ici

Une autre chose à noter est que les taches sur les coccinelles sont presque toujours symétriques. Et c'est là que ce défi entre en jeu.

Défi:

Étant donné un entier n( >= 0), sortez une ou plusieurs fois la coccinelle ASCII-art suivante, avec des taches symétriques réparties également entre les deux côtés, ainsi que les deux coccinelles ou plus.

Voici la disposition par défaut des coccinelles:

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

Si n=0, nous sortons la coccinelle ci-dessus telle quelle.

Quand nest plus grand que zéro, nous remplissons soit les espaces du bug ASCII-art avec des minuscules o, soit nous remplaçons ceux |du centre par des majuscules O. Le but est d'apporter des nmodifications aux coccinelles «vides», tout en produisant une sortie symétrique (par coccinelle), et en produisant le moins de coccinelles possible.

Les sorties valides pour n=1sont donc:

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

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

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

Mais cela serait invalide:

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

Les sorties valides pour n=2sont:

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

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

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

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

etc. There are a lot of possible outputs.

La première nqui n'est plus possible de s'intégrer dans une seule coccinelle est n=24. Dans ce cas, vous devrez le diviser aussi uniformément que possible en deux coccinelles (vous pouvez choisir de les afficher côte à côte ou sous l'une l'autre - avec éventuellement un espace ou une nouvelle ligne entre elles). Par exemple:

    _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/
  ''-!-''

Règles du défi:

  • nsera de l'ordre de 0-1000.
  • Vous pouvez choisir de sortir vers STDOUT, de retourner sous forme de chaîne ou de tableau / liste de caractères 2D, etc. Votre appel.
  • Les nouvelles lignes ou les espaces blancs inutiles ne sont pas autorisés. Les espaces blancs à la fin et une seule nouvelle ligne à la fin sont autorisés.
  • Comme mentionné ci-dessus, lorsque deux ou plusieurs coccinelles sont nécessaires, vous pouvez choisir de les produire côte à côte ou en dessous l'une de l'autre (ou un mélange des deux ..)
  • Lorsque deux ou plusieurs coccinelles sont imprimées côte à côte, un seul espace facultatif entre les deux est autorisé. Lorsque deux ou plusieurs coccinelles sont imprimées l'une sur l'autre, une seule nouvelle ligne facultative entre les deux est autorisée.
  • Vous pouvez choisir la disposition des coccinelles à n'importe quelle étape de la séquence, à condition qu'elles soient symétriques et égales à l'entrée n.
  • Puisque le but est d'avoir des nchangements ET aussi peu de coccinelles que possible, vous commencerez à utiliser plus d'une coccinelle au-dessus n=23. La disposition de ces coccinelles ne doit pas nécessairement être la même. En fait, ce n'est même pas possible pour certaines entrées, comme n=25ou n=50pour n'en nommer que deux.
  • De plus, il n'est parfois pas possible de répartir également les points entre deux coccinelles ou plus. Dans ce cas, vous devrez les diviser aussi uniformément que possible, avec au plus une différence de 1 entre eux.

Donc n=50, en gardant à l'esprit les deux dernières règles, ce serait une sortie possible valide (où le premier bogue a 16 points et les deux autres 17):

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

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, fonctions / méthode avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code.
  • Veuillez également ajouter une explication si nécessaire.
Kevin Cruijssen
la source
Que voulez-vous dire par "le moins de changements possible" à la coccinelle vide? Lorsque vous placez n (<24) lettres o / O sur une seule coccinelle, vous y apportez n modifications. Ou voulez-vous dire des changements de n-1 à n (donc les sorties varient le moins possible lorsque les entrées varient de 1)?
Heimdall
@Heimdall Ah désolé pour la confusion due à une mauvaise formulation. C'est à ce moment-là que j'ai eu l'idée de permettre à plusieurs personnages de former un seul endroit quand j'ai pensé à ce défi, mais j'ai abandonné cela et je l'ai simplement utilisé oet à la Oplace. J'ai un peu changé le libellé.
Kevin Cruijssen
Pour l' n=50exemple, je pense que vous voulez dire que le premier bogue a 16 taches et les deux autres en ont 17.
Jon Claus
Ceci est mon album préféré de Jimi Hendrix.
Rétablir Monica - notmaynard
@iamnotmaynard Peut-être que je manque quelque chose d'évident, ou avez-vous commenté le mauvais défi? Je ne vois pas vraiment le lien entre Jimi Hendrix et les coccinelles ..
Kevin Cruijssen

Réponses:

5

Fusain , 84 81 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

Nθ

Saisissez le nombre total de spots.

≔⌈∕∨θ¹¦²³η

Calculez le nombre de coccinelles nécessaires.

Fη«

Faites une boucle sur chaque coccinelle.

≔⁺÷θη‹ι﹪θηζ

Calculez le nombre de taches à mettre sur cette coccinelle.

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

Imprimez la tête et l'aile droite de la coccinelle.

↑⎇›ζ²¹OO²

S'il y a plus de 21 points, imprimez deux points, sinon imprimez le verso.

§|Oζ

Si le nombre de taches est impair, imprimez une autre tache, sinon imprimez le reste du dos.

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

Divisez le nombre de spots par deux et répartissez-les sur trois rangées de 3, 4 et 3 spots.

↙»

Passez au début de la prochaine coccinelle.

‖B←

Réfléchissez la toile vers la gauche, en gardant le dos.

Neil
la source
8

Python 2 , 252 249 238 212 211 213 209 octets

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

Essayez-le en ligne!

  • 9 octets enregistrés grâce à Kevin Cruijssen
  • Enregistré 18 octets grâce à M. Xcoder
  • Enregistré 2 octets grâce à Jonathan Frech
TFeld
la source
Je pense que vous pouvez supprimer .replace('A','|O'[b%2])et utiliser à la c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"place?
Kevin Cruijssen
230 octets en se transformant [' o','|O'][i>9]en ' |oO'[i>9::2]et en utilisant |au lieu de logique ou. Passant également for i in range(11)à une execinstruction enregistré 4 octets.
M. Xcoder
1
Et désolé pour l'encombrement des commentaires, mais 218 octets en mélangeant votre compréhension de liste avec la forboucle, supprimant également une variable inutile.
M. Xcoder
@ Mr.Xcoder Merci beaucoup :)
TFeld
C'est censé produire le moins de coccinelles possible, non? Quand je mets de 24 à 46 sur TIO, cela donne 3 coccinelles au lieu de deux.
Nick Matteo
7

JavaScript (ES6), 183 186 octets

Utilise la même formule que la réponse de TFeld pour partager les taches entre les coccinelles.

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)

Démo

Arnauld
la source
6

Befunge, 292 279 octets

#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

Essayez-le en ligne!

Explication

L'art ASCII pour la coccinelle est codé dans une seule chaîne Befunge, décalée de 15, pour permettre aux 15 premiers caractères imprimables d'être réservés à des fins spéciales. Les deux premiers de ces caractères spéciaux représentent la nouvelle ligne et le |caractère, qui, autrement, ne seraient pas imprimables. Le troisième n'est pas utilisé, car c'est un ", qui ne peut pas être utilisé dans une chaîne. Les deux suivants représentent les grandes taches au centre. Et les dix autres sont pour les taches sur les ailes.

Ces caractères spéciaux sont traduits dans leur forme finale via une table de recherche, qui est écrite sur la première partie de la première ligne.

Pour le rendre plus facile à expliquer, voici le code avec les différents composants mis en évidence:

Code source avec les chemins d'exécution mis en évidence

*Nous commençons par initialiser la nouvelle ligne et le |caractère dans la table de recherche, car ils sont constants.
*Ensuite, nous lisons le nombre de taches de stdin et calculons le nombre de coccinelles nécessaires.
*Nous pouvons ensuite démarrer la boucle externe pour l'ensemble des bogues, en calculant le nombre de taches pour la prochaine coccinelle à rendre.
*Pour chaque coccinelle, nous calculons si le grand point central doit être affiché (si spots%2 == 1), et écrivons la valeur appropriée dans la table de recherche.
*De même, nous calculons si l'autre paire de grands spots doit être affichée (si spots/2 > 10), mettant à jour à nouveau la table de recherche. Nous calculons également les taches restantes requises sur chaque aile.
*La dernière partie de l'initialisation de la table de recherche est une boucle qui calcule quels petits points doivent être affichés. Essentiellement, l'algorithme est: si (spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10, alors le spot doit être affiché.
*Ensuite, nous poussons la représentation de chaîne codée de la coccinelle sur la pile. Il s'agit essentiellement d'une simple chaîne, mais elle est devenue un peu compliquée alors que j'essayais de la presser dans les lacunes du code afin que la source forme un rectangle.
*À ce stade, nous sommes prêts à commencer la boucle de sortie, en traitant les caractères un par un, en convertissant les cas spéciaux (les taches, les sauts de ligne, etc.) via la table de recherche précédemment construite.
*Enfin, nous vérifions si nous avons affiché toutes les coccinelles requises, sinon revenons au début de la boucle externe.

James Holderness
la source
Bien, j'aime vraiment les motifs que vos coccinelles ont pour chaque étape de 1-23. Assez différent de certaines des autres réponses. +1 de moi. Pourriez-vous ajouter une explication (après avoir peut-être fini de jouer au golf)?
Kevin Cruijssen
1
Je suis content que vous ayez aimé les motifs. En fait, j'ai passé beaucoup de temps à essayer les différentes combinaisons pour trouver un algorithme qui avait l'air bien dans autant d'étapes que possible. J'ai également ajouté une explication à ma réponse maintenant.
James Holderness
3

Rubis , 203 193 190 octets

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}

Essayez-le en ligne!

  • 10 octets enregistrés grâce à Jordan
Réintégrer Monica - notmaynard
la source
{|m|m.peut être remplacé par {$&.; b=(n-1)/23+1peut être remplacé par b=1+~-n/23; et x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}peut être remplacé par x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Jordan
Vous pouvez enregistrer un autre octet en utilisant %q{XY}au lieu de 'X'+"Y"sur les huit premières lignes et quelques autres en faisant à la d=n>0?n/(b=1+~-n/23):b=0place de n>0?d=n/(b=(n-1)/23+1):d=b=0.
Jordan
@ Jordan Wow, merci.
Rétablir Monica - notmaynard