N Slab Slanted Slash Cake


23

Tulis program atau fungsi yang mengambil bilangan bulat positif N.

Ketika N adalah 1, output

/\
\/

Ketika N adalah 2, output

/\/\
\/ /
/ /
\/

Ketika N adalah 3, output

/\/\/\
\/ / /
/ / /
\/ /
/ /
\/

Ketika N adalah 4, output

/\/\/\/\
\/ / / /
/ / / /
\/ / /
/ / /
\/ /
/ /
\/

Untuk N yang lebih besar, pola berlanjut, layer baru ditambahkan setiap kali N bertambah.

  • "Output" berarti mencetak pola garis miring atau mengembalikannya sebagai string.
  • Baris baru yang mengekor di output diizinkan.
  • Spasi tertinggal dalam output diizinkan tetapi spasi terkemuka tidak.

Kode terpendek dalam byte menang.

Jawaban:


10

Pyth, 25 byte

j_+t.iJ*R"/ "SQ+L\\J*Q"/\

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

j_+t.iJ*R"/ "SQ+L\\J*Q"/\   implicit: Q = input number
             SQ             create the list [1, 2, ..., Q]
       *R"/ "               repeat "/ " accordingly to this numbers
      J                     assign this list of strings to J
               +L\\J        create a 2nd list, which contains the same strings
                            as in J, just with a "\" prepended
    .i                      interleave these two lists
   t                        remove the first element
                    *Q"/\   repeat the string "/\" Q times
  +                         append it to the list
 _                          reverse it
j                           print each string on a separate line

10

CJam, 32 30 29 28 byte

ri_"/\ /"2/f*)@,\f>+_z..e>N*

Uji di sini.

Saya mencoba untuk membantu Reto golf menjawab CJam tetapi berakhir dengan solusi yang tidak ada hubungannya dengan itu, jadi saya pikir saya mungkin sebaiknya mempostingnya sendiri.

Penjelasan

Ini memanfaatkan simetri keluaran. Secara khusus, fakta bahwa output sama dengan transposnya.

Pertama, kami membuat N+1garis pertama , tetapi tanpa tepi kiri:

ri       e# Read input and convert to integer N.
_        e# Duplicate.
"/\ /"2/ e# Push an array with two strings: ["/\" " /"]
f*       e# Repeat each of the two strings N times. That gives the first two rows.
)        e# Detach the second row.
@,       e# Pull up the other copy of N and turn into range [0 1 ... N-1].
\f>      e# For each element i in that range, discard the first i characters of
         e# the second row.
+        e# Add all those lines back to the first row.

Sekarang kita punya array string yang mewakili kisi-kisi berikut:

/\/\/\/\
 / / / /
/ / / /
 / / /
/ / /

Transpos yang terlihat seperti ini:

/ / /
\/ / 
/ / /
\/ / 
/ / /
\/ /
/ /
\/

Bersama-sama, ini memiliki semua karakter non-ruang yang kita butuhkan. Kita sekarang dapat menggunakan tip rad Dennis untuk menggabungkan dua kisi ASCII menjadi satu, dengan mengambil maksimum dari setiap pasangan karakter yang sesuai. Di semua posisi di mana kedua grid berbeda, satu akan memiliki ruang (atau tidak sama sekali) dan yang lainnya akan memiliki karakter yang kita cari. Ketika satu daftar dalam operasi vektor lebih panjang dari yang lain, elemen tambahan dari daftar panjang hanya akan disimpan, yang hanya apa yang kita cari. Dalam kasus lain, karakter non-spasi akan selalu menjadi maksimum dari dua karakter:

_z   e# Duplicate the grid and transpose it.
..e> e# For each pair of characters in corresponding positions, pick the maximum.
N*   e# Join the lines by linefeed characters.

7

Japt , 46 44 41 40 byte

Uo-U £Y?"\\/"sYv)+" /"pU-Y/2 :"/\\"pU} ·

Cobalah online!

Tanpa penjelasan dan penjelasan

Uo-U mXYZ{Y?"\\/"sYv)+" /"pU-Y/2 :"/\\"pU} qR

Inti dari program ini membuat daftar U * 2item, memetakan masing-masing ke satu baris dari pola, lalu bergabung dengan mereka dengan baris baru:

Uo-U    // Build an array of all integers in the range [-U, U).
mXYZ{   // Map each item X and index Y in this array with the following function.
 ...
} qR    // Join the resulting array with newlines.

Adapun pola itu sendiri, inilah cara saya memecahnya:

/\/\/\/\

\/   / / /
/    / / /
\/   / /
/    / /
\/   /
/    /
\/

Seperti yang Anda lihat di sini, ini sekarang berubah menjadi tiga pola sederhana. Yang pertama adalah yang termudah, dihasilkan dengan kode ini:

Y? ... :  // If Y, the current index, is 0,
"/\\"pU   // return the pattern "/\" repeated U*2 times.

Sekarang untuk bagian kiri. Indeks ganjil harus dipetakan ke \/, dan bahkan ke /, jadi kami menggunakan kode ini:

"\\/"s  // Otherwise, slice the pattern "\/" at 
Yv)     //  if Y is even, 1; otherwise, 0.

Ini membuat setengah jalan yang benar lebih mudah; yang perlu kita lakukan adalah mengulangi  /beberapa kali:

" /"p  // Repeat the pattern " /"
U-Y/2  //  floor(U - (Y/2)) times.

Saran diterima!


5

GNU Sed, 59

Skor termasuk +2 untuk opsi '-nr ke sed.

s|1|/\\|gp
y|/\\| /|
s| |\\|p
:
s|\\(..)|\1|p
s|/ |\\|p
t

Masukan dalam unary sesuai jawaban meta ini .

Output tes:

$ sed -nrf slantcake.sed <<< 111
/\/\/\
\/ / /
/ / /
\/ /
/ /
\/
$ 

4

CJam, 36 35 34 byte

ri_"/\\"*N@,W%{'\'/@" /"*+_N\N}/;;

Cobalah online

Terima kasih kepada @NinjaBearMonkey karena menunjukkan kelebihannya ;.

Meskipun ini terlihat relatif tidak elegan, saya mencoba beberapa opsi lain, dan mereka tidak berakhir lebih pendek.

Penjelasan:

ri_     Get input, convert to integer, and copy.
"/\\"   Pattern for first line.
*N      Repeat N times, and add a newline.
@,      Rotate N to top, and create [0 .. N-1] sequence.
W%      Invert sequence to [N-1 .. 0].
{       Loop over counts, creating two lines for each.
  '\      Leading character for first in pair of lines. Rest will be the same
          for both lines.
  '/      First character for repeated part.
  @       Rotate count to top.
  " /"    Repetitive pattern.
  *       Replicate it by count.
  +       Concatenate with '/.
  _       Copy whole thing for use as second in pair of lines.
  N\      Put a newline between the pair of lines.
  N       Add a newline after second line.
}/      End of loop over counts.
;;      Created an extra line, get rid of it.

1
Sekarang Anda bisa menghapus salah satu yang terakhir ;.
NinjaBearMonkey

Atau ganti ;; dengan +;
GamrCorps

3

Python 2, 80 byte

n=input()
print"/\\"*n
for i in range(n*2,1,-1):print"\\"*(1-i%2)+"/ "*(i/2+i%2)


2

Java - 141 byte

Bukan yang terpendek tentu saja, tetapi senang memiliki solusi Java:

String a(int a){String s="";int b=-1,c,e;for(a*=2;++b<a;){for(c=-1;++c<a;)s+=(e=b+c)>a?" ":e%2==0?"/":b==0||c==0?"\\":" ";s+="\n";}return s;}

Tidak disatukan

String a(int a){
    String s ="";
    int b=-1,c,e;
    for (a*=2;++b < a;){
        for (c = -1 ; ++c < a ;)
            s+= (e=b+c)>a?" ": e%2==0? "/" : b==0||c==0? "\\" : " ";
        s+="\n";
    }
    return s;
}

Memasukkan

System.out.println(a(5));

Keluaran

/\/\/\/\/\
\/ / / / /
/ / / / / 
\/ / / /  
/ / / /   
\/ / /    
/ / /     
\/ /      
/ /       
\/    


1

JavaScript, 128 125 123 114 byte

n=>{r='';for(i=0;i<n;i++)r+='/\\';for(j=0;j<2*n-1;j++){r+='\n'+(j%2?'':'\\');for(i=n-j/2;i>0;i--)r+='/ '}return r}

De-golf (juga dikonversi menjadi ES5) + demo:

function c(n) {
    r = '';
    for (i = 0; i < n; i++) r += '/\\';
    for (j = 0; j < 2 * n - 1; j++) {
        r += '\n' + (j % 2 ? '' : '\\');
        for (i = n - j / 2; i > 0; i--) r += '/ '
    }
    return r
}

alert(c(prompt()));


1

Ruby, 50 byte

->n{s='/\\'*n
n.times{|i|puts s,?\\+s='/ '*(n-i)}}

Dalam program uji:

f=->n{s='/\\'*n
n.times{|i|puts s,?\\+s='/ '*(n-i)}}
f[gets.to_i]

Lingkaran mencetak 2 baris untuk setiap iterasi dari i = 0 hingga i = n-1.

Baris kedua selalu '\'diikuti oleh insiden Ni '/ '.

Baris pertama sama dengan baris kedua dari iterasi sebelumnya, tetapi dengan yang '\'hilang (jadi kami menyimpan nilai ini ssaat kami mencetak baris kedua dari iterasi sebelumnya.)

Satu-satunya pengecualian adalah iterasi nol, yang ditangani dengan menginisialisasi ske '/\'*n.


1

Javascript (ES6), 107 104 100 98 97 91 90 byte

p=>{s=`/\\`.repeat(p++)+`
`;for(i=p;i>2;s+='\\'+o+o)o=`/ `.repeat(--i)+`
`;return s+'\\/'}

Posting pertama di sini!

Dulu digunakan tapi sekarang digunakan , mirip dengan Ruby .Array(len).join(str) String.repeat(len)operator*(str,len)

Tidak Disatukan:

len => {
    var str = `/\\`.repeat(len++) + '\n';

    for (var i = len, mid; i > 2; str += '\\' + mid + mid) {
        mid = `/ `.repeat(--i) + '\n';
    }

    return str + '\\/';
}


Terima kasih kepada:
107 => 104 byte: @insertusernamehere
97 => 90 byte: @ user81655


1
Anda dapat menyimpan 3 byte : p=>{s=Array(++p).join('/\\')+'\n';for(i=p;i>2;i--,s+='\\'+o+o)o=Array(i).join('/ ')+'\n';return s+'\\/'}.
masukkan nama pengguna di sini

Saya menghapus jawaban saya karena sangat mirip tetapi dikirim setelah Anda.
user81655

@ user81655 Ah, maaf soal itu. Terima kasih telah menunjukkan repeatcaranya.
usandfriends

1

Python 2, 66 byte

n=input();b=1
print'/\\'*n
while~-n+b:print'\\'*b+'/ '*n;b^=1;n-=b

Cukup mudah. Nilainya nadalah angka /pada baris, dan bmengatakan apakah baris tersebut dimulai \. Nilai bbergantian antara 0 dan 1, dan nmenurun setiap langkah kedua. Kondisi terminasi yang buruk berhenti ketika n=1, b=0. Alternatif execloop akan memiliki masalah membutuhkan banyak pelarian "'\\\\'".

Saya terkejut menemukan pendekatan ini lebih pendek daripada menggunakan nomor tunggal k=2*n+b. Ini adalah 68 byte:

k=2*input()+1
print k/2*"/\\"
while k>2:print k%2*'\\'+k/2*'/ ';k-=1

Strategi alternatif akan menghindari terpisah printuntuk garis atas, tetapi saya tidak melihat cara yang ringkas.


1

Minkolang 0,14 , 46 byte

Saya yakin ini bisa bermain golf, tapi sekarang jam 4 pagi dan saya harus tidur.

n$z"/\"z$D$OlOz[" /"zi-$Dlr$d"\"zi1+-3&5$X$O].

Coba di sini.

Penjelasan

n$z               Take number from input (n) and store it in the register (z)
   "/\"           Push these characters (in reverse)
       z$D        Push register value and duplicate the whole stack that many times
          $O      Output whole stack as characters
            lO    Output newline

z                                   Push n from register
 [                                  Open for loop that repeats n times
  " /"                              Push these characters (in reverse)
      zi-                           n - loop counter
         $D                         Pop k and duplicate whole stack k times
           l                        Push 10 (for newline)
            r                       Reverse stack
             $d                     Duplicate whole stack
               "\"                  Push this character
                  zi1+-             0 if n = loop counter + 1, truthy otherwise
                       3&           Do the next three characters if top of stack is 0
                         5$X        Dump the bottom-most five items of the stack
                            $O      Output whole stack as characters
                              ].    Close for loop and stop

1

Batch, 121 byte

@echo off
set/an=%1-1
if %1==1 (echo /\%2) else call %0 %n% /\%2
set a=/\%2
echo \%a:\= %
if not \%2==\ echo %a:\= %

Atau jika unary dapat diterima, 107 byte:

@echo off
set a=%1
echo %a:1=/\%
:a
echo \%a:1=/ %
set a=%a:~1%
if not %a%1==1 echo / %a:1=/ %&goto a

Aktifkan dengan jumlah 1s yang sesuai.


0

Matlab, 122 byte

M=2*input('');
z=zeros(M);[y,x]=ndgrid(1:M);
z(~mod(x+y,2)&x+y<M+3)=1;v=2-mod(1:M,2);
z(1,:)=v;z(:,1)=v;disp([15*z.^2+32,''])

0

Haskell, 99 byte

Dua solusi dengan panjang yang sama.

Panggil f.

f n=mapM_ putStrLn$[[x?y|x<-[0..2*n-y-0^y]]|y<-[0..2*n-1]]
x?y|mod(x+y)2==0='/'|x*y==0='\\'|0<1=' '

dan

f n=mapM_ putStrLn$[[x?y|x<-[y..2*n-0^y]]|y<-[0..2*n-1]]
x?y|mod x 2==0='/'|mod y x==0='\\'|0<1=' '

0

Haskell, 96

f=g.(*2)
g m=unlines$t m(c"/\\"):[t n l|(n,l)<-zip[m,m-1..2]$c['\\':p,p]]
p=c"/ "
c=cycle
t=take

Ini sebenarnya tidak kompetitif terhadap solusi Haskell yang ada karena menyimpan 5 karakter dengan mengembalikan alih-alih mencetak string. Saya mempostingnya hanya untuk menunjukkan bagaimana pendekatan pola infinite dibandingkan dengan pendekatan berbasis koordinat. Catatan:

  • p dapat digarisbawahi tanpa perubahan panjang.
  • [t n l|(n,l)<-...]menghemat 2 lebih (map(uncurry t)$...).

0

Ceylon, 100

String s(Integer n)=>"\n".join{"/\\".repeat(n),for(i in 2*n+1..3)"\\".repeat(i%2)+"/ ".repeat(i/2)};

Ini menampilkan "daftar argumen yang dinamai" untuk join(tanpa argumen apa pun yang disebutkan, tetapi sebagai pemahaman yang dapat diubah), dan beberapa kegunaan String.repeat(salah satunya sebenarnya berarti "hanya untuk ganjil i").

Diformat:

String s(Integer n) =>
        "\n".join{
            "/\\".repeat(n),
            for (i in 2*n + 1 .. 3)
                "\\".repeat(i % 2)
                        + "/ ".repeat(i / 2)
        };

0

PHP, 117 byte

<?$n=$argv[1];$r=str_repeat;echo$r("/\\",$n);for(;$i++<$n*2-1;)echo"\n".($i%2?"\\":'').$r("/ ",$n-floor(($i-1)/2));?>

Asumsikan pemberitahuan dimatikan dan input diambil dari baris perintah.

Tidak Disatukan:

<?php
error_reporting(E_ALL & ~E_NOTICE);

$n = $argv[1];
$r='str_repeat';
echo $r("/\\",$n);
for(;$i++<$n*2-1;){
    echo"\n".(($i%2)?"\\":'') . $r("/ ",$n-floor(($i-1)/2));
}
?>

Komentar dipersilahkan :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.