Questa sfida utilizza il carattere "+"


28

Il tuo compito: dato un numero n, genera un segno "+" che è ncaratteri distanti dal suo centro. Se questo è confuso, controlla i casi di test.

Metodi standard di input: l'output deve essere una stringa o stampato. Si applicano scappatoie standard.

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

Questo è , quindi vince il codice più corto!


Presumo che siano consentiti spazi finali su ogni riga in modo che il risultato sia quadrato, giusto?
Luis Mendo,

@LuisMendo Sì, va bene.
Compagno SparklePony,


3
"genera un segno '+' che è n caratteri di distanza dal suo centro" - Non capisco questa parte. A quale centro ti riferisci? Come può qualcosa essere eccentrico a se stesso? Si prega di precisare.
Wossname

6
Sarebbe stato molto meno confuso se il centro fosse a 0 di distanza da se stesso.
Smetti di fare del male a Monica il

Risposte:


45

Carbone , 5 byte

P+×+N

Provalo online!


22
Cos'è anche questa lingua?
DJMcMayhem

@DJMcMayhem Fondamentalmente puoi fare grafica ASCII con la tartaruga. Ha molti pratici incorporati per il rendering di diversi tipi di forme ASCII (come P+= croce).
fergusq,

Questi non sono personaggi multibyte?
Petah,

3
@Petah Charcoal utilizza una tabella codici personalizzata .
ASCII il

@fergusq Potresti mescolare Charcoal con Turtlèd : P, Charcoal non è in realtà un linguaggio grafico per tartarughe
ASCII il


12

JavaScript (ES6), 67 65 63 60 59 byte

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 byte salvati sostituendo due occorrenze di x-1, il primo con --xe il secondo con x.
  • 2 byte salvati grazie a Kritixi Lithos , in sostituzione "\n"di `[newline]`.
  • 3 byte salvati grazie a user2428118 , finalmente aiutandomi a capire un modo per alias repeatin modo da ridurne le dimensioni. (Con onorevole menzione anche a Marie per i suoi sforzi)
  • 1 byte salvato indirettamente grazie a Herman.

Provalo

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
Non ne sono del tutto sicuro, ma penso che puoi sostituirlo "\n"con due backtick e una letterale letterale tra di loro
Kritixi Lithos,

Grazie, @KritixiLithos; non so perché non ci abbia pensato prima.
Shaggy,

1
Sembra che potresti probabilmente salvare un byte aliasando ripetizione, ad esempio a='repeat',v=.....e` `[a]
Marie

Grazie, @Marie; Avevo provato ad aliasing repeat()ma i miei primi tentativi sono usciti 2 o 3 byte più grandi, quindi l'ho abbandonato! Lo guarderò di nuovo quando torno davanti a un computer.
Shaggy,

2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
user2428118,

9

MATL , 11 byte

tZv=&+g43*c

Provalo online!

Spiegazione con esempio

Considerare 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

Carbone , 16 13 byte

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

Provalo online!

Utilizza un approccio diverso dall'altra risposta al carbone.

Spiegazione

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

Ora l'angolo in alto a sinistra è completo, sarà simile a questo:

  +
  +
+++

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

L'ultimo passo è la chiave di questo programma, usa la parte in alto a sinistra del plus per generare il resto del plus riflettendolo nella direzione sud-est (verso destra e verso il basso).


Charcoal ha una sua tabella codici? Molti di questi caratteri sono multipli byte in UTF-8.
TRiG

@TRiG Sì, lo fa !
Kritixi Lithos,

8

Shakespeare Programming Language , 749 743 byte

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]

Provalo online!

Modifica: reso la risposta compatibile con l'implementazione ufficiale di SPL - non riuscivo a farlo funzionare prima.

Golfato 6 byte perché i numeri di scena non devono essere consecutivi.

Spiegazione :

SPL è un esolang progettato per assomigliare alle commedie di Shakespeare. I sostantivi positivi hanno il valore di 1 (qui si usa il gatto ) e i sostantivi negativi hanno il valore di -1 (nessuno è stato usato ma il maiale è uno di questi). Gli aggettivi modificano una costante moltiplicandola per 2.

N.

Tutto fino al primo punto è il titolo e non importa.

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

I personaggi sono variabili intere, ognuna di esse ha anche uno stack ma non ho avuto bisogno di usare quella funzione.

Act I:.
Scene I:.

Gli atti e le scene sono usati come etichette di goto

[Enter Puck and Ford]

È utile solo se sul palco sono presenti esattamente due personaggi contemporaneamente.

Puck:Listen to thy heart!

Legge un numero e fa ricordare a Ford.

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

Come puoi vedere Engrish è valido in SPL. Questo rende il valore di Puck "la differenza tra un gatto e io". Ma cosa significa? catè un sostantivo positivo, quindi lo è Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt è solo un plurale di "uscita", e senza argomenti significa che tutti sul palco escono.

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

È anche, Page = 1 - Fordma è parlato da un attore diverso, quindi Isarebbe sbagliato. Dal momento che è un ciclo, non posso semplicemente copiare il valore di Puck.

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

Ormai abbastanza semplice. Ajax = Puck * Page.

Is you as big as zero?

"as [agg] as" è l' ==operatore.

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.

Se Ajax == 0 ... "cat" è 1, "big cat" è 2, "big big cat" è 4 e così via. Dopo aver sostituito le costanti semplici otteniamo "la somma della somma della somma di 32 e 8 e 2 e 1" -> "la somma della somma di 40 e 2 e 1" -> "la somma di 42 e 1" -> "43", ovvero ASCII per +.

If not,you fat fat fat fat fat cat.

altrimenti è solo "grasso grasso grasso grasso grasso gatto", quindi Ajax ottiene il valore di 32, ASCII per uno spazio.

Speak thy mind!

Questo è il comando per emettere un personaggio.

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

Questo è un costrutto circolare. Pagina "incrementi di te e gatto" e if(Page != Ford) goto Scene III. Il resto del programma utilizza gli stessi componenti, quindi ecco una versione pseudocodice più leggibile:

Scena 1:
    input = [numero input];
    riga = 0 - input + 1;
SCENE2:
    col = 0 - input + 1;
Scene3:
    temp = riga * col;
    if (temp == 0) {
        temp = '+';
    }altro{
        temp = '';
    }

    putchar (temp);
    Pagina = Pagina + 1;
    if (Page! = Ford) vai a Scene3;
    Ajax = 10;
    putchar (Ajax);
    Disco = Disco + 1;
    if (Puck! = Ford) vai a Scene2;

" If not,let us return to Scene III." -1; rompe la quarta parete: P
Jakob


6

Mathematica, 39 byte

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

CrossMatrixè un built-in che genera una matrice della forma richiesta con 1s anziché +s e 0s anziché spazi. Se moltiplichiamo quella matrice per "+", sostituisce la 1s con +s lasciando 0invariata la s (ovviamente ... 0*x = 0e 1*x = x, giusto?). Quindi sostituiamo gli zeri manualmente con spazi usando /. 0->" ". Infine, stampiamo ogni riga della matrice con Print@@@(...).


1
Non sapevo Printpotesse essere usato così.
ngenisi,

6

C, 69 byte

Non molto interessante ... Avvolge la piazza, stampando il carattere appropriato.

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 byte

-5 grazie a seshoumara
Include +1 per-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/++/

Riceve input in unario.

Provalo 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 Puoi salvare 5 byte usando s/( *2)2(2*)/\1\n\1\2/e s/(.*)(\n1*)/&\n\1/come mostrato qui , per un punteggio totale di 99.
seshoumara,

5

Lua 113 , 90 byte

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

Python 2 , 52 byte

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

Provalo online!

Un'alternativa a 53 byte ( TIO ):

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

5

R, 54 byte

Rasatura di 7 byte grazie a @Jarko Dubbeldam:

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

risposta precedente:

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

1
Non è necessario function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}assegnare un nome alle funzioni, quindi sarebbero 59 byte!
JAD,

1
Inoltre, puoi salvare un byte usandomatrix("",y<-n*2-1,y)
JAD

1
a[n,]=a[,n]="x"funziona anche, salvando qualche altro byte.
JAD,

Puoi salvare altri 4 byte usando scan()e trasformandolo in un programma anziché in una funzione: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

Provalo online!

Accetta input $n. Inizia costruendo una serie di --$nspazi, concatenati con +. Viene convertito in un array utilizzando l'operatore virgola, volte (appena diminuito) $n. Quell'array viene archiviato $xe incapsulato in parentesi per posizionare una copia sulla pipeline.

Facciamo quindi la sezione centrale, che è la +stringa moltiplicata per il numero appropriato di volte. È rimasto sulla pipeline. Alla fine, abbiamo $xripreso la pipeline.

Questi sono tutti lasciati in cantiere al completamento del programma e l'implicito Write-Outputinserisce una nuova riga tra gli elementi.


4

Perl 5 , 45 byte

44 byte di codice + -pflag.

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

Provalo online!


Alcuni approcci simili (ma ancora diversi):

48 byte (47+ -p):

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

50 byte (49+ -n):

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


3

CJam , 23 byte

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

Provalo online!

Spiegazione

Questo sembra un po 'non ottimale, ma l'idea è sovrapporre le seguenti due griglie:

  +
  +
  +
  +
  +



+++++

Che dà il risultato desiderato.

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*

Provalo online

Spiegazione:

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 byte

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

Provalo online!

-2 grazie a Emigna.


1
Si potrebbe fare F'+}¹·<×)û.cper 12.
Emigna

Il tuo link online per il tentativo è negativo - non si collega alla revisione corrente del post, quindi mostra "output errato" che non corrisponde ai casi di test sopra.
Thomas Ward,

@ThomasWard: buona cattura! Ho corretto il collegamento.
Emigna,


2

JS (ES6), 88 74 73 byte

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

Probabilmente si può giocare a golf di più.

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
Non ne sono del tutto sicuro, ma penso che puoi sostituirlo "\n"con due backtick e una letterale letterale tra di loro
Kritixi Lithos,

Vedendo solo questa soluzione ora, mi hai battuto di qualche minuto. Qual è l'etichetta qui intorno su soluzioni simili nella stessa lingua che vengono pubblicate in una piccola finestra di tempo?
Shaggy,

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>

Emette due nuove righe finali. Formulazione alternativa, anche 60 byte:

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

2

PowerShell, 48

Non sembra essere più breve di quello (e praticamente lo stesso approccio dell'altra soluzione):

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

o

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


2

REXX, 81 byte

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 byte

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

83 byte

for(;$i<($c=($n=$argn)*2-1)**2;)echo$i%$c?"":"\n".!++$k," +"[$k==$n|$i++%$c==$n-1];

1
È possibile salvare alcuni byte utilizzando $m=$argne pre-incrementando $ianziché post-incrementandolo. puoi anche salvare un byte spostando l' $massegnazione alla fine e facendo cadere le parentesi.
user59178

@utente59178 Non riuscivo a capire cosa intendi esattamente
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 byte (e salvane uno in più con un'interruzione di linea fisica)
Tito


2

Brain-Flak , 216 + 1 = 217 byte

+1 byte dalla -Abandiera

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

Provalo online!

Spiegazione a venire

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.