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!


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


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!


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>


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: ['  +  ';
                '  +  ';
                '+++++';
                '  +  ';
                '  +  ']

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.


Hat Charcoal eine eigene Codepage? Viele dieser Zeichen sind in UTF-8 mehrere Bytes.
TRiG


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;

" 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@@@(...).


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));}


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

+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


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}

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.


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


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.

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


3

05AB1E , 15 14 12 Bytes

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

Probieren Sie es online!

-2 danke an Emigna.


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

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>


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(`++`)])

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"


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

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];

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

Brain-Flak , 216 + 1 = 217 Bytes

+1 Bytes von der -AFlagge

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

Probieren Sie es online!

Erklärung zu kommen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.