Tantangan ini menggunakan karakter '+'

28

Tugas Anda: diberi nomor n , buat tanda '+' yang nkarakternya jauh dari pusatnya. Jika ini membingungkan, periksa kasus uji.

Metode input standar: output harus berupa string atau dicetak. Celah standar berlaku.

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

Ini , jadi kode terpendek menang!

Kamerad SparklePony
sumber
Saya berasumsi spasi tambahan di setiap baris diperbolehkan sehingga hasilnya persegi, kan?
Luis Mendo
@LuisMendo Ya, tidak apa-apa.
Kamerad SparklePony
Terkait .
Neil
3
"menghasilkan tanda '+' yang n karakter dari pusatnya" - Saya tidak mengerti bagian ini. Pusat apa yang Anda maksud? Bagaimana bisa sesuatu menjadi eksentrik pada dirinya sendiri? Mohon klarifikasi.
Wossname
6
Akan jauh lebih membingungkan jika pusat itu 0 dari dirinya sendiri.
Stop Harming Monica

Jawaban:

45

Arang , 5 byte

P+×+N

Cobalah online!

fergusq
sumber
22
Bahasa apa ini?
DJMcMayhem
@DJMcMayhem Pada dasarnya kamu bisa melakukan turtle graphics ASCII art dengannya. Ini memiliki banyak builtin berguna untuk merender berbagai jenis bentuk ASCII (seperti P+= lintas).
fergusq
Apakah itu bukan karakter multibyte?
Petah
3
@ Petah Charcoal menggunakan codepage khusus .
ASCII
@fergusq Anda mungkin mencampur Charcoal dengan Turtlèd : P, Charcoal sebenarnya bukan bahasa grafis penyu
ASCII,
25

Python 2 , 53 byte

n=2*input()-1;C='+'.center
for c in C(n):print C(n,c)

Cobalah online!

Dennis
sumber
12

JavaScript (ES6), 67 65 63 60 59 byte

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • 2 byte disimpan dengan mengganti dua kejadian x-1, yang pertama dengan --xdan yang kedua dengan x.
  • 2 byte disimpan berkat Kritixi Lithos , diganti "\n"dengan `[newline]`.
  • 3 byte disimpan berkat user2428118 , akhirnya membantu saya untuk mencari cara alias dengan repeatcara yang mengurangi ukuran. (Dengan menyebutkan terhormat untuk Marie atas usahanya, juga)
  • 1 byte disimpan secara tidak langsung berkat Herman.

Cobalah

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>

Shaggy
sumber
1
Saya tidak sepenuhnya yakin, tapi saya pikir Anda dapat mengganti "\n"dengan dua backticks dan baris baru literal di antara mereka
Kritixi Lithos
Terima kasih, @KritixiLithos; Saya tidak tahu mengapa saya tidak memikirkan itu lebih cepat.
Shaggy
1
Sepertinya Anda mungkin dapat menyimpan byte dengan aliasing repeat, eg a='repeat',v=.....dan` `[a]
Marie
Terima kasih, @Marie; Saya telah mencoba alias repeat()tetapi beberapa upaya pertama saya keluar 2 atau 3 byte lebih besar sehingga saya meninggalkannya! Saya akan melihat lagi ketika saya kembali di depan komputer.
Shaggy
2
x=>(v=(` `[r='repeat'](--x)+`+<newline>`)[r](x))+`+`[r](x*2+1)+`<newline>`+v
user2428118
9

MATL , 11 byte

tZv=&+g43*c

Cobalah online!

Penjelasan dengan contoh

Pertimbangkan 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
sumber
8

Arang , 16 13 byte

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

Cobalah online!

Menggunakan pendekatan yang berbeda dari jawaban Arang lainnya.

Penjelasan

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

Sekarang sudut kiri atas selesai, akan terlihat seperti ini:

  +
  +
+++

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

Langkah terakhir adalah kunci untuk program ini, ia menggunakan bagian kiri atas plus untuk menghasilkan sisa plus dengan merefleksikannya ke arah tenggara (kanan dan ke bawah).

Kritixi Lithos
sumber
Apakah Charcoal memiliki halaman kode sendiri? Banyak dari karakter tersebut adalah beberapa byte dalam UTF-8.
TRiG
@TRiG Ya, benar !
Kritixi Lithos
8

Bahasa Pemrograman Shakespeare , 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]

Cobalah online!

Sunting: membuat jawaban itu kompatibel dengan implementasi SPL resmi - saya tidak bisa membuatnya bekerja sebelumnya.

Golf 6 byte karena nomor adegan tidak harus berturut-turut.

Penjelasan :

SPL adalah esolang yang dirancang agar terlihat seperti drama Shakespeare. Kata benda positif memiliki nilai 1 (di sini kucing digunakan) dan kata benda negatif memiliki nilai -1 (tidak ada yang digunakan tetapi babi adalah salah satunya). Kata sifat memodifikasi konstanta dengan mengalikannya dengan 2.

N.

Semuanya sampai titik pertama adalah judul dan tidak masalah.

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

Karakter adalah variabel integer, masing-masingnya juga memiliki tumpukan tetapi saya tidak perlu menggunakan fitur itu.

Act I:.
Scene I:.

Kisah dan adegan digunakan sebagai label goto

[Enter Puck and Ford]

Ini hanya berguna jika tepat dua karakter berada di atas panggung pada saat yang sama.

Puck:Listen to thy heart!

Membaca angka dan membuat Ford mengingatnya.

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

Seperti yang Anda lihat, Engrish valid di SPL. Ini membuat nilai Puck "berbeda antara kucing dan aku". Tapi apa artinya itu? catadalah kata benda positif, jadi itu Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt hanyalah sejumlah "keluar", dan tanpa argumen berarti bahwa semua orang di panggung keluar.

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

Itu juga Page = 1 - Fordtetapi itu diucapkan oleh aktor yang berbeda sehingga Iakan salah. Karena ini adalah loop, saya tidak bisa hanya menyalin nilai Puck.

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

Cukup mudah sekarang. Ajax = Puck * Page.

Is you as big as zero?

"as [adj] as" adalah ==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.

Jika Ajax == 0 ... "kucing" adalah 1, "kucing besar" adalah 2, "kucing besar besar" adalah 4 dan seterusnya. Setelah mengganti konstanta sederhana kita mendapatkan "jumlah dari jumlah dari jumlah 32 dan 8 dan 2 dan 1" -> "jumlah dari jumlah 40 dan 2 dan 1" -> "jumlah dari 42 dan 1" -> "43", yang merupakan ASCII untuk +.

If not,you fat fat fat fat fat cat.

selain itu hanya "fat fat fat fat fat", jadi Ajax mendapat nilai 32, ASCII untuk sebuah space.

Speak thy mind!

Ini adalah perintah untuk menghasilkan karakter.

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

Ini adalah konstruksi lingkaran. "Kau jumlah anda dan kucing" increment Page, dan if(Page != Ford) goto Scene III. Program lainnya menggunakan komponen yang sama, jadi di sini adalah versi pseudocode yang lebih mudah dibaca:

Scene1:
    input = [nomor input];
    baris = 0 - input + 1;
Scene2:
    col = 0 - input + 1;
Scene3:
    temp = baris * col;
    if (temp == 0) {
        temp = '+';
    }lain{
        temp = '';
    }

    putchar (temp);
    Halaman = Halaman + 1;
    if (Page! = Ford) goto Scene3;
    Ajax = 10;
    putchar (Ajax);
    Keping = Keping + 1;
    if (Puck! = Ford) goto Scene2;
NieDzejkob
sumber
" If not,let us return to Scene III." -1; memecahkan dinding keempat: P
Jakob
6

Mathematica, 39 byte

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

CrossMatrixadalah built-in yang menghasilkan matriks dari bentuk yang diperlukan dengan 1s bukannya +s dan 0s bukan spasi. Jika kita mengalikan matriks itu dengan "+", yang menggantikan 1s dengan +s sambil membiarkan 0s tidak berubah (jelas ... 0*x = 0dan 1*x = x, kan?). Lalu kami mengganti nol secara manual dengan spasi menggunakan /. 0->" ". Akhirnya, kami mencetak setiap baris dari matriks dengan Print@@@(...).

Martin Ender
sumber
1
Tidak tahu Printbisa digunakan seperti itu.
ngenisis
6

C, 69 byte

Tidak terlalu menarik ... Loop di atas alun-alun, mencetak karakter yang sesuai.

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

Rubi, 41 40 byte

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

Cobalah online!

Ventero
sumber
6

GNU sed , 104 99 bytes

-5 Terima kasih kepada seshoumara
Termasuk +1 untuk-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/++/

Mengambil input di unary.

Cobalah 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
sumber
+1 Anda dapat menyimpan 5 byte dengan menggunakan s/( *2)2(2*)/\1\n\1\2/dan s/(.*)(\n1*)/&\n\1/seperti yang ditunjukkan di sini , dengan skor total 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
Pengobrol
sumber
5

Python 2 , 52 byte

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

Cobalah online!

Alternatif 53-byte ( TIO ):

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

R, 54 byte

Mencukur 7 byte berkat @Jarko Dubbeldam:

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

jawaban sebelumnya:

f=function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}
hitung
sumber
1
Anda tidak harus menyebutkan fungsi, jadi function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}59 byte!
JAD
1
Anda juga dapat menyimpan byte menggunakanmatrix("",y<-n*2-1,y)
JAD
1
a[n,]=a[,n]="x"berfungsi juga, menghemat beberapa byte lagi.
JAD
Anda dapat menyimpan 4 byte lainnya dengan menggunakan scan()dan menjadikannya program daripada fungsi: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

Cobalah online!

Mengambil input $n. Mulai dengan membangun serangkaian --$nruang, disatukan dengan +. Itu dikonversi menjadi array menggunakan operator koma, (baru-dikurangi) $nkali. Array itu disimpan dalam $xdan dienkapsulasi dalam parens untuk menempatkan salinan pada pipeline.

Kami kemudian melakukan bagian tengah, yaitu +string dikalikan jumlah yang sesuai kali. Tersisa di saluran pipa. Akhirnya, kami memasang $xpipa lagi.

Itu semua ditinggalkan di jalur pipa saat penyelesaian program, dan implisit Write-Outputmenyisipkan baris baru di antara elemen-elemen.

AdmBorkBork
sumber
4

Perl 5 , 45 byte

44 byte kode + -pbendera.

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

Cobalah online!


Beberapa pendekatan yang serupa (tetapi masih berbeda):

48 byte (47+ -p):

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

50 byte (49+ -n):

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

Python 2 , 60, 56 byte

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

Cobalah online!

  • -4 byte - terima kasih kepada pecandu matematika!
Keerthana Prabhakaran
sumber
1
Simpan 4 byte seperti ini: TIO
pecandu matematika
3

CJam , 23 byte

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

Cobalah online!

Penjelasan

Ini terasa agak suboptimal, tetapi idenya adalah untuk menempatkan dua grid berikut:

  +
  +
  +
  +
  +



+++++

Yang memberikan hasil yang diinginkan.

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

CJam, 17

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

Cobalah online

Penjelasan:

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

Oktaf, 36 31 byte

Terinspirasi oleh jawaban MATL dari @LuisMendo.

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

Cobalah online!

Jawaban sebelumnya:

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

Cobalah online!

rahnema1
sumber
3

05AB1E , 15 14 12 byte

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

Cobalah online!

Terima kasih kepada Emigna.

Guci Gurita Ajaib
sumber
1
Anda bisa melakukannya F'+}¹·<×)û.cuntuk 12.
Emigna
Tautan online coba Anda buruk - tidak terhubung ke revisi posting saat ini sehingga menunjukkan "output buruk" yang tidak cocok dengan kasus uji di atas.
Thomas Ward
@ThomasWard: Tangkapan bagus! Saya memperbaiki tautannya.
Emigna
2

Python 2, 65 byte

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

Cobalah secara Online!

pecandu matematika
sumber
2

JS (ES6), 88 74 73 byte

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

Mungkin bisa bermain golf lebih banyak.

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
sumber
1
Saya tidak sepenuhnya yakin, tapi saya pikir Anda dapat mengganti "\n"dengan dua backticks dan baris baru literal di antara mereka
Kritixi Lithos
Hanya melihat solusi ini sekarang, Anda mengalahkan saya beberapa menit. Apa etiket di sini tentang solusi serupa dalam bahasa yang sama yang diposting dalam waktu singkat?
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>

Menghasilkan dua baris baru. Formulasi alternatif, juga 60 byte:

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

PowerShell, 48

Tampaknya tidak menjadi lebih pendek dari itu (dan hampir sama dengan pendekatan yang lain):

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

atau

($a=(' '*($n="$args"-1)+'+
')*$n)+'++'*$n+"+
$a"
Joey
sumber
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
idrougge
sumber
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
sumber
1
Anda dapat menyimpan beberapa byte dengan menggunakan $m=$argndan pra-penambahan $ialih - alih mengirimnya. Anda juga dapat menyimpan byte dengan memindahkan $mpenugasan dari ujung dan menjatuhkan tanda kurung.
user59178
@ user59178 Saya tidak mengerti apa yang sebenarnya Anda maksud
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 (dan simpan satu lagi dengan linebreak fisik)
Titus
2

MUMPS, 48 50 53 byte

F i=1-n:1:n-1 W ! F j=1-n:1:n-1 W $C(i&j*-11+43)
mumpsimus
sumber
Selamat datang di PPCG!
Martin Ender
2

Brain-Flak , 216 + 1 = 217 byte

+1 byte dari -Abendera

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

Cobalah online!

Penjelasan yang akan datang

0 '
sumber