Problem
Inspiriert von einer vorherigen Herausforderung ähnlich , etwas zu tun
Bei einer positiven Ganzzahleingabe n
wird eine Form ausgegeben, die diesem Muster folgt:
Eingabe n=1
:
* *
*
* *
Eingabe n=2
:
** **
****
**
****
** **
Eingabe n=3
:
*** ***
*** ***
*****
***
*****
*** ***
*** ***
und so weiter...
Es hat diese Eigenschaften:
n*2+1
Linien groß
Die "Arme" sind n
weit, außer wenn sie sich vereinigen
Die Mittellinie ist n
breit
Wenn n
ja, sind die Linien über und unter der Mitte n*2
breit
Wenn n
ungerade ist, sind die Linien über und unter der Mitte n*2-1
breit
Regeln
- Abschließende Zeilenumbrüche akzeptiert
- Es gelten Standardlücken
- Kürzeste Bytes gewinnen
- Die Ausgabe kann ein Ausdruck oder eine Zeichenfolge oder ein Array von Zeichenfolgen sein
Bearbeitungen
n=0
muss nicht behandelt werden- Leerzeichen erlaubt
1
anstelle von*
und0
anstelle von Speicherplatz hat?Antworten:
Kohle ,
1312 BytesVielen Dank an @ErikTheOutgolfer für ein Byte
Probieren Sie es online!
Dies ist meine erste Antwort auf Charcoal, und ich bin mir ziemlich sicher, dass es nicht so gut ist, wie es sein könnte, aber ich dachte, ich würde irgendwo anfangen.
quelle
I
für -1 verwenden.MATL , 16 Bytes
Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
2
als Beispiel. Stapelinhalte werden mit neueren unten gezeigt.quelle
Gelee , 15 Bytes
Probieren Sie es online!
quelle
»
Vektorisierungen lernen ...V ,
1817 BytesDank des @ DJMcMayhem-Eingabeticks wurde ein Byte gespeichert.
Probieren Sie es online!
Erläuterung
Dies fügt ein
[n]*'*'+[n]*' '+[n]*'*'
Jede Iteration der Schleife, aus der der Puffer stammt
Zu
Wo
|
ist der Cursor mit einem*
darunter?quelle
Àé*ÄJÀäl
anstelle von tunÀá*Àá Àá*
, und Sie können tun<M-c>
, dhã
(mnemonisch: Mitte ), um in die Mitte der Zeile zu gelangen, die ein Byte kürzer ist alsÀl
. Probieren Sie es online!<M-c>
Pausen für höhere Zahlen05AB1E , 18 Bytes
Probieren Sie es online!
Erläuterung
Beispiel für
n=2
quelle
V , 23 Bytes
Probieren Sie es online!
Hexdump:
Aus irgendeinem Grund ist diese Herausforderung in V bedeutend schwieriger als in der letzten. Wachsen Sie seit unserem allgemeinen Ansatz von n-mal ein 'x' hier nicht funktioniert, konstruieren wir stattdessen die Oberseite des X, kopieren es und spiegeln es und fügen dann die beiden Teile zusammen.
Erläuterung:
Indem Sie den Einzug am Ende der Schleife ausführen, können Sie implizite Endungen nutzen . Auf diese Weise werden bequemerweise auch n + 1 Linien erstellt, dh genau die obere Hälfte des 'X'. Angenommen, die Eingabe war 4. An diesem Punkt sieht der Puffer folgendermaßen aus:
Und wir sind in der letzten Zeile. Also dann wir:
quelle
ãxx
Ding zuerst auch gemacht, aber ich denke es bricht für zB n = 8?ãl
oder wenn Sie vor dem Zentrieren einrücken, aber das spart eigentlich keine Bytes. Ich verstehe nicht, warum es für kleinere Zahlen funktioniert.C #,
139 130115 Bytes-1 Byte durch Erstellen einer Zeichenfolge und Aufrufen
WriteLine
, wodurch die Prüfung für die neue Zeile gespeichert wird.-6 Bytes dank Kevin und seinen meisterlichen Golftechniken!
-2 Bytes durch Ersetzen
n*3-n
durchn*2
.-15 Bytes, nachdem Kevin mich freundlich in die richtige Richtung geleitet hat: Ich kann die Zeichenfolge einfach zurückgeben, anstatt sie zu drucken, und so den Aufruf von speichern
System.Console.WriteLine()
. Und noch ein paar andere Tipps ...Probieren Sie es online!
Ungolfed:
Es iteriert nur entlang der Zeilen und Spalten des Platzes, der zum Drucken des großen X benötigt wird, und druckt entweder a
'*'
' '
je nach Bedingung oder a .quelle
&&
kann&
und||
kann|
in diesem Fall sein.for(int j=0;
kann seinfor(int j=0,i;
und dann kannst du dieint
vor deri
in der inneren schleife entfernen . Auch nach dem ersten Wechsel von&
und|
können Sie auch das Entferneni++
innerhalb der for-Schleife und änderni==n*3-1?...
zui++==n*3-1?...
.WriteLine
wurde nur 1 Byte gespeichert. Jetzt bin ich nicht sicher, was ich mit deinem letzten Rat anfangen soll.System.Console.WriteLine
? Rückgabe der Zeichenkette:n=>{string s="";for(int i,j=0;j<n*2+1;j++,s+="\n")for(i=0;i<n*3;)s+=i>=j&i<j+n|i<=n*3-j-1&i++>n*2-j-1?'*':' ';return s;}
ist kürzer [ 120 Bytes ] (und entfernt auch die Klammern, indem alles in die for-Schleife gesetzt wird. Hier ist ein TIO-Link , um zu zeigen, dass es funktioniert. Sie können diesen auch gerne hinzufügen (oder Ihren eigenen). TIO-Link zu Ihrer Antwort :)WriteLine
in dem Code , weil die OP gefragt Ausgabe die großen X, nicht nur zurückkehren es, so fühlte mich , dass die Ausgabe der X (durch die Aufruf -WriteLine
Methode) sollte Teil des Codes sein. Trotzdem bin ich immer noch nicht an die Regeln des Code-Golf gewöhnt und ich weiß nicht, welche Lizenzen ich beim Schreiben von Code nehmen kann. Ich habe gerade gesehen, dass einige der anderen Antworten hier das X im Code und einige andere es in der Fußzeile drucken. Was ist der gültige Ansatz in diesem Fall?j<n*2+1
kann seinj<=n*2
. Ich habe auch einen Java 8- Port für Ihre Antwort mit der gleichen Byteanzahl erstellt und Ihre erstaunliche Antwort natürlich gutgeschrieben.Haskell ,
888786 Bytes-1 danke an @Laikoni
Probieren Sie es online!
quelle
zipWith max m(reverse m)
kann auf gekürzt werdenzipWith max(reverse m)m
. Dies ist das Gleiche wiezipWith max=<<reverse$m
undm
kann dann inline gesetzt werden: Probieren Sie es online aus!Jelly ,
242316 BytesProbieren Sie es online!
quelle
MATLAB,
153126 Bytes (17,6% ↓)Dank des Kommentars von @ LuisMendo kann die Funktion
disp()
Zeichen ohne einfache Anführungszeichen ausgeben, so dass ich die Verwendung vonfprintf
with verhindernformats
und einige Bytes weglassen konnte. Außerdem erinnert mich sein Kommentar daran, dass ichchar(32)
ein Leerzeichen anstelle vonchar(0)
(null) verwenden muss.Probieren Sie es online!
MATLAB, 153 Bytes
Ergebnisbeispiel: n = 10
quelle
Python 2 ,
93908983 Bytes-3 Bytes dank Leaky Nun
-1 Bytes dank Zachary T
-6 Bytes dank xnor
[Online testen!] [TIO-j3xwsktf]
Beginnt mit einer Zeichenfolge wie
'*** '
fürn=3
. Wenden Sie diesemap/max
an, um die*
Leerzeichen für jede Position auszuwählen. Fügen Sie dann ein Leerzeichen hinzu, entfernen Sie das letzte Zeichen aus der Zeichenfolge und wiederholen Sie den Vorgang.quelle
n*2*' '
durchn*' '
?map(max
kann direkt ohne ein gemacht werdenzip
. Auchn*2+1
istn-~n
.Haskell , 70 Bytes
Probieren Sie es online!
Gibt eine Liste von Zeichenfolgen aus.
Verwendet für jede Position von Zeile
r
, Spaltec
eine Formel, um zu bestimmen, ob sie in eines der beiden diagonalen Bänder fällt und so ist*
.quelle
Java 8,
119118 BytesHafen von @CarlosAlejo 's erstaunlicher C # Antwort , nachdem ich ihm geholfen hatte, ein paar Dinge zu spielen. Also stelle sicher, dass du ihn auch positiv bewertest!
Probieren Sie es hier aus.
quelle
Javascript (ES2017),
155157 BytesGibt ein Array von Zeichenfolgen zurück. Ich führe Operationen an Arrays durch und spiegele sie dann. Dies könnte wahrscheinlich mit Matrizen wie den anderen Antworten optimiert werden, aber ich wollte einzigartig sein.
Bearbeiten: Wie Neil betonte
n
, war die Mittellinie für gerade Werte von nichtn
breit, daher habe ich einen Modul hinzugefügt, um gerade / ungerade beim Schneiden der Spalte zu erkennen.Ungolfed
Quadrant
Horizontal gespiegelt
Vertikal gespiegelt
quelle
n
- die Mittellinie ist nichtn
breit.Mathematica, 148 Bytes
quelle
R, 102 Bytes
Code:
Prüfung:
quelle
CJam, 24 Bytes
Dies ist ein Block, der eine Zahl aus dem Stapel entnimmt und eine Liste von Zeilen an den Stapel ausgibt.
Erläuterung:
quelle
Python 2 , 110 Bytes
Dieses Programm unterteilt jede Zeile in 4 Teile, erste Leerzeichen, erste Sterne, zweite Leerzeichen und dann zweite Sterne. Für jede horizontale Linie des X wird berechnet, wie viele Sterne oder Leerzeichen für jeden der 4 Abschnitte der Linie benötigt werden. Anschließend wird diese Zeichenfolge konstruiert und gedruckt.
quelle
Netzhaut , 144 Bytes
Probieren Sie es online! Erläuterung:
Fügen Sie 2n + 1 Leerzeichen vor dem Eingabewert hinzu (eines für jede Ausgabezeile).
Ersetzen Sie jedes Leerzeichen mit einem
#
und sammeln Sie die Ergebnisse. Dies ergibt eine diagonale Linie von#
s, wobei der Eingabewert durch ein Suffix ergänzt wird.Löschen Sie den ursprünglichen Eingabewert, da wir jetzt in jeder Zeile eine Kopie haben.
Bauen Sie zwei diagonale Linien von n
*
s auf, wobei eine Trennsäule ausn
Leerzeichen in ein Paar von#
s eingeschlossen ist.*
Vertauschen Sie die beiden Hälften an den Linien, an denen sich das s näher an der Mitte befindet. Dies ergibt ein ähnliches Erscheinungsbild> | | <
.Bewegen Sie die
| |
s so weit wie möglich nach links, um ein>> > <
Erscheinungsbild zu erhalten.#
Löschen Sie für jedes Leerzeichen zwischen den Zeichen die folgenden drei Zeichen. Dies verbindet die> <
in eineX
.Löschen Sie die jetzt nicht mehr benötigten
#
s.quelle