Układanie bloków

15

Biorąc pod uwagę listę bloków do upuszczenia w określonych punktach, wypisz wysokość wynikowej „wieży”.

Najlepszym sposobem wyjaśnienia tego wyzwania jest podanie przykładu. Wejście będzie listą liczb całkowitych 2n reprezentujących n bloków. Pierwsza liczba całkowita to pozycja x bloku, indeksowana 0, a druga to szerokość bloku. Na przykład dane wejściowe 2 4reprezentują blok (ze współrzędnymi x oznaczonymi poniżej):

  ####
0123456789

Powiedzmy, że dane wejściowe są 2 4 4 6. Oznacza to, że jeden blok przy x = 2 o szerokości 4, a jeden przy x = 4 o szerokości 6:

    ######
  ####

Zauważ, że a.) Bloki zawsze „spadają” z samego szczytu wieży, a b.) Bloki nigdy nie „przewracają się” (tzn. Zawsze się równoważą). Zatem wejście 2 4 4 6 12 1reprezentuje:

    ######
  ####      #

Zauważ, że ostatni blok spadł aż do „ziemi”.

Ostatecznym wynikiem powinna być maksymalna wysokość wieży przy każdej wartości x, aż do największej. Dlatego dane wejściowe 2 4 4 6 12 1powinny dawać wynik 0011222222001:

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

Dane wejściowe mogą być podawane jako ciąg oddzielony spacjami / przecinkami, tablica liczb całkowitych lub argumenty funkcji / wiersza poleceń. Pozycje bloku (wartości x) zawsze będą liczbami całkowitymi 0 lub większymi, szerokość zawsze będzie liczbą całkowitą 1 lub większą, i zawsze będzie co najmniej jeden blok.

Dane wyjściowe można podać jako pojedynczy ciąg oddzielony znakami nienumerycznymi (np. "0, 0, 1, ..."), Pojedynczy ciąg zawierający wszystkie cyfry (np. "001..." - maksymalna wysokość to 9 lub mniej) lub tablicy liczb całkowitych.

Ponieważ jest to , wygra najkrótszy kod w bajtach.

Przypadki testowe:

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
Klamka
źródło
Czy możemy brać dane wejściowe jako tablicę 2-krotek?
lirtosiast
@ThomasKwa Nie, dane wejściowe muszą być jednowymiarową tablicą.
Klamka

Odpowiedzi:

2

CJam, 34 30 bajtów

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

Dane wejściowe jako tablica w stylu CJam, dane wyjściowe jako ciąg cyfr.

Uruchom wszystkie przypadki testowe.

Oto dwa warianty innego pomysłu, ale obecnie jest on o 2 bajty dłuższy:

Lq~2/{_:\3$><0+:e>)aeez.*e_.e>}/
LQ~2/{_:\3$><0+:e>)aeez.+e~.e>}/
Martin Ender
źródło
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

Wypróbuj online .

Funkcja pobiera i zwraca listę liczb całkowitych.

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
źródło
2

Rubin, 88 87 bajtów

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}

Wypróbuj online.

Zainspirowany odpowiedzią grc, ale w innym języku i tylko nieco krótszy.

Wyjaśnienie:

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
źródło
1

APL, 79 bajtów

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

Dane wejściowe jako tablica APL, dane wyjściowe jako tablica cyfr APL.

lstefano
źródło
{⊃{o←⍵↑⍨z←(≢⍵)⌈a←+/⍺⋄e←z↑(-a)↑⍺[1]⍴1⋄o+0⌈o-⍨e×e⌈.+e×o}/⌽(⊂⍬),↓⍵⍴⍨⌽2,.5×≢⍵}(Mój
Boże
Proszę, bądź ostrożny ze swoimi słowami ... Wydaje się, że nie znasz różnicy między i 1↑dlatego dajesz sugestie, które powodują, że zaktualizowany program daje zły wynik, ale nie patronuję ci.
lstefano,
Tak, mam tak czasem, gdy widzę kilka rzeczy, który może być grałem. Ale pozostałe pola powinny nadal obowiązywać.
Zacharý
Wszyscy tak robią. Mam nadzieję, że zintegrowałem twoje sugestie z odpowiednimi kredytami.
Istefano
- - Czy ty? - -0.5
Zacharý
0

Java 1.8, 351 329 bajtów

Nie jestem podekscytowany tą pierwszą próbą - jestem pewien, że podwójna pętla i wszystkie te liczby całkowite.valueOf mogą być jeszcze bardziej zagrane w golfa.

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

Nie golfił

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
źródło