ชั้นหนังสือ ASCII


27

คุณรู้ว่าชั้นวางซ้อนกันได้ที่โดยทั่วไปเป็นเพียงกล่องไม้ที่สามารถซ้อนกัน? เราจะจำลองการสร้างชั้นหนังสือบางส่วนด้วยศิลปะ ASCII

หนังสือของเรามีทุกสิ่งอำนวยความสะดวกในเครื่องแบบขนาดและรูปลักษณ์ทั้งหมดเช่นต่อไปนี้:

|X|
|X|
|X|

ชั้นวางหนังสือกล่องแต่ละเสมอสามตัวสูงภายใน (พอที่จะใส่หนังสือยืนตรง) ประกอบด้วย|ตัวอักษรด้านซ้ายและขวา-ตัวอักษรด้านบนและด้านล่างและกว้างพอที่จะพอดีกับXหนังสือ (ที่Xเป็นอินพุท จำนวนเต็ม). ตัวอย่างเช่นนี่คือชั้นวางหนังสือที่มีขนาด3:

|---------|
|         |
|         |
|         |
|---------|

เพราะคุณสามารถใส่3หนังสือลงไปได้อย่างนั้น

|---------|
||X||X||X||
||X||X||X||
||X||X||X||
|---------|

ค่าอินพุทจะเป็นจำนวนเต็มบวกสองตัวXและYที่Xความกว้างของชั้นวางที่เรามี (วัดในหนังสือ) และYจำนวนหนังสือที่เราต้องกองซ้อน หากเรามีหนังสือมากกว่าที่วางในชั้นเดียวเราจำเป็นต้องเพิ่มชั้นวางเพิ่มเติมไปด้านบน ตัวอย่างเช่นนี่คืออินพุต4 wide / 6 books:

|------------|
||X||X|      |
||X||X|      |
||X||X|      |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|

หากY % X > 0หมายถึงจำนวนหนังสือไม่ใช่จำนวนเต็มขนาดของชั้นหนังสือที่เหลือควรอยู่ในตำแหน่งซ้ายสุดบนสุด (เช่นในกรณีที่มี4 6ด้านบน) และส่วนที่เหลือของชั้นวางนั้นเต็มไปด้วย ช่องว่าง

อินพุต

  • เลขจำนวนเต็มบวกสองตัวในรูปแบบที่สะดวกแต่ละ>0อัน
  • คุณสามารถป้อนข้อมูลตามลำดับใดก็ได้ (เช่นขนาดของชั้นวางก่อนจากนั้นจำนวนหนังสือหรือในทางกลับกัน) โปรดระบุในการส่งคำสั่งซื้อของคุณ
  • คุณสามารถสันนิษฐานได้อย่างปลอดภัยว่าการป้อนข้อมูลจะไม่ใหญ่กว่า[int]ขนาดเริ่มต้นของภาษา

เอาท์พุต

การนำเสนอผลงานศิลปะ ASCII ของหนังสือและชั้นหนังสือ

กฎระเบียบ

  • ขึ้นบรรทัดใหม่หรือต่อท้ายช่องว่างหรือช่องว่างทั้งหมดเป็นตัวเลือกตราบใดที่ตัวละครตัวเองเข้าแถวอย่างถูกต้อง
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดใส่ลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่างเพิ่มเติม

6 wide / 2 books
|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|

2 wide / 6 books
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|

4 wide / 9 books
|------------|
||X|         |
||X|         |
||X|         |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|

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

1
@GoldenRatio ไม่ต้องกรอกหนังสือจากบนลงล่างจากซ้ายไปขวา
AdmBorkBork

คำตอบ:


14

JavaScript (ES6), 100 99 98 ไบต์

ใช้ความกว้างwและจำนวนหนังสือbในรูปแบบของการแก้(w)(b)ปัญหา

w=>g=(b,s=`|${'-'.repeat(w*3)}|
`,r=s.replace(/---/g,_=>b&&b--?'|X|':'   '))=>(b?g(b)+s:s)+r+r+r+s

จัดรูปแบบและแสดงความคิดเห็น

w =>                                // main function: takes width 'w' as input, returns 'g'
  g = (                             // g = recursive function with:
    b,                              //   - b = number of books
    s = `|${'-'.repeat(w * 3)}|\n`, //   - s = top/bottom of shell, filled with '-'
    r = s.replace(                  //   - r = pattern of the current row of books,
      RegExp('---', 'g'),           //         using 's' as a template and updating
      _ => b && b-- ? '|X|' : '   ' //         'b' while building it
    )                               // NB: 'r' must be defined in the scope of 'g',
  ) =>                              //     otherwise it would be overwritten by
    (                               //     subsequent calls
      b ?                           // if there are remaining books:
        g(b) + s                    //   do a recursive call and append shell top
      :                             // else:
        s                           //   just append shell top
    ) + r + r + r + s               // append book rows and shell bottom

กรณีทดสอบ


9

Bash (+ ยูทิลิตี้) 130, 108, 106 ไบต์

ไปป์ไลน์เชลล์เดี่ยวและต่อเนื่องเพื่อแสดงชั้นหนังสือของคุณ

การเปลี่ยนแปลง:

  • เพิ่มประสิทธิภาพการแสดงออกครั้งแรก sed บิต -12 ไบต์ (ขอบคุณ @Riley!)
  • แทนที่printf + seqด้วย raw printf, -10 bytes
  • สร้างการแสดงออกที่สอง sed ครั้งที่สอง -2 ไบต์

แข็งแรงเล่นกอล์ฟ

printf %$2s\\n|fold -$1|sed "s/ /|X|/g;:;/.\{$[$1*3]\}/!s/$/ /;t;h;s/./-/gp;x;p;p;p;x"|sed 's/.*/|&|/'|tac

$./shelf 6 8
|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|
|------------------|
||X||X||X||X||X||X||
||X||X||X||X||X||X||
||X||X||X||X||X||X||
|------------------|

ลองออนไลน์!

มันทำงานอย่างไร

$./shelf 2 3

printf %$2s\\n- สร้างตัวละครเว้นวรรคหนึ่งตัวต่อหนึ่งหนังสือ (แสดงเป็น_)

___

fold -$1 - พับได้ตามความยาวชั้นวาง

__
_

sed "s/ /|X|/g;"- แทนที่_ด้วยXเพิ่มปกหนังสือ

|X||X|
|X|

:;/.\{$[$1*3]\}/!s/$/ /;t- แผ่นขวามีช่องว่าง (แสดงเป็น_)

|X||X|
|X|___

h;s/./-/gp;x;p;p;p;x- เพิ่มจำนวนสามบรรทัดในแต่ละบรรทัดและเพิ่ม---ก่อนและหลัง

------
|X||X|
|X||X|
|X||X|
------
------
|X|   
|X|   
|X|   
------

sed 's/.*/|&|/'|tac- ตัดบรรทัด| |ด้วยย้อนกลับด้วย tac

|------|
||X|   |
||X|   |
||X|   |
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|

ใน sed แรกที่คุณสามารถใช้ฉลากนิรนามและtแทนเพื่อให้คุณไม่จำเป็นต้องb {}คุณสามารถข้ามs/./-/gเพราะพวกเขามีอยู่แล้ว-s ลองออนไลน์!
Riley

@Riley นั่นเป็นคำแนะนำที่ดีมากขอบคุณ!
เรือเหาะ

6

Python 2, 133 113 105 ไบต์

ฉันแน่ใจว่ามีวิธีที่ดีกว่า ...

X,Y=input()
k='|'+'---'*X+'|'
while Y:g=Y%X or X;print k+'\n'+('|'+'|X|'*g+'   '*(X-g)+'|'+'\n')*3+k;Y-=g

อินพุตถูกใช้ width, books

-20 ไบต์ขอบคุณ @ovs สำหรับการสังเกตฟังก์ชั่นแลมบ์ดาที่ไม่จำเป็น!
-8 ไบต์ขอบคุณ @ovs สำหรับทำให้อินพุตสั้นลง


X,Y=input()เป็นวิธีที่สั้นกว่าที่จะใช้กับค่า
OVS

@ovs โอ้รอฉันใส่ที่นั่นเพื่อลองครั้งแรกของฉัน อ๊ะ จับได้ดีขอบคุณ!
HyperNeutrino

1
@ovs ขอบคุณดังนั้นข้อมูลจะถูกนำมาเป็นX, Yใช่มั้ย
HyperNeutrino

2
ฉันคิดว่าคุณสามารถบันทึกสองไบต์โดยกำหนด'|'เป็นตัวแปร
Ørjan Johansen

6

แบตช์ 261 ไบต์

@set/an=~-%1%%%2+1,b=%1-n
@set s=
@set t=
@for /l %%i in (1,1,%2)do @call set t=---%%t%%&if %%i gtr %n% (call set s=%%s%%   )else call set s=%%s%%X
@for %%s in ("|%t%|" "|%s:X=|X|%|" "|%s:X=|X|%|" "|%s:X=|X|%|" "|%t%|")do @echo %%~s
@if %b% gtr 0 %0 %b% %2

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


5

Haskell , 100 ไบต์

x#yส่งคืนสตริงสำหรับความกว้างxและyหนังสือ

s?n=[1..n]>>s
x#y|x<y=x#(y-x)++x#x|w<-"---"?x,b<-"|X|"?y++"   "?(x-y)=[w,b,b,b,w]>>=('|':).(++"|\n")

ลองออนไลน์!

ฟังก์ชันหลัก / #ผู้ประกอบการคือ เมื่อx<yมันแยกหนังสือลงy-xและxแล้ว recurses เมื่อx>=y, wและbเป็นสองชนิดสายลบด้านนอก|และการขึ้นบรรทัดใหม่

ผู้ประกอบการผู้ช่วยs?nเชื่อมสำเนาของสตริงns


5

PowerShell , 149 134 ไบต์

param($w,$b)$s="|$('-'*$w*3)|"
if($a=$b%$w){,$s+,"|$('|X|'*$a)$(' '*3*($w-$a))|"*3+$s}
if($b-=$a){(,$s+,"|$('|X|'*$w)|"*3+$s)*($b/$w)}

ลองออนไลน์!

ใช้$width และ$books อินพุต ตั้งค่าสตริง$sให้เป็นหนึ่งในชั้นวางแนวนอน จากนั้นเรามีสองifข้อความ

การตรวจสอบครั้งแรกว่าเรามีหนังสือ "เหลือ" หรือไม่ ถ้าเป็นเช่นนั้นเราจะส่งออกชั้นวาง (จำนวนหนังสือบวกจำนวนช่องว่าง) *3และชั้นวางอื่น

ต่อไปเราจะดูว่าเรายังมีหนังสือเหลืออยู่หรือไม่หลังจากลบส่วนที่เหลือ ( $a) การตั้งค่าแบบเดียวกันยกเว้นเราใช้$wจำนวนหนังสือ เนื่องจาก ณ จุด$bนี้รับประกันได้ว่าเป็นจำนวนเท่าของ$w(เพราะเราลบส่วนที่เหลือออก$a) เราไม่จำเป็นต้องกังวลเกี่ยวกับการปัดเศษ

ลบการ[math]::Floor()โทรประหยัด 15 ไบต์

สตริงเหล่านี้ทั้งหมดจะถูกทิ้งไว้ที่ไพพ์ไลน์และWrite-Outputจะเกิดขึ้นเมื่อโปรแกรมเสร็จสมบูรณ์


4

CJam , 62 61 ไบต์

q~1a*W$/W$f{0e]}{{"|X|"S3*?}%s__'-3*W$*_}%1m>W%"|
|"*"||"\*o;

ใช้อินพุตเป็น width books

ลองออนไลน์!

คำอธิบาย

q~           Read and eval input (pushes width W and books B to the stack)
1a*          Push an array containing  the number 1 B times
W$/          Split it into chunks of size W
W$f{0e]}     Pad each chunk to width W by adding 0's to the right (the last chunk might be 
              shorter than W)
{            Apply the following to each chunk:
 {            Apply the following to each number in the chunk:
  "|X|"S3*?    Push "|X|" if the number is 1, or "   " if it's 0
 }%           (end of block)
 s            Stringify (joins with no separator)
 __           Duplicate twice (each shelf is 3 identical lines)
 '-3*W$*_     Push a string containing '-' repeated 3×W times, then duplicate it
}%           (end of block)
              At this point we have an array containing sequences of 3 identical lines 
              each followed by two lines of -'s
1m>          Rotate the array 1 to the right; brings the final line of -'s to the start
W%           Reverse the array, so that the top shelf is the partially empty one
"|\n|"*      Join the array with the string "|\n|", to build the sides of the shelves
"||"\*       Join the string "||" with the shelf string (adds the first and last | chars)
o            Print the result
;            Pop and discard W

4

Python 3, 142 ไบต์

ยังคงทำงานกับมัน bสำหรับ 'จำนวนหนังสือ' และwสำหรับความกว้างของชั้นวาง

def s(b,w):
 R=b%w
 B='|\n'
 I='|'
 X='|X|'
 d=I+3*w*'-'+B
 f=I+X*w+B
 p=I+R*X+3*(w-R)*' '+B
 print(R and d+3*p+d or" ")+b//w*(d+3*f+d))

ยินดีต้อนรับสู่ PPCG! สิ่งนี้ไม่ได้ผลสำหรับฉันจนกว่าR=b%wจะถูกย้ายไปยังบรรทัดถัดไป นอกจากนี้คุณควรจะสามารถลบช่องว่างรอบสามเหล่านั้น=เพื่อบันทึกไบต์
ธุรกิจ Cat

ยินดีต้อนรับสู่ PPCG!
AdmBorkBork

คุณสามารถแทนที่d+3*p+d if R!=0 else ''ด้วยR and d+3*p+d or''
shooqie

@ shooqie ฉันสงสัยว่าสิ่งนี้จะประเมินผลของการได้d+3*p+dอย่างไร
Juan Meleiro

1
คุณสามารถบันทึกไม่กี่ไบต์โดยใส่คำจำกัดความทั้งหมดในหนึ่งบรรทัดโดยใช้เครื่องหมายอัฒภาค
L3viathan

3

AHK, 208 ไบต์

AutoTrim,Off
w=%1%
b=%2%
f:=Mod(b,w)
Loop,%w%
s=%s%---
s=|%s%|`n
If (f>0) {
Loop,%f%
t=%t%|X|
Loop,% w-f
t=%t% ` ` `
t=|%t%|`n
t:=s t t t s
}
Loop,%w%
r=%r%|X|
r=|%r%|`n
Loop,% (b-f)/w
t:=t s r r r s
Send,%t%

มีบางสิ่งที่ทำให้ฉันหงุดหงิดจากการเล่นกอล์ฟต่อไป:

  • AutoHotkey ไม่มีฟังก์ชั่นการเล่นซ้ำ
  • คุณไม่สามารถใช้การส่งผ่านข้อโต้แย้ง ( %1%& %2%) ในฟังก์ชันทางคณิตศาสตร์ได้โดยตรงเนื่องจากสิ่งเหล่านั้นต้องการตัวแปรหรือการป้อนตัวเลขและมันจะถือว่าค่าที่ไม่ใช้ค่า Escape 1เป็นตัวเลขหนึ่งแทนที่จะเป็นชื่อตัวแปร
  • ฉันเล่นกอล์ฟไม่ค่อยเก่ง

เวอร์ชันด้านบนที่อ่านง่ายกว่าจะมีลักษณะดังนี้:

AutoTrim,Off
w=%1%
b=%2%
f:=Mod(b,w)

Loop,%w%
   s=%s%---
s=|%s%|`n

If (f>0) {
   Loop,%f%
      t=%t%|X|
   Loop,% w-f
      t=%t% ` ` `
   t=|%t%|`n
   t:=s t t t s
}

Loop,%w%
   r=%r%|X|
r=|%r%|`n

Loop,% (b-f)/w
   t:=t s r r r s

Send,%t%

หาก a Loopไม่ใช้เครื่องหมายวงเล็บ{}แสดงว่าบรรทัดถัดไปเป็นส่วนหนึ่งของลูป หากตั้งค่าของตัวแปรโดยใช้:=แทนคุณ=สามารถปล่อยอักขระเครื่องหมายหนีเปอร์เซ็นต์ Tilde n เป็นอักขระขึ้นบรรทัดใหม่


3

Java 7, 230 224 222 ไบต์

String c(int w,int b){String r="",n="|\n",z="|";int i=0,j,k,t=b%w<1?w:b%w,x=b/w+(t!=w?1:0);for(;i++<w;z+="---");z+=n;for(i=0;i<x;i++){r+=z;for(j=0;j++<3;r+=n){r+="|";for(k=0;k<w;r+=i<1&k++>=t?"   ":"|X|");}r+=z;}return r;}

คำอธิบาย:

String c(int w, int b){                // Method with two integer parameters and String return-type
  String r = "",                       //  The return-String
         n = "|\n",                    //  Part that's used multiple times in the code
         z = "|";                      //  Shelf part of the book-boxes
  int i = 0, j, k,                     //  Indexes used in the for-loops
      t = b%w < 1 ? w : b%w,           //  Books on top shelf
      x = b/w + (t != w ? 1 : 0);      //  Amount of shelves
  for(; i++ < w; z += "---"); z += n;  //  Create the shelf-part ("|---|"; with w times "---")
  for(i = 0; i < x; i++){              //  Loop over the rows
    r += z;                            //   Append the result with the shelf-part
    for(j = 0; j++ < 3; ){             //   Loop three times (the height of the books & boxes)
      r += "|";                        //    Append the result-String with "|"
      for(k = 0; k < w;                //    Loop over the columns
          r +=                         //     And append the result-String with:
           i < 1                       //      If this is the first row:
           & k++ >= t ?                //      And the current column is larger or equal to the amount of books in the top shelf
             "   "                     //       Use an empty space
           :                           //      Else:
             "|X|"                     //       Use the book-part
            );                         //    End of columns loop
         r += n;                       //    Append the result-String with a "|" and a new-line
       }                               //   End of the loop of three
      r += z;                          //   Append the result-String with the shelf-part
    }                                  //  End of rows loop
    return r;                          //  Return the result-String
 }                                     // End of method

รหัสทดสอบ:

ลองที่นี่

class M{
  static String c(int w,int b){String r="",n="|\n",z="|";int i=0,j,k,t=b%w<1?w:b%w,x=b/w+(t!=w?1:0);for(;i++<w;z+="---");z+=n;for(i=0;i<x;i++){r+=z;for(j=0;j++<3;r+=n){r+="|";for(k=0;k<w;r+=i<1&k++>=t?"   ":"|X|");}r+=z;}return r;}

  public static void main(String[] a){
    System.out.println(c(6, 2));
    System.out.println(c(2, 6));
    System.out.println(c(4, 9));
  }
}

เอาท์พุท:

|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|

|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|

|------------|
||X|         |
||X|         |
||X|         |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|

1
ฉันไม่รู้เหมือนกัน แต่ดูเหมือนว่าlambdas และ.repeatจริงๆช่วยในการท้าทายนี้
Olivier Grégoire

@ OlivierGrégoireพิจารณาแล้วฉันโพสต์สิ่งนี้เมื่อประมาณ 1.5 ปีก่อนฉันไม่แปลกใจเลยที่จะสามารถเล่นกอล์ฟได้อย่างมีนัยสำคัญ ;)
Kevin Cruijssen

โอ้ ... ฉันไม่ได้ตรวจสอบวันที่: ฉันเพิ่งเห็นว่าคำถามนี้ใช้งานได้และอัลกอริทึมแบบเต็มสำหรับ Java เป็นไปได้ ไม่ดีของฉัน ...
Olivier Grégoire

@ OlivierGrégoireไม่มีปัญหาและทำได้ดีกับคำตอบของคุณ :) เกือบจะรู้สึกย้อนกลับไปคิดถึงคำตอบนี้เมื่อฉันยังเพิ่มกรณีทดสอบและส่งออกไปยังคำตอบและตอบทุกอย่างใน Java 7 เพราะฉันยังไม่เข้าใจ Java 8 XD
Kevin Cruijssen

2

PowerShell ขนาด 109 ไบต์

param($w,$b)for(;$b;$b-=$c){if(!($c=$b%$w)){$c=$w}($l="|$('-'*$w*3)|")
,"|$('|X|'*$c)$(' '*($w-$c)*3)|"*3
$l}

สคริปต์ทดสอบ golfed น้อย:

$f = {

param($w,$b)
for(;$b;$b-=$c){
    if(!($c=$b%$w)){$c=$w}
    ($l="|$('-'*$w*3)|")
    ,"|$('|X|'*$c)$(' '*($w-$c)*3)|"*3
    $l
}

}

@(
    ,(6, 2, 
    "|------------------|",
    "||X||X|            |",
    "||X||X|            |",
    "||X||X|            |",
    "|------------------|")

    ,(2, 6,
    "|------|",
    "||X||X||",
    "||X||X||",
    "||X||X||",
    "|------|",
    "|------|",
    "||X||X||",
    "||X||X||",
    "||X||X||",
    "|------|",
    "|------|",
    "||X||X||",
    "||X||X||",
    "||X||X||",
    "|------|")

    ,(4, 9,
    "|------------|",
    "||X|         |",
    "||X|         |",
    "||X|         |",
    "|------------|",
    "|------------|",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "|------------|",
    "|------------|",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "|------------|")
) | % {
    $w,$b,$expected = $_
    $result = &$f $w $b
    "$result"-eq"$expected"
    $result
}

เอาท์พุท:

True
|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|
True
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
True
|------------|
||X|         |
||X|         |
||X|         |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|

PowerShell, 109 ไบต์, ทางเลือก

param($w,$b)for(;$b;$b-=$c){($l="|$('---'*$w)|")
,"|$('|X|'*($c=(($b%$w),$w-ne0)[0]))$('   '*($w-$c))|"*3
$l}

1

Python 2 , 120 118 bytes

i,j=input()
a=j%i
n='|\n'
x='|'+'---'*i+n
print(x+('|'+'|x|'*a+' '*(i-a)*3+n)*3,'')[a<1]+(x+('|'+'|x|'*i+n)*3)*(j/i)+x

ลองออนไลน์!

มีความหมายที่จะไปที่นี้ในไม่กี่วันที่ผ่านมา ตอนนี้ฉันมีเวลาที่จะทำมันแล้ว โอ้ดีเพิ่งโพสต์เป็นทางเลือก

นำเข้าเป็นความกว้างหนังสือ


1

SOGL , 64 ไบต์

be%→M"Q└ƨS‘*ač;┼→S%‘A |e3* -* |++M?tMSeM-9*@*a+┼Ot}be÷:?{teSa┼Ot

คำอธิบาย: ฟังก์ชั่นแรก:

   →M  define function M which pushes
b      the book amount
  %    mod
 e     the bookshelf width

ฟังก์ชั่นที่สอง:

           →S  create function S (example input: 3)          [3]
"Q└ƨS‘         push the string "|||XXX|||" (the book)        [3, "|||XXX|||"]
      *        multiply by the number on stack (book count)  ["|||XXX||||||XXX||||||XXX|||"]
       a       push variable A (later defined "|||")         ["|||XXX||||||XXX||||||XXX|||", "|||"]
        č      chop into char array                          ["|||XXX||||||XXX||||||XXX|||", ["|", "|", "|"]]
         ;     swap top 2 on stack                           [["|", "|", "|"], "|||XXX||||||XXX||||||XXX|||"]
          ┼    horizontally append                           [["||X||X||X|", "||X||X||X|", "||X||X||X|"]]

ฟังก์ชั่นนี้คาดว่าจะมีจำนวน (จำนวนหนังสือ) ในสแต็กและส่งออกหนังสือชั้นวางหนังสือ

["||X||X||X|",
 "||X||X||X|",
 "||X||X||X|"]

ตัวอย่างถัดลงมาคือ e = 3 (ความกว้างของชั้นหนังสือ) และ b = 8 (จำนวนหนังสือ)

%‘A              var A = "|||"                        
    |            push "|"                      ["|"]                
     e3*         push E * 3                    ["|", 9]             
         -*      push that many "-"es          ["|", "---------"]   
            |+   append "|"                    ["|", "---------|"]  
              +  prepend the "|"               ["|---------|"]      

นี่คือชั้นวางหนังสือชั้นบน / ล่างและจะอยู่ในส่วนแรกของสแต็คเสมอ

ส่วนหลักแรก

M?               }               if the modulo != 0
  tM                             output the bookshelf top/bottom line
    S                            execute the S function width the modulo
     eM-                         push bookshelf width - modulo (empty space count)
        9*                       multiply by 9 (books are 3x3 so 3x3 spaces)
          @*                     get that many spaces
            a+                   append to that "|||"
              ┼                  horizontally append
               O                 output
                t                output the bookshelf top/bottom line

และส่วนสุดท้าย

be÷            floor divide book amout by width (full shelves)
   :?          if not 0 (a bug makes all loops execute once)
     {         repeat
      t        output the bookshelf top/bottom line
       eS      execute S with shelf width (full shelf)
         a┼    horizontally append "|||"
           O   output
            t  output the bookshelf top/bottom line



0

Canvas ขนาด 33 ไบต์

|X|3*×⁷3×⇵-×|3*×╫│;22╋P
%?%⁸}÷[⁷⁸

ลองที่นี่!

คำอธิบาย (ตัวละครบางตัวถูกแทนที่เพื่อดู monospace เพิ่มเติม):

|X|3*×⁷3×⇵-×|3*×╫│;22╋P  helper function. Prints a shelf with X books
|X|                      push "|X|"
   3*                    repeat it 3 times vertically
     ×                   repeat that horizontally by the item (X) below on the stack
      ⁷3×                push width * 3
         ⇵               ceiling divide that by 2
          -×             repeat "-" that many times
            |3*          repeat "|" vertically 3 times (aka "|¶|¶|")
               ×         prepend that to the dashes (aka ¼ of a bookshelf)
                ╫│       quad-palindromize with horizontal overlap of the remainder
                           taken before and vertical overlap of 1
                  ;      get the books on top
                   22╋   and at coordinates (2;2) in the shelf, place them in
                      P  print that whole thing

%?%⁸}÷[⁷⁸  
%?  }      if width%amount (!= 0)
  %⁸         execute the helper function with width%amount on the stack
     ÷[    repeat floor(width/amount) times
       ⁷     push width
        ⁸    execute the helper function

0

Pip -n , 45 ไบต์

Wb-:yPPZ['-X3Xa"|X|"X(Yb%a|a).sX3Xa-yRL3]WR'|

รับความกว้างและจำนวนหนังสือตามลำดับเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ลองออนไลน์!

คำอธิบาย

เราเรียกใช้ลูปเพื่อพิมพ์ชั้นวางทีละชั้นจากบนลงล่าง ในการทำซ้ำแต่ละครั้งเราจะอัปเดตb(จำนวนหนังสือที่จะพิมพ์) โดยการลบy(จำนวนหนังสือที่พิมพ์ในการทำซ้ำนั้น) เมื่อbถึง 0 วงออกจาก

Wb-:yPPZ['-X3Xa"|X|"X(Yb%a|a).sX3Xa-yRL3]WR'|
                                               a is 1st cmdline arg (shelf width); b is 2nd cmdline
                                                 arg (# books); s is space; y is ""
                                               Note that "" becomes zero in numeric contexts
Wb-:y                                          While b decremented by y is nonzero:
                       b%a|a                    b mod a, or a if that quantity is zero
                      Y                         Yank that value into y
                     (      )                   This is the number of books on the current shelf
               "|X|"                            Book-spine string
                    X                           Repeated y times
                                  a-y           Number of empty slots on the current shelf
                              sX3X              Three spaces for each slot
                             .                  Concatenate to the book-spines string
                                     RL3        Make a list of 3 copies of that string
         '-X3Xa                                 3*a hyphens
        [                               ]       Put that string and the above list in a list
                                         WR'|   Wrap all strings in the nested list in |
      PZ                                        Palindromize the outer list (adding a copy of the
                                                hyphens to the end of it)
     P                                          Print, joining all sublists on newlines (-n flag)

เนื่องจากมันเกี่ยวข้องน้อยนี่คือตัวอย่างของการวนซ้ำครั้งแรกเมื่อa = 3, b = 8:

Yb%a|a       2
"|X|"X ^     "|X||X|"
^ .sX3Xa-y   "|X||X|   "
^ RL3        ["|X||X|   ";"|X||X|   ";"|X||X|   "]
['-X3Xa ^ ]  ["---------";["|X||X|   ";"|X||X|   ";"|X||X|   "]]
^ WR'|       ["|---------|";["||X||X|   |";"||X||X|   |";"||X||X|   |"]]
PZ ^         ["|---------|";["||X||X|   |";"||X||X|   |";"||X||X|   |"];"|---------|"]

ซึ่งพิมพ์เป็น

|---------|
||X||X|   |
||X||X|   |
||X||X|   |
|---------|

0

Pyth , 56 ไบต์

M++GHGV_fTs*V,]Q1.DEQjCg*5\|smgL\-*L3?d"|X|""   ".[*]1N0

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

M++GHGV_fTs*V,]Q1.DEQjCg*5\|smgL\-*L3?d"|X|""   ".[*]1N0Q   Implicit: Q=1st arg, E=2nd arg
                                                            Trailing Q inferred
M                                                           Define a function, g(G,H):
 ++GHG                                                        Return G + H + G
                 .DEQ                                       Divmod E by Q, yields [E//Q, E%Q]
             ,]Q1                                           [[Q], 1]
           *V                                               Vectorised multiply the two previous results
                                                              This yields Q repeated E//Q times, then E%Q
          s                                                 Flatten
        fT                                                  Filter out falsey values (i.e. trailing 0 if present)
       _                                                    Reverse (to put partially filled shelf on top)
      V                                                     For N in the above:
                                                    ]1        [1]
                                                   *  N       Repeat the above N times
                                                 .[    0Q     Pad the above on the right with 0, to length Q
                             m                                Map the above, as d, using:
                                     ?d"|X|""   "               If d != 0, yield "|X|", else "   "
                                  *L3                           Multiply each char by 3
                                                                  Yields ['|||','XXX','|||'] or ['   ','   ','   ']
                              gL\-                              Use g to wrap each element in '-'
                            s                                 Flatten
                       g*5\|                                  Use g to add '|||||' to start and end of the above
                      C                                       Transpose
                     j                                        Join on newlines, implicit print

0

มา (gforth) , 622 ไบต์ (ย่อเล็กสุด (ลบความคิดเห็น, การเยื้อง, ชื่อคำ 1-char) ถึง 303 ไบต์)

การเล่นครั้งแรกของฉันกับ Forth :)

: bar 124 EMIT ;

: delimline ( width -- )
    bar
    3 * 0 DO 45 EMIT LOOP
    bar CR
;

: bookline ( width books -- )
    bar
    DUP 0 DO bar 88 EMIT bar LOOP
    2DUP = IF
        DROP DROP
    ELSE
        - 0 do 3 SPACES LOOP
    THEN
    bar CR
;

: shelf ( width books -- )
    DUP 0 = IF
        DROP DROP
    ELSE
        OVER delimline
        3 0 DO OVER OVER bookline LOOP
        DROP delimline
    THEN
;

: stack ( width books -- )
    CR
    OVER OVER OVER MOD shelf
    OVER /
    DUP 0 = IF
        DROP DROP
    ELSE 
        0 DO DUP DUP shelf LOOP
    THEN
;

6 2 stack
2 6 stack
3 5 stack
4 4 stack

ลองออนไลน์!

เอาท์พุต

| ------------------ |
|| X || X | |
|| X || X | |
|| X || X | |
| ------------------ |

| ------ |
|| X || X ||
|| X || X ||
|| X || X ||
| ------ |
| ------ |
|| X || X ||
|| X || X ||
|| X || X ||
| ------ |
| ------ |
|| X || X ||
|| X || X ||
|| X || X ||
| ------ |

| --------- |
|| X || X | |
|| X || X | |
|| X || X | |
| --------- |
| --------- |
|| || X X X || ||
|| || X X X || ||
|| || X X X || ||
| --------- |

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