N Slab Slanted Slash Cake


23

เขียนโปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มบวก N

เมื่อ N คือ 1 เอาต์พุต

/\
\/

เมื่อ N คือ 2 เอาต์พุต

/\/\
\/ /
/ /
\/

เมื่อ N คือ 3 เอาต์พุต

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

เมื่อ N คือ 4 เอาต์พุต

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

สำหรับ N ที่ใหญ่ขึ้นลวดลายจะดำเนินต่อไปเลเยอร์ใหม่จะถูกเพิ่มทุกครั้งที่ N เพิ่มขึ้น

  • "เอาท์พุท" หมายถึงพิมพ์รูปแบบสแลชหรือส่งกลับเป็นสตริง
  • บรรทัดใหม่ต่อท้ายเดียวในเอาต์พุตได้รับอนุญาต
  • อนุญาตให้ใช้ช่องว่างต่อท้ายในเอาต์พุต แต่นำหน้าช่องว่างไม่ได้

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


10

Pyth, 25 ไบต์

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

ลองออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

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 bytes

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

ทดสอบที่นี่

ฉันพยายามช่วย Reto golf คำตอบ CJam ของเขา แต่ลงเอยด้วยวิธีแก้ปัญหาที่ไม่เกี่ยวข้องกับเขาดังนั้นฉันคิดว่าฉันอาจโพสต์ด้วยตัวเอง

คำอธิบาย

สิ่งนี้ใช้ประโยชน์จากความสมมาตรของเอาต์พุต โดยเฉพาะอย่างยิ่งความจริงที่ว่าเอาท์พุทจะเหมือนกันกับการแปลง

อันดับแรกเราสร้างN+1บรรทัดแรกแต่ไม่มีขอบซ้าย:

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.

ตอนนี้เรามีชุดของสตริงที่แสดงถึงกริดต่อไปนี้:

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

การย้ายที่มีลักษณะเช่นนี้:

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

เมื่อรวมเข้าด้วยกันเหล่านี้มีอักขระที่ไม่ใช่ช่องว่างทั้งหมดที่เราต้องการ ตอนนี้เราสามารถใช้ประโยชน์จากปลาย Rad ของเดนนิสเพื่อรวมกริด ASCII สองกริดเป็นหนึ่งเดียวโดยการใช้อักขระสูงสุดที่ตรงกันแต่ละคู่ ในทุกตำแหน่งที่กริดทั้งสองแตกต่างกันตำแหน่งหนึ่งจะมีช่องว่าง (หรือไม่มีอะไรเลย) และอีกตำแหน่งหนึ่งจะมีอักขระที่เรากำลังค้นหา เมื่อหนึ่งรายการในการดำเนินการ vectorised ยาวกว่าอีกรายการองค์ประกอบเพิ่มเติมของรายการยาวจะถูกเก็บไว้ซึ่งเป็นสิ่งที่เรากำลังมองหา ในกรณีอื่น ๆ อักขระที่ไม่เว้นวรรคจะเป็นจำนวนสูงสุดของอักขระสองตัว:

_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 ไบต์

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

ลองออนไลน์!

Ungolfed และคำอธิบาย

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

แกนหลักของโปรแกรมสร้างรายการของU * 2รายการจับคู่แต่ละรูปแบบของแถวจากนั้นรวมเข้ากับบรรทัดใหม่:

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.

สำหรับรูปแบบตัวเองนี่คือวิธีที่ฉันได้ทำลายมันขึ้นมา:

/\/\/\/\

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

อย่างที่คุณเห็นที่นี่ตอนนี้มันแบ่งออกเป็นสามรูปแบบง่าย ๆ อันแรกนั้นง่ายที่สุดสร้างด้วยรหัสนี้:

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

ตอนนี้ครึ่งซ้าย ดัชนีคี่ควรแมปไปยัง\/และ/ด้วยดังนั้นเราจึงใช้รหัสนี้:

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

สิ่งนี้ทำให้ครึ่งทางที่ถูกต้องง่ายขึ้น สิ่งที่เราต้องทำคือทำซ้ำ /สองสามครั้ง:

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

ยินดีต้อนรับข้อเสนอแนะ!



4

CJam, 36 35 34 ไบต์

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

ลองออนไลน์

ขอขอบคุณที่ @NinjaBearMonkey ;สำหรับการชี้ออกพิเศษ

ในขณะที่สิ่งนี้ดูไม่เหมาะสมนักฉันลองใช้ตัวเลือกอื่นสองสามอย่างและพวกเขาก็ไม่ได้สั้นลงไปกว่านี้

คำอธิบาย:

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
ตอนนี้คุณก็สามารถลบหนึ่งสุดท้าย;s
NinjaBearMonkey

หรือแทนที่ ;; ด้วย +;
GamrCorps



2

Java - 141 ไบต์

ไม่ใช่หลักสูตรที่สั้นที่สุด แต่ยินดีที่ได้ใช้โซลูชัน 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;}

Ungolfed

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

อินพุต

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

เอาท์พุต

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


1

JavaScript, 128 125 123 114 ไบต์

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 (แปลงเป็น ES5) + ตัวอย่าง:

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 ไบต์

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

ในโปรแกรมทดสอบ:

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

ลูปจะพิมพ์ 2 แถวสำหรับการวนซ้ำทุกครั้งจาก i = 0 ถึง i = n-1

แถวที่สองมักจะตามมาด้วยอุบัติการณ์ของพรรณี'\''/ '

แถวแรกนั้นเหมือนกับแถวที่สองของการทำซ้ำก่อนหน้า แต่มีการ'\'หายไป (ดังนั้นเราจึงเก็บค่านี้ไว้sเมื่อเราพิมพ์แถวที่สองของการทำซ้ำก่อนหน้านี้)

ยกเว้นอย่างเดียวคือการย้ำศูนย์ซึ่งจะถูกจัดการโดยการเริ่มต้นที่จะs'/\'*n


1

Javascript (ES6), 107 104 100 98 97 91 90 ไบต์

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

โพสต์แรกที่นี่!

เคยใช้ แต่ตอนนี้ใช้คล้ายกับทับทิมArray(len).join(str) String.repeat(len)operator*(str,len)

Ungolfed:

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

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

    return str + '\\/';
}


ขอบคุณ:
107 => 104 ไบต์: @insertusernamehere
97 => 90 ไบต์: @ user81655


1
คุณสามารถบันทึก3 ไบต์p=>{s=Array(++p).join('/\\')+'\n';for(i=p;i>2;i--,s+='\\'+o+o)o=Array(i).join('/ ')+'\n';return s+'\\/'} :
insertusernamehere

ฉันลบคำตอบของฉันเพราะคล้ายกันมาก แต่โพสต์หลังจากคุณ
user81655

@ user81655 อ่าขอโทษด้วย ขอบคุณที่แสดงrepeatวิธีการให้ฉัน
usandfriends

1

Python 2, 66 ไบต์

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

ตรงไปตรงมาสวย ค่าnเป็นจำนวนของ/สายและกล่าวว่าไม่ว่าจะเป็นเส้นเริ่มต้นด้วยb \ค่าของbทางเลือกระหว่าง 0 และ 1 และnลดลงทุกขั้นตอนที่สอง n=1, b=0เงื่อนไขการเลิกจ้างน่าเกลียดหยุดเมื่อ ทางเลือกของการexecวนซ้ำจะมีปัญหาในการต้องการทางหนี"'\\\\'"มากมาย

ฉันรู้สึกประหลาดใจที่พบว่าวิธีนี้สั้นกว่าการใช้หมายเลขเดียว k=2*n+bฉันรู้สึกประหลาดใจที่จะหาวิธีการนี้สั้นกว่าการใช้หมายเลขเดียวนี่คือ 68 ไบต์:

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

กลยุทธ์ทางเลือกจะหลีกเลี่ยงการแยกprintสำหรับบรรทัดบนสุด แต่ฉันไม่เห็นวิธีรัดกุม


1

Minkolang 0.14 , 46 bytes

ฉันแน่ใจว่าสิ่งนี้จะสามารถเล่นกอล์ฟได้ แต่นี่เป็นเวลาตีสี่และฉันต้องเข้านอน

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

ลองที่นี่

คำอธิบาย

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

แบตช์ 121 ไบต์

@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:\= %

หรือถ้าชาวนายอมรับได้ 107 ไบต์:

@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

เรียกใช้ด้วยจำนวนที่เหมาะสม 1s


0

Matlab, 122 ไบต์

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 ไบต์

การแก้ปัญหาสองความยาวเท่ากัน

โทร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=' '

และ

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

สิ่งนี้ไม่ได้แข่งขันกับโซลูชัน Haskell ที่มีอยู่เพราะช่วยประหยัด 5 อักขระโดยส่งคืนแทนที่จะพิมพ์สตริง ฉันกำลังโพสต์เพียงเพื่อแสดงให้เห็นว่าวิธีการรูปแบบที่ไม่มีที่สิ้นสุดเปรียบเทียบกับวิธีการประสานงานตาม หมายเหตุ:

  • p สามารถ inline โดยไม่มีการเปลี่ยนแปลงความยาว
  • [t n l|(n,l)<-...]ประหยัด 2 (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)};

คุณลักษณะนี้เป็น "รายการอาร์กิวเมนต์ที่ระบุชื่อ" สำหรับjoin(โดยไม่มีอาร์กิวเมนต์ที่กำหนดชื่อใด ๆ แต่มีความเข้าใจที่ซ้ำได้แทน) และการใช้งานหลายครั้งString.repeat(ซึ่งหนึ่งในนั้นหมายถึง "รวมเฉพาะคี่i")

จัดรูปแบบ:

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

0

PHP, 117 ไบต์

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

ถือว่าการแจ้งเตือนถูกปิดและอินพุตถูกนำมาจากบรรทัดคำสั่ง

Ungolfed:

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

ความเห็นยินดีต้อนรับ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.