web-dev-qa-db-ja.com

スカイラインの問題‍

私は VAのオンラインジャッジ でこの小さな問題に遭遇し、小さなコードゴルフの良い候補かもしれないと思いました。

問題:

あなたは、都市の建物の位置を考慮して、建築家が都市のスカイラインを描くのを支援するプログラムを設計します。問題を扱いやすくするために、すべての建物は長方形の形状であり、それらは共通の底を共有しています(それらが組み込まれている都市は非常に平坦です)。都市はまた、二次元として見られています。建物は、順序付けされたトリプル(Li、Hi、Ri)によって指定されます。ここで、LiおよびRi はそれぞれ建物iの左と右の座標であり、Hiは建物の高さです。

alt text

下の図では、建物が左側にトリプルで示されています

(1,11,5), (2,6,7), (3,13,9), (12,7,16), (14,3,25), (19,18,22), (23,13,29), (24,4,28) 

右側に示すスカイラインは、次のシーケンスで表されます。

1, 11, 3, 13, 9, 0, 12, 7, 16, 3, 19, 18, 22, 3, 23, 13, 29, 0 

上記の例に示すように、出力はスカイラインを説明するベクトルで構成される必要があります。スカイラインベクトル(v1、v2、v3、... vn)では、viiが偶数になるような水平線(高さ)を表します。 viiが奇数になると、垂直線(x座標)を表します。スカイラインベクトルは、たとえば、最小のx座標から始まり、スカイラインを定義するすべてのライン上を水平および垂直に移動するバグによってとられた「パス」を表す必要があります。したがって、スカイラインベクトルの最後のエントリは0になります。座標は空白スペースで区切る必要があります。

提供された(テスト)建物の宣言をカウントせず、すべてのスペースとタブ文字を含める場合、Pythonでの私の解決策は223文字です。

ここに要約版があります:

B=[[1,11,5],[2,6,7],[3,13,9],[12,7,16],[14,3,25],[19,18,22],[23,13,29],[24,4,28]]

# Solution.

R=range
v=[0 for e in R(max([y[2] for y in B])+1)]
for b in B:
   for x in R(b[0], b[2]):
      if b[1]>v[x]:
         v[x]=b[1]
p=1
k=0
for x in R(len(v)):
   V=v[x]
   if p and V==0:
      continue
   Elif V!=k:
      p=0
      print "%s %s" % (str(x), str(V)),
   k=V

私は間違いはなかったと思いますが、もしそうなら、遠慮なく私を批判してください。

私はあまり評判がよくないので、賞金に100を払うだけです-誰かがこれを80文字未満で解決しようとするとしたら、私は興味があります。 cobbalによって投稿されたソリューションは 101文字の長さ であり、現在、これが最良のソリューションです。

私は、80文字はこの種の問題の病的限界だと思いました。 cobbal、彼の46文字のソリューションは私を完全に驚かせました-認めざるを得ませんが、彼が書いたことを部分的に理解する前に、彼の説明を読むのに少し時間を費やしたことを認めます。

51
zeroDivisible

私は学習を始めたばかりです [〜#〜] j [〜#〜] なので、ここがゴルフの最初の試みです:

103 62 49
46文字

   b =: 8 3 $ 1 11 5 2 6 7 3 13 9 12 7 16 14 3 25 19 18 22 23 13 29 24 4 28
   ,(,.{&s)I.s~:_1|.s=:0,~>./(1&{*{.<:[:i.{:)"1 b
1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0

言語をよく知っている人ならこれをかなり短縮できると思いますが

コードの説明:

 NB。 建物の右境界までの番号をリストします
([:i。{:) 14 3 25 
 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 
 NB。 建物の左境界と比較し、高さを乗算します
(1&{* {。<:[:i。{:) 14 3 25 
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 
 NB。 bの各行に適用し、短いエントリに0が埋め込まれることに注意してください
(1&{* {。<:[:i。 {:) "1 b 
 0 11 11 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 0 0 6 6 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 ... 
 NB。折りたたむ最大値を見つけ、後で回転するために最後に0を追加し、s
に割り当てます] s =:0、〜> ./(1&{* {。<:[: i。{:) "1 b 
 0 11 11 13 13 13 13 13 13 0 0 0 7 7 7 7 3 3 3 18 18 18 3 13 13 13 13 13 13 0 
 NB。 sを右に1回転し、sと比較して、高さが変化する場所を見つけます
 s〜:_1 |。 s 
 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 
 NB。 すべての違いのインデックスを見つける
 I. s〜:_1 |。 s 
 1 3 9 12 16 19 22 23 29 
 NB。 各インデックスと建物の高さをペアにします
(、。{&s)I. s〜:_1 |。 s 
 1 11 
 3 13 
 9 0 
 ... 
 NB。 そして最後にリストをフラット化します
、(、。{&s)I. s〜:_1 |。 s 
 1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0 
25
cobbal

Python、89文字、同じくTriptichの5001チートを使用:

_B=[[1,11,5],[2,6,7],[3,13,9],[12,7,16],[14,3,25],[19,18,22],[23,13,29],[24,4,28]]

x=o=0
while x<5001:
 n=max([H for L,H,R in B if L<=x<R]+[0])
 if n-o:print x,n,
 o=n;x+=1
_

_5001_をmax(map(max,B))+1に置き換えて、(ほぼ)任意の大都市を許可すると、102文字が残ります。

改訂履歴:

  • john Pirieのコメントに記載されているように2文字を節約
  • mahlerFiveが提案したように1つの文字を保存
17
balpha

Python:115文字

OPと同様に、データの宣言は含めていませんが、空白を数えています。

_D = [(1,11,5), (2,6,7), (3,13,9), (12,7,16), 
 (14,3,25), (19,18,22), (23,13,29), (24,4,28)]

P=[max([0]+[h for s,h,e in D if s<=x<e])for x in range(5001)]
for i,x in enumerate(P[1:]):
   if x!=P[i]:print i+1,x,
_

OPが提供するリンクを問題の正確な定義として使用していることに注意してください。たとえば、5000を超える建物の座標はなく、すべての座標は正の整数であると想定して、少し騙します。私の意見では、元の投稿は、これが楽しいものになるほど強く制約されていません。

編集:リストの構築をforループの印刷に折りたたむヒントについてJohn Pirieに感謝します。どうしてそれが恋しいの?!

編集exactの使用を決定した後、range(1+max(Zip(*D)[2]))range(5001)に変更しました元の問題で与えられた定義。最初のバージョンは、任意の正の整数の構築を処理します(すべてがメモリに収まると仮定)。

編集:物事を複雑にしすぎていることに気づきました。私の改訂を確認してください。

ところで、私はこれを行うためのはるかにエレガントで、おそらくより短い方法があるという予感があります。誰かが私を倒した!

10
Triptych

176バイトのWinXP .COM実行可能ファイル:

vQoAgMYQjsKO2jPAM/+ 5AIDzq7QLzSE8/751AXQDvoQB6DkAi/noNACL2egvACn5A/87HXYCiR2D xwLi9eviM8mZ9/VSQQvAdfeI + rQCzSG3LFqAwjC0As0h4vbD/9Y8CnP6D7bI/9Y8CnPwtACR9 + UD yOvxtAvNITz/dRO0CM0hLDDDtAHNITwadfW + kAHDM/Yzと/ 7cgrTn4dA + L + I1E/tHo6Jr/i8folf8L 9nXozSA =

Base64エンコード、私 このサイトを使用してエンコードしました 。 .comファイルにデコードします。プログラムは、EOF(コンソールから読み取る場合はCtrl-Z)までstdinを読み取り、その結果をstdoutに出力します。

編集:ソースコード:

    mov bp,10
    add dh,10h
    mov es,dx
    mov ds,dx
    xor ax,ax
    xor di,di
    mov cx,8000h
    rep stosw
    mov ah,0bh
    int 21h
    cmp al,255
    mov si,offset l9
    je l1
    mov si,offset l11
l1:
    call l7
    mov di,cx
    call l7
    mov bx,cx
    call l7
    sub cx,di
    add di,di
l2:
    cmp bx,[di]
    jbe l3
    mov [di],bx
l3:
    add di,2
    loop l2
    jmp l1
l4:
    xor cx,cx
l5:
    cwd
    div bp
    Push dx
    inc cx
    or ax,ax
    jnz l5
    mov dl,bh
    mov ah,2
    int 21h
    mov bh,44
l6:
    pop dx
    add dl,48
    mov ah,2
    int 21h
    loop l6
    ret
l7:
    call si
    cmp al,10
    jae l7
    db 0fh, 0b6h, 0c8h
l8:
    call si
    cmp al,10
    jae ret
    mov ah,0
    xchg cx,ax
    mul bp
    add cx,ax
    jmp l8
l9:
    mov ah,0bh
    int 21h
    cmp al,255
    jne l12
    mov ah,8
    int 21h
l10:
    sub al,48
    ret
l11:
    mov ah,1
    int 21h
    cmp al,26
    jne l10
    mov si,offset l12
    ret
l12:
    xor si,si
    xor di,di
    mov bh,32
l13:
    lodsw
    cmp ax,di
    je l14
    mov di,ax
    lea ax,[si-2]
    shr ax,1
    call l4
    mov ax,di
    call l4
l14:
    or si,si
    jne l13
    int 20h

いつものように、A86を使用してコンパイルしました。

9
Skizz

2 C#の回答-wayが長すぎますが、もっとよく見たいですか?

LINQアプローチ(配列行を除く135文字):

var a=new[]{new[]{1,11,5},new[]{2,6,7},new[]{3,13,9},new[]{12,7,16},new[]{14,3,25},new[]{19,18,22},new[]{23,13,29},new[]{24,4,28}};    
int l=0,y,x=-1;while(++x<5001){var b=a.Where(c=>c[0]<=x&&c[2]>x);if((y=b.Any()?b.Max(c=>c[1]):0)!=l)Console.Write(x+", "+(l=y)+", ");}

または、LINQ以外の回答(179 185 配列行を除く文字):

var a={1,11,5,2,6,7,3,13,9,12,7,16,13,3,25,19,18,22,23,13,29,24,4,28};
var b=new int[5000];int i=-1,j,z;while(++i<a.Length)for(j=a[i*3];j<a[i*3+2];j++)if((z=a[i*3+1])>b[j])b[j]=z;i=-1;z=0;while(++i<5000)if(b[i]!=z)Console.Write(i+", "+(z=b[i])+", ");
5
Marc Gravell

133文字のPython、メモリと時間効率、データ入力の制限なし

_D = [(1,11,5), (2,6,7), (3,13,9), (12,7,16), (14,3,25), (19,18,22), (23,13,29), (24,4,28)]

l,T=0,Zip(*D)
for x,h in map(lambda x:(x,max([y for a,y,b in D if a<=x<b]or[0])),sorted(T[0]+T[2])):
    if h!=l: print x,h,
    l=h
_

説明:

_lambda x:(x,max([y for a,y,b in D if a<=x<b]or[0])
_

位置xの位置と高さを返します。

sorted(Zip(*D)[0]+Zip(*D)[2])によってコンパイルされたソートされた座標リストをループし、高さが変化した場合に出力します。

2番目のバージョンは、上記のものほど効率的ではなく、座標制限がありますが、115文字のみを使用します。

_for x in range(100):
    E=[max([y for a,y,b in D if a<=(x-i)<b]+[0])for i in(0,1)]
    if E[0]-E[1]:print x,E[0],
_
5

[〜#〜] j [〜#〜] の98文字、暗黙的に定義(変数名なし!):

,@(([:(1:,{:"1)}.~:}:)#])@((],[:>./(1&{@[*(]>:{.@[)*]<{:@[)"1)"2 0(([:<./{."1)}.[:i.@>:[:>./{:"1))

実行中:

 $ jconsole 
 s =:、@(([:( 1:、{: "1)}。〜:}:)#])@((]、[​​:> ./ (1&{@ [*(]>:{。@ [)*] <{:@ [) "1)" 2 0(([:<./ {。 "1)}。[:i。@>: [:> ./ {: "1))
 |:b =:8 3 $ 1 11 5 2 6 7 3 13 9 12 7 16 14 3 25 19 18 22 23 13 29 24 4 28 
 1 2 3 12 14 19 23 24 
 11 6 13 7 3 18 13 4 
 5 7 9 16 25 22 29 28 
 sb 
 1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0 

左端の座標が常に1であることを前提とした86文字のみ。

,@(([:(1:,{:"1)}.~:}:)#])@((],[:>./(1&{@[*(]>:{.@[)*]<{:@[)"1)"2 0([:>:[:i.[:>./{:"1))

右端の座標が最大で99であるという追加の仮定を使用して、76のみ。

,@(([:(1:,{:"1)}.~:}:)#])@((],[:>./(1&{@[*(]>:{.@[)*]<{:@[)"1)"2 0&(>:i.99))

Cobbalからいくつかのトリックを借りて、68にすることができます。

[:,@({:"1#>:@i.@#,.{."1)[:1&|.[:(,.(~:_1&|.))[:>./(1&{*{.<:[:i.{:)"1

ただし、暗黙の定義は、冗長性を排除するためのs=:…の使用と競合することはできません。


[〜#〜] j [〜#〜]で質問に答えるときはいつでも、何が起こっているのかを説明するために時間をかけようとしています。他人が外国語の仕組みを調べて楽しむかもしれないと思います。

 NB。ベクトルの最初、2番目、最後の要素
({。0 {b)、(1 {0 {b)、({:0 {b)
 1 11 5 
 NB。 0から(ベクトルの最後の要素)-1 
まで数えます。 {:0 {b 
 0 1 2 3 4 
 NB。ブール値:ベクトルの最初の要素以下(上)?
({。<:[:i。{:) 0 {b 
 0 1 1 1 1 
 NB。ベクトルの2番目の要素を乗算します
(1&{* {。<:[:i。{:) 0 {b 
 0 11 11 11 11 
 NB。各ベクトルの結果を積み上げ、次に列ごとに最大値を求めます
> ./(1&{* {。<:[:i。{:) "1 b 
 0 11 11 13 13 13 13 13 13 0 0 0 7 7 7 7 3 3 3 18 18 18 3 13 13 13 13 13 13 
 NB。リーダーを特定してテーブルを作成する
 |:(、。(〜:_1&| 。))> ./(1&{* {。<:[:i。{:) "1 b 
 0 11 11 13 13 13 13 13 13 0 0 0 7 7 7 7 3 3 3 18 18 18 3 13 13 13 13 13 13 
 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 
 NB。左に回転
 |:1 |。 (、。(〜:_1&|。))> ./(1&{* {。<:[:i。{:) "1 b 
 11 11 13 13 13 13 13 13 0 0 0 7 7 7 7 3 3 3 18 18 18 3 13 13 13 13 13 13 0 
 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 
 NB。1ベースのインデックスと最初の要素、最後の要素が真の場合
 |:({: "1#>:@ i。@#、。{。" 1)1&|。 (、。(〜:_1&|。))> ./(1&{* {。<:[:i。{:) "1 b 
 1 3 9 12 16 19 22 23 29 
 11 13 0 7 3 18 3 13 0 
 NB。 Flatten 
、({: "1#>:@ i。@#,. {。" 1)1&|。(、。(〜:_1&|。))> ./(1&{* {。 <:[:i。{:) "1 b 
 1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0 
 NB。暗黙の動詞の並べ替え
([:、@({: "1#>:@ i。@#,. {。" 1)[:1&|。[:(、。(〜:_1&|。))[:> ./( 1&{* {。<:[:i。{:) "1)b 
 1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0 
5
ephemient

入力を想定:

b=[(1,11,5),(2,6,7),(3,13,9),(12,7,16),(14,3,25),(19,18,22),(23,13,29),(24,4,28)]

Haskell:105文字

h x=maximum$0:[y|(l,y,r)<-b,l<=x,x<r]
main=putStr$unwords[show x++" "++show(h x)|x<-[1..9999],h x/=h(x-1)]

文字列の書式設定は、HaskellがPythonソリューションに遅れをとっているところです。「main =」を記述するために追加の5文字を​​使用しなければならないのも役に立ちませんが、おそらく含めるべきではありません。 C#/ Javaソリューションは、もし彼らのコードが完全なプログラムを実証しなければならないなら、巨大になるでしょう:)

Haskell:76文字(文字列フォーマットなし&メインなし)

h x=maximum$0:[y|(l,y,r)<-b,l<=x,x<r]
print[(x,h x)|x<-[1..9999],h x/=h(x-1)]

元の問題 を振り返ると、ファイルから入力を読み取る必要があるため、追加される文字の数を確認することは興味深いと思いました。

Haskell:149文字(完全なソリューション)

main=interact f
f i=unwords[show x++" "++show(h x)|x<-[1..9999],h x/=h(x-1)] where
 h x=maximum$0:[y|[l,y,r]<-b,l<=x,x<r]
 b=map(map read.words)$lines i

以下は、可能な場合、よりわかりやすい変数名と型シグネチャを使用した完全なソリューションの外観です。

main :: IO ()
main = interact skyline

skyline :: String -> String
skyline input =

  unwords [show x ++ " " ++ show (heightAt x) |
           x <- [1..9999], heightAt x /= heightAt (x-1)]

  where heightAt :: Int -> Int
        heightAt x = maximum $ 0 : [h | [l,h,r] <- buildings, l <= x, x < r]

        buildings :: [[Int]]
        buildings = map (map read . words) $ lines input
3
Jacob Stanley

コードは圧縮されており(コードに数行)、トーナメントに適しており(時間は最も少ないリソースです)、正しいようです(Pythonはわかりませんが、コードは理解していると思います)。

あなたの解決策は基本的にバッファーで都市のスカイラインをペイントしてから、バッファーのコンテンツを必要な形式で出力します。

問題から除外した追加情報は、最大で5000の建物があり、水平位置が10.000未満になることです。これは、あなたのケースではメモリは問題に見えないことを意味します(32ビットアーキテクチャを想定したスカイラインでは40 kb、建物の説明では45 kb-オプションで、読み取りループでスカイラインをペイントできます)。アルゴリズムは建物の数に対して線形であるため、高速です。

より厳しいメモリ制約を使用すると、ワンパスアルゴリズムを使用できますが、この場合、パフォーマンスが低下し、実装がはるかに複雑になると思います(時間の増加、CPU時間の増加)。

ここで、所定の形式で入力を実際に読み取り、事前に格納されたデータ配列の代わりにそのデータを計算に使用することを検討する必要があります。

ところで、pythonは現在ACMコンテストで有効な言語ですか?

これがPerlの簡単なものです

(簡単に言うと、2時間未満です)

わずか327文字のPerl

( " #/"を除いて強調表示を改善します)

use 5.010;
$/=undef;
@s=map{[split',',$_]}grep{$_}split/\)\s*(?:$|,\s*\()|^\s*\(/,<>; #/
for$s(@s){($l,$y,$r)=@$s;
for$x($l..$r){$c=$p[$x];$p[$x]=$c>$y?$c:$y;}}
for($x=1;$x<=@p;$x++){$y=$p[$x]||0;
if(!defined$z){$l=$x;$z=$y;
}elsif($y!=$z){Push@n,[$l,$z,$x-1];$z=$y;$l=$x;}}
Push@n,[$l,$z];
say join', ',map{($_->[0],$_->[1])}@n;

元のテストバージョン853文字

#! /usr/bin/env Perl
use strict;
use warnings;
use 5.010;
use YAML;
use List::Util 'max';


my $file;
{
  local $/ = undef;
  $file = <>;
}

my @sections = map { [split ',', $_] } grep {$_} split m'
  \)\s* (?:$|,\s*\() |
  ^ \s* \(
'x, $file;

#my $max_x = max map{ $_->[2] } @sections;
#say $max_x;

my @points;
for my $reg( @sections ){
  my($l,$y,$r) = @$reg;
  for my $x ( $l .. $r ){
    my $c = $points[$x] || 0;
    $points[$x] = max $c, $y;
  }
}


my @new;
my($l,$last_y);
for( my $x=1; $x <= @points; $x++ ){
  my $y = $points[$x] || 0;

  # start
  if( ! defined $last_y ){
    $l = $x;
    $last_y = $y;
    next;
  }

  if( $y != $last_y ){
    Push @new, [$l,$last_y,$x-1];
    $last_y = $y;
    $l = $x;
    next;
  }
}
Push @new, [$l,$last_y];


say Dump \@sections, \@points, \@new;

say join ', ', map { ($_->[0],$_->[1]) } @new;

初期縮小バージョン621文字

( " #/"を除いて強調表示を改善します)

#! /usr/bin/env Perl
use strict;
use warnings;
use YAML;
use 5.010;

$/=undef;

my@s=map{[split',',$_]}grep{$_}split/\)\s*(?:$|,\s*\()|^\s*\(/,<>; #/

my@p;
{
  no strict; no warnings 'uninitialized';

  for$s(@s){
    ($l,$y,$r)=@$s;
    for$x($l..$r){
      $c=$p[$x];
      $p[$x]=$c>$y?$c:$y;
    }
  }
}

# $last_y => $z
my @n;
{
  no strict;

  #my($l,$z);
  for($x=1;$x<=@p;$x++){
    $y=$p[$x]||0;
    if(!defined$z){
      $l=$x;
      $z=$y;
    }elsif($y!=$z){
      Push@n,[$l,$z,$x-1];
      $z=$y;
      $l=$x;
    }
  }
  Push@n,[$l,$z];
}

say Dump \@s, \@p, \@n;

say join', ',map{($_->[0],$_->[1])}@n;

[〜#〜] yaml [〜#〜] を使用して、適切なデータを取得していること、および異なるバージョンが同じように機能することを確認しました。

3
Brad Gilbert

これがPerlでの私の試みです。 137人のキャラクターのうち、33人がスカイラインの終わりを見つけることに専念しています。

@a = ([1,11,5],[2,6,7],[3,13,9],[12,7,16],[14,3,25],[19,18,22],[23,13,29],[24,4,28]);
($x)=sort{$b<=>$a}map{$$_[2]}@a;
for(;$c<=$x;$c++){$n=0;map{$n=$$_[1]if$c>=$$_[0]&&$c<$$_[2]&&$n<$$_[1]}@a;print"$c $n "if$n!=$h;$h=$n;}
2
Eric

挑戦は別として

結果セットは正しいですか?位置22では最高点は18で、23では13なので、3は最高点ではありません。

私はまた、phpバージョンを作成しようとしました、そしてそれは私に異なる最終的なベクトルを与えます。速度は最適化されていません。

<?php
$buildings = array(
    array(1,11,5), 
    array(2,6,7), 
    array(3,13,9), 
    array(12,7,16), 
    array(14,3,25), 
    array(19,18,22), 
    array(23,13,29), 
    array(24,4,28)
);

$preSkyline = array();
for( $i = 0; $i<= 30; $i++){
    foreach( $buildings as $k => $building){
        if( $i >= $building[0] && $i<= $building[2]){
            $preSkyline[$i][$k] = $building[1];
        } else{
            $preSkyline[$i][$k] = 0;
        }
    }
}
foreach( $preSkyline as $s =>$a){
    $skyline[$s] = max( $a );
}
$finalSkyline = array();
foreach( $skyline as $k => $v){
    if( $v !== $skyline[ $k-1]){
        $finalSkyline[$k] =  $v;
    }
}
echo "<pre>";
print_r( $finalSkyline );
?>

これは次を返します:

Array
(
    [0] => 11
    [2] => 13
    [9] => 0
    [11] => 7
    [16] => 3
    [18] => 18
    [22] => 13
    [29] => 0
)

変曲点と最大高さです。

2
Elzo Valugi

ルビー、80文字

B=[[1,11,5],[2,6,7],[3,13,9],[12,7,16],[14,3,25],[19,18,22],[23,13,29],[24,4,28]]
o=0;1.upto(5001){|x|y=(B.map{|b|x>=b[0]&&x<b[2]&&b[1]||0}.max);o!=(o=y)&&p(x,y)}
2
user700186

UVAルールを再読すると、最大Xは5000に制限されず、5000 buildingsに制限されます。 XとYの値は、9999(およびそれを含む)まで許可されます。

また、明らかにC、C++、C#、およびJavaは公式に認識されている言語なので、Javaでマイニングしました。数字はスペースで区切られているだけですが、コンマを(合計2文字のコスト)合計153文字(配列行を除く):

int[][]b=new int[][]{{1,11,5},{2,6,7},{3,13,9},{12,7,16},{14,3,25},{19,18,22},{23,13,29},{24,4,28}};
int[]y=new int[10000];int i;for(int[]o:b)for(i=o[0];i<o[2];y[i]=Math.max(y[i++],o[1]));for(i=0;i<9999;)if(y[i++]!=y[i])System.out.print(i+" "+y[i]+" ");

ロジックはかなり単純です。フローを少し不安定にする唯一のことは、変数の再利用とポストインクリメントの非標準の配置です。生成:

1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0 
2
Matt Poush

C

int main(int arc, char **argv) {
  int B[][3]={{1,11,5},{2,6,7},{3,13,9},{12,7,16},{14,3,25},{19,18,22},{23,13,29},{24,4,28}},o=0,y=0,x=0,blen=8,bs=0,b;
  for (;x<9001;x++,o=y,y=0) {
    for (b=bs;b<blen;b++) {
      if (x >= B[b][0] && x < B[b][2] && B[b][1] > y) y=B[b][1];
      if (x > B[b][2]) bs = b;
    }
    if (y-o) printf("%d %d ", x, y);
  }
}
2
user700186

これは古い投稿ですが、gnuオクターブの実装を137文字で共有したいと思いました。

function[p]=sl(b)s=zeros(max(b)(:,2),max(b(:,3)));for i=b's(1:i(2),i(1):i(3)-1)=1;end;t=sum(s);u=find(shift(t,1)~=t);p=[u;t(u)](:)';end;

トリプルの任意のサイズの行列をbとして渡します

1
Curtis
#include <stdio.h>
#define MAX_B   5000
static unsigned max_y[MAX_B];
main() {
    signed i, j;
    int max_x = 0, last_new = 0, curr_ht = 0;

    for (;!feof(stdin);) {
        int l, h, r;
        fscanf(stdin, "%d %d %d\n", &l, &h, &r);
        if (r > max_x)
            max_x = r;
        for (i = l; i <= r; i++)
            if (max_y[i] < h)
                max_y[i] = h;
    }
    max_x += 2;
    for (i = 0; i < max_x; i++) {
        j = max_y[i] - last_new;
        curr_ht += j;
        last_new = max_y[i];
        if (j > 0)
            printf("%d %d ", i, curr_ht);
        if (j < 0)
            printf("%d %d ", i - 1, curr_ht);
    }
    printf("\n");
}

本当に簡単なCソリューション... 540文字。

1
user827475