Bu zorluk '+' karakterini kullanıyor


28

Göreviniz: bir sayı verilmişse , merkezinden uzaktaki karakterlerden noluşan bir '+' işareti oluşturun n. Bu kafa karıştırıcıysa, test durumlarını kontrol edin.

Standart giriş yöntemleri: çıktı bir dize olmalı veya yazdırılmalıdır. Standart boşluklar uygulanır.

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

Bu , yani en kısa kod kazanır!


Sonuçların kare olması için her satırdaki sondaki boşluklara izin verildiğini varsayıyorum.
Luis Mendo

@LuisMendo Evet, sorun değil.
Yoldaş SparklePony


3
"Merkezinden uzaktaki n karakterden oluşan" + "işareti oluşturun" - Bu bölümü anlamıyorum. Hangi merkezden bahsediyorsun? Bir şey kendine nasıl eksantrik olabilir? Lütfen açıkla.
Woss name

6
Merkez 0 dan uzaktaysa, daha az kafa karıştırıcı olurdu.
Monica'ya Zarar Vermeyi Durdur

Yanıtlar:


45

Kömür , 5 bayt

P+×+N

Çevrimiçi deneyin!


22
Bu dil ne bile?
DJMcMayhem

@DJMcMayhem Temelde onunla ASCII sanat kaplumbağa grafik yapabilirsiniz. Farklı ASCII şekilleri oluşturmak için birçok kullanışlı yapıya sahiptir (like P+= cross).
fergusq

Bunlar çok baytlı karakterler değil mi?
Petah

3
@Petah Charcoal özel bir kod sayfası kullanıyor .
sadece ASCII

@fergusq Sen ile Kömür yukarı karıştırma olabilir Turtlèd : P, Kömür bir kaplumbağa grafik dili gerçekten değil
ASCII sadece


12

JavaScript (ES6), 67 65 63 60 59 bayt

x=>(v=(` `[r=`repeat`](--x)+`+
`)[r](x))+`+`[r](x*2)+`+
`+v;
  • İki bayt değiştirilerek kaydedilmiş 2 bayt x-1, birincisi --xve ikincisix .
  • 2 byte sayesinde kaydedilen Kritixi Lithos yerine "\n"sahip`[newline]` .
  • User2428118 sayesinde 3 bayt kurtarıldı , sonunda boyutu küçültecek şekilde takma bir yol bulmamda bana yardımcı oldu repeat. (Onurlu söz ile Marie’nin çabalarından dolayı )
  • Herman sayesinde 1 bayt dolaylı olarak kurtarıldı.

Dene

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
Tamamen emin değilim, ama bence "\n"iki geri
tepme ile

Teşekkürler, @KritixiLithos; Bunu neden daha önce düşünemediğimi bilmiyorum.
Shaggy

1
Öyle görünüyor ki, tekrar tekrar takma yoluyla bir bayt kurtarabilir gibi görünüyorsunuz, örneğin a='repeat',v=.....ve` `[a]
Marie

Teşekkürler, @Marie; Takma ad repeat()denemeyi denedim, ancak ilk birkaç denemem 2 veya 3 bayt daha büyük çıktı, ben de onu terk ettim! Bir bilgisayarın önüne döndüğümde bir daha bakacağım.
Shaggy

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

9

MATL , 11 bayt

tZv=&+g43*c

Çevrimiçi deneyin!

Örnek ile açıklama

Düşünün 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

Kömür , 16 13 bayt

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

Çevrimiçi deneyin!

Diğer Kömür cevabından farklı bir yaklaşım kullanır.

açıklama

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

Şimdi sol üst köşe tamamlandı, şöyle görünecek:

  +
  +
+++

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

Son adım, bu programın anahtarıdır, artı güneyi yönünde (sağa ve aşağıya doğru) yansıtarak artı geri kalanını üretmek için artı üst sol kısmını kullanır.


Kömürün kendi kod sayfası var mı? Bu karakterlerin çoğu UTF-8’de çoklu baytlardır.
TRiG

@ TRiG Evet, öyle !
Kritixi Lithos,

8

Shakespeare Programlama Dili , 749 743 bayt

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]

Çevrimiçi deneyin!

Düzenleme: cevabı resmi SPL uygulaması ile uyumlu hale getirdi - daha önce çalışmasını sağlayamadım.

6 byte golf oynadı, çünkü sahne numaralarının ardışık olması gerekmiyor.

Açıklama :

SPL, Shakespeare oyunları gibi görünmek için tasarlanmış bir esolang'dır. Pozitif isimler 1 (burada kedi kullanılır) değerine sahip ve negatif isimler -1 (yok kullanılmış fakat domuz onlardan biri) değerine sahiptir . Sıfatlar bir sabiti 2 ile çarparak değiştirir.

N.

İlk noktaya kadar her şey başlık ve önemli değil.

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

Karakterler tamsayı değişkenleridir, her birinin de bir yığını vardır ancak bu özelliği kullanmama gerek yoktu.

Act I:.
Scene I:.

Hareketler ve sahneler goto etiketi olarak kullanılır

[Enter Puck and Ford]

Aynı anda sahnede tam olarak iki karakter varsa, kullanışlıdır.

Puck:Listen to thy heart!

Bir sayı okur ve Ford'un hatırlamasını sağlar.

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

Gördüğünüz gibi Engrish SPL'de geçerlidir. Bu Puck'ın değerini "bir kedi ile ben arasındaki farklı" yapar. Ama bu ne demektir? catpozitif bir isim, öyleyse öyle Puck = 1 - Ford.

Scene II:.
[Exeunt]

Exeunt, sadece bir çoğul “çıkış” ve argümanlar olmadan sahnedeki herkesin çıkması anlamına gelir.

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

Aynı zamanda Page = 1 - Fordfarklı bir oyuncu tarafından konuşuluyor, bu yüzden Iyanlış olurdu. Bu bir döngü olduğundan, sadece değerini kopyalayamıyorum Puck.

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

Şimdiye kadar oldukça basit. Ajax = Puck * Page.

Is you as big as zero?

"as [as]" olarak ==operatör.

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.

Ajax == 0 ... "kedi" 1 ise, "büyük kedi" 2, "büyük kedi" 4 olur ve böyle devam eder. Basit sabitleri değiştirdikten sonra, "32 ve 8 ve 2 ve 1'in toplamının toplamı" -> "40 ve 2 ve 1'in toplamının toplamı" -> "42 ve 1'in toplamını" alırız. -> "43", ki bu da + için ASCII'dir.

If not,you fat fat fat fat fat cat.

Başka bir şey ise sadece "yağ yağ yağ yağ kedi", yani Ajax bir alan için ASCII, 32 değerini alır.

Speak thy mind!

Bu, karakter çıktısı için verilen komuttur.

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

Bu bir döngü yapısıdır. "Sen ve kediyi toplarsın" artışları Sayfa, veif(Page != Ford) goto Scene III . Programın geri kalanı aynı bileşenleri kullanıyor, bu yüzden işte daha okunabilir bir sözde kod sürümü:

Sahne 1:
    giriş = [giriş numarası];
    satır = 0 - giriş + 1;
Scene2:
    col = 0 - giriş + 1;
Scene3:
    temp = row * col;
    eğer (temp == 0) {
        temp = '+';
    }Başka{
        temp = '';
    }

    putchar (sıcaklık);
    Sayfa = Sayfa + 1;
    eğer (Sayfa! = Ford) Scene3'e;
    Ajax = 10;
    putchar (Ajax);
    Disk = Disk + 1;
    (Puck! = Ford), Scene2;

" If not,let us return to Scene III." -1; dördüncü duvarı kırar: P
Jakob


6

Mathematica, 39 bayt

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

CrossMatrixdahili olduğu gereklidir şekilde bir matris oluşturur 1s yerine +s ve 0yerine boşluk s. Eğer biz çarpın o matris "+"yerine, 1birlikte s +çıkarken s 0değişmeden s (besbelli ... 0*x = 0ve 1*x = xsağ?). Sonra sıfırları elle kullanarak boşluklarla değiştiririz /. 0->" ". Son olarak matrisin her satırını ile yazdırıyoruz Print@@@(...).


1
Öyle Printkullanılabileceğini bilmiyordum .
ngenis,

6

C, 69 bayt

Çok ilginç değil ... Kare üzerinde döngüler, uygun karakteri yazdırıyorlar.

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 bayt

-5 seshoumara sayesinde için
+1 içerir-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/++/

Aynı zamanda girdi alır .

Çevrimiçi deneyin!

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 Buradas/( *2)2(2*)/\1\n\1\2/ ve s/(.*)(\n1*)/&\n\1/gösterildiği gibi , toplam 99 puan almak için 5 bayt
kazanabilirsiniz.

5

Lua 113 , 90 bayt

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 bayt

@Jarko Dubbeldam sayesinde 7 byte tıraş:

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

önceki cevap:

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

1
İşlevleri adlandırmanız gerekmez, bu nedenle function(n){a=matrix("",n*2-1,n*2-1);a[n,]="x";a[,n]="x";a}59 bayt olur!
JAD

1
Ayrıca, byte kullanarak kaydedebilirsinizmatrix("",y<-n*2-1,y)
JAD

1
a[n,]=a[,n]="x"çalışır, biraz daha bayt kaydeder.
JAD

scan()Bir işlev yerine bir program kullanarak ve yaparak başka bir 4 bayttan tasarruf edebilirsiniz :n=scan();a=matrix("",y<-n*2-1,y);a[n,]=a[,n]="+";a
rturnbull

4

PowerShell , 48 bayt

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

Çevrimiçi deneyin!

Girdi alır $n. İle --$nbirleştirilmiş bir boşluk dizisi oluşturarak başlar +. Bu virgül operatörünü kullanarak (yeni azaltılmış) $nkez diziye dönüştürülür . Bu dizi $xboru hattına bir kopya yerleştirmek için parenler içinde saklanır ve saklanır .

Daha sonra +dizgiyi uygun sayıda çarparak çarpan orta bölümü yapıyoruz . Boru hattında kaldı. Sonunda $xboru hattını tekrar koyduk .

Bunların hepsi programın bitiminde boru hattına bırakılmış ve örtük Write-Outputöğeler arasında yeni bir satır ekliyor.


4

Perl 5 , 45 bayt

44 bayt kodu + -pbayrak.

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

Çevrimiçi deneyin!


Bazı benzer (ancak yine de farklı) yaklaşımlar:

48 bayt (47+ -p):

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

50 bayt (49+ -n):

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


3

CJam , 23 bayt

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

Çevrimiçi deneyin!

açıklama

Bu biraz yetersiz görünüyor, ancak fikir şu iki ızgarayı üst üste getirmektir:

  +
  +
  +
  +
  +



+++++

İstenilen sonucu verir.

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*

Çevrimiçi deneyin

Açıklama:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.