ASCII Kutusu oluşturma


11

Görev

Göreviniz, giriş tarafından belirtilen konumlara ASCII kutuları çıkaran bir program yazmaktır.

Giriş

Size bir numara listesi verilecektir. Burada biçim istediğiniz herhangi deliminator kullanabilmesi de, biraz esnektir (örneğin 1,2,3,4, 1 2 3 4, [1,2,3,4]). Liste 4'lü gruplar halindedir ve xywhher kutunun içini belirtir . Her kutunun genişliği ve yüksekliği en az 2. olacaktır xve widthsoldan sağa olacaktır. yve heightyukarıdan aşağıya doğru.

Çıktı

Oluşturma, sağdan sola, önce sağdaki kutu ve bundan sonraki her kutu üzerinde olduğu düşünülebilir. Sondaki boşluklara ve bir sondaki yeni satıra izin verilir.

Çakışan kutular nasıl kullanılır?

Girişin solundaki kutu üst kutudır ve hiçbir şey üst üste gelmez. Bundan sonraki her kutu, yalnızca bir kutuda bulunmayan boşlukta işlenir ve zaten oluşturulmuş bir kutunun kenarlığının yerini almaz.

stil

Kutuların stili, +köşeler -için kullanılan, yatay çizgiler |için kullanılan ve dikey çizgiler için kullanılan oldukça standarttır .

Örnekler:

( >>>girişi gösterir)

>>>0 0 11 4 7 2 8 4 3 5 8 3
+---------+
|         |
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 3 11 4 7 5 8 4 3 8 8 3 4 0 13 5
    +-----------+
    |           |
    |           |
+---------+     |
|         |-----+
|         |---+
+---------+   |
       |      |
   +---+------+
   |      |
   +------+


>>>0 0 2 2
++
++


>>>2 2 5 3 1 1 7 5 0 0 9 7
+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

>>>0 0 3 3 2 0 3 3
+-+-+
| | |
+-+-+

Bu ortadan 4 0 13 5ziyade değil 0 4 13 5mi?
Neil

İlk 2 durumda alttan 2. dikdörtgenin x = 7 değeri vardır (x = 0 dikdörtgenlerle tutarlı olmak için)
Level River St

1
Fark ettiğiniz için teşekkürler, sorularım için nadiren cevap yazıyorum ve bu yüzden tüm bunlar elle ...
J Atkin

@JAtkin Üzgünüm, bunu özledim.
Conor O'Brien

İyi, ben de okurken sık sık bir şeyleri özlüyorum;)
J Atkin

Yanıtlar:


4

APL, 116 bayt

{⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵}

Bu, bir dizi diziyi alan ve bir karakter matrisi döndüren bir işlevdir.

Testler:

      t1← (0 0 11 4)(8 2 8 4)(3 5 8 3)
      t2← (0 3 11 4)(8 5 8 4)(3 8 8 3)(4 0 13 5)
      t3← (⊂0 0 2 2)
      t4← (2 2 5 3)(1 1 7 5)(0 0 9 7)
      {⎕IO←0⋄K←' '⍴⍨⌽+⌿2 2⍴⌈⌿↑⍵⋄K⊣{x y W H←⍵-⌊.5×⍳4⋄K[Y←y+⍳H;X←x+⍳W]←' '⋄K[Y;A←x+0 W]←'|'⋄K[B←y+0 H;X]←'-'⋄K[B;A]←'+'}¨⌽⍵} ¨ t1 t2 t3 t4
┌───────────────────┬─────────────────────┬────┬───────────┐
│+---------+        │    +-----------+    │++  │+-------+  │
│|         |        │    |           |    │++  │|+-----+|  │
│|         |----+   │    |           |    │    │||+---+||  │
│+---------+    |   │+---------+     |    │    │|||   |||  │
│        |      |   │|         |-----+    │    │||+---+||  │
│   +----+------+   │|         |----+     │    │|+-----+|  │
│   |      |        │+---------+    |     │    │+-------+  │
│   +------+        │        |      |     │    │           │
│                   │   +----+------+     │    │           │
│                   │   |      |          │    │           │
│                   │   +------+          │    │           │
│                   │                     │    │           │
│                   │                     │    │           │
└───────────────────┴─────────────────────┴────┴───────────┘

Açıklama:

  • ⎕IO←0: dizin kaynağını olarak ayarlayın 0.
  • Doğru boyutta bir matris oluşturun:
    • ⌈⌿↑⍵: x, y, w ve h için en büyük değerleri bulma
    • +⌿2 2⍴: x + w ve y + h
    • K←' '⍴⍨⌽: x + w * y + h boşluklarından oluşan bir matris oluşturun ve saklayın K.
  • Kutuları içine çizin:
    • {... }¨⌽⍵: kutuların her biri için, ters sırayla,
      • x y W H←⍵-⌊.5×⍳4: Koordinatları tayin x, y, Wve H, her iki 1 çıkarma Wve H. (koordinatlar özeldir, APL dizi aralıkları dahildir.)
      • K[Y←y+⍳H;X←x+⍳W]←' ': geçerli kutuyu boşluklarla doldur
      • K[Y;A←x+0 W]←'|': dikey kenarları çiz
      • K[B←y+0 H;X]←'-': yatay kenarları çiz
      • K[B;A]←'+': kenarları '+' olarak ayarlayın
    • K⊣: daha sonra geri dönün K.

1
APL, bir yabancıya çok tuhaf bir dil ...
J Atkin

3

ES6, 228 223 217 208 201 198 bayt

Bir dizi koordinat dizisini kabul eder ve bir dize döndürür.

a=>a.reverse().map(([x,y,w,h])=>[...Array(y+h)].map((_,i)=>(s=r[i]||'',r[i]=i<y?s:(s+' '.repeat(x)).slice(0,x)+(c=>c[0]+c[1].repeat(w-2)+c[0])(y-i&&y+h-1-i?'| ':'+-')+s.slice(x+w))),r=[])&&r.join`\n`

Burada \nyeni satır karakteri temsil edilir.

Düzenleme: Koşullarımı tersine çevirerek 5 bayt kaydetti. Bir dizi karakter dizisinden bir dizi diziye geçerek 6 bayt daha kaydetti. Geçici bir değişken ekleyerek 9 bayt daha kaydetti. Bir yardımcı fonksiyon ekleyerek 7 bayt daha kaydetti. Önceki bir tasarrufu geri alarak 3 bayt daha kaydetti!


3

Yakut, 153 143

->n{a=(0..m=3*n.max).map{$b=' '*m}
(*n,x,y,w,h=n 
v=w-2
h.times{|i|a[y+i][x,w]=i%~-h<1??++?-*v+?+:?|+' '*v+?|}
)while n[0]
a.delete($b);puts a}

Test programında yönlendirilmemiş

f=->n{                                #worst case width when x=w=large number, is max input*2+1
  a=(1..m=3*n.max).map{$b=' '*m}      #find m=max value in input, make an a array of 3*m strings of 3*m spaces 
  (
    *n,x,y,w,h=n                      #extract x,y,w,h from the end of n, save the rest back to n     
    v=w-2                             #internal space in rectangle is w-2  
    h.times{|i|                       #for each row
      a[y+i][x,w]=                    #substitute the relevant characters of the relevant lines of a 
      i%~-h<1?                        #i%~-h = i%(h-1). This is zero (<1) for first and last lines of the rectangle
      ?+ + ?-*v + ?+ :?| + ' '*v +?|  # +--...--+ or |  ...  | as required
    }
  )while n[0]                         #loop until data exhausted (n[0] becomes falsy as it does not exist)
a.delete($b);puts a}                  #delete blank rows ($b is a global variable) and display

3

SmileBASIC, 128 125 bayt

DEF B A
WHILE LEN(A)H=POP(A)W=POP(A)-2Y=POP(A)X=POP(A)FOR I=0TO H-1LOCATE X,Y+I?"+|"[M];"- "[M]*W;"+|"[M]M=I<H-2NEXT
WEND
END

Ekran görüntüleri (kırpılmış)

ekran görüntüsü ekran görüntüsü ekran görüntüsü ekran görüntüsü ekran görüntüsü

açıklama

DEF B A 'make a function and add 12 bytes :(
 WHILE LEN(A) 'repeat until array is empty
  H=POP(A):W=POP(A)-2 'get width/height
  Y=POP(A):X=POP(A) 'get x/y
  FOR I=0 TO H-1 'draw one row at a time
   LOCATE X,Y+I 'position the cursor
   PRINT "+|"[M]; 'draw left edge
   PRINT "- "[M]*W; 'draw middle
   PRINT "+|"[M] 'draw right edge
   M=I<H-2
  NEXT
 WEND
END

Mkutunun ilk / son satırında ( 0= +--+, 1= | |) olup olmadığını saklar . Döngüden ilk geçişte M0, diğerlerine kadar sonda 1'dir.


Bu çok güzel :)
J Atkin


1

Pyth, 162 145 bayt

J\+K*h.MZm+@d1@d3Q]*h.MZm+@d0@d2QdD:GHb XKHX@KHGb;V_QDlTR@NTVl3Vl2:+l0b+l1H?|qHtl3qH0\-?|qbtl2qb0\|d)):l0l1J:+l0tl2l1J:l0+l1tl3J:+l0tl2+l1tl3J;jK

Burada deneyebilirsin

Test takımının çıktısı:

+---------+     
|         |     
|         |----+
+---------+    |
        |      |
   +----+-+----+
   |      |     
   +------+     

++
++

+-------+
|+-----+|
||+---+||
|||   |||
||+---+||
|+-----+|
+-------+

+-+-+
| | |
+-+-+

Korkunç çözüm! Sadece birisinin onu dövmesini bekliyorum


2
İlk örneğiniz, kutuların bir kenarı paylaştığı yere fazladan + koyar.
Linus
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.