W tym wyzwaniu użyto znaku „+”

28

Twoje zadanie: podając liczbę n, wygeneruj znak „+”, który oznacza, że nznaki znajdują się poza jego centrum. Jeśli jest to mylące, sprawdź przypadki testowe.

Standardowe metody wprowadzania: dane wyjściowe muszą być ciągiem lub drukowane. Obowiązują standardowe luki.

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

To jest , więc wygrywa najkrótszy kod!

Towarzyszu SparklePony
źródło
Zakładam, że końcowe spacje w każdej linii są dozwolone, więc wynik jest kwadratowy, prawda?
Luis Mendo,
@LuisMendo Tak, w porządku.
Towarzysz SparklePony
Związane .
Neil
3
„generuj znak„ + ”, który jest n znaków od jego środka” - nie rozumiem tej części. Do jakiego centrum się odnosisz? Jak coś może być ekscentryczne? Proszę o wyjaśnienie.
Wossname
6
Byłoby o wiele mniej mylące, gdyby centrum znajdowało się 0 od siebie.
Stop Harming Monica,

Odpowiedzi:

45

Węgiel drzewny , 5 bajtów

P+×+N

Wypróbuj online!

fergusq
źródło
22
Co to w ogóle za ten język?
DJMcMayhem
@DJMcMayhem Zasadniczo możesz z nim tworzyć grafiki ASCII z żółwiami. Ma wiele przydatnych wbudowanych funkcji do renderowania różnego rodzaju kształtów ASCII (jak P+= krzyż).
fergusq
Czy to nie są znaki wielobajtowe?
Petah
3
@Petah Charcoal używa niestandardowej strony kodowej .
Tylko ASCII,
@fergusq Być może łączysz węgiel drzewny z Turtlèd : P, węgiel drzewny nie jest tak naprawdę językiem graficznym dla żółwi
tylko ASCII
12

JavaScript (ES6), 67 65 63 60 59 bajtów

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 bajty zapisane przez zamianę dwóch wystąpień x-1, pierwszego na --xi drugiego na x.
  • 2 bajty zapisywane dzięki Kritixi Lithos , zastępując "\n"z `[newline]`.
  • 3 bajty zapisane dzięki user2428118 , wreszcie pomagając mi znaleźć sposób na alias repeatw sposób, który zmniejszył rozmiar. (Z wyróżnieniem dla Marie za jej wysiłki)
  • 1 bajt zapisany pośrednio dzięki Hermanowi.

Spróbuj

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>

Kudłaty
źródło
1
Nie jestem do końca pewien, ale myślę, że można zastąpić "\n"dwoma backtickami i dosłowną nową linią między nimi
Kritixi Lithos
Dzięki, @KritixiLithos; nie wiem, dlaczego sam o tym nie pomyślałem.
Kudłaty
1
Wygląda na to, że prawdopodobnie możesz zaoszczędzić bajt poprzez aliasing powtarzania, np. a='repeat',v=.....I` `[a]
Marie
Dzięki, @Marie; Próbowałem aliasingu, repeat()ale moje pierwsze próby były większe o 2 lub 3 bajty, więc zrezygnowałem! Spojrzę na to jeszcze raz, kiedy wrócę przed komputerem.
Kudłaty
2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
user2428118
9

MATL , 11 bajtów

tZv=&+g43*c

Wypróbuj online!

Objaśnienie z przykładem

Zastanów się 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
źródło
8

Węgiel drzewny , 16 13 bajtów

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

Wypróbuj online!

Używa innego podejścia niż inne odpowiedzi na węgiel drzewny.

Wyjaśnienie

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

Teraz lewy górny róg jest gotowy, będzie wyglądał mniej więcej tak:

  +
  +
+++

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

Ostatni krok jest kluczem do tego programu, wykorzystuje lewą górną część plusa, aby wygenerować resztę plusa, odzwierciedlając go w kierunku południowo-wschodnim (w prawo i w dół).

Kritixi Lithos
źródło
Czy węgiel drzewny ma własną stronę kodową? Wiele z tych znaków to wiele bajtów w UTF-8.
TRiG
@TRiG Tak, robi to !
Kritixi Lithos
8

Język programowania Szekspira , 749 743 bajtów

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]

Wypróbuj online!

Edycja: dostosowałem odpowiedź do oficjalnej implementacji SPL - wcześniej nie mogłem jej uruchomić.

Gra w golfa 6 bajtów, ponieważ numery scen nie muszą być następujące po sobie.

Wyjaśnienie :

SPL to esolang zaprojektowany tak, aby wyglądał jak gra Szekspira. Rzeczowniki dodatnie mają wartość 1 (tutaj używany jest kot ), a rzeczowniki ujemne mają wartość -1 (nie użyto żadnego, ale świnia jest jednym z nich). Przymiotniki modyfikują stałą, mnożąc ją przez 2.

N.

Wszystko do pierwszej kropki jest tytułem i nie ma znaczenia.

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

Znaki są zmiennymi całkowitymi, każdy z nich ma również stos, ale nie musiałem korzystać z tej funkcji.

Act I:.
Scene I:.

Akty i sceny są używane jako etykiety goto

[Enter Puck and Ford]

Przydaje się to tylko wtedy, gdy na scenie jednocześnie znajdują się dokładnie dwie postacie.

Puck:Listen to thy heart!

Czyta cyfrę i sprawia, że ​​Ford ją pamięta.

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

Jak widać, język angielski jest ważny w języku SPL. To sprawia, że ​​wartość Pucka „różni się między kotem a mną”. Ale co to oznacza? catjest rzeczownikiem pozytywnym, więc jest Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt to tylko liczba „wyjście” i bez argumentów oznacza, że ​​wszyscy na scenie wychodzą.

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

Jest to również Page = 1 - Fordwypowiedziane przez innego aktora, więc Ibyłoby źle. Ponieważ jest to pętla, nie mogę po prostu skopiować wartości Puck.

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

Już teraz całkiem proste. Ajax = Puck * Page.

Is you as big as zero?

„as [przym] as” to ==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.

Jeśli Ajax == 0 ... „kot” ma wartość 1, „duży kot” ma wartość 2, „duży duży kot” ma wartość 4 itd. Po podstawieniu prostych stałych otrzymujemy „sumę sumy 32 i 8 oraz 2 i 1” -> „sumę sumy 40 i 2 i 1” -> „sumę 42 i 1” -> „43”, czyli ASCII dla +.

If not,you fat fat fat fat fat cat.

inaczej jest to po prostu „gruby gruby gruby gruby gruby kot”, więc Ajax otrzymuje wartość 32, ASCII za spację.

Speak thy mind!

Jest to polecenie do wypisywania znaku.

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

To konstrukcja pętli. Przyrosty „sumujesz siebie i kota”, oraz if(Page != Ford) goto Scene III. Reszta programu wykorzystuje te same komponenty, więc tutaj jest bardziej czytelna wersja pseudokodu:

Scena 1:
    input = [numer wejściowy];
    wiersz = 0 - wejście + 1;
Scena 2:
    col = 0 - wejście + 1;
Scena 3:
    temp = wiersz * col;
    if (temp == 0) {
        temp = „+”;
    }jeszcze{
        temp = '';
    }

    putchar (temp);
    Strona = strona + 1;
    if (Page! = Ford) goto Scene3;
    Ajax = 10;
    putchar (Ajax);
    Krążek = Krążek + 1;
    if (Puck! = Ford) goto Scene2;
NieDzejkob
źródło
If not,let us return to Scene III.” -1; łamie czwartą ścianę: P
Jakob
6

Mathematica, 39 bajtów

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

CrossMatrixjest wbudowany, który generuje matrycę o wymaganym kształcie z 1s zamiast +s i 0s zamiast spacji. Jeśli pomnożymy tę macierz przez "+", to zastępuje ona 1s +, pozostawiając 0s niezmienioną (oczywiście ... 0*x = 0i 1*x = xprawda?). Następnie zastępujemy zera ręcznie spacjami za pomocą /. 0->" ". Na koniec drukujemy każdą linię matrycy za pomocąPrint@@@(...) .

Martin Ender
źródło
1
Nie wiedziałem, Printże można tak używać.
ngenisis,
6

C, 69 bajtów

Niezbyt interesujące ... Pętle nad kwadratem, drukując odpowiednią postać.

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

Rubin, 41 40 bajtów

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

Wypróbuj online!

Ventero
źródło
6

GNU sed , 104 99 bajtów

-5 dzięki seshoumara
Obejmuje +1 dla-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/++/

Pobiera dane wejściowe jednoargumentowe.

Wypróbuj 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
źródło
+1 Możesz zapisać 5 bajtów, używając s/( *2)2(2*)/\1\n\1\2/i s/(.*)(\n1*)/&\n\1/jak pokazano tutaj , aby uzyskać łączny wynik 99.
seshoumara
5

Lua 113 , 90 bajtów

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
Paplać
źródło
5

Python 2 , 52 bajty

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

Wypróbuj online!

53-bajtowa alternatywa ( TIO ):

n=input()-1
for c in' '*n+'+'+' '*n:print c*n+'+'+c*n
xnor
źródło
5

R, 54 bajty

Golenie 7 bajtów dzięki @Jarko Dubbeldam:

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

poprzednia odpowiedź:

f=function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}
liczyć
źródło
1
Nie musisz nazywać funkcji, więc function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}byłoby 59 bajtów!
JAD
1
Możesz także zapisać bajt, używającmatrix("",y<-n*2-1,y)
JAD
1
a[n,]=a[,n]="x"działa również, oszczędzając więcej bajtów.
JAD
Możesz zapisać kolejne 4 bajty, używając scan()i czyniąc z niego program, a nie funkcję:n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull 14.04.17
4

PowerShell , 48 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe $n. Zaczyna się od utworzenia ciągu --$nspacji połączonego z +. To jest konwertowane na tablicę za pomocą operatora przecinków (nowo zmniejszonej) $nrazy. Ta tablica jest przechowywana $xi zamykana w parenach, aby umieścić kopię w potoku.

Następnie wykonujemy środkową sekcję, czyli +ciąg pomnożony przez odpowiednią liczbę razy. Zostało to w przygotowaniu. Wreszcie $xponownie uruchamiamy rurociąg.

Wszystkie są pozostawione w potoku po zakończeniu programu, a domniemane Write-Outputwstawia nowy wiersz między elementami.

AdmBorkBork
źródło
4

Perl 5 , 45 bajtów

44 bajty kodu + -pflaga.

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

Wypróbuj online!


Niektóre podobne (ale wciąż różne) podejścia:

48 bajtów (47+ -p):

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

50 bajtów (49+ -n):

$,="+"x($_*2-1).$/;print+(~~($"x--$_."+\n")x$_)x2
Dada
źródło
4

Python 2 , 60, 56 bajtów

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

Wypróbuj online!

  • -4 bajty - dzięki matematycznemu ćpunowi!
Keerthana Prabhakaran
źródło
1
Zaoszczędź 4 bajty w ten sposób: TIO
matematyki
3

CJam , 23 bajty

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

Wypróbuj online!

Wyjaśnienie

To wydaje się nieco nieoptymalne, ale pomysł polega na nałożeniu następujących dwóch siatek:

  +
  +
  +
  +
  +



+++++

Co daje pożądany rezultat.

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
źródło
3

CJam, 17 lat

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

Wypróbuj online

Wyjaśnienie:

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
źródło
3

Oktawa, 36 31 bajtów

Zainspirowany odpowiedzią MATL @LuisMendo.

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

Wypróbuj online!

Poprzednia odpowiedź:

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

Wypróbuj online!

rahnema1
źródło
3

05AB1E , 15 14 12 bajtów

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

Wypróbuj online!

-2 dzięki Emignie.

Urna Magicznej Ośmiornicy
źródło
1
Możesz zrobić F'+}¹·<×)û.cdla 12.
Emigna
Twój link do wypróbowania online jest zły - nie łączy się z bieżącą wersją postu, więc pokazuje „zły wynik”, który nie pasuje do powyższych przypadków testowych.
Thomas Ward,
@ThomasWard: Good catch! Poprawiłem link.
Emigna,
2

Python 2, 65 bajtów

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

Wypróbuj online!

ćpun matematyki
źródło
2

JS (ES6), 88 74 73 bajty

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

Prawdopodobnie można grać w golfa więcej.

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
źródło
1
Nie jestem do końca pewien, ale myślę, że można zastąpić "\n"dwoma backtickami i dosłowną nową linią między nimi
Kritixi Lithos
Dopiero teraz widząc to rozwiązanie, pokonałeś mnie o kilka minut. Jaka jest tutaj etykieta podobnych rozwiązań w tym samym języku, które są publikowane w krótkim okresie czasu?
Kudłaty
2

JavaScript (ES6), 60 bajtów

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>

Wyprowadza dwie końcowe znaki nowej linii. Alternatywne sformułowanie, również 60 bajtów:

n=>(r=a=>(s=a[0].repeat(n-1))+a[1]+s+`
`)([r(` +`),r(`++`)])
Neil
źródło
2

PowerShell, 48

Wydaje się, że nie jest krótszy (i prawie takie samo podejście jak inne rozwiązanie):

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

lub

($a=(' '*($n="$args"-1)+'+
')*$n)+'++'*$n+"+
$a"
Joey
źródło
2

REXX, 81 bajtów

arg a
b=a*2-1
do i=1 to b
  if i=a then say copies('+',b)
  else say right('+',a)
  end
idrougge
źródło
2

PHP, 68 bajtów

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

83 bajtów

for(;$i<($c=($n=$argn)*2-1)**2;)echo$i%$c?"":"\n".!++$k," +"[$k==$n|$i++%$c==$n-1];
Jörg Hülsermann
źródło
1
Możesz zaoszczędzić kilka bajtów przy użyciu $m=$argni wstępnej inkrementacji, $ia nie po inkrementacji. Możesz także zapisać bajt, przesuwając $mprzypisanie końca i upuszczając nawiasy.
user59178
@ user59178 Nie mogłem zrozumieć, co dokładnie masz na myśli
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 bajtów (i zaoszczędzić jeszcze jeden fizyczny podział linii)
Tytus
2

MUMPS, 48 50 53 bajtów

F i=1-n:1:n-1 W ! F j=1-n:1:n-1 W $C(i&j*-11+43)
świnka
źródło
Witamy w PPCG!
Martin Ender
2

Brain-Flak , 216 + 1 = 217 bajtów

+1 bajty od -Aflagi

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

Wypróbuj online!

Wyjaśnienie, które nastąpi

0 '
źródło