In einer nun gelöschten Stapelüberlauf-Frage hat jemand Folgendes gepostet:
Schreiben eines Programms oder der Funktion zum Drucken in alternierenden Muster *
und #
basierend auf einer vorgegebenen ganzen Zahl n
. Einige Beispiele:
Eingabe: n=1
Ausgabe:
*
Eingabe n=5
Ausgabe:
*####
###**
***##
###**
*####
Eingabe: n=8
Ausgabe:
*#######
######**
***#####
####****
****####
#####***
**######
#######*
Da es wie eine ziemlich coole Code-Golf-Herausforderung aussah, ist es hier.
Wie sind diese Muster aufgebaut?
Die erste Zeile beginnt mit einer einzelnen *
, gefolgt von der n-1
Anzahl der nachfolgenden Zeilen #
.
Die zweite Zeile enthält dann zwei Zeilen *
mit der n-2
Anzahl der führenden Zeilen #
.
Die dritte Zeile beginnt mit drei *
, gefolgt von einem n-3
Nachlauf #
.
etc.
Sobald wir die Mitte ( n/2
) erreicht haben, zählen wir wieder mit dem Betrag von zurück *
, der in den obigen Beispielen zu sehen ist.
HINWEIS: Bei ungeraden Eingaben ist das invertierte Zeilenpaar (also zuerst und zuletzt; zweitens und vorletztes usw.) genau dasselbe. Im n=5
Beispiel sind die erste und letzte Zeile *####
; Die vorletzte und die vorletzte Zeile sind ###**
.
Bei geraden Eingaben wird jedoch das umgekehrte Zeilenpaar umgekehrt. Im n=8
Beispiel sind die erste und letzte Zeile *#######
und #######*
; die vorletzte und die vorletzte Zeile sind ######**
und **######
; etc.
Herausforderungsregeln:
- Sie können anstelle von und zwei verschiedene druckbare Zeichen verwenden . Sie können und verwenden ; und ; und ; usw. Bitte geben Sie in Ihren Antworten an, was Sie verwendet haben.
*
#
A
B
3
7
<
>
- Sie können davon ausgehen, dass
n
es sich um eine positive Ganzzahl handelt (>= 1
) - Sie können eine Liste / ein Array von Zeichenfolgen für jede Zeile oder eine 2D-Zeichenmatrix ausgeben, anstatt sie an STDOUT zu drucken.
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.
- Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
Testfälle (zuerst n=1
durch n=10
)
*
*#
#*
*##
#**
*##
*###
##**
**##
###*
*####
###**
***##
###**
*####
*#####
####**
***###
###***
**####
#####*
*######
#####**
***####
###****
***####
#####**
*######
*#######
######**
***#####
####****
****####
#####***
**######
#######*
*########
#######**
***######
#####****
*****####
#####****
***######
#######**
*########
*#########
########**
***#######
######****
*****#####
#####*****
****######
#######***
**########
#########*
Antworten:
Gelee , 9 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python 2 , 62 Bytes
Probieren Sie es online!
Gebrauch
x
und Raum.Die Zeilen werden folgendermaßen berechnet:
Verwenden Sie den
%*s
Bezeichner, um zwischenn
und zu wählen-n
.quelle
Perl 6 , 57 Bytes
Probieren Sie es online!
Verwendet die gleiche Methode wie Lynns Python-Antwort . Ausgaben mit
*
und Leerzeichen.quelle
MATL,
343118 BytesProbieren Sie es auf MATL Online aus
Verwendet 0 für * und 1 für #. Beyogen auf Lynns Gelee Antwort .
Ältere Antwort, 31 Bytes:
Probieren Sie es auf MATL Online aus
Verwendet 1 für * und 0 für #.
quelle
APL (Dyalog Classic) , 18 Byte
Probieren Sie es online!
Ausgänge
AB
statt*#
⎕
ausgewerteter Eingang n⍳⎕
der Vektor0 1 ... n-1
⊢⌊⌽
min (⌊
) zwischen sich (⊢
) und ihrem Rückwärtsgang (⌽
) - siehe Züge⊂>⊢⌊⌽
Dabei ist der⍳
Vektor als Ganzes (⊂
) kleiner als jeder seiner⊢⌊⌽
- Rückgabe eines Vektors aus booleschen (0/1) Vektoren⊢∘⌽\
kehre jeden anderen Vektor um↑
in eine Matrix mischen⎕a
das englische Alphabet in Großbuchstaben,'AB
...Z'
⎕a[
]
ersetzen0
1
mit'A'
'B'
quelle
⎕a[...}
sie zu konvertierenA
undB
ohne Leerzeichen kürzer als sie als zu halten0
und1
ohne Leerzeichen Erwägen Sie , dass verwendet haben, aber nur neugierig , ob es viel Unterschied in Bytes ist , wenn Sie sie halten , wie0
und1
.⎕d[
...]
oder⊃¨⍕¨
... In dieser Ausdruck⍕¨
ist „formatiert jeder“ - es jede Zahl in einem verschachtelten char dreht Vektor , also brauchen wir „zuerst jede msgstr "(⊃¨
) um nur Zeichen - Skalare zu erhalten (und daher kein Leerzeichen beim Drucken).Holzkohle , 21 Bytes
Probieren Sie es online! Verwendet
0
und1
. Der Link ist eine ausführliche Version des Codes und beinhaltet,§*#
welche die Ausgabe in das*
und#
in der Frage übersetzt. Erläuterung:quelle
Jelly ,
1215 Bytes+3 Fixing
n=1
Edge-Case Bug :(Ein vollständiges Programm eine ganze Zahl zu akzeptieren , die die Ausgabe druckt wie im OP unter Verwendung definiert
0
und1
für*
und#
verbunden.Probieren Sie es online!
Wie?
quelle
Gelee , 15 Bytes
Probieren Sie es online!
Volles Programm.
*
=1
#
=0
quelle
Java 10, 145 Bytes
All das Ternäre macht es ein bisschen chaotisch, aber es funktioniert gut. Ich habe versucht, die verschachtelte Schleife und verschiedene andere Dinge zu reduzieren, aber sie haben nur die Byteanzahl erhöht. Probieren Sie es hier online aus .
Ungolfed:
Java
811,179127 BytesProbieren Sie es hier online aus (TIO verfügt noch nicht über Java 11, daher wird eine benutzerdefinierte Methode verwendet, die dieselbe Byteanzahl ergibt wie
String#repeat()
).Vielen Dank an Kevin Cruijssen für die unglaublichen 52 Bytes!
Ungolfed:
quelle
"*".repeat(...)
und auf 127 Bytes"#".repeat(...)
n-j-1
n+~j
n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
repeat()
herauszubringen. Diese Methode ist wirklich gut zum Golfen.Lua ,
148133 BytesProbieren Sie es online!
-15 Bytes dank @KevinCruijssen und @JoKing.
quelle
(n+1)/2
bis-~n/2
;or n-i+1
zuor-~n-i
;i%2==0
zui%2<1
; undreverse() or
zureverse()or
. Außerdem enthalten Ihre TIO-Version und die Anzahl der Bytes ein nachgestelltes Semikolon, das nicht erforderlich zu sein scheint. Gute erste Antwort. +1 von mir. Und willkommen bei PPCG! :)-~n
in Ihren Vorschlägen tut? Es funktioniert definitiv, aber ich verstehe nicht warum.~
ist ein unärer bitweiser Negationsoperator. Wichtig für das Codegolfing ist jedoch, dass es~i
den gleichen Wert hat wie-i-1
. Wir können daher-~i
anstelle voni+1
und~-i
anstelle von verwendeni-1
. Dies ist in zwei Fällen nützlich, die ich beide in Ihrer Antwort verwenden könnte: Klammern loswerden, weil-
und~
Operator Vorrang vor anderen mathematischen Operationen haben,(n+1)/2
kann also sein-~n/2
. Und der andere nützliche Teil ist, in einigen Fällen Leerzeichen zu entfernen, wie ich es getan habeor-~n-i
.~
x+1
x-1
möchten: Verwenden Sie unary für und und Verwenden Sie unary~
füra-b-1
unda+b+1
. Alle allgemeinen Tipps sowie sprachspezifische Tipps ( in diesem Fall Tipps zum Golfen in Lua ) können interessant sein. :)Kotlin , 86 Bytes
Probieren Sie es online!
Verwendet
x
und Leerzeichen als Ausgabesymbole. Derivate von Lynn Answerquelle
Perl 5+
-pa -MPOSIX -M5.010
, 58 BytesProbieren Sie es online!
quelle
C (GCC) ,
10499 BytesProbieren Sie es online!
quelle
C (GCC) ,
118108 BytesDieser wird nicht gewinnen, aber es ist ein anderer Ansatz (oder zumindest glaube ich das!) Anstatt Saitenmanipulationen durchzuführen, nutze ich die Tatsache, dass10x- 1 Über [ 1 .. n ] = { 9 , 99 , 999 , . . . } , die dann multipliziert werden können, um das entsprechende Muster zu erhalten;
printf()
Dann erfolgt das Auffüllen mit Nullen zur Rechtfertigung.Leider
int
reicht der Bereich nur für bis zu 9 Stellen (auf 32-Bit-Plattformen), sodass Sie zu gehen müssenlong
größere Muster verwenden müssen. Eine Sprache, die MP-Arithmetik von Haus aus beherrscht, könnte dies für etwas verwenden.Danke an ceilingcat für den Vorschlag.
Probieren Sie es online!
Beweis des Konzepts, dass dies mit MP-Arithmetik funktioniert:
C # (Mono C # -Compiler) ,
187Byte(143 Bytes + 22 Bytes für das
using System.Numerics;
im Header)Probieren Sie es online!
quelle
Vim, 99 Tastenanschläge
Es ist immer interessant, mit Eingabeargumenten zu experimentieren. Es ist sehr unnatürlich, also wird es nicht erstaunlich kurz sein. Hierfür gibt es wahrscheinlich andere gute Ansätze.
Es wird davon ausgegangen, dass sich die Eingabe in einem Puffer befindet. Es wird angenommen, dass die Register leer sind. Es wird davon ausgegangen, dass der Editor groß genug ist, um das Ergebnis ohne Scrollen aufzunehmen (dies könnte technisch auf Kosten einiger Tastenanschläge vermieden werden).
Erläuterung
Und in base64 mit tatsächlichen Zeichen (Eingabe
input
und Tastenanschläge eingebenkeys
und mit ausführenvim -u NONE -s keys input
)quelle
R , 75 Bytes
Probieren Sie es online!
n
als Parameter abruft und eine Matrix zurückgibt, in der steht,0/1
wo0
entspricht'*'
und1
was entspricht'#'
quelle
K (ngn / k) , 22 Bytes
Probieren Sie es online!
{
}
Funktion mit Argumentx
!x
die Liste(0;1;
...;x-1)
i:
zuweiseni
i&|i
Minima (&
) voni
und sein Gegenteil (|
)i>/:
Vergleiche mit größer als (>
)i
mit jedem Element aus der Liste auf der rechten Seite (/:
) - gib eine boolesche Matrix zurück (Liste der Listen)i|:/'
kehren Sie für jedes ('
) j ini
(|:
- wir müssen:
erzwingen|
, dass es unär ist) das entsprechende Element j mal um (n f/ x
giltf
n
mal fürx
). Tauschen Sie effektiv jede zweite Reihe aus."*#"
Verwenden Sie Matrixelemente als Indizes in der Zeichenfolge"*#"
quelle