Ich habe diese Herausforderung von Codingame erhalten und bin neugierig auf bessere Lösungen als meine:
Zeichnen Sie bei einer Breite über die Standardeingabe ein hohles Quadrat '#' in der angegebenen Breite und Länge.
Beispiel:
5 Ergebnisse in
#####
# #
# #
# #
#####
Ich habe Python verwendet, um dieses Problem zu lösen, daher interessiere ich mich besonders für anderen Python-Code. Sie können Ihre Lösung jedoch in jeder gewünschten Sprache veröffentlichen.
code-golf
string
ascii-art
number
code-golf
grid
code-golf
string
ascii-art
code-golf
alphabet
cipher
code-golf
math
number
code-golf
quine
code-golf
palindrome
polyglot
code-golf
number
array-manipulation
counting
logic
code-golf
string
primes
binary
decision-problem
code-golf
ascii-art
kolmogorov-complexity
popularity-contest
code-golf
probability-theory
code-golf
string
code-golf
python
polyglot
programming-puzzle
c++
code-golf
math
code-golf
binary
integer
bitwise
code-golf
rational-numbers
code-golf
string
palindrome
code-golf
ascii-art
code-golf
code-golf
string
fibonacci
code-golf
math
sequence
code-golf
code-golf
string
palindrome
code-golf
string
code-golf
math
primes
source-layout
code-golf
sequence
binary
integer
code-golf
math
arithmetic
game
code-golf
restricted-source
palindrome
code-golf
restricted-source
palindrome
code-golf
combinatorics
binary
code-golf
string
math
code-golf
ascii-art
number
code-golf
cipher
code-golf
base-conversion
counting
code-golf
sequence
random
classification
code-golf
string
subsequence
code-golf
permutations
code-golf
string
code-golf
string
cipher
code-golf
kolmogorov-complexity
arithmetic
integer
code-golf
quine
markov-chain
code-golf
string
code-golf
code-golf
ascii-art
maze
sebingel
quelle
quelle
Antworten:
Pyke, 11 Bytes
Probieren Sie es hier aus!
quelle
Holzkohle , 6 Bytes
Code:
Erläuterung:
Probieren Sie es online!
quelle
N
dies auch in einem Ausdruck wieint(input())
in Python verwendet werden kann. Wenn diese Herausforderung darin bestünde, "ein hohles Rechteck mit vorgegebener Breite und Höhe zu zeichnen", könnte dies die Lösung seinBNN#
.MATL , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
Jolf, 8 Bytes
quelle
#
braucht man aus Neugier drei ?Python 2,
6254 BytesGibt zurück,
#\n#
wenn die Eingabe ist1
55-Byte-Version, die gedruckt wird
62-Byte-Version, die für jede Eingabe funktioniert:
quelle
f=
sei denn, Sie verwenden es - was Sie nicht tun.COW ,
426405348330 BytesProbieren Sie es online! Ändern Sie die Nummer in der zweiten Zeile in eine beliebige Nummer, um die Ausgabe zu ändern.
Der COW-Interpreter, den ich hier verwende, wurde in Perl geschrieben (und ist neuer als diese Herausforderung), aber Sie können immer noch das gleiche Ergebnis erzielen, indem Sie den Code hier eingeben .
Erläuterung
quelle
Python 2,
5958 Bytesrepl.it
Hinweis: Eine Eingabe von
1
ergibt eine Ausgabe von##
, aber ein hohles Quadrat würde niemals für eine Eingabe von weniger als erzeugt werden3
, also denke ich, dass dies in Ordnung ist.quelle
Java 7,
113112110 Bytes1 Byte gespart dank @ OlivierGrégoire ;
2 Bytes gespart dank @cliffroot .
Abgeleitete Lösung basierend auf meiner Antwort " Erstellen eines gekreuzten Quadrats" .
Probieren Sie es hier aus.
quelle
for(int i=n,j;i-->0;r+="\n")
? Da es uns egal ist, welches die untere oder die obere Zeile ist, macht es keinen Sinn, diese Reihenfolge beizubehalten, oder?PowerShell v2 +,
4847 Bytes-1 Byte dank JohnLBevan
Übernimmt Eingaben
$n
, setzt sie$z
als$n
Hashmarkierungen und$n
dekrementiert sie nach. Verkapselt dies in Parens, um eine Kopie in der Pipeline zu platzieren. Verwendet dann den Komma-Operator, um ein Array von vordekrementierten$n
Zeilen mit#
Leerzeichen zu erstellen#
. Diese verbleiben in der Pipeline. Dann$z
wieder in die Pipeline stellen.Write-Output
Bei der impliziten Ausgabe am Ende wird eine neue Zeile zwischen den Elementen eingefügt, sodass wir diese kostenlos erhalten.Da der OP-Code für die Eingabe nicht funktioniert
n <= 1
, habe ich das so verstanden, dass wir auch keine Eingabe unterstützen1
müssen.Beispiele
quelle
param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
C 98 Bytes
Verwendung:
quelle
05AB1E , 20 Bytes
Probieren Sie es online!
Oder 18 Bytes, wenn wir ignorieren können
1 <= n
:Probieren Sie es online!
quelle
WinDbg,
206200182170 Bytes-6 Bytes durch Entfernen von Parens aus
.if
und Verwenden vonj
anstelle von Sekunden.if
-18 Bytes durch Verwenden von
f
anstelle von a.for
zum Erstellen der Zeichenfolgen.-12 Bytes durch nicht NULL-terminierende Zeichenfolgen, stattdessen wird Länge an übergeben
da
Die Eingabe erfolgt über das Pseudoregister
$t0
(zBr $t0 = 5; {above-code}
).Erläuterung:
Beispielausgabe:
quelle
JavaScript,
61-58Bytes3 Bytes gespart dank @lmis !
(Behandelt nicht
0
oder1
)Für 13 zusätzliche Bytes (bei 71 Bytes ) können Sie!
Diese Lösungen sind recht einfach: Sie benötigen viel Speicher, um sich nicht zu wiederholen und ein paar Bytes zu sparen. Ohne die Variablen würde es so aussehen:
Versuch es!
quelle
!n?'':n==1?'#':
zusätzlichen 15 Bytes am Anfang des Funktionskörpers können Sie die Eingaben0
und verarbeiten1
.n=>(b='#'[r='repeat'](n))
und dann#${" "[r](n-=2)}
usw. spart Ihnen 3 Bytes durch Vermeidung von Wiederholungenrepeat
:)Python, 109 Bytes
quelle
list(' '*n)
mit[' ']*n
. Sie können auchx%(n-1)
mitx%~-n
for
Block in ein Listenverständnis verwandeln , können Sie mehr als 20 Bytes speichernint()
und lassen Sie die Klammern losprint
.<1
anstelle von==0
.Ruby, 39 Bytes
Es stellt sich heraus, dass es auf diese Weise kürzer ist als all die ausgefallenen Sachen, die ich versucht habe. Beachten Sie, dass dies nicht mit 0 oder 1 umgehen kann.
quelle
Python 2, 50 Bytes
Arbeitet für
n>=2
. Druckt jede Zeile mit einem Nummernzeichenn-2
des entsprechenden Symbols und anschließend mit einem weiteren Nummernzeichen.Aliasing des Pound-Symbols ergibt die gleiche Länge:
Andere Versuche:
quelle
Haskell, 49 Bytes
Funktioniert für
n>=2
. Definiert den Vorgang des Einfügens eines Zeichens zwischen Zeichen#
für einen
Zeichenfolge mit Zeilenumbruch und zweimaliger Anwendung, um ein 2D-Raster zu erstellen.Rufen Sie an wie:
quelle
C
8382807877 BytesMultiplizieren Sie und speichern Sie ein Byte ...
Zähle auch j runter und spare noch ein paar ...
Zähle i von n auf null herunter und spare ein paar Bytes ...
Ein bisschen einfacher zu verstehen und 1 Byte mehr
quelle
&&
statt&
?Groovy,
51 bis50 Bytesquelle
PHP,
81-69BytesLaufen Sie mit
-r
; Geben Sie eine Eingabe als Argument ein.Löst ein
DivisionByZeroError
for input = aus1
.quelle
R 68,
70BytesFunktioniert für n> 1. Danke an @Billywob für ein paar Bytes, die das Array gegen eine Matrix ausgetauscht haben.
Verwendet rbind und cbind, um Zeilen und Spalten von
#
's um eine n-2-Quadratmatrix von Räumen zu platzieren. Zeilenumbrüche sind ebenfalls an die Zeilen gebunden. Der Zeilenumbruch in der Quelle ist signifikant. Die Eingabe erfolgt von STDINquelle
\n
. Sie könnten zwei Bytes sparen, indem Siematrix
stattdessen verwendenarray
.Common Lisp,
150 -130 Bytes-20 dank @Cyoce und @AlexL.
Verwendung:
Grundsätzlich wird
format
zweimal für oben und unten und eine Schleife für die dazwischen liegenden Zeilen verwendet. Der Formataufruf für oben und unten gibt eine Zeile aus#
, die mit#
s beginnt und auf die entsprechende Breite aufgefüllt ist . Der Formataufruf für die Zeilen dazwischen funktioniert ähnlich, mit der Ausnahme, dass der Abstand Leerzeichen enthält und ein#
am Ende der Zeile gedruckt wird.Hinweis: Ich bin ein Neuling in Lisp und erwarte viel Raum für Verbesserungen.
quelle
s
? Oder funktioniert eine anonyme Funktion?dotimes (h (- v 2))
oder könnte es seindotimes(h(- v 2))
?Haskell, 67 Bytes
Anwendungsbeispiel:
Wie es funktioniert:
quelle
Jelly , 13, Bytes
TryItOnline! oder versuchen Sie es mit 0 bis 15
Wie?
quelle
Pip , 16 Bytes
15 Byte Code, +1 für
-n
Flag.Funktioniert für Eingaben> = 2. Probieren Sie es online!
Erklärung der etwas ungolften Version
Zunächst definieren wir eine Funktion
y
, die ein Zeichenfolgenargument annimmt, es wiederholta-2
(wobeia
es sich um die erste Befehlszeileneingabe handelt) und das Ergebnis in Zeilenumbrüche einfügt#
.Als nächstes wenden wir diese Funktion zweimal an - einmal normal, dann wieder mit map -, um das Quadrat als Liste von Zeichenfolgen zu erhalten:
Zur Eingabe von
4
,(y s)
ergibt sich in"# #"
undy M (y s)
in["####"; "# #"; "# #"; "####"]
. Dieser letztere Wert wird dann mit dem Symbol gedruckt-n
Flag dazu führt, dass die Zeilenumbrüche getrennt werden.Golftricks
So wechseln Sie von der ungolften zur golfierten Version:
Y
ist ein Operator, was bedeutet, dass wir ihn in einem Ausdruck verwenden können. AnstattY...
gefolgt von(ys)
, können wir einfach tun(Y...s)
.y
. soyM(Y_Xa-2WR'#s)
wird nicht funktionieren. Lösung: Tauschen Sie die Operanden desM
Operators ap aus. Solange eine von ihnen eine Funktion ist und die andere ein iterierbarer Typ, spielt es keine Rolle, in welcher Reihenfolge sie eingehen.quelle
Schläger 113 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
SpecBAS - 57 Bytes
?
ist Abkürzung fürPRINT
,#13
ist Wagenrücklauf, der an das Ende einer Zeichenkette geheftet werden kann, ohne dass ein+
, sie zu verbinden.Der Apostroph bewegt den Druckcursor eine Zeile nach unten.
quelle
Feststecken,
2927 BytesZiemlich verdammt lang für eine "Golf" -Sprache, aber ich habe vergessen, wie viel davon funktioniert: P
Erläuterung:
quelle
C #,
154152 BytesGolf gespielt:
Ungolfed:
EDIT1: Loop Range Optimierung.
quelle
Lithp , 117 Bytes
Zeile zweigeteilt zur besseren Lesbarkeit:
Beispielnutzung:
quelle