Diese Herausforderung verwendet das Zeichen "+"

28

Ihre Aufgabe: Geben Sie eine Zahl ein nund generieren Sie ein "+" - Zeichen, ndas nicht in der Mitte des Zeichens steht . Wenn dies verwirrend ist, überprüfen Sie die Testfälle.

Standard-Eingabemethoden: Die Ausgabe muss eine Zeichenfolge sein oder gedruckt werden. Es gelten Standardlücken.

Input: 1
Output: +           ] 1 away from center `+`.

Input: 2
Output:  +          ] 2 away from center `+`.
        +++         ] 1 away from center `+`.  
         +

Input: 3
Output:   +         ] 3 away from center `+`.
          +
        +++++
          +
          +

Das ist , also gewinnt der kürzeste Code!

Genosse SparklePony
quelle
Ich gehe davon aus, dass nachfolgende Leerzeichen in jeder Zeile zulässig sind, damit das Ergebnis quadratisch ist, oder?
Luis Mendo
@ LuisMendo Ja, das ist in Ordnung.
Genosse SparklePony
Verwandte .
Neil
3
"generiere ein '+' Zeichen, das n Zeichen von seiner Mitte entfernt ist" - ich verstehe diesen Teil nicht. Auf welches Zentrum beziehen Sie sich? Wie kann etwas für sich selbst exzentrisch sein? Bitte klären Sie.
Wossname
6
Es wäre viel weniger verwirrend gewesen, wenn das Zentrum von sich selbst entfernt gewesen wäre.
Hören Sie auf, Monica am

Antworten:

45

Kohle , 5 Bytes

P+×+N

Probieren Sie es online!

fergusq
quelle
22
Was ist diese Sprache überhaupt?
DJMcMayhem
@DJMcMayhem Grundsätzlich können Sie damit ASCII-Grafiken für Schildkröten erstellen. Es verfügt über viele praktische Funktionen zum Rendern verschiedener Arten von ASCII-Formen (wie P+= Kreuz).
Fergusq
Sind das keine Multibyte-Zeichen?
Petah
3
@Petah Charcoal verwendet eine benutzerdefinierte Codepage .
Nur ASCII
@fergusq Möglicherweise mischen Sie Charcoal mit Turtlèd : P, Charcoal ist eigentlich keine Turtle-Grafiksprache
ASCII
12

JavaScript (ES6), 67 65 63 60 59 Bytes

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 Byte werden durch Ersetzen von zwei Vorkommen von x-1, dem ersten mit --xund dem zweiten mit, gespeichert x.
  • 2 Bytes gespart dank Kritixi Lithos , ersetzt "\n"durch `[newline]`.
  • Dank user2428118 konnten 3 Bytes gespart werden , was mir schließlich dabei half, einen Weg zu finden, den Alias repeatauf eine Weise zu definieren, die die Größe reduzierte. (Mit der ehrenvollen Erwähnung von Marie auch für ihre Bemühungen)
  • 1 Byte indirekt gespeichert dank Herman.

Versuch es

f=
x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
oninput=_=>o.innerText=f(+i.value)
o.innerText=f(i.value=3)
<input id=i min=1 type=number><pre id=o>

Zottelig
quelle
1
Ich bin mir nicht ganz sicher, aber ich denke, Sie können die "\n"durch zwei Backticks und eine wörtliche Newline zwischen ihnen
ersetzen
Danke, @KritixiLithos; Ich weiß nicht, warum ich selbst nicht früher daran gedacht habe.
Shaggy
1
Es sieht so aus, als könnten Sie wahrscheinlich ein Byte durch Aliasing-Wiederholung speichern, z. B. a='repeat',v=.....und` `[a]
Marie
Vielen Dank, @Marie; Ich hatte versucht, ein Alias ​​zu erstellen, repeat()aber meine ersten Versuche waren 2 oder 3 Bytes größer, also habe ich darauf verzichtet! Ich werde es mir noch einmal ansehen, wenn ich wieder vor einem Computer stehe.
Shaggy
2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
user2428118
9

MATL , 11 Bytes

tZv=&+g43*c

Probieren Sie es online!

Erklärung mit Beispiel

Überlegen Sie n = 3.

t     % Implicitly input n. Duplicate
      % STACK: 3, 3
Zv    % Symmetric range
      % STACK: 3, [1 2 3 2 1]
=     % Equal, element-wise
      % STACK: [0 0 1 0 0]
&+    % All pair-wise additions. Gives a 2D array
      % STACK: [0 0 1 0 0;
                0 0 1 0 0;
                1 1 2 1 1;
                0 0 1 0 0;
                0 0 1 0 0]
g     % Logical: convert non-zero to one
      % STACK: [0 0 1 0 0;
                0 0 1 0 0;
                1 1 1 1 1;
                0 0 1 0 0;
                0 0 1 0 0]
43*   % Multiply by 43 (ASCII for '+'), element-wise
      % STACK: [ 0  0 43  0  0;
                 0  0 43  0  0;
                43 43 43 43 43;
                 0  0 43  0  0;
                 0  0 43  0  0]
c     % Convert to char. Char 0 is displayed as space. Implicitly display.
      % STACK: ['  +  ';
                '  +  ';
                '+++++';
                '  +  ';
                '  +  ']
Luis Mendo
quelle
8

Kohle , 16 13 Bytes

Nα×+α←↑×+α‖O↘

Probieren Sie es online!

Verwendet einen anderen Ansatz als die andere Antwort von Charcoal.

Erläuterung

Nα                       # Take input and store it in variable α
×+α                       # α times write a +
←                         # Go left
↑×+α                      # α times write a + upwards

Jetzt ist die obere linke Ecke fertig und sieht ungefähr so ​​aus:

  +
  +
+++

‖O↘                      # Reflect-overlap it in a SE direction

Der letzte Schritt ist der Schlüssel zu diesem Programm. Er verwendet den oberen linken Teil des Plus, um den Rest des Plus durch Spiegeln in südöstlicher Richtung (nach rechts und unten) zu generieren.

Kritixi Lithos
quelle
Hat Charcoal eine eigene Codepage? Viele dieser Zeichen sind in UTF-8 mehrere Bytes.
TRiG
@TRiG Ja, das tut es !
Kritixi Lithos
8

Shakespeare Programming Language , 749 743 Bytes

N.Puck,.Page,.Ford,.Ajax,.Act I:.Scene I:.[Enter Puck and Ford]Puck:Listen to thy heart!Ford:You is the difference between a cat and I.Scene V:.[Exeunt][Enter Page and Ajax]Ajax:You is the difference between a cat and Ford.Scene X:.Page:You is the product of Puck and I.Is you as big as zero?If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.If not,you big big big big big cat.Speak thy mind!Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene X.Page:You is the sum of a big big big cat and a big cat.Speak thy mind![Exit Page][Enter Puck]Ajax:You is the sum of you and a cat.Is you as big as Ford?If not,let us return to Scene V.[Exeunt]

Probieren Sie es online!

Bearbeiten: Die Antwort wurde mit der offiziellen SPL-Implementierung kompatibel gemacht. Ich konnte sie vorher nicht zum Laufen bringen.

Golfed 6 Bytes, weil Szenennummern nicht aufeinander folgen müssen.

Erklärung :

SPL ist ein Esolang, der so gestaltet ist, dass er Shakespeares Stücken ähnelt. Positive Substantive haben den Wert 1 (hier wird cat verwendet) und negative Substantive den Wert -1 (keine wurden verwendet, aber pig ist eine davon). Adjektive modifizieren eine Konstante, indem sie sie mit 2 multiplizieren.

N.

Alles bis zum ersten Punkt ist der Titel und spielt keine Rolle.

Puck,.                           row counter
Page,.                           column counter
Ford,.                           input
Ajax,.                           temp

Die Zeichen sind ganzzahlige Variablen, jede hat auch einen Stapel, aber ich musste diese Funktion nicht verwenden.

Act I:.
Scene I:.

Acts und Szenen werden als Goto-Labels verwendet

[Enter Puck and Ford]

Es ist nur sinnvoll, wenn genau zwei Charaktere gleichzeitig auf der Bühne stehen.

Puck:Listen to thy heart!

Liest eine Nummer und erinnert Ford daran.

Ford:You is the difference between a cat and I.

Wie Sie sehen, ist Engrish in SPL gültig. Dies macht Pucks Wert "der Unterschied zwischen einer Katze und mir". Aber was bedeutet es? catist ein positives Nomen, also ist es Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt ist nur ein Plural von "exit" und ohne Argumente bedeutet dies, dass jeder auf der Bühne verlässt.

[Enter Page and Ajax]
Ajax:You is the difference between a cat and Ford.

Es ist auch, Page = 1 - Fordaber es wird von einem anderen Schauspieler gesprochen, also Iwäre es falsch. Da es sich um eine Schleife handelt, kann ich den Wert von nicht einfach kopieren Puck.

Scene III:.
Page:You is the product of Puck and I.

Ziemlich unkompliziert. Ajax = Puck * Page.

Is you as big as zero?

"as [adj] as" ist der ==Operator.

If so,you is the sum of the sum of the sum of a big big big big big cat and a big big big cat and a big cat and a cat.

Wenn Ajax == 0 ... "cat" ist 1, "big cat" ist 2, "big big cat" ist 4 und so weiter. Nach dem Ersetzen der einfachen Konstanten erhalten wir "die Summe der Summe der Summe von 32 und 8 und 2 und 1" -> "die Summe der Summe von 40 und 2 und 1" -> "die Summe von 42 und 1" -> "43", das ist das ASCII für +.

If not,you fat fat fat fat fat cat.

ansonsten ist es nur "fat fat fat fat fat cat", also erhält Ajax den Wert 32, den ASCII-Wert für ein Leerzeichen.

Speak thy mind!

Dies ist der Befehl zur Ausgabe eines Zeichens.

Ajax:
You sum you and cat.Is you as big as Ford?If not,let us return to Scene III.

Dies ist ein Schleifenkonstrukt. "Sie summieren Sie und Katze" erhöht Seite undif(Page != Ford) goto Scene III . Der Rest des Programms verwendet dieselben Komponenten, daher ist hier eine besser lesbare Pseudocode-Version:

Szene 1:
    Eingabe = [Eingabenummer];
    Zeile = 0 - Eingabe + 1;
Szene 2:
    col = 0 - Eingabe + 1;
Szene 3:
    temp = row * col;
    if (temp == 0) {
        temp = '+';
    }sonst{
        temp = '';
    }

    Putchar (Temp);
    Seite = Seite + 1;
    if (Page! = Ford) gehe zu Scene3;
    Ajax = 10;
    Putchar (Ajax);
    Puck = Puck + 1;
    if (Puck! = Ford) gehe zu Scene2;
NieDzejkob
quelle
" If not,let us return to Scene III." -1; bricht die vierte Mauer: P
Jakob
6

Mathematica, 39 Bytes

Print@@@(CrossMatrix[#-1]"+"/. 0->" ")&

CrossMatrixist eine integrierte Funktion, die eine Matrix der erforderlichen Form mit 1s anstelle von +s und 0s anstelle von Leerzeichen generiert . Wenn wir diese Matrix mit multiplizieren"+" das 1s durch +s ersetzt, während das 0s unverändert bleibt (offensichtlich ... 0*x = 0und 1*x = x, richtig?). Dann ersetzen wir die Nullen manuell durch Leerzeichen /. 0->" ". Zum Schluss drucken wir jede Zeile der Matrix mit Print@@@(...).

Martin Ender
quelle
1
Wusste nicht, dass Printman so etwas benutzen kann.
Genisis
6

C 69 Bytes

Nicht sehr interessant ... Überquert das Quadrat und druckt das entsprechende Zeichen aus.

r,c;f(n){for(r=-n;++r<n;puts(""))for(c=-n;++c<n;putchar(r*c?32:43));}
QUentin
quelle
6

Rubin, 41 40 Bytes

->x{puts k=[?\s*(r=x-1)+?+]*r,?+*r+=x,k}

Probieren Sie es online!

Ventero
quelle
6

GNU sed , 104 99 Bytes

-5 danke an seshoumara
Beinhaltet +1 für-r

s/1//;h;:;s/(.*)1/ \12/;t;s/( *2)2(2*)/\1\n\1\2/
t;G;s/1+/&&1/;s/(.*)(\n1*)/&\n\1/;/1/!c+
y/12/++/

Nimmt unäre Eingaben auf .

Probieren Sie es online!

s/1//                    # Subtract 1 from input
h                        # Hold onto input
:                        # Start loop
s/(.*)1/ \12/            #   Remove a 1, prepend a space, and append a 2
t                        # Loop until all 1s are 2s
                         # Start Loop (uses the previous label)
s/( *2)2(2*)/\1\n\1\2/   #   Shift all but the first 2 from the last line to a new line 
                         #   E.g.  "  2"      "  2"
                         #         "  222" -> "  2"
                         #                    "  22"
t                        # Loop until all 2s are on their own line
G                        # Append a newline and input
s/1+/&&1/                # Double the number of 1s and append an extra
s/(.*)(\n1*)/&\n\1/      # Copy all of the lines with 2s to the end
/1/!c+                   # If there aren't any 1s print a '+'
y/12/++/                 # Convert all 1s and 2s to +s
Riley
quelle
+1 Sie können 5 Bytes sparen, indem Sie s/( *2)2(2*)/\1\n\1\2/und s/(.*)(\n1*)/&\n\1/wie hier gezeigt für eine Gesamtpunktzahl von 99 verwenden.
seshoumara
5

Lua 113 , 90 Bytes

r,w,p=string.rep,io.read(),io.write;s=r(' ',w-1)p(r(s..'+'..'\n',w-1))p(r('+',w*2-1)..'\n')p(r(s..'+'..'\n',w-1))

r,w=string.rep,io.read()d=w*2-1;for a=1,d do print(a~=w and r(' ',w-1)..'+'or r('+',d))end
Ausplaudern
quelle
5

R, 54 Bytes

7 Bytes sparen dank @Jarko Dubbeldam:

function(n){a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="x";a}

vorherige Antwort:

f=function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}
Anzahl
quelle
1
Sie müssen keine Funktionen benennen, das function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}wären also 59 Bytes!
JAD
1
Sie können ein Byte auch mitmatrix("",y<-n*2-1,y)
JAD
1
a[n,]=a[,n]="x"funktioniert auch und spart ein paar Bytes.
JAD
Sie können weitere 4 Bytes speichern, scan()indem Sie es als Programm anstatt als Funktion verwenden:n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull
4

PowerShell , 48 Byte

param($n)($x=,(" "*--$n+"+")*$n);'+'*(1+2*$n);$x

Probieren Sie es online!

Übernimmt die Eingabe $n. Beginnt mit der Erstellung einer Folge von --$nLeerzeichen, die mit verknüpft sind +. Das wird mit dem Komma-Operator (neu dekrementiert) $nmal in ein Array konvertiert . Dieses Array wird $xin Parens gespeichert und eingekapselt, um eine Kopie in die Pipeline einzufügen.

Wir machen dann den mittleren Abschnitt, der +mit der entsprechenden Anzahl von Malen multipliziert wird. Das ist noch in der Pipeline. Zum Schluss setzen wir $xdie Pipeline wieder auf.

Diese werden bei Programmabschluss alle in der Pipeline belassen, und das implizite Write-Outputfügt eine neue Zeile zwischen die Elemente ein.

AdmBorkBork
quelle
4

Perl 5 , 45 Bytes

44 Byte Code + -pFlag.

$_=join"+
",@%=($"x--$_)x$_,"+"x($_*2),@%,""

Probieren Sie es online!


Einige ähnliche (aber immer noch unterschiedliche) Ansätze:

48 Bytes (47+ -p):

$_=join"+"x($_*2-1).$/,(~~($"x--$_."+\n")x$_)x2

50 Bytes (49+ -n):

$,="+"x($_*2-1).$/;print+(~~($"x--$_."+\n")x$_)x2
Dada
quelle
3

CJam , 23 Bytes

ri_(S*'++a\2*(*_z..e>N*

Probieren Sie es online!

Erläuterung

Das fühlt sich ein bisschen suboptimal an, aber die Idee ist, die folgenden zwei Gitter zu überlagern:

  +
  +
  +
  +
  +



+++++

Welches gibt das gewünschte Ergebnis.

ri    e# Read input and convert to integer N.
_(    e# Duplicate and decrement.
S*    e# Get a string of N-1 spaces (indentation of the vertical bar).
'++   e# Append a + (the vertical bar).
a     e# Wrap the line in an array.
\2*(  e# Swap with the other copy of N and compute 2N-1.
*     e# Repeat the line that many times.
_z    e# Duplicate the grid and transpose it.
..e>  e# Pairwise maximum between the two grids. This superimposes them.
N*    e# Join with linefeeds.
Martin Ender
quelle
3

CJam, 17

ri(S*_]'+*_ffe>N*

Probieren Sie es online aus

Erläuterung:

ri(      read n, convert to int and decrement
S*       make a string of n-1 spaces
_]       duplicate it and put the 2 strings in an array
'+*_     join the strings with a '+' and duplicate the result
ffe>     for each pair of characters from the 2 (identical) strings,
          get the larger character (results in a matrix)
N*       join the rows with newlines
aditsu
quelle
3

Oktave, 36 31 Bytes

Inspiriert von der MATL-Antwort von @LuisMendo.

@(n)' +'(((a=1:n*2-1==n)|a')+1)

Probieren Sie es online!

Vorherige Antwort:

@(n)' +'(1+((a=padarray(1,n-1))|a'))

Probieren Sie es online!

rahnema1
quelle
3

05AB1E , 15 14 12 Bytes

F'+}¹·<×)û.c

Probieren Sie es online!

-2 danke an Emigna.

Magische Kraken-Urne
quelle
1
Sie könnten F'+}¹·<×)û.cfür 12. tun
Emigna
Ihr Online-Link "try it" ist fehlerhaft - er verweist nicht auf die aktuelle Version des Posts, sodass "fehlerhafte Ausgabe" angezeigt wird, die nicht mit den obigen Testfällen übereinstimmt.
Thomas Ward
@ ThomasWard: Guter Fang! Ich habe den Link korrigiert.
Emigna
2

Python 2, 65 Bytes

lambda n:('g+\n'*~-n+'+'*~-(2*n)+'\ng+'*~-n).replace('g',' '*~-n)

Probieren Sie es online!

Mathe-Junkie
quelle
2

JS (ES6), 88 74 73 Bytes

x=>(x--,y=y=>(" ".repeat(x)+`+
`).repeat(x),y``+"+".repeat(x+x+1)+"\n"+y``)

Wahrscheinlich kann mehr golfen werden.

Snippetify(x=>(x--,y=y=>(" ".repeat(x)+`+
`).repeat(x),y``+"+".repeat(x+x+1)+"\n"+y``))
<script src="https://programmer5000.com/snippetify.min.js"></script>
<input type = "number">
<pre data-output></pre>

programmer5000
quelle
1
Ich bin mir nicht ganz sicher, aber ich denke, Sie können die "\n"durch zwei Backticks und eine wörtliche Newline zwischen ihnen
ersetzen
Nachdem Sie diese Lösung erst jetzt gesehen haben, haben Sie mich um ein paar Minuten geschlagen. Wie lautet hier die Etikette für ähnliche Lösungen in derselben Sprache, die innerhalb eines kleinen Zeitfensters veröffentlicht werden?
Zottelig
2

JavaScript (ES6), 60 Byte

f=
n=>(r=([s,t])=>(s=s.repeat(n-1))+t+s+`
`)([r(` +`),r(`++`)])
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

Gibt zwei nachgestellte Zeilenumbrüche aus. Alternative Formulierung, auch 60 Bytes:

n=>(r=a=>(s=a[0].repeat(n-1))+a[1]+s+`
`)([r(` +`),r(`++`)])
Neil
quelle
2

PowerShell, 48

Scheint nicht kürzer zu werden (und so ziemlich der gleiche Ansatz wie bei der anderen Lösung):

($a=,(' '*($n="$args"-1)+'+')*$n)
'+'+'++'*$n
$a

oder

($a=(' '*($n="$args"-1)+'+
')*$n)+'++'*$n+"+
$a"
Joey
quelle
2

REXX, 81 Bytes

arg a
b=a*2-1
do i=1 to b
  if i=a then say copies('+',b)
  else say right('+',a)
  end
idrougge
quelle
2

PHP, 68 Bytes

for(;$i<$c=-1+2*$m=$argn;)echo"\n".str_pad("+",$c," +"[$m==++$i],2);

83 Bytes

for(;$i<($c=($n=$argn)*2-1)**2;)echo$i%$c?"":"\n".!++$k," +"[$k==$n|$i++%$c==$n-1];
Jörg Hülsermann
quelle
1
Sie können einige Bytes einsparen, indem Sie sie verwenden $m=$argnund vorab erhöhen, $ianstatt sie nachträglich zu erhöhen. Sie können ein Byte auch speichern, indem Sie die $mZuweisung nach oben verschieben und die Klammern entfernen.
user59178
@ user59178 Ich konnte nicht verstehen, was du genau meinst
Jörg Hülsermann
1
for(;$i<$c=-1+2*$m=$argn;)echo"\n".str_pad("+",$c," +"[$m==++$i],2);
user59178
while(++$y<2*$n=$argn)echo"\n",str_pad("+",$n*2-1," +"[$y==$n],2);66 Bytes (und speichern Sie eine weitere mit einem physischen Zeilenumbruch)
Titus
2

MUMPS, 48 50 53 Bytes

F i=1-n:1:n-1 W ! F j=1-n:1:n-1 W $C(i&j*-11+43)
Mumpsimus
quelle
Willkommen bei PPCG!
Martin Ender
2

Brain-Flak , 216 + 1 = 217 Bytes

+1 Bytes von der -AFlagge

([{}]())(()()){<>(((((()()()()()){})){}()){}())<>(({}[()])<({}<(({})){({}()<(({}<<>(({}<(({})<>)>)<>)<>>)<{({}()<(((((()()){}){}){}){})>)}{}>)>)}{}>){(<{}(({}<<>({}<({}<>)>)>)<(({}){}){({}()<(({}))>)}{}>)>)}{}>)}{}{}

Probieren Sie es online!

Erklärung zu kommen

0 '
quelle