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:
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=0
ja, geben wir den Marienkäfer so aus, wie er ist.
Wenn n
größer als Null ist, füllen wir entweder die Leerzeichen des ASCII-art-Fehlers mit Kleinbuchstaben aus o
oder 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=1
sind 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=2
sind:
_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:
n
wird im Bereich von liegen0-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 verwendenn=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 Beispieln=25
odern=50
um 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=50
Berü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 Code-Golf , 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.
o
undO
. Ich habe den Wortlaut ein wenig geändert.n=50
Beispiel glaube ich, dass Sie meinen, der erste Fehler hat 16 Stellen und die anderen beiden haben jeweils 17.Antworten:
Kohle ,
8481 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Geben Sie die Gesamtzahl der Spots ein.
Berechnen Sie die Anzahl der benötigten Marienkäfer.
Schlinge über jeden Marienkäfer.
Berechnen Sie die Anzahl der Stellen, an denen dieser Marienkäfer angebracht werden soll.
Drucken Sie den Kopf und den rechten Flügel des Marienkäfers.
Wenn es mehr als 21 Stellen gibt, drucken Sie zwei Stellen, andernfalls drucken Sie die Rückseite.
Wenn die Anzahl der Punkte ungerade ist, drucken Sie einen anderen Punkt, ansonsten drucken Sie den Rest der Rückseite.
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.
Reflektiere die Leinwand nach links und behalte den Rücken.
quelle
Python 2 ,
252249238212211213209 BytesProbieren Sie es online!
quelle
.replace('A','|O'[b%2])
undc=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"
stattdessen verwenden?[' o','|O'][i>9]
in' |oO'[i>9::2]
und Verwenden|
anstelle von logischem oder. Wenden wir unsfor i in range(11)
auch einerexec
Anweisung zu, die 4 Bytes gespeichert hat.for
Schleife mischen und auch eine unnötige Variable entfernen.JavaScript (ES6),
183186 BytesVerwendet die gleiche Formel wie TFelds Antwort , um die Flecken unter den Marienkäfern aufzuteilen.
Demo
Code-Snippet anzeigen
quelle
Befunge,
292279 BytesProbieren 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:
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.
quelle
Ruby ,
203193190 BytesProbieren Sie es online!
quelle
{|m|m.
kann ersetzt werden durch{$&.
;b=(n-1)/23+1
kann ersetzt werden durchb=1+~-n/23
; undx=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|}
kann durch ersetzt werdenx=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}
.%q{XY}
anstelle'X'+"Y"
der ersten acht Zeilen ein paar weitere Zeilend=n>0?n/(b=1+~-n/23):b=0
verwendenn>0?d=n/(b=(n-1)/23+1):d=b=0
.