Ce défi utilise le caractère «+»


28

Votre tâche: à partir d'un nombre n, générez un signe «+» néloigné des caractères de son centre. Si cela prête à confusion, consultez les cas de test.

Méthodes d'entrée standard: la sortie doit être une chaîne ou imprimée. Des échappatoires standard s'appliquent.

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

C'est le , donc le code le plus court gagne!


Je suppose que les espaces de fin sur chaque ligne sont autorisés afin que le résultat soit carré, non?
Luis Mendo

@LuisMendo Oui, ça va.
Camarade SparklePony


3
"générer un signe '+' éloigné de n caractères de son centre" - je ne comprends pas cette partie. De quel centre parlez-vous? Comment quelque chose peut-il être excentrique par rapport à lui-même? Précisez s'il vous plaît.
Wossname

6
Cela aurait été beaucoup moins déroutant si le centre était à 0 de lui-même.
Arrêtez de nuire à Monica le

Réponses:


45

Fusain , 5 octets

P+×+N

Essayez-le en ligne!


22
Quelle est même cette langue?
DJMcMayhem

@DJMcMayhem Fondamentalement, vous pouvez faire de l'art ASCII avec des graphiques de tortues. Il possède de nombreuses fonctionnalités pratiques pour le rendu de différents types de formes ASCII (comme P+= croix).
fergusq

Ce ne sont pas des caractères multi-octets?
Petah

3
@Petah Charcoal utilise une page de code personnalisée .
ASCII uniquement du

@fergusq Vous mélangez peut-être Charcoal avec Turtlèd : P, Charcoal n'est pas vraiment un langage graphique pour les tortues
ASCII uniquement


12

JavaScript (ES6), 67 65 63 60 59 octets

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 octets enregistrés en remplaçant deux occurrences de x-1, la première avec --xet la seconde avec x.
  • 2 octets enregistrés grâce à Kritixi Lithos , en remplaçant "\n"par `[newline]`.
  • 3 octets enregistrés grâce à user2428118 , ce qui m'a finalement aidé à trouver un moyen de créer un alias repeatde manière à réduire la taille. (Avec une mention honorable à Marie pour ses efforts aussi)
  • 1 octet économisé indirectement grâce à Herman.

Essayez-le

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
Je ne suis pas tout à fait sûr, mais je pense que vous pouvez remplacer le "\n"par deux backticks et une nouvelle ligne littérale entre eux
Kritixi Lithos

Merci, @KritixiLithos; Je ne sais pas pourquoi je n'y ai pas pensé plus tôt moi-même.
Shaggy

1
Il semble que vous pourriez probablement enregistrer un octet en répétant le pseudonyme, par exemple a='repeat',v=.....et` `[a]
Marie

Merci, @Marie; J'avais essayé l'aliasing repeat()mais mes premières tentatives sont sorties 2 ou 3 octets plus gros donc je l'ai abandonné! J'y reverrai quand je reviendrai devant un ordinateur.
Shaggy

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

9

MATL , 11 octets

tZv=&+g43*c

Essayez-le en ligne!

Explication avec exemple

Considérez 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

Fusain , 16 13 octets

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

Essayez-le en ligne!

Utilise une approche différente de l'autre réponse au charbon de bois.

Explication

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

Maintenant, le coin supérieur gauche est terminé, il ressemblera à ceci:

  +
  +
+++

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

La dernière étape est la clé de ce programme, il utilise la partie supérieure gauche du plus pour générer le reste du plus en le reflétant dans la direction sud-est (vers la droite et vers le bas).


Le charbon de bois a-t-il sa propre page de codes? Beaucoup de ces caractères sont plusieurs octets en UTF-8.
TRiG


8

Langage de programmation Shakespeare , 749 743 octets

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]

Essayez-le en ligne!

Edit: a rendu la réponse compatible avec l'implémentation SPL officielle - je ne pouvais pas le faire fonctionner avant.

Golfé 6 octets car les numéros de scène ne doivent pas être consécutifs.

Explication :

SPL est un esolang conçu pour ressembler aux pièces de Shakespeare. Les noms positifs ont la valeur 1 (ici le chat est utilisé) et les noms négatifs ont la valeur -1 (aucun n'a été utilisé mais porc est l'un d'entre eux). Les adjectifs modifient une constante en la multipliant par 2.

N.

Tout jusqu'au premier point est le titre et n'a pas d'importance.

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

Les caractères sont des variables entières, chacun d'eux a également une pile mais je n'avais pas besoin d'utiliser cette fonctionnalité.

Act I:.
Scene I:.

Les actes et les scènes sont utilisés comme étiquettes goto

[Enter Puck and Ford]

Cela n'est utile que si exactement deux personnages sont sur la scène en même temps.

Puck:Listen to thy heart!

Lit un nombre et fait en sorte que Ford s'en souvienne.

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

Comme vous pouvez le voir, Engrish est valide dans SPL. Cela fait de la valeur de Puck "la différence entre un chat et moi". Mais qu'est-ce que ça veut dire?catest un nom positif, donc c'est Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt est juste un pluriel de "sortie", et sans arguments signifie que tout le monde sur la scène sort.

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

C'est aussi Page = 1 - Fordmais c'est parlé par un acteur différent donc ce Iserait faux. Puisqu'il s'agit d'une boucle, je ne peux pas simplement copier la valeur dePuck .

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

Assez simple maintenant. Ajax = Puck * Page.

Is you as big as zero?

"aussi [adj] que" est le == opérateur.

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 ... "chat" vaut 1, "gros chat" vaut 2, "gros gros chat" vaut 4 et ainsi de suite. Après avoir substitué les constantes simples, nous obtenons "la somme de la somme de la somme de 32 et 8 et 2 et 1" -> "la somme de la somme de 40 et 2 et 1" -> "la somme de 42 et 1" -> "43", qui est l'ASCII pour +.

If not,you fat fat fat fat fat cat.

sinon c'est juste "fat fat fat fat fat fat cat", donc Ajax obtient la valeur de 32, l'ASCII pour un espace.

Speak thy mind!

Il s'agit de la commande de sortie d'un caractère.

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

Il s'agit d'une construction en boucle. "Vous additionnez vous et chat" incrémente Page, et if(Page != Ford) goto Scene III. Le reste du programme utilise les mêmes composants, voici donc une version de pseudocode plus lisible:

Scène 1:
    entrée = [numéro d'entrée];
    ligne = 0 - entrée + 1;
Scene2:
    col = 0 - entrée + 1;
Scene3:
    temp = ligne * col;
    si (temp == 0) {
        temp = '+';
    }autre{
        temp = '';
    }

    putchar (temp);
    Page = Page + 1;
    if (Page! = Ford) goto Scene3;
    Ajax = 10;
    putchar (Ajax);
    Puck = Puck + 1;
    if (Puck! = Ford) goto Scene2;

" If not,let us return to Scene III." -1; brise le quatrième mur: P
Jakob


6

Mathematica, 39 octets

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

CrossMatrixest une fonction intégrée qui génère une matrice de la forme requise avec 1s au lieu de +s et 0s au lieu d'espaces. Si nous multiplions cette matrice par "+", cela remplace le 1s par +s tout en laissant le 0s inchangé (évidemment ... 0*x = 0et 1*x = x, non?). Ensuite, nous remplaçons les zéros manuellement par des espaces en utilisant /. 0->" ". Enfin, nous imprimons chaque ligne de la matrice avec Print@@@(...).


1
Je ne savais pas qu'on Printpouvait l'utiliser comme ça.
ngenisis

6

C, 69 octets

Pas très intéressant ... Boucles sur le carré, imprimant le caractère approprié.

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 octets

-5 grâce à seshoumara
Comprend +1 pour-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/++/

Prend entrée en unaire.

Essayez-le en ligne!

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 Vous pouvez économiser 5 octets en utilisant s/( *2)2(2*)/\1\n\1\2/et s/(.*)(\n1*)/&\n\1/comme indiqué ici , pour un score total de 99.
seshoumara

5

Lua 113 , 90 octets

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 octets

Raser 7 octets grâce à @Jarko Dubbeldam:

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

réponse précédente:

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

1
Vous n'avez pas à nommer de fonctions, ce function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}serait donc 59 octets!
JAD

1
En outre, vous pouvez enregistrer un octet en utilisantmatrix("",y<-n*2-1,y)
JAD

1
a[n,]=a[,n]="x"fonctionne aussi, économisant encore plus d'octets.
JAD

Vous pouvez enregistrer encore 4 octets en utilisant scan()et en faisant un programme plutôt qu'une fonction:n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull

4

PowerShell , 48 octets

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

Essayez-le en ligne!

Prend des informations $n. Commence par construire une chaîne d' --$nespaces, concaténée avec +. Cela est converti en un tableau à l'aide de l'opérateur virgule, (nouvellement décrémenté) $nfois. Ce tableau est stocké $xet encapsulé dans des parens pour placer une copie sur le pipeline.

Nous faisons ensuite la section du milieu, qui est une +chaîne multipliée par le nombre approprié de fois. Cela reste sur le pipeline. Enfin, nous avons remis $xle pipeline en place.

Ceux-ci sont tous laissés sur le pipeline à la fin du programme, et l'implicite Write-Outputinsère une nouvelle ligne entre les éléments.


4

Perl 5 , 45 octets

44 octets de code + -pindicateur.

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

Essayez-le en ligne!


Quelques approches similaires (mais toujours différentes):

48 octets (47+ -p):

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

50 octets (49+ -n):

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


3

CJam , 23 octets

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

Essayez-le en ligne!

Explication

Cela semble un peu sous-optimal, mais l'idée est de superposer les deux grilles suivantes:

  +
  +
  +
  +
  +



+++++

Ce qui donne le résultat souhaité.

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 ans

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

Essayez-le en ligne

Explication:

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

Try it online!

-2 thanks to Emigna.


1
You could do F'+}¹·<×)û.c for 12.
Emigna

Your try it online link is bad - it doesn't link to the current revision of the post so it shows "bad output" that doesn't match the test cases above.
Thomas Ward

@ThomasWard: Good catch! I corrected the link.
Emigna


2

JS (ES6), 88 74 73 bytes

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

Probably can be golfed more.

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
I'm not entirely sure, but I think you can replace the "\n" with two backticks and a literal newline between them
Kritixi Lithos

Only seeing this solution now, you beat me by a few minutes. What's the etiquette around here on similar solutions in the same language that are posted within a small window of time?
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>

Outputs two trailing newlines. Alternative formulation, also 60 bytes:

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

2

PowerShell, 48

Doesn't seem to get shorter than that (and pretty much the same approach as the other solution):

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

or

($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
You can save a few bytes by using $m=$argn and pre-incrementing $i rather than post incrementing it. you can also save a byte by moving the $m assignment ot the end and dropping the brackets.
user59178

@user59178 I could not understand what you exactly mean
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 (and save one more with a physical linebreak)
Titus


2

Brain-Flak, 216 + 1 = 217 bytes

+1 bytes from the -A flag

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

Try it online!

Explanation to come

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.