Gambar beberapa kotak ASCII

19

Ambil dua daftar bilangan bulat non-negatif, dan hasilkan kotak ASCII seperti yang didefinisikan di bawah ini.

  • Sudut dan persimpangan adalah nilai tambah: + (ASCII-code 43)
  • Garis vertikal adalah batang | (ASCII-code 124)
  • Garis horizontal adalah minus -(kode ASCII 45)

Daftar input pertama menentukan jumlah minus di antara setiap tanda plus, dalam arah horizontal.

Daftar input kedua menentukan jumlah bar antara setiap tanda plus, dalam arah vertikal.

Lebih mudah dijelaskan dengan beberapa contoh:

0    // No minuses between each + sign
0    // No bars between + signs

++
++

------------------
1 2   // First a single minus, then two minuses 
1 2   // First  one bar, then two bars

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


------------------
1 0 3 0 2 0
2 1 0 0

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

Klarifikasi:

  • Urutan dan format input adalah opsional
  • Hanya kotak yang harus dicetak / ditampilkan, tetapi ruang tambahan atau baris baru diterima.
  • Anda dapat menambahkan 1 untuk semua nilai input jika itu lebih nyaman. Contoh kedua maka akan menjadi: 2 3; 2 3.

Ini adalah kode golf, jadi kode terpendek dalam byte menang.

Stewie Griffin
sumber

Jawaban:

5

MATL , 25 22 21 byte

'|-+ '2:"1tiYsQ(]E!+)

Menggunakan input dengan 1tambahan (diizinkan oleh tantangan).

Cobalah online!

Penjelasan

Kode awalnya membangun array yang berisi 1indeks kolom karakter non-spasi di hasil akhir, dan 0sebaliknya. Jadi jika input pertama adalah [2 1 4 1 3 1](akan [1 0 3 0 2 0]dalam format berbasis 0) array ini akan menjadi

1 0 1 1 0 0 0 1 1 0 0 1 1

Perhatikan bagaimana panjang rentang nol terkait dengan input. Secara khusus, array ini dibuat sebagai berikut:

  1. Memulai array ke satu 1.
  2. Hitung jumlah kumulatif input dan tambahkan 1. Dalam contoh ini memberi [3 4 8 9 12 13].
  3. Perpanjang array dari langkah 1 dengan menetapkan 1entri dengan indeks (berbasis 1) yang diberikan oleh langkah 2. Entri perantara secara otomatis diatur ke 0.

Array serupa dibuat untuk baris. Input kedua [3 2 1 1](atau [2 1 0 0 ]) memberi

1 0 0 1 0 1 1 1

Sekarang array kedua dikalikan dengan 2, ditransposisikan dan ditambahkan dengan broadcast ke yang pertama. Ini memberikan array 2D

3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
1 0 1 1 0 0 0 1 1 0 0 1 1
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3
3 2 3 3 2 2 2 3 3 2 2 3 3

Pengindeksan ke dalam string '|-+ 'memberikan hasil akhir sebagai array char 2D. Karena pengindeksan adalah modular dan berbasis 1, indeks 0terkait dengan elemen terakhir (spasi).

'|-+ '                   % Push this string
      2:"       ]        % Do this twice
         1               % Push 1 (initial array)
          t              % Push another 1 (contents to be filled in)
           i             % Take input
            Ys           % Cumulative sum
              Q          % Add 1
               (         % Fill 1 into those entries of the array
                 E       % Multiply by 2
                  !      % Transpose
                   +     % Add, with broadcast
                    )    % Index (modular, 1-based) into the string
Luis Mendo
sumber
6

Python 2, 117 Bytes

def f(h,v):r="+"+"+".join("-"*i for i in h)+"+\n";print r+r.join(("|"+"|".join(" "*i for i in h)+"|\n")*i for i in v)+r

Cobalah di ideone.

Tidak berharap terlalu banyak dari ini. Sangat sederhana, hanya menggunakan gabungan python dan string perkalian untuk menyatukan semuanya.

SCB
sumber
6

JavaScript (ES6), 83 byte

(a,b,g=(a,[s,t])=>t+a.map(n=>s.repeat(n)+t).join``+`
`)=>g(b,[g(a,` |`),g(a,`-+`)])

Output mencakup dua baris baru.

Neil
sumber
Wow. Jadi jawaban yang mirip diposting hampir bersamaan. ;)
Arnauld
(Kamu mengalahkan saya dengan 2 menit dan 2 byte, meskipun.)
Arnauld
@Arnauld Anda membuang-buang waktu di demo Anda ;-)
Neil
Ya saya kira begitu. ^^ Menariknya, versi saya akan menjadi 81 byte dengan dua baris baru.
Arnauld
2

CJam, 50 Bytes

0lS/:i0++:H;lS/:i0+{H{'-*}%'+*N+o{H{S*}%'|*N+o}*}%

Cobalah online!

anOKsquirrel
sumber
1

Pyth, 45 byte

AQj.i*hlH]Js.i*hlG\+m*d\-G-mjb*d]XJ"+-""| "Hk

Program yang mengambil input dari dua daftar yang dipisah koma pada STDIN dan mencetak hasilnya.

Mungkin masih ada beberapa golf yang harus dilakukan di sini.

Cobalah online

Penjelasan datang nanti

TheBikingViking
sumber
1

Haskell, 55 byte

f[a,b]x=a:do n<-x;(b<$[1..n])++[a]
g x=f[f"+-"x,f"| "x]

Menentukan fungsi gyang mengambil dua daftar input dan mengembalikan daftar yang berisi garis-garis output

dianne
sumber
0

PowerShell v2 +, 89 byte

param($a,$b)($x="+$(($a|%{'-'*$_})-join'+')+")
$b|%{,"|$(($a|%{' '*$_})-join'|')|"*$_;$x}

Sial, jangan pikir saya bisa menangkap JavaScript.

Mengambil input $adan $bsebagai array eksplisit. Menyetel variabel $xmenjadi baris atas kotak berdasarkan perulangan $adan beberapa rangkaian string. Itu dirangkum dalam parens sehingga ditempatkan pada pipa. Kemudian, kita lewati $b, setiap iterasi menempatkan dua string pada pipeline - string gaya yang sama tetapi dengan spasi dan |bukannya tanda hubung dan +, dan $x. Semua string tersebut dikumpulkan dari pipeline dengan implisit Write-Outputpada penyelesaian program, dengan baris baru default di antara mereka.

Contohnya

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(0) @(0)
++
++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,0,3,0,2,0) @(2,1,0,0)
+-++---++--++
| ||   ||  ||
| ||   ||  ||
+-++---++--++
| ||   ||  ||
+-++---++--++
+-++---++--++
+-++---++--++

PS C:\Tools\Scripts\golfing> .\make-some-ascii-boxes.ps1 @(1,4,1) @(1,2,1)
+-+----+-+
| |    | |
+-+----+-+
| |    | |
| |    | |
+-+----+-+
| |    | |
+-+----+-+
AdmBorkBork
sumber
0

Ruby, 66 byte

->x,y{d=->c,m,z=x{c+z.map{|w|m*w}*c+c+$/}
d[d[?+,?-],d[?|,' '],y]}
m-chrzan
sumber
0

Jelly , 30 26 byte

Ḣị“+-“| ”ị@
1;+\Ṭ
Ç€,€/Ñ€Y

Uji di TryItOnline

Bagaimana?

Input yang diambil adalah daftar dari dua daftar,, [vertical, horizontal]dan menggunakan opsi yang bertambah
- jadi contoh 3 ambil [[3,2,1,1], [2,1,4,1,3,1]]
Masing-masing kemudian dikonversi ke array boolean yang mengindikasikan masing-masing rowType atau rowCharacterType, mis [[1,0,0,1,0,1,1,1], [1,0,1,1,0,0,0,1,1,0,0,1,1]]
. Kotak-kotak tersebut kemudian dibangun dengan membuat baris dari karakter yang diidentifikasi oleh kombinasi rowType dan rowCharacterType - yaitu rowType mengidentifikasi salah satu "+-"dan "| "dan rowCharacterType mengidentifikasi salah satu dari dua karakter tersebut.

Ḣị“+-“| ”ị@ - Link 1, create a row: [rowType, [rowCharaterTypes]]
Ḣ           - head - get the rowType
  “+-“| ”   - list of strings ["+-", "| "]
 ị          - index into (if rowType is 1 "+-"; if rowType is 0 "| ")
         ị@ - index into with reversed operands (index into that from rowCharaterTypes)
                (replace each 1 in rowCharaters with "+" or "|" and each 0 with "-" or " ")

1;+\Ṭ - Link 2, create the Type lists from the inputs: int[] nCharacters
1;    - 1 concatenated with the input
  +\  - reduce with addition (accumulation provides the indices)
    Ṭ - boolean array with 1s at those indices
            As an example take the vertical of example 3:
            [3,2,1,1] -> [1,3,2,1,1] -> [1,4,6,7,8] -> [1,0,0,1,0,1,1,1]
            each of which will be passed as a rowType for Link 1

Ç€,€/Ñ€Y - Main link, takes one argument: [Vertical, Horizontal] (incremented option)
Ç€       - call the last link (2) for each of the two lists in the input
  ,€/    - pair each and reduce (making a list of [rowtype [rowCharacterTypes]])
     р  - call the next link (1) for each
       Y - join on line feeds
Jonathan Allan
sumber