Este desafío utiliza el carácter '+'

28

Su tarea: dado un número n, genere un signo '+' que esté nalejado de los caracteres de su centro. Si esto es confuso, revise los casos de prueba.

Métodos estándar de entrada: la salida debe ser una cadena o impresa. Se aplican lagunas estándar.

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 `+`.
          +
        +++++
          +
          +

Este es el , ¡el código más corto gana!

Camarada SparklePony
fuente
Supongo que los espacios finales en cada línea están permitidos para que el resultado sea cuadrado, ¿verdad?
Luis Mendo
@LuisMendo Sí, eso está bien.
Camarada SparklePony
Relacionados .
Neil
3
"genera un signo '+' que está a n caracteres de distancia de su centro" - No entiendo esta parte. ¿A qué centro te refieres? ¿Cómo puede algo ser excéntrico para sí mismo? Por favor aclarar
Wossname
66
Hubiera sido mucho menos confuso si el centro estuviera alejado de sí mismo.
Deja de dañar a Monica el

Respuestas:

45

Carbón de leña , 5 bytes

P+×+N

Pruébalo en línea!

fergusq
fuente
22
¿Qué es este idioma?
DJMcMayhem
@DJMcMayhem Básicamente, puedes hacer gráficos ASCII de gráficos de tortuga con él. Tiene muchas prácticas herramientas para renderizar diferentes tipos de formas ASCII (como P+= cruz).
fergusq
¿No son esos caracteres multibyte?
Petah
3
@Petah Charcoal utiliza una página de códigos personalizada .
Solo para ASCII el
@fergusq Usted podría estar mezclando carbón de leña con turtled : P, carbón de leña no es realmente un lenguaje de gráficos de tortuga
ASCII de sólo
12

JavaScript (ES6), 67 65 63 60 59 bytes

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 bytes guardados reemplazando dos ocurrencias de x-1, la primera con --xy la segunda con x.
  • 2 bytes guardados gracias a Kritixi Lithos , reemplazando "\n"con `[newline]`.
  • 3 bytes guardados gracias a user2428118 , que finalmente me ayudó a encontrar una forma de alias repeatde una manera que redujera el tamaño. (Con mención honorífica a Marie por sus esfuerzos, también)
  • 1 byte guardado indirectamente gracias a Herman.

Intentalo

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>

Lanudo
fuente
1
No estoy completamente seguro, pero creo que puede reemplazarlo "\n"con dos
puntos de referencia
Gracias, @KritixiLithos; No sé por qué no pensé en eso antes.
Shaggy
1
Parece que probablemente podría guardar un byte aliasing repetición, por ejemplo, a='repeat',v=.....y` `[a]
Marie
Gracias, @Marie; Intenté aplicar alias repeat()pero mis primeros intentos salieron 2 o 3 bytes más grandes, ¡así que lo abandoné! Le echaré otro vistazo cuando vuelva a estar frente a una computadora.
Shaggy
2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
user2428118
9

MATL , 11 bytes

tZv=&+g43*c

Pruébalo en línea!

Explicación con ejemplo

Considere 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
fuente
8

Carbón , 16 13 bytes

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

Pruébalo en línea!

Utiliza un enfoque diferente de la otra respuesta de carbón.

Explicación

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

Ahora la esquina superior izquierda está completa, se verá más o menos así:

  +
  +
+++

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

El último paso es la clave de este programa, utiliza la parte superior izquierda del signo más para generar el resto del signo más reflejándolo en la dirección sureste (hacia la derecha y hacia abajo).

Kritixi Lithos
fuente
¿Charcoal tiene su propia página de códigos? Muchos de esos caracteres son múltiples bytes en UTF-8.
TRiG
@TRiG Sí, lo hace !
Kritixi Lithos
8

Lenguaje de programación Shakespeare , 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]

Pruébalo en línea!

Editar: hizo que la respuesta fuera compatible con la implementación oficial de SPL.

Golfó 6 bytes porque los números de escena no tienen que ser consecutivos.

Explicación :

SPL es un esolang diseñado para parecerse a las obras de Shakespeare. Los sustantivos positivos tienen el valor de 1 (aquí se usa cat ) y los sustantivos negativos tienen el valor de -1 (no se usaron ninguno pero pig es uno de ellos). Los adjetivos modifican una constante multiplicándola por 2.

N.

Todo hasta el primer punto es el título y no importa.

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

Los caracteres son variables enteras, cada uno de ellos también tiene una pila, pero no necesitaba usar esa función.

Act I:.
Scene I:.

Los actos y las escenas se usan como etiquetas de goto

[Enter Puck and Ford]

Solo es útil si exactamente dos personajes están en el escenario al mismo tiempo.

Puck:Listen to thy heart!

Lee un número y hace que Ford lo recuerde.

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

Como puede ver, Engrish es válido en SPL. Esto hace que el valor de Puck sea "la diferencia entre un gato y yo". Pero, ¿qué significa? cates un sustantivo positivo, entonces lo es Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt es solo un plural de "salida", y sin argumentos significa que todos en el escenario salen.

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

También es, Page = 1 - Fordpero lo habla un actor diferente, por Ilo que estaría mal. Como es un bucle, no puedo simplemente copiar el valor de Puck.

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

Bastante sencillo por ahora. Ajax = Puck * Page.

Is you as big as zero?

"as [adj] as" es el ==operador.

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.

Si Ajax == 0 ... "gato" es 1, "gato grande" es 2, "gato grande" es 4 y así sucesivamente. Después de sustituir las constantes simples obtenemos "la suma de la suma de la suma de 32 y 8 y 2 y 1" -> "la suma de la suma de 40 y 2 y 1" -> "la suma de 42 y 1" -> "43", que es el ASCII para +.

If not,you fat fat fat fat fat cat.

de lo contrario, es solo "gato gordo gordo gordo gordo", por lo que Ajax obtiene el valor de 32, el ASCII por un espacio.

Speak thy mind!

Este es el comando para generar un carácter.

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

Esta es una construcción de bucle. "Sumas tú y gato" incrementa la página, y if(Page != Ford) goto Scene III. El resto del programa usa los mismos componentes, así que aquí hay una versión de pseudocódigo más legible:

Escena 1:
    input = [número de entrada];
    fila = 0 - entrada + 1;
Escena2:
    col = 0 - entrada + 1;
Escena3:
    temp = fila * col;
    if (temp == 0) {
        temp = '+';
    }más{
        temp = '';
    }

    putchar (temp);
    Página = Página + 1;
    if (Page! = Ford) goto Scene3;
    Ajax = 10;
    putchar (Ajax);
    Puck = Puck + 1;
    if (Puck! = Ford) pasa a Scene2;
NieDzejkob
fuente
" If not,let us return to Scene III." -1; rompe la cuarta pared: P
Jakob
6

Mathematica, 39 bytes

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

CrossMatrixes una función integrada que genera una matriz de la forma requerida con 1s en lugar de +sy 0s en lugar de espacios. Si multiplicamos esa matriz por "+", eso reemplaza la 1s con +s mientras deja la 0s sin cambios (obviamente ... 0*x = 0y 1*x = x, ¿verdad?). Luego reemplazamos los ceros manualmente con espacios usando /. 0->" ". Finalmente, imprimimos cada línea de la matriz con Print@@@(...).

Martin Ender
fuente
1
No sabía que Printpodría usarse así.
ngenisis
6

C, 69 bytes

No es muy interesante ... Recorre el cuadrado, imprime el personaje apropiado.

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

GNU sed , 104 99 bytes

-5 gracias a seshoumara
Incluye +1 por-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/++/

Toma entrada en unario.

Pruébalo en línea!

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
fuente
+1 Puede guardar 5 bytes usando s/( *2)2(2*)/\1\n\1\2/y s/(.*)(\n1*)/&\n\1/como se muestra aquí , para una puntuación total de 99.
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
Cotilla
fuente
5

Python 2 , 52 bytes

n=input()-1
p=(' '*n+'+\n')*n
print p+'++'*n+'+\n'+p

Pruébalo en línea!

Una alternativa de 53 bytes ( TIO ):

n=input()-1
for c in' '*n+'+'+' '*n:print c*n+'+'+c*n
xnor
fuente
5

R, 54 bytes

Afeitando 7 bytes gracias a @Jarko Dubbeldam:

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

respuesta anterior:

f=function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}
contar
fuente
1
No tiene que nombrar funciones, ¡entonces function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}serían 59 bytes!
JAD
1
Además, puede guardar un byte usandomatrix("",y<-n*2-1,y)
JAD
1
a[n,]=a[,n]="x"funciona también, ahorrando algunos bytes más.
JAD
Puede guardar otros 4 bytes utilizando scan()y convirtiéndolo en un programa en lugar de una función:n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull
4

PowerShell , 48 bytes

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

Pruébalo en línea!

Toma entrada $n. Comienza construyendo una cadena de --$nespacios, concatenados con +. Eso se convierte en una matriz utilizando el operador de coma, (recientemente decrementado) $nveces. Esa matriz se almacena $xy encapsula en parens para colocar una copia en la tubería.

Luego hacemos la sección del medio, que es una +cadena multiplicada el número apropiado de veces. Eso queda en la tubería. Finalmente, volvemos $xa la tubería.

Todo eso queda en la tubería al finalizar el programa, y ​​lo implícito Write-Outputinserta una nueva línea entre los elementos.

AdmBorkBork
fuente
4

Perl 5 , 45 bytes

44 bytes de código + -pbandera.

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

Pruébalo en línea!


Algunos enfoques similares (pero aún diferentes):

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
fuente
4

Python 2 , 60, 56 bytes

n=input()-1
z=(' '*n+'+\n')*n
print z+'+'*(2*n+1)+'\n'+z

Pruébalo en línea!

  • -4 bytes - ¡gracias al adicto a las matemáticas!
Keerthana Prabhakaran
fuente
1
Ahorre 4 bytes como este: TIO
adicto a las matemáticas
3

CJam , 23 bytes

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

Pruébalo en línea!

Explicación

Esto se siente un poco subóptimo, pero la idea es superponer las siguientes dos cuadrículas:

  +
  +
  +
  +
  +



+++++

Lo que da el resultado deseado.

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
fuente
3

CJam, 17

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

Pruébalo en línea

Explicación:

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
fuente
3

05AB1E , 15 14 12 bytes

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

Pruébalo en línea!

-2 gracias a Emigna.

Urna de pulpo mágico
fuente
1
Podrías hacerlo F'+}¹·<×)û.cpor 12.
Emigna
Su enlace de probarlo en línea es incorrecto: no se vincula a la revisión actual de la publicación, por lo que muestra un "resultado incorrecto" que no coincide con los casos de prueba anteriores.
Thomas Ward,
@ThomasWard: ¡Buena captura! Corrija el enlace.
Emigna
2

Python 2, 65 bytes

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

Pruébalo en línea!

adicto a las matemáticas
fuente
2

JS (ES6), 88 74 73 bytes

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

Probablemente se pueda jugar más al golf.

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>

programador 5000
fuente
1
No estoy completamente seguro, pero creo que puede reemplazarlo "\n"con dos
puntos de referencia
Solo viendo esta solución ahora, me ganaste por unos minutos. ¿Cuál es la etiqueta por aquí sobre soluciones similares en el mismo idioma que se publican dentro de un breve lapso de tiempo?
Shaggy
2

JavaScript (ES6), 60 bytes

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>

Produce dos nuevas líneas finales. Formulación alternativa, también 60 bytes:

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

PowerShell, 48

No parece ser más corto que eso (y casi el mismo enfoque que la otra solución):

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

o

($a=(' '*($n="$args"-1)+'+
')*$n)+'++'*$n+"+
$a"
Joey
fuente
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
fuente
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
fuente
1
Puede guardar unos pocos bytes mediante el uso $m=$argny el incremento previo en $ilugar de aumentarlo posteriormente. También puede guardar un byte moviendo la $masignación al final y soltando los corchetes.
user59178
@ user59178 No pude entender lo que quieres decir exactamente
Jörg Hülsermann
1
for(;$i<$c=-1+2*$m=$argn;)echo"\n".str_pad("+",$c," +"[$m==++$i],2);
usuario59178
while(++$y<2*$n=$argn)echo"\n",str_pad("+",$n*2-1," +"[$y==$n],2);66 bytes (y guarde uno más con un salto de línea físico)
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
fuente
Bienvenido a PPCG!
Martin Ender
2

Brain-Flak , 216 + 1 = 217 bytes

+1 bytes de la -Abandera

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

Pruébalo en línea!

Explicación por venir

0 '
fuente