Susun balok

15

Diberikan input dari daftar blok untuk jatuh pada titik-titik tertentu, output ketinggian "menara."

Cara terbaik untuk menjelaskan tantangan ini adalah dengan contoh. Input akan berupa daftar bilangan bulat 2n yang mewakili n blok. Bilangan bulat pertama adalah posisi x blok, diindeks 0, dan yang kedua adalah seberapa lebar blok tersebut. Misalnya, input 2 4mewakili blok (dengan x koordinat berlabel di bawah):

  ####
0123456789

Sekarang, katakanlah inputnya 2 4 4 6. Yaitu, satu blok di x = 2 dengan lebar 4, dan satu di x = 4 dengan lebar 6:

    ######
  ####

Perhatikan bahwa a.) Blok selalu "jatuh" dari bagian paling atas menara dan b.) Blok tidak akan pernah "jatuh" (yaitu mereka akan selalu seimbang). Jadi, input 2 4 4 6 12 1mewakili:

    ######
  ####      #

Perhatikan bahwa blok terakhir telah jatuh sampai ke "tanah".

Hasil akhir Anda harus menjadi ketinggian maksimum menara pada setiap nilai x hingga yang terbesar. Oleh karena itu, input 2 4 4 6 12 1harus menghasilkan output 0011222222001:

    ######
  ####      #
0011222222001

Input dapat diberikan sebagai string whitespace- / dipisahkan koma, array bilangan bulat, atau argumen fungsi / perintah baris. Posisi blok (nilai x) akan selalu berupa bilangan bulat 0 atau lebih besar, lebarnya akan selalu bilangan bulat 1 atau lebih besar, dan akan selalu ada setidaknya satu blok.

Output dapat diberikan sebagai string tunggal yang dipisahkan oleh karakter non-numerik (mis. "0, 0, 1, ..."), String tunggal yang mencantumkan semua digit (mis. "001..." — Ketinggian maksimum dijamin 9 atau kurang), atau array bilangan bulat.

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji:

In                                   Out
---------------------------------------------------------
2 4 4 6 12 1                         0011222222001
0 5 9 1 6 4 2 5                      1133333222
0 5 9 1 2 5 6 4                      1122223333
0 5 2 5 6 4 9 1                      1122223334
20 1 20 1 20 1                       00000000000000000003
5 5                                  000011111
0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 4  123456789999
Gagang pintu
sumber
Bisakah kita mengambil input sebagai array 2-tupel?
lirtosiast
@ThomasKwa Tidak, input harus berupa array 1 dimensi.
Gagang Pintu

Jawaban:

2

CJam, 34 30 byte

Lq~2/{eeWf%e~_2$:).*:e>f*.e>}/

Input sebagai array gaya CJam, output sebagai serangkaian digit.

Jalankan semua test case.

Berikut adalah dua varian dari ide lain, tetapi saat ini lebih panjang 2 byte:

Lq~2/{_:\3$><0+:e>)aeez.*e_.e>}/
LQ~2/{_:\3$><0+:e>)aeez.+e~.e>}/
Martin Ender
sumber
6

Python 3, 89

def f(a):
 h=[]
 while a:x,w,*a=a;h[:x+w]=(h+[0]*x)[:x]+[max(h[x:x+w]+[0])+1]*w
 return h

Cobalah online .

Fungsi mengambil dan mengembalikan daftar bilangan bulat.

def f(a):                       # input as list of integers
  h=[]                          # list of heights
  while a:                      # while there's input left
    x,w,*a=a;                   # pop first 2 integers as x and w

    h[:x+w]=                    # change the heights between 0 and x+w
      (h+[0]*x)[:x]+            # left of x -> unchanged but padded with zeros
      [max(h[x:x+w]+[0])+1]*w   # between x and x+w -> set to the previous max + 1

  return h                      # return the list of heights
grc
sumber
2

Rubi, 88 87 byte

f=->i{o=[]
(s,l,*i=i
r=s...s+l
o[r]=[([*o[r]]+[0]).max+1]*l
o.map! &:to_i)while i[0]
o}

Cobalah online.

Terinspirasi oleh jawaban grc, tetapi dalam bahasa yang berbeda dan hanya sedikit lebih pendek.

Penjelasan:

f=->i                        # lambda with parameter i, expects array of ints
{
    o=[]                     # output
    (
        s,l,*i=i             # pop start and length
        r = s...s+l          # range is used twice, so shorten it to 1 char
        o[r] =
            [(
                    [*o[r]]  # o[r] returns nil if out of bounds, so splat it into another array
                    +[0]     # max doesn't like an empty array, so give it at least a 0
            ).max+1]*l       # repeat max+1 to fill length
        o.map! &:to_i        # replace nil values with 0
    ) while i[0]             # i[0] returns nil when i is empty, which is falsy
    o                        # return o
}
Icy Defiance
sumber
1

APL, 79 byte

{⊃{o←(z←(≢⍵)⌈a←+/⍺)↑⍵⋄e←(z↑(-a)↑⍺[1]⍴1)⋄o+0⌈o-⍨e×e⌈.+e×o}/⌽(⊂⍬),↓(⌽2,0.5×≢⍵)⍴⍵}

Input sebagai APL Array, output sebagai array digit APL.

lstefano
sumber
{⊃{o←⍵↑⍨z←(≢⍵)⌈a←+/⍺⋄e←z↑(-a)↑⍺[1]⍴1⋄o+0⌈o-⍨e×e⌈.+e×o}/⌽(⊂⍬),↓⍵⍴⍨⌽2,.5×≢⍵}(Ya Tuhan, belajarlah untuk menggunakan yang benar)
Zacharý
Tolong, berhati-hatilah dengan kata-kata Anda ... Anda sepertinya tidak tahu perbedaan antara dan 1↑dan karena ini Anda memberikan saran yang menyebabkan program yang diperbarui untuk memberikan hasil yang salah tetapi saya tidak menggurui Anda.
lstefano
Ya, saya kadang - kadang seperti itu ketika saya melihat banyak hal yang bisa golf. Tapi golf lain tetap harus diterapkan.
Zacharý
Mereka semua melakukannya. Dan saya telah mengintegrasikan saran Anda, semoga dengan kredit yang tepat.
lstefano
- - Apakah kamu? - -0.5
Zacharý
0

Jawa 1.8, 351 329 byte

Tidak senang dengan upaya pertama ini - saya yakin perulangan ganda, dan semua Integer.valueOf ini dapat di-golf lagi.

interface B{static void main(String[]x){Byte b=1;int i=0,s,c,m=0,h,a=x.length,t[];for(;i<a;){s=b.valueOf(x[i++]);c=b.valueOf(x[i++]);m=m>s+c?m:s+c;}t=new int[m];for(i=0;i<a;){h=0;s=b.valueOf(x[i++]);c=b.valueOf(x[i++]);for(m=s;m<s+c;m++)if(t[m]>=h)h=t[m]+1;for(m=s;m<s+c;)t[m++]=h;}for(i=0;i<t.length;)System.out.print(t[i++]);}}

Tidak disatukan

interface B {
static void main(String[]x){
    int start, count, maxWidth=0, height, args=x.length, totals[];
    Byte b=1;
    for (int i=0; i<args;){
        start = b.valueOf(x[i++]);
        count = b.valueOf(x[i++]);
        maxWidth = maxWidth>start+count ? maxWidth : start+count; 
    }
    totals=new int[maxWidth];
    for (int i=0; i<args;){
        height=0;
        start = b.valueOf(x[i++]);
        count = b.valueOf(x[i++]);
        for (int j = start; j<start+count; j++) {
            if (totals[j]>=height) {
                height=totals[j]+1;
            }
        }
        for (int j = start; j<start+count; j++) {
            totals[j] = height;
        }
    }
    for (int i=0;i<totals.length; i++){
        System.out.print(totals[i]);
    }
}
}
Denham Coote
sumber