ASCII Kitaplık


27

Temelde sadece istiflenebilen ahşap kutular olan istiflenebilir rafları biliyor musunuz ? Bazı ASCII sanatına sahip olanlardan bazı kitap rafları inşa etmeyi simüle edeceğiz.

Kitaplarımızın hepsi uygun bir şekilde aynı boyutta ve hepsi aşağıdakine benziyor:

|X|
|X|
|X|

Kitaplıklar, her zaman içeride üç karakter yüksekliğinde (bir kitabın dik durması için yeterli), |sol ve sağdaki -karakterlerden, üst ve alt için karakterlerden oluşan ve Xkitaplara sığacak kadar geniş ( Xbir girdidir ) olan ayrı kutulardır. tam sayı). Örneğin, işte boyutta bir kitaplık 3:

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

çünkü 3kitapları bu şekilde yerleştirebilirsiniz

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

Girdi, kesinlikle pozitif olan iki tamsayı olacak Xve sahip olduğumuz rafların genişliği (kitaplarla ölçülen) Ynerede Xve Yne kadar kitap biriktirmemiz gerekiyor. Tek bir rafa sığmayacak kadar çok kitabımız varsa, en üste daha fazla raf eklememiz gerekir. Örneğin, işte girdi 4 wide / 6 books:

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

Y % X > 0Kitapların sayısı, raf boyutunun tam sayı katı olmadığı anlamına gelirse , kalan kitaplar en üstteki en üst konuma ( 4 6yukarıdaki durumda olduğu gibi) devam etmeli ve bu rafın kalan kısmı doldurulmalıdır. alanlarda.

Giriş

  • Her biri uygun biçimde iki kesinlikle pozitif tam sayı >0.
  • Girişi ya sırayla alabilirsiniz (örneğin, önce rafların büyüklüğü, sonra kitap sayısı ya da tam tersi). Lütfen giriş sırasını gönderiminizde belirtiniz.
  • Hiçbir girişin dilinizin varsayılan [int]boyutundan (veya eşdeğeri) büyük olamayacağını güvenle kabul edebilirsiniz .

Çıktı

Elde edilen ASCII kitaplarının ve raflarının sanat gösterimi

kurallar

  • Lider ya da izleyen yeni satırlar ya da boşluklar, karakterlerin kendileri doğru bir şekilde hizalandığı sürece isteğe bağlıdır.
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine geri gönderebilirsiniz.
  • Mümkünse, lütfen başkalarının kodunuzu deneyebilmesi için çevrimiçi bir test ortamına bir bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Diğer örnekler

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

Kitapların en az olduğu rafın dibinde olmasını sağlayabilir miyim? Öyleyse yukarıdan aşağıya doldurduğu gibi
Altın Oran

1
@GoldenRatio Hayır, kitaplar alttan üste, soldan sağa doldurulmalıdır.
AdmBorkBork

Yanıtlar:


14

JavaScript (ES6), 100 99 98 bayt

Körili sözdiziminde wkitapların genişliğini ve sayısını alır .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

Biçimlendi ve yorumlandı

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

Test durumları


9

Bash (+ yardımcı programları), 130, 108, 106 bayt

Kitaplıklarınızı oluşturmak için tek, sürekli bir kabuk hattı.

Değişiklikler:

  • Optimize edilmiş ilk sed ifadesi biraz, -12 bayt (Thx @Riley!)
  • printf + seqHam printf, -10 bayt ile değiştirildi
  • İkinci sed ifadesini yeniden birleştirdi, -2 bayt

golfed

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

Çevrimiçi Deneyin!

Nasıl çalışır

$./shelf 2 3

printf %$2s\\n- oluşturmak N boşluk karakterleri, kitap başına bir (gösterildiği gibi _)

___

fold -$1 - raf boyuna göre katlayın

__
_

sed "s/ /|X|/g;"- değiştirin _ile Xkitap kapakları ekleyin

|X||X|
|X|

:;/.\{$[$1*3]\}/!s/$/ /;t- boşluklu sağ altlık (gösterildiği gibi _)

|X||X|
|X|___

h;s/./-/gp;x;p;p;p;x- her satırı üç kopyalayın ve ---önce ve sonra ekleyin .

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

sed 's/.*/|&|/'|tac- satırları | |kaydırın, tac ile ters çevirin

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

İlk adımda isimsiz bir etiket kullanabilirsiniz ve tbunun yerine bihtiyacınız olmaz {}. s/./-/gZaten -s olduklarından atlayabilirsiniz . Çevrimiçi Deneyin!
Riley,

@Riley Bu mükemmel bir tavsiye, teşekkür ederim!
zeplin

6

Python 2, 133 113 105 bayt

Eminim daha iyi bir yol vardır ...

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

Giriş alındı width, books

Gereksiz bir lambda işlevini farketmek için @ovs sayesinde -20 bayt!
Girişi kısaltmak için @ovs sayesinde -8 bayt.


X,Y=input()değerleri almak için daha kısa bir yoldur.
ovs

@ovs Oh bekle, ilk denemem için oraya koydum. Whoops. Güzel yakala, teşekkürler!
HyperNeutrino,

1
@ovs Teşekkürler, öyleyse giriş yapıldı X, Y, değil mi?
HyperNeutrino

2
'|'Değişken olarak tanımlayarak iki bayttan tasarruf edebileceğinizi düşünüyorum .
Ørjan Johansen

6

Toplu iş, 261 bayt

@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

Numaramı Batch cevabımdaki hilesini kullanarak çok sayıda karakteri kolayca basabilmek için tenis oynayalım| .


5

Haskell , 100 bayt

x#ywidth xve ybooks için dize döndürür .

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

Çevrimiçi deneyin!

Ana işlev / operatör #. Ne zaman x<yo içine kitap böler y-xve xardından recurses. Zaman x>=y, wve biki çizgi türleri, eksi dış olan |ler ve satır.

Yardımcı operatör , dizenin kopyalarını s?nbirleştirir .ns


5

PowerShell , 149 134 bayt

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

Çevrimiçi deneyin!

Giriş idth $wve $books alır. Dizeyi $syatay raflardan biri olacak şekilde ayarlar . O zaman iki ififademiz var.

İlki, "kalan" kitaplarımızın olup olmadığını kontrol eder. Eğer öyleyse, raf, (kitap sayısı artı boşluk sayısı) *3ve başka bir raf çıkar.

Daha sonra, kalanları ( $a) çıkardıktan sonra hala kitap kaldığını görüyoruz . Aynı tür kurulum, $wkitap sayısı kullanmamız dışında . Bu noktada, $bbir katının olması garantili olduğundan $w(kalanı çıkardığımız için $a), yuvarlama konusunda endişelenmemize gerek yoktur.

[math]::Floor()15 byte tasarruf edilerek arama kaldırıldı

Bu dizelerin tümü boru hattında bırakılır ve örtülü Write-Outputprogram tamamlanır.


4

CJam , 62 61 bayt

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

Girişi alır width books

Çevrimiçi deneyin!

açıklama

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 bayt

Hala üzerinde çalışıyor. b'kitap sayısı' içindir ve wraf genişliği içindir.

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'ye Hoşgeldiniz! R=b%wBir sonraki satıra taşınmazsa bu benim için işe yaramaz . Ayrıca, =bazı baytları kaydetmek için bu üçün etrafındaki boşlukları kaldırmanız gerekir.
Business Cat

PPCG'ye Hoşgeldiniz!
AdmBorkBork

Sen yerini alabilir d+3*p+d if R!=0 else ''ileR and d+3*p+d or''
shooqie

@shooqie Merak ediyorum, bu sonucu nasıl değerlendirebilir d+3*p+d?
Juan Meleiro

1
Tüm tanımları noktalı virgül kullanarak bir satıra yerleştirerek birkaç bayttan tasarruf edebilirsiniz.
L3viathan

3

AHK, 208 bayt

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%

Beni daha çok golf oynamaktan zorlayan şeyler var:

  • AutoHotkey yerleşik bir yineleme işlevine sahip değildir
  • Doğrudan değişkenlerde ( %1%& %2%) argümanlarını matematik işlevlerinde kullanamazsınız, çünkü bunlar değişken veya sayı girişi beklerler ve çıkmazın 1değişken ismi yerine bir numara olarak kabul edilirler .
  • Golf oynamakta pek iyi değilim

Yukarıdakilerin okunması kolay bir şeye benziyor:

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 Loopparantez kullanmıyorsa {}, yalnızca sonraki satır döngünün bir parçasıdır. Bir değişkenin değerini :=bunun yerine kullanarak ayarlıyorsanız =, yüzde işareti kaçış karakterlerini düşürebilirsiniz. Tilde n, yeni satır karakteridir.


3

Java 7, 230 224 222 bayt

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

Açıklama:

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

Test kodu:

Burada dene.

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

Çıktı:

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


@ OlivierGrégoire Bunu yaklaşık 1,5 yıl önce yayınladığımdan beri, oldukça ciddi şekilde golf oynayabileceğine şaşırmadım. ;)
Kevin Cruijssen

Ow ... Tarihi kontrol etmemiştim: Sadece bu sorunun aktif olduğunu ve Java için başka bir algoritmanın mümkün olduğunu gördüm. Benim kötü ...
Olivier Grégoire

@ OlivierGrégoire Sorun yok ve cevabınız iyi geçti. :) Hala test senaryolarını ekleyip cevabı çıktıyor ve Java 7'deki her şeyi yanıtlıyordum, çünkü henüz Java 8'i anlamadığım için neredeyse nostaljik hissettiriyor. XD
Kevin Cruijssen

2

PowerShell, 109 bayt

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

Daha az golf test testi senaryosu:

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

Çıktı:

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 bayt, alternatif

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 bayt

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

Çevrimiçi deneyin!

Son birkaç gündür buna gitmek demek istedim. Şimdi nihayet yapmak için zamanım olduğuna göre, zaten çok kısa bir Python cevabı var. Oh iyi, sadece alternatif olarak gönderildi.

Girdi genişlik olarak alınmış, kitaplar


1

SOGL , 64 bayt

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

Açıklama: İlk işlev:

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

ikinci işlev:

           →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|"]]

bu işlev yığın üzerinde bir sayı (kitap sayısı) bekler ve kitaplık defterlerini çıkarır

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

Daha aşağıya verilen örnek e = 3 (kitaplık genişliği) ve b = 8'dir (kitap miktarı)

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

bu kitap rafı üst / alt çizgisidir ve her zaman yığın ilk bölümünde kalır (yarı boş kitap rafı)

İlk ana bölüm

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

Ve son bölüm

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

Tuval , 33 bayt

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

Burada dene!

Açıklama (daha fazla tek aralıklı görünmesi için bazı karakterler değiştirildi):

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

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

Genişlik ve kitap sayımlarını sırasıyla komut satırı argümanları olarak alır. Çevrimiçi deneyin!

açıklama

Rafları yukarıdan aşağıya doğru tek tek yazdırmak için bir halka kullanıyoruz. Her yinelemede, b( ybu yinelemeye basılan kitapların sayısını ) çıkararak (yazdırılacak kitap sayısını) güncelleriz. Zaman b0, döngü çıkar ulaşır.

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)

Bu biraz karıştığı için, işte ilk yinelemenin bir örneği 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|   |"];"|---------|"]

hangi sonra yazdırır

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

0

Pyth , 56 bayt

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

Raf genişliğini kabul eder, kitap sayımı bu sırada ayrı argümanlar olarak gösterir. Online Deneyin burada ya bir kerede tüm test durumları doğrulamak burada .

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

İleri (gforth) , 622 bayt (simge durumuna küçültülmüş (yorumları kaldır, girintiler, 1 karakterlik sözcük isimleri) - 303 bayt)

Forth ile ilk oyunum :)

: 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

Çevrimiçi deneyin!

Çıktı

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