Symmetrische Marienkäfer

22

Einführung:

Wenn wir an Marienkäfer denken, denken wir normalerweise an einen roten oder dunkelorangen Käfer mit schwarzen Flecken. Obwohl dies nicht unbedingt erforderlich ist, da es auch schwarz mit rot / orange gefleckten Marienkäfern oder Marienkäfer ohne Flecken gibt , stellen wir uns hauptsächlich Marienkäfer wie diesen asiatischen Marienkäfer vor:

Bildbeschreibung hier eingeben

Ebenfalls zu beachten ist, dass die Flecken auf den Marienkäfern fast immer symmetrisch sind. Und hier kommt diese Herausforderung ins Spiel.

Herausforderung:

Geben Sie mit einer Ganzzahl n( >= 0) den folgenden ASCII-Marienkäfer ein- oder mehrmals aus, wobei die symmetrischen Punkte gleichmäßig zwischen den beiden Seiten sowie den zwei oder mehr Marienkäfern aufgeteilt sind.

Hier ist das Standard-Marienkäfer-Layout:

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

Wenn n=0ja, geben wir den Marienkäfer so aus, wie er ist.

Wenn ngrößer als Null ist, füllen wir entweder die Leerzeichen des ASCII-art-Fehlers mit Kleinbuchstaben aus ooder ersetzen die |in der Mitte mit einem Großbuchstaben O. Das Ziel ist es, nÄnderungen an den 'leeren' Marienkäfern vorzunehmen, während immer noch eine symmetrische Ausgabe (pro Marienkäfer) erzeugt wird und so wenig Marienkäfer wie möglich ausgegeben werden.

Gültige Ausgaben für n=1sind also:

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

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

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

Das wäre aber ungültig:

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

Gültige Ausgaben für n=2sind:

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

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

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

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

etc. There are a lot of possible outputs.

Das erste n, das nicht mehr in einen einzelnen Marienkäfer passt, ist n=24. In diesem Fall müssen Sie es so gleichmäßig wie möglich in zwei Marienkäfer aufteilen (Sie können wählen, ob Sie sie nebeneinander oder untereinander ausgeben möchten - wahlweise mit einem Leerzeichen oder einer neuen Zeile dazwischen). Beispielsweise:

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

ODER:

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

Herausforderungsregeln:

  • nwird im Bereich von liegen 0-1000.
  • Sie können wählen, ob Sie auf STDOUT ausgeben, als String oder als 2D-Zeichen-Array / -Liste usw. zurückkehren möchten. Ihr Anruf.
  • Das Setzen von Zeilenumbrüchen oder unnötigen Leerzeichen ist nicht zulässig. Es sind abschließende Leerzeichen und eine einzelne abschließende neue Zeile zulässig.
  • Wie oben erwähnt, können Sie, wenn zwei oder mehr Marienkäfer erforderlich sind, wählen, ob Sie diese nebeneinander oder untereinander (oder in einer Mischung aus beiden) ausgeben möchten.
  • Wenn zwei oder mehr Marienkäfer nebeneinander gedruckt werden, ist ein einzelnes optionales Leerzeichen dazwischen zulässig. Wenn zwei oder mehr Marienkäfer aufeinander gedruckt werden, ist eine einzelne optionale Zeile dazwischen zulässig.
  • Sie können das Layout der Marienkäfer in jedem Schritt der Sequenz auswählen, sofern sie symmetrisch und eingabeberecht sind n.
  • Da das Ziel darin besteht, nÄnderungen UND so wenig Marienkäfer wie möglich zu haben, werden Sie oben mehr als einen Marienkäfer verwenden n=23. Das Layout dieser Marienkäfer muss nicht unbedingt gleich sein. Tatsächlich ist dies nicht einmal für einige Eingaben möglich, wie zum Beispiel n=25oder n=50um zwei zu nennen.
  • Außerdem ist es manchmal nicht möglich, die Punkte gleichmäßig auf zwei oder mehr Marienkäfer aufzuteilen. In diesem Fall müssen Sie sie so gleichmäßig wie möglich aufteilen, mit einem Unterschied von höchstens 1 zwischen ihnen.

Unter n=50Berücksichtigung der letzten beiden Regeln wäre dies eine gültige Ausgabe (wobei der erste Fehler 16 Stellen hat und die anderen beiden 17):

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

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.
Kevin Cruijssen
quelle
Was meinst du mit "so wenig Änderungen wie möglich" an dem leeren Marienkäfer? Wenn Sie n (<24) Buchstaben o / O auf einen einzelnen Marienkäfer legen, nehmen Sie n Änderungen daran vor. Oder meinst du Änderungen von n-1 zu n (also variieren die Ausgaben so wenig wie möglich, wenn die Eingaben um 1 variieren)?
Heimdall
@Heimdall Ah sorry für die Verwirrung wegen falscher Formulierung. Dies war der Zeitpunkt, an dem ich die Idee hatte, mehreren Charakteren zu erlauben, einen Punkt zu bilden, als ich über diese Herausforderung nachdachte, aber ich ließ dies fallen und benutzte stattdessen ound O. Ich habe den Wortlaut ein wenig geändert.
Kevin Cruijssen
Für das n=50Beispiel glaube ich, dass Sie meinen, der erste Fehler hat 16 Stellen und die anderen beiden haben jeweils 17.
Jon Claus
Dies ist mein Lieblingsalbum von Jimi Hendrix.
Setzen Sie Monica iamnotmaynard
@iamnotmaynard Vielleicht fehlt mir etwas Offensichtliches, oder hast du die falsche Herausforderung kommentiert? Ich sehe nicht wirklich die Verbindung zwischen Jimi Hendrix und Marienkäfern ..
Kevin Cruijssen

Antworten:

5

Kohle , 84 81 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

Nθ

Geben Sie die Gesamtzahl der Spots ein.

≔⌈∕∨θ¹¦²³η

Berechnen Sie die Anzahl der benötigten Marienkäfer.

Fη«

Schlinge über jeden Marienkäfer.

≔⁺÷θη‹ι﹪θηζ

Berechnen Sie die Anzahl der Stellen, an denen dieser Marienkäfer angebracht werden soll.

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

Drucken Sie den Kopf und den rechten Flügel des Marienkäfers.

↑⎇›ζ²¹OO²

Wenn es mehr als 21 Stellen gibt, drucken Sie zwei Stellen, andernfalls drucken Sie die Rückseite.

§|Oζ

Wenn die Anzahl der Punkte ungerade ist, drucken Sie einen anderen Punkt, ansonsten drucken Sie den Rest der Rückseite.

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

Teilen Sie die Anzahl der Punkte durch zwei und verteilen Sie sie auf drei Reihen mit 3, 4 und 3 Punkten.

↙»

Gehen Sie zum Anfang des nächsten Marienkäfers.

‖B←

Reflektiere die Leinwand nach links und behalte den Rücken.

Neil
quelle
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

Probieren Sie es online!

  • 9 Bytes dank Kevin Cruijssen gespeichert
  • Dank Mr. Xcoder 18 Bytes gespart
  • 2 Bytes dank Jonathan Frech gespeichert
TFeld
quelle
Ich denke, Sie können die entfernen .replace('A','|O'[b%2])und c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"stattdessen verwenden?
Kevin Cruijssen
230 Bytes durch Verwandeln [' o','|O'][i>9]in ' |oO'[i>9::2]und Verwenden |anstelle von logischem oder. Wenden wir uns for i in range(11)auch einer execAnweisung zu, die 4 Bytes gespeichert hat.
Mr. Xcoder
1
Und entschuldigen Sie die Unordnung der Kommentare, aber 218 Bytes, indem Sie Ihr Listenverständnis mit der forSchleife mischen und auch eine unnötige Variable entfernen.
Mr. Xcoder
@ Mr.Xcoder Vielen Dank :)
TFeld
Es soll die wenigsten Marienkäfer hervorbringen, oder? Wenn ich bei TIO 24 bis 46 eingebe, gibt es 3 Marienkäfer anstelle von zwei.
Nick Matteo
7

JavaScript (ES6), 183 186 Bytes

Verwendet die gleiche Formel wie TFelds Antwort , um die Flecken unter den Marienkäfern aufzuteilen.

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
quelle
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

Probieren Sie es online!

Erläuterung

Die ASCII-Grafik für den Marienkäfer ist in einer einzelnen Befunge-Zeichenfolge codiert, die um 15 versetzt ist, damit die ersten 15 druckbaren Zeichen für bestimmte Zwecke reserviert werden können. Die ersten beiden dieser Sonderzeichen stellen die Zeilenumbrüche und das |Zeichen dar, die andernfalls nicht gedruckt werden könnten. Der dritte wird nicht verwendet, da er "in einer Zeichenfolge nicht verwendet werden kann. Die nächsten beiden repräsentieren die großen Flecken in der Mitte. Und die restlichen zehn sind für die Flecken auf den Flügeln.

Diese Sonderzeichen werden über eine Nachschlagetabelle, die über den ersten Teil der ersten Zeile geschrieben ist, in ihre endgültige Form übersetzt.

Zur leichteren Erklärung ist dies der Code mit den verschiedenen hervorgehobenen Bestandteilen:

Quellcode mit hervorgehobenen Ausführungspfaden

*Wir beginnen mit der Initialisierung der Newline und der letzte Teil der Initialisierung der Lookup-Tabelle ist eine Schleife, die berechnet, welche der kleinen Punkte angezeigt werden müssen. Der Algorithmus lautet im Wesentlichen: Wenn , dann muss der Spot angezeigt werden.| Zeichens in der Nachschlagetabelle, da diese konstant sind.
*Als nächstes lesen wir die Anzahl der Spots von stdin ein und berechnen die Anzahl der benötigten Marienkäfer.
*Wir können dann die äußere Schleife für die Menge der Fehler starten und die Anzahl der Punkte für den nächsten zu rendernden Marienkäfer berechnen.
*Für jeden Marienkäfer berechnen wir, ob der große Mittelpunkt angezeigt werden muss (wenn spots%2 == 1), und schreiben den entsprechenden Wert in die Nachschlagetabelle.
*In ähnlicher Weise berechnen wir, ob das andere Paar großer Punkte angezeigt werden muss (falls spots/2 > 10), und aktualisieren erneut die Nachschlagetabelle. Wir berechnen auch die verbleibenden benötigten Stellen auf jedem Flügel.
*(spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10
*Als nächstes schieben wir die codierte Zeichenfolgendarstellung des Marienkäfers auf den Stapel. Dies ist im Wesentlichen nur eine einfache Zeichenfolge, die sich jedoch etwas verwickelt hat, als ich versuchte, sie in die Lücken im Code einzudrücken, damit die Quelle ein Rechteck bildet.
*Jetzt können Sie die Ausgabeschleife starten, die Zeichen einzeln verarbeiten und die Sonderfälle (Punkte, Zeilenumbrüche usw.) über die zuvor erstellte Nachschlagetabelle konvertieren.
*Zum Schluss prüfen wir, ob wir alle benötigten Marienkäfer angezeigt haben, ansonsten fahren wir mit dem Start der äußeren Schleife fort.

James Holderness
quelle
Schön, ich mag die Muster, die deine Marienkäfer für jede Stufe von 1-23 haben. Ganz anders als einige der anderen Antworten. +1 von mir. Würde es Ihnen etwas ausmachen, eine Erklärung hinzuzufügen (nachdem Sie vielleicht mit dem Golfspielen fertig sind)?
Kevin Cruijssen
1
Ich bin froh, dass dir die Muster gefallen haben. Tatsächlich habe ich ziemlich viel Zeit damit verbracht, die verschiedenen Kombinationen auszuprobieren, um einen Algorithmus zu finden, der in so vielen Phasen wie möglich gut aussieht. Fügte meiner Antwort jetzt auch eine kleine Erklärung hinzu.
James Holderness
3

Ruby , 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}

Probieren Sie es online!

  • Dank Jordan 10 Bytes gespart
Setzen Sie Monica iamnotmaynard wieder ein
quelle
{|m|m.kann ersetzt werden durch {$&.; b=(n-1)/23+1kann ersetzt werden durch b=1+~-n/23; und x=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}kann durch ersetzt werden x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}.
Jordanien
Sie können ein weiteres Byte speichern, indem Sie %q{XY}anstelle 'X'+"Y"der ersten acht Zeilen ein paar weitere Zeilen d=n>0?n/(b=1+~-n/23):b=0verwenden n>0?d=n/(b=(n-1)/23+1):d=b=0.
Jordanien
@ Jordan Wow, danke.
Setzen Sie Monica iamnotmaynard