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!


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


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!


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>


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

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ół).


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;

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


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


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

+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


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}

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.


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


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.

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




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>


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

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"


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

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

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

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

+1 bajty od -Aflagi

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

Wypróbuj online!

Wyjaśnienie, które nastąpi

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.