Wieder inspiriert von einer Aufgabe zum Programmieren 101 ist hier eine weitere Herausforderung.
Eingang:
- Eine positive ganze Zahl
n >= 3
. (muss ungerade sein)
Ausgabe:
n
Zeilen mit Sternchen, wobei die erste Zeilen
Sternchen enthält und jede neue Zeile zwei Sternchen weniger als die vorherige Zeile enthält. Bis du 1 Sternchen triffst. Von da an hat jede neue Zeile zwei Sternchen mehr als die vorherige Zeile, bis wiedern
Sternchen angezeigt werden. Leerzeichen oder ähnliches müssen verwendet werden, um die Sternchen so auszurichten, dass sie wirklich wie eine Sanduhr aussehen.
Allgemeine Regeln:
- Nachgestellte Zeilenumbrüche sind erlaubt, müssen aber nicht verwendet werden.
- Einrückung ist ein Muss.
- Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
- Da der Kurs in C ++ unterrichtet wird, bin ich gespannt auf Lösungen in C ++.
Testfall (n = 5):
*****
***
*
***
*****
Antworten:
Holzkohle , 6 Bytes
Ganz einfach. Zeichnet ein poly G auf dem
*
, mit der Seitenlänge von einer Eingang entnommen N umber, wobei die Seiten nach unten gehen und rechts, horizontal nach links und nach oben und rechts:Vervollständigen Sie dann den Umriss automatisch und füllen Sie ihn aus.
Probieren Sie es online!
quelle
Python 2, 57 Bytes
Ein volles Programm. Geht Zeile für Zeile und druckt die richtige Anzahl von zentrierten Sternchen.
Eine rekursive Funktion war länger (67 Bytes):
oder
quelle
max
durch eine zu ersetzenabs
, aber alles, was ich bekam, istabs(n-1)+1
, was schlimmer ist, weil der Zusatz Klammern erfordert'*'*-~abs(n-1)
, aber dann ist es die gleiche Länge wie'*'*max(n,2-n)
.def f(n,s=''):r=s+'*'*n+'\n';return 1/n*r or r+f(n-2,s+' ')+r
für 61 Bytes, aber es ist immer noch länger. Auch mit einer führenden Newline,def f(n,s='\n'):r=s+'*'*n;return 1/n*r or r+f(n-2,s+' ')+r
ist immer noch 58 Bytes ...center
. Ich wusste nie, dass es das bis jetzt gibt.V , 12 Bytes
Probieren Sie es online!
Ich mag Herausforderungen wie diese, weil ich die Vorteile von Vs 2D-Charakter zeigen kann. Erläuterung. Zuerst müssen wir eine Folge von n Sternchen erstellen . Also machen wir das:
Als Randnotiz ist dies direkt äquivalent zu
@ai*<esc>
in vim und register@a
ist auf "arg1" vorinitialisiert. Dies erleichtert die numerische Eingabe erheblich.Dann bewegen wir uns mit der Figur nach rechts
h
. Hier ist der lustige Teil:Technisch gesehen ist dies der letzte Teil
Weil der Einrückbefehl tatsächlich ist
>>
. V geht zweckmäßigerweise davon aus, dass unvollständige Befehle für die aktuelle Zeile gelten, und füllt implizit auch das zweiteò
Zeichen für die Schleife aus.quelle
C ++ - Metatemplates, 186 Byte
Mit der expliziten Formel aus meiner C-Antwort konkurrieren die Metatemplates!
Ungolfed:
Verwendung:
nicht konkurrierend
Nur zum Spaß:
Verwendung:
quelle
PowerShell v2 +, 54 Byte
Übernimmt die Eingabe
$n
(garantiert eine ungerade Ganzzahl), konstruiert zwei Bereiche mit$n..1
und2..$n
und verknüpft sie miteinander undWhere-Object
wählt dann nur die ungeraden mit aus|?{$_%2}
. Diese werden in eine Schleife eingespeist. Bei jeder Iteration erstellen wir die entsprechende Anzahl von Leerzeichen, die mit der entsprechenden Anzahl von Sternchen verkettet sind. Diese ZeichenfolgenWrite-Output
verbleiben in der Pipeline und werden nach Abschluss des Programms durch implizite Einfügungen von Zeilenumbrüchen zwischen ihnen ausgegeben .Beispiele
quelle
Python, 78 Bytes
Also nur mit Einrückung:
Verwendung:
quelle
C
114109 Bytesungolfed:
Bisherige rekursive Lösung:
quelle
JavaScript (ES6), 66 Byte
Die Idee dabei ist, jede Sanduhr aus der vorherigen zu generieren: Fügen Sie am Anfang jeder Zeile ein Leerzeichen ein und stellen Sie
n
Sternchen voran und fügen Sie sie hinzu .quelle
05AB1E ,
21201917 Bytes2 Bytes dank Carusocomputing gespart
Probieren Sie es online!
Erläuterung
quelle
Ir"*"×.pRû
- Bis hierher gekommen, mit verblüfftem Gesicht, als mir klar wurde, wie weit ich entfernt war. Sie haben geantwortet und werden versuchen, anhand dieses Beispiels Iteration in dieser Sprache zu lernen. Vielen Dank!;ƒ'*¹N·-×Nð×ì})û»
Verwenden Sie den neuen Befehl palindromize. -2 Bytes.ÅÉ
und.c
wahrscheinlich noch nicht verfügbar waren, als Sie dies gepostet haben. :)MATL , 12 Bytes
Probieren Sie es online!
Erläuterung
Dies nutzt die kürzlich hinzugefügte Symmetric Range- Funktion.
quelle
PHP, 95 Bytes
Anstatt die Zeilen in einem Array zu speichern und dann alles auszugeben, geht die for-Schleife bis auf 1 zurück und kehrt dann zur ursprünglichen Nummer zurück.
quelle
C ++ 11, 93 Bytes
Leicht ungolfed:
Verwendung:
quelle
'\n'
mit10
:)MATL , 20 Bytes
Probieren Sie es online!
quelle
R, 77 Bytes
Erstellt eine Zeichenmatrix, die dann gedruckt wird
cat
,fill=n
wobei sichergestellt wird, dass die Linien richtig ausgerichtet sind. Beachten Sie, dass Elemente in einer Matrix spaltenweise gespeichert werden (dh die ersten beiden Elemente sindM[1,1]
undM[2,1]
nichtM[1,2]
.)quelle
Java 7,
170 165164 BytesVielen Dank an @Hypino für das Speichern von 5 Bytes.
Vielen Dank an Kevin für das Speichern von 1 Byte.
quelle
s=
vons=s+"\n"
und 2 weitere Bytes durch Ändernreturn(n=--n-1)
vonreturn(n=n-2)
auf insgesamt 4 Bytes sparen .String s="",c="",t="";
bisString s,c,t=s=c="";
( -2 Bytes ) undreturn(n=n-2)>=0?s+"\n"+c+c(n,++x)+
zureturn n-1>0?s+"\n"+c+c(n-2,++x)+
( -2 Bytes wieder)n=n-2
->n-1>0
weil n in einem anderen Argument einer Funktion verwendet werden sollte.n
umn-2
an diesem Teil.return(n=n-2)>=0 ... n
gewechselt zureturn n-1>0 ... n-2
ist noch kürzer. PS: Sie haben mir für das Speichern von Bytes gedankt, aber Ihren Code in Ihrer Bearbeitung nicht geändert. ;)String c(int n,int x){String s,c=s="";int i=0;for(;i++<n;s+="*");for(i=x;i-->0;c+=" ");return n>1?s+"\n "+c+c(n-2,x+1)+"\n"+c+s:"*";}
ohne diet
( Ideone-Test - 133 Bytes )PHP - 95 Bytes
Ein Byte wurde gespeichert, indem eine aktuelle neue Zeile anstelle von "" verwendet wurde
"\r"
quelle
Pyth, 22 Bytes
Ein Programm, das eine Ganzzahl in STDIN eingibt und das Ergebnis ausgibt.
Probieren Sie es online aus
Wie es funktioniert
quelle
C,
195191 BytesSollte etwas kleiner golfen
Wir können es hier auf ideone testen
quelle
C 79 Bytes
Die Countdown-Variable wird
k
in Zeilen- und Spaltenindizes aufgeteilt. Wenn der Spaltenindex 0 ist (letztes Zeichen in einer Zeile), wird ein Zeilenumbruchzeichen (10) ausgegeben. Dann werden die Zeilen- und Spaltenindizes so angepasst, dass sie sich um den mittleren Stern befinden. Dannabs(x) < abs(y)
ist eine kurze Bedingung für die Ausgabe eines Leerzeichens.quelle
Ruby,
5554 Bytesquelle
?**n
funktioniert; Sie brauchen dort keinen Platz.Java 7, 156 Bytes
Relativ einfach. Verfolgt Linien mit
n
, Sterne mitj
, Leerzeichen mits
und Richtung mitd
. Ich wollte eigentlich nur eine nicht-rekursive Java-Antwort im Forum haben, aber es tut nicht weh, dass sie auch etwas kürzer ist :)Mit Zeilenumbrüchen:
quelle
APL, 19 Bytes
Prüfung:
Erläuterung:
quelle
1+
eine APL, die hat , und verwenden Sie sie⎕IO←0
.Haskell, 84 Bytes
quelle
putStr
und Sie können das loswerdenfromEnum
wie diese .C (GCC) ,
8074 BytesIch danke ceilingcat für 6 Bytes
Probieren Sie es online!
quelle
PowerShell ,
5450 ByteProbieren Sie es online!
quelle
PHP ,
10488 BytesProbieren Sie es online!
Dies übertrifft nicht die niedrigsten Werte für PHP bei dieser Herausforderung, aber es ist einfach zu verrückt für mich, um es wegzuwerfen.Okay, also habe ich jetzt Golf gespielt, um die (nicht lange) niedrigste Punktzahl für PHP bei dieser Herausforderung zu sein, aber es ändert nichts an der Tatsache, dass es immer noch verrückt ist.
quelle
Groovy, 66 Bytes
Probieren Sie es aus: https://groovyconsole.appspot.com/script/5145735624392704
Erklärt:
((n..1)+(2..n))
- Umgekehrte Palindromisierung zu n[n,..,1,..,n]
.each{if(it%2>0){...}
- Durch ungerade Elemente iterieren.println(("*"*it).center(n))
- N Sterne zentrieren und jeweils auf Newline drucken.quelle
.each
könnte der codeblock sein{it%2&&println(("*"*it).center(n))}
.PHP, 191 Bytes
Laufen wie
php -f golf_hourglass.php 15
Die Idee dahinter ist, die obere Hälfte (den Teil vor der Single
*
) zu erstellen und dann den oberen Teil zweimal, aber das zweite Mal in umgekehrter Reihenfolge, wiederzugeben.quelle
for(;$i<$a=$argv[1];$i+=2){$t=str_pad(str_pad("",$i+1,"*"),$a," ",2)."\n";$i?$s.=$t:$r=$t;}echo strrev($s)."\n".$r.$s;
for(;$i<$a=$argv[1];$i++){$t=str_pad(str_pad("",$i+1+$i%2,"*"),$a," ",2)."\n";$i%2?$s.=$t:$s=$t.$s;}echo$s;
das ist besser\n
durch eine aktuelle neue Zeile, um ein Byte zu speichern.Pyke,
2219 BytesProbieren Sie es hier aus!
quelle
C 117 Bytes
Ungolfed
quelle