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

가장 적은 양의 책이있는 선반이 맨 아래에 놓 이도록 만들 수 있습니까? 위에서 아래로 채우는 것처럼
Golden Ratio

1
@GoldenRatio 아니요, 책은 왼쪽에서 오른쪽으로 아래에서 위로 채워야합니다.
AdmBorkBork

답변:


14

자바 스크립트 (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

배쉬 (+ 유틸리티) 130, 108, 106 바이트

책장을 렌더링하기위한 단일의 연속 쉘 파이프 라인

변경 로그:

  • 첫 번째 sed 식을 약간 -12 바이트로 최적화했습니다 (Thx @Riley!).
  • printf + seq원시 printf-10 바이트 로 대체
  • 두 번째 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-책당 하나씩 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-각 줄을 3 번 반복 ---하여 앞뒤에 추가 하십시오.

------
|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그들은 이미 있기 때문에 건너 뛸 수 있습니다 -. 온라인으로 사용해보십시오!
Riley

@ Riley 그것은 훌륭한 조언입니다, 감사합니다!
zeppelin

6

파이썬 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

불필요한 람다 함수를 인식 한 @ovs 덕분에 -20 바이트!
입력을 줄인 @ovs 덕분에 -8 바이트


X,Y=input()to 값을 얻는 더 짧은 방법입니다.
ovs

@ovs 아 잠깐, 나는 첫 번째 시도를 위해 거기에 넣어. 으악. 좋은 캐치, 감사합니다!
HyperNeutrino

1
@ovs 감사합니다. 그러면 입력이으로 간주됩니다 X, Y.
HyperNeutrino

2
'|'변수 로 정의 하여 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

Batch 답변에서 내 트릭을 사용 하여 많은 문자 를 쉽게 인쇄하기 위해 테니스합시다| .


5

하스켈 , 100 바이트

x#y너비 xy책 의 문자열을 반환합니다 .

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, 다음 재귀. 때 x>=y, w그리고 b두 개의 선 유형을 뺀 외부있는 |의와 줄 바꿈은.

도우미 연산자 는 문자열 복사본을 s?n연결 n합니다 s.


5

PowerShell , 149134 바이트

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

파이썬 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다음 줄로 이동 하지 않으면 작동하지 않습니다 . 또한 3 =바이트 주위의 공백을 제거하여 바이트를 절약 할 수 있어야 합니다.
비즈니스 고양이

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%

더 이상 골프를 치는 데 몇 가지 불편한 점이 있습니다.

  • 오토 핫키에는 내장 반복 기능이 없습니다
  • 변수 나 숫자 입력을 기대하고 이스케이프 처리되지 않은 변수를 변수 이름이 아닌 숫자 1로 가정하기 때문에 수학 함수에서 전달 된 인수 ( %1%& %2%)를 직접 사용할 수 없습니다.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가 대괄호를 사용하지 않으면 {}다음 행만 루프의 일부입니다. :=대신에를 사용하여 변수 값을 설정 =하면 퍼센트 기호 이스케이프 문자를 삭제할 수 있습니다. 틸드 n은 개행 문자입니다.


3

자바 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
어떻게되는지 모르겠지만, 람다.repeat 처럼 보이고 실제로이 도전에 도움이 됩니다.
Olivier Grégoire

@ OlivierGrégoire 약 1.5 년 전에이 글을 올린 것을 고려할 때 상당히 골프를 치는 것은 놀랍지 않습니다. ;)
Kevin Cruijssen

오우 ... 나는 날짜를 확인하지 않았다 : 나는이 질문이 활성화되었고 Java에 대한 다른 모든 알고리즘이 가능하다는 것을 보았습니다. 나의 나쁜 ...
Olivier Grégoire

@ OlivierGrégoire 문제 없습니다. 대답은 잘하셨습니다. :) 나는 여전히 테스트 케이스를 추가하고 답변에 출력했을 때이 답변을 되돌아보고 향수를 느끼고 Java 8을 아직 이해하지 못했기 때문에 Java 7의 모든 것에 응답했습니다. 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}

덜 골프 테스트 스크립트 :

$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

파이썬 (2) , 120 (118) 바이트

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

온라인으로 사용해보십시오!

지난 며칠 동안 이것에 가야한다는 의미였습니다. 이제 마침내 할 시간이되었으므로 이미 더 짧은 Python 답변이 있습니다. 잘, 대안으로 게시했습니다.

너비, 책으로 입력


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

캔버스 , 33 바이트

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

여기 사용해보십시오!

설명 (일부 문자가 더 모노 스페이스로 바뀌 었습니다) :

|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

-n , 45 바이트

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

너비와 책 수를 각각 명령 줄 인수로 사용합니다. 온라인으로 사용해보십시오!

설명

선반을 위에서 아래로 하나씩 인쇄하기 위해 루프를 실행합니다. 반복 할 때마다 (그 반복에 인쇄 된 책 수 b)를 빼서 업데이트 할 책 수를 업데이트 합니다 y. 때 b0, 루프가 종료에 도달합니다.

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

포스 (포스) , 622 바이트 (최소화 (설명, 들여 쓰기, 1 자 단어 이름 제거)를 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.