붓으로 스카이 라인을 덮고


43

음수가 아닌 정수 스카이 라인 높이 목록이 주어지면이를 덮기 위해 중단없이 1 단위 높이의 수평 브러시 스트로크가 몇 번 필요한지 대답하십시오.

[1,3,2,1,2,1,5,3,3,4,2]다음과 같이 시각화됩니다.

      5    
      5  4 
 3    5334 
 32 2 53342
13212153342

9 개의 브러시 스트로크가 필요합니다.

      1    
      2  3 
 4    5555 
 66 7 88888
99999999999

[1,3,2,1,2,1,5,3,3,4,2]9

[5,8]8

[1,1,1,1]1

[]0

[0,0]0

[2]2

[2,0,2]4

[10,9,8,9]11


관심이 높은 대표 사용자 : 바탕으로 .
Adám

2
모든 브러시 스트로크가 수평입니까?
tsh

1
@tsh 좋은 지적. 추가되었습니다.
Adám

코드 골프는 아니지만 1 년 전의 인터뷰 코드 테스트에 대해이 질문이있었습니다.
luizfzs

답변:


35

자바 스크립트 (Node.js) , 38 바이트

a=>a.map(v=>(n+=v>p&&v-p,p=v),p=n=0)|n

온라인으로 사용해보십시오!

왼쪽에서 오른쪽으로 스캔하는 욕심 많은 알고리즘으로, 필요한 경우에만 선을 그리고 가능한 한 길게 그립니다.

감사합니다 Arnauld, 2 3 바이트 절약


@Arnauld 좋은 캐치. 완전히 잊어 버렸습니다.
tsh

이것을 어떻게 깨달았습니까?
Adám

@ Adám Nothing magic. 처음으로 질문을 읽으면 모든 줄이 가로로만 표시 될 때까지 검색 방법에 혼란 스러웠습니다. 그리고이 공식은 자연스럽게 내 마음에 떠 올랐습니다 ....
tsh

4
마술 은 그 과정을 설명하기에 적합한 단어처럼 보입니다.
Adám

1
이것이 현재 널리 사용되는 알고리즘의 기원이지만 여기에 설명되어 있습니다 .
Adám

28

05AB1E ,  8 7  5 바이트

@Adnan 덕분에 2 바이트 절약

0š¥þO

온라인으로 사용해보십시오!

어떻게?

이것은 @tsh 가 처음 찾은 알고리즘을 사용하고 있습니다. 이 답변이 마음에 드시면 그들의 답변찬성 하십시오 !

스카이 스크래퍼가 이전 스카이 스크래퍼보다 낮거나 높을 때마다 간단히 브러시 스트로크를 확장하여 '무료'로 페인트 할 수 있습니다.

예를 들어, 아래 그림에서 고층 빌딩 와 를 그리는 데는 비용이 들지 않습니다.BC

반면에 스카이 스크래퍼 를 페인트하려면 2 개의 새로운 브러시 스트로크가 필요합니다 .E

건물

첫 번째 초고층 빌딩의 경우 바닥에있는만큼 많은 브러시 스트로크가 필요합니다.

이것을 수학으로 바꾸기 :

S=h0+i=1nmax(hihi1,0)

목록 앞에 을 붙이면 다음과 같이 단순화 할 수 있습니다.0

S=i=1nmax(hihi1,0)

댓글

0š¥þO     # expects a list of non-negative integers  e.g. [10, 9, 8, 9]
0š        # prepend 0 to the list                    -->  [0, 10, 9, 8, 9]
  ¥       # compute deltas                           -->  [10, -1, -1, 1]
   þ      # keep only values made of decimal digits
          # (i.e. without a minus sign)              -->  ["10", "1"]
    O     # sum                                      -->  11

나는 0š¥ʒd}O당신에게 바이트를 절약 생각 합니다.
Mr. Xcoder

@ Don'tbeax-tripledot 나는 당신의 의견을 보았을 때 정확히 그 답을 편집하고있었습니다.)
Arnauld

4
아름다운 설명.
Adám

1
교체 ʒd}로하는 것은 þ당신에게 2 바이트를 저장해야합니다.
Adnan

@Adnan 아, 좋아. 감사!
Arnauld

7

파이썬 3 , 37 바이트

lambda a:sum(a)-sum(map(min,a[1:],a))

온라인으로 사용해보십시오!

Sarien 덕분에 Python 3으로 전환하여 -5 바이트


파이썬 2 , 47 43 42 바이트

lambda a:sum(a)-sum(map(min,a[1:],a[:-1]))

온라인으로 사용해보십시오!

Alt :

lambda a:sum(a)-sum(map(min,zip(a[1:],a)))

온라인으로 사용해보십시오!


파이썬 3에서는 [: -1]을 버리고 5 바이트를 절약 할 수 있습니다.
Sarien

@Sarien 감사합니다 : D, 나는지도 몰랐다 파이썬 2와 3에서 다른
TFeld



5

K (oK) , 12 7 바이트

ngn 덕분에 -5 바이트!

Arnauld의 05AB1E 솔루션 (및 tsh의 JavaScript 솔루션) 의 k (oK) 포트 :

+/0|-':

온라인으로 사용해보십시오!

J , 15 바이트

Arnauld의 05AB1E 솔루션 (및 tsh의 JavaScript 솔루션)의 AJ 포트 :

1#.0>./2-~/\0,]

온라인으로 사용해보십시오!

나의 순진한 해결책 :

J , 27 바이트

1#.2(1 0-:])\0,@|:@,~1$~"0]

온라인으로 사용해보십시오!


2
oK : 각 선행 ( ':)은 목록 앞에 암시 적 ID 요소 ( 0for -)를 사용하므로 0,불필요합니다. 구성을 생략 할 수 있습니다 { x}.+/0|-':
ngn

@ngn 감사합니다! 분명히 나는 ​​이것을 잊었다 :Some primitive verbs result in a different special-cased initial value: +, *, - and & are provided with 0, 1, 0 or the first element of the sequence, respectively
Galen Ivanov

5

하스켈 , 34 32 바이트

Lynn이 트리밍 한 2 바이트

g x=sum$max 0<$>zipWith(-)x(0:x)

온라인으로 사용해보십시오!

그래서 우리는 시작 zipWith(-)합니다. 여기에는 두 개의 목록이 필요하며 쌍별 차이의 새 목록이 생성됩니다. 우리는 그와 결합 x하고 (0:x). (0:)는리스트의 앞에 0을 추가하는 함수이며,이를 결합하여리스트의 zipWith(-)연속 요소들 사이에 0이있는 차이를 얻을 수 있습니다. 그런 다음 모든 음수를 0으로 바꿉니다 (max 0<$>). 그러면 각 요소가 각 타워에서 시작해야하는 새 획 수인 새 목록이 작성됩니다. 합계를 얻으려면 다음과 합하면됩니다 sum.


2
g x=sum$max 0<$>zipWith(-)x(0:x)32 바이트입니다 :)
Lynn

그대로sum.zipWith((max 0.).(-))<*>(0:)
Lynn

@Lynn 두 번째 것 .보다 우선 순위가 높으므로 추가 괄호가 필요합니다 <*>.
밀 마법사

3

Japt , 8 바이트

@Shaggy에서 -2 바이트

mîT Õ¸¸è

설명

mîT Õ¸¸è      Full program. Implicit input U
                e.g. U = [2,0,2]
mîT             Map each item X and repeat T(0) X times
                     U = ["00","","00"]
    Õ           Transpose rows with columns
                     U = ["0 0","0 0"]
     ¸¸         Join using space and then split in space
                     U = ["0","0","0","0"]
        è       Return the count of the truthy values

온라인으로 사용해보십시오!


8 바이트 :mîT Õ¸¸è
얽히고 설킨

1
의 좋은 사용 A.y()방법으로의 패딩.
얽히고 설킨



3

Japt , 7 6 바이트

änT fq

시도 해봐

Oliver 덕분에 1 바이트가 절약되었습니다.

änT xwT    :Implicit input of integer array
än         :Consecutive differences / Deltas
  T        :  After first prepending 0
    f      :Filter elements by
     q     :  Square root (The square root of a negative being NaN)
           :Implicitly reduce by addition and output


좋은 사람, @Oliver; 그렇게 생각하지 않았을 것입니다.
얽히고 설킨


2

레티 나 0.8.2 , 21 바이트

\d+
$*
(1+)(?=,\1)

1

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

\d+
$*

단항으로 변환합니다.

(1+)(?=,\1)

새 획이 필요하지 않은 다음 타워와 겹치는 부분을 모두 삭제하십시오.

1

나머지 스트로크를 계산하십시오.


2

공통 리스프, 88 87 바이트

(lambda(s)(let((o 0))(dolist(c s)(incf o(max 0 c))(mapl(lambda(y)(decf(car y)c))s))o))

축소되지 않은

(lambda (skyline)
  (let ((output 0))
    (dolist (current-skyscraper-height skyline)
      (incf output (max 0 current-skyscraper-height))
      (mapl (lambda (skyscraper)
              (decf (car skyscraper) current-skyscraper-height))
            skyline))
    output)))

그것을 테스트

하나의 타워에 페인트를 칠할 때는 높이와 동일한 브러시 스트로크가 필요합니다. 이 브러쉬 스트로크는 다음 모든 것을 번역하며, 여기에서 다른 모든 타워에서 현재 타워의 높이를 빼서 표시합니다 (그 자체는 중요하지 않습니다). 다음 타워가 더 짧으면 음수로 푸시되고,이 음수는 다음 타워에서 차감됩니다 (이전 타워에서 다음 타워로 변환 할 수없는 브러시 스트로크를 나타냄). 실제로 이전 타워 높이를 포함하여 모든 타워 높이 에서 숫자를 뺍니다. 그러나 이전 타워를 다시 보지 않기 때문에 이것은 중요하지 않습니다.


PPCG에 오신 것을 환영합니다. 쉽게 확인할 수 있도록 온라인 테스트 환경에 대한 링크를 제공 할 수 있습니까?
Jonathan Frech

네 그럼요. rextester.com/TKBU14782 답변이 곧 업데이트 될 예정입니다
Charlim

잘 했어. 훌륭하고 실력있는 첫 게시물에 +1 즐거운 골프 되세요.
Jonathan Frech

1

05AB1E , 13 10 바이트

Z>Lε@γPO}O

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Z            # Get the maximum of the (implicit) input-list
 >           # Increase it by 1 (if the list only contains 0s)
  L          # Create a list in the range [1, max]
   ε         # Map each value to:
    @        #  Check if this value is >= for each value in the (implicit) input
     γ       #  Split into chunks of adjacent equal digits
      P      #  Take the product of each inner list
       O     #  Take the sum
        }O   # And after the map: take the sum (which is output implicitly)

1

플래그 /u:System.Math가 47 바이트 인 C # (Visual C # Interactive Compiler)

n=>n.Select((a,i)=>i<1?a:Max(a-n[i-1],0)).Sum()

온라인으로 사용해보십시오!

플래그가있는 이전 버전, /u:System.Math63 바이트

n=>n.Aggregate((0,0),(a,b)=>(a.Item1+Max(0,b-a.Item2),b)).Item1

이 솔루션이 첫 번째 솔루션보다 더 우아하다고 생각합니다. 시작 값으로 2 값 튜플을 사용하여 배열을 통과하여 값을 선택하고 튜플의 두 번째 부분에 값을 저장합니다.

온라인으로 사용해보십시오!


1

Pyth, 8 바이트

s>#0.++0

@tsh의 놀라운 답변의 또 다른 포트 . 입력의 델타 (. +) s양수 값 ( >#0)의 합 ( )을 0 앞에 붙입니다 ( +0Q, 후행 Q 유추).

여기 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인 하십시오 .

문자열 결합 방법, 10 바이트

이것은 다른 답변을 탐색하기 전에 쓴 솔루션이었습니다.

lcj.t+d*LN

테스트 스위트.

lcj.t+d*LNQ   Implicit: Q=eval(input()), b=<newline>, N=<quote mark>
              Trailing Q inferred
        L Q   Map each element of Q...
       * N    ... to N repeated that many times
     +b       Prepend a newline
   .t         Transpose, padding with spaces
  j           Join on newlines
 c            Split on whitespace
l             Take the length, implicit print

1

클로저, 50 바이트

#((reduce(fn[[s n]i][(+(max(- i n)0)s)i])[0 0]%)0)

온라인으로 사용해보십시오! (이것이 왜 인쇄되지 않습니까?)

#( ; begin anonymous function
    (reduce
        (fn [[s n] i] ; internal anonymous reducing function, destructures accumulator argument into a sum and the previous item
            [(+ (max (- i n) 0) s ; the sum part of the accumulator becomes the previous sum plus the larger of zero and the difference between the current number and the last one, which is how many new strokes need to be started at this point
            i]) ; ...and the previous item part becomes the current item
        [0 0] ; the initial value of the accumulator gives no strokes yet, and nothing for them to cover yet
        %) ; reduce over the argument to the function
    0) ; and get the sum element of the last value of the accumulator.

PPCG에 오신 것을 환영합니다! Clojure에 대해 아무것도 모르지만 빠른 검색 결과 lazy for 루프를 평가해야한다는 것을 알 수 있습니다. 온라인으로 사용해보십시오! (팁 : 링크 단추를 사용하여 답변을 자동 서식으로 지정할 수 있습니다). 당신이 주위에 붙어 재미를 바랍니다!
조 왕


0

MATL , 15 14 13 바이트

ts:<~"@Y'x]vs

입력 값은 ;분리 자로 사용되는 열 벡터 입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

t       % Implicit input: column vector. Duplicate
s       % Sum
:       % Range from 1 to that. Gives a row vector
<~      % Greater or equal? Element-wise with broadcast
"       % For each column
  @     %   Push current columnn
  Y'    %   Run-length encoding. Gives vector of values (0, 1) and vector of lengths
  x     %   Delete vector of lengths
]       % End
v       % Vertically concatenate. May give an empty array
s       % Sum. Implicit display

0

펄 5, 21 바이트

$\+=$_>$'&&$_-$';//}{

TIO

어떻게

  • -p+ }{+ $\트릭
  • //빈 문자열과 일치하여 다음 줄의 postmatch $'가 이전 줄을 포함하도록합니다.
  • $\+=$_>$'&&$_-$'전류가 이전보다 큰 경우 현재 라인과 이전의 차이를 누적합니다 (쓰기 가능 $\+=$_-$' if$_>$'하지만 펄은 $\+=$_-$'if$_>$'동일 하지 않습니다 )


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.