İstifleme blokları


15

Belirli noktalara düşecek blokların bir listesi verildiğinde, ortaya çıkan "kulenin" yüksekliğini çıktılayın.

Bu zorluğu açıklamanın en iyi yolu örnek olarak verilebilir. Giriş, n bloğunu temsil eden 2n tamsayıların bir listesi olacaktır . İlk tamsayı bloğun x konumu, 0 dizinli ve ikincisi bloğun ne kadar geniş olduğudur. Örneğin, bir girişi bloğu temsil eder (x koordinatları aşağıda etiketlenmiştir):2 4

  ####
0123456789

Şimdi, girdinin diyelim 2 4 4 6. Yani, x = 2'de 4 genişliğinde bir blok ve x = 4'te 6 genişliğinde bir blok:

    ######
  ####

A.) Blokların her zaman kulenin en üstünden “düştüğünü” ve b.) Blokların asla “devrilmeyeceğini” (yani her zaman dengeleyeceklerini) unutmayın. Yani, bir girdi 2 4 4 6 12 1şunları temsil eder:

    ######
  ####      #

Son bloğun "yere" düştüğünü unutmayın.

Son çıktınız, her bir x değerinde en büyük değere kadar kulenin maksimum yüksekliği olmalıdır. Bu nedenle, girdi 2 4 4 6 12 1çıktı ile sonuçlanmalıdır 0011222222001:

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

Girdi, boşluk / virgülle ayrılmış dize, bir tamsayı dizisi veya işlev / komut satırı bağımsız değişkenleri olarak verilebilir. Blok konumları (x değerleri) her zaman 0 veya daha büyük tamsayılar olacak, genişlik her zaman 1 veya daha büyük bir tamsayı olacak ve her zaman en az bir blok olacaktır.

Çıktı, sayısal olmayan karakterler (ör. "0, 0, 1, ...") İle ayrılmış tek bir dize , tüm basamakları listeleyen tek bir dize (ör. "001..."—Yüksek yüksekliğin 9 veya daha az olması garanti edilir) veya bir tamsayı dizisi olarak verilebilir.

Bu , bayt cinsinden en kısa kod kazanacaktır.

Test senaryoları:

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

Girdiyi 2-tuples dizisi olarak alabilir miyiz?
lirtosiast

@ThomasKwa Hayır, giriş 1 boyutlu bir dizi olmalıdır.
Kapı tokmağı

Yanıtlar:


2

CJam, 34 30 bayt

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

CJam tarzı bir dizi olarak giriş yapın, bir rakam dizesi olarak çıktı alın.

Tüm test senaryolarını çalıştırın.

İşte başka bir fikrin iki çeşidi, ancak şu anda 2 bayt daha uzun:

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

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

Çevrimiçi deneyin .

İşlev bir tamsayı listesi alır ve döndürür.

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

2

Yakut, 88 87 bayt

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}

Çevrimiçi deneyin.

Grc'nin cevabından ilham aldı, ancak farklı bir dilde ve biraz daha kısa.

Açıklama:

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
}

1

APL, 79 bayt

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

APL Dizisi olarak girin, APL basamak dizisi olarak çıkış yapın.


{⊃{o←⍵↑⍨z←(≢⍵)⌈a←+/⍺⋄e←z↑(-a)↑⍺[1]⍴1⋄o+0⌈o-⍨e×e⌈.+e×o}/⌽(⊂⍬),↓⍵⍴⍨⌽2,.5×≢⍵}(Tanrım, doğru kullanmayı öğren )
Zacharý

, Sözlerinle dikkatli olun ... Farkı bilmek görünmüyor arasında ve 1↑çünkü güncellenen programın yanlış sonuç vermek ama seni tenezzül etmeyin çünkü o önerilerinin bunun yüzünden.
lstefano

Evet, onu böyle ben golfed edilmesi mümkün şeylerin ardına sıralanmış bazen zaman. Ancak yine de diğer golfler geçerli olmalıdır.
Zacharý

Hepsi öyle. Ve önerilerinizi umarım uygun kredilerle birleştirdim.
lstefano

- - Öyle mi? - -0.5
Zacharý

0

Java 1.8, 351 329 bayt

Bu ilk deneme ile heyecan değil - çift döngü eminim ve tüm bu Integer.valueOf's biraz daha golf olabilir.

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

Ungolfed

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