ครอบคลุมเส้นขอบฟ้าด้วยแปรงลายเส้น


43

เมื่อรับรายการความสูงเส้นขอบฟ้าจำนวนเต็มแบบไม่ลบให้ตอบว่าจำเป็นต้องใช้แปรงเส้นแนวนอนจำนวน 1 หน่วยต่อเนื่องสูงเพียงใดเพื่อครอบคลุม

[1,3,2,1,2,1,5,3,3,4,2]มองเห็นเป็น:

      5    
      5  4 
 3    5334 
 32 2 53342
13212153342

ต้องการแปรงเก้าจังหวะ:

      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

มันไม่ใช่ codegolf แต่ฉันมีคำถามนี้สำหรับการทดสอบรหัสสัมภาษณ์เมื่อประมาณหนึ่งปีที่แล้ว
luizfzs

คำตอบ:


35

JavaScript (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ไม่มีอะไรวิเศษ ครั้งแรกที่ฉันอ่านคำถามที่ฉันสับสนโดยวิธีการค้นหาจนกระทั่งฉันตระหนักว่าทุกบรรทัดเป็นแนวนอนเท่านั้น แล้วสูตรนี้ก็ขึ้นอยู่กับความคิดของฉันตามธรรมชาติ ....
tsh

4
เวทมนตร์ดูเหมือนจะเป็นคำที่เหมาะสมในการอธิบายกระบวนการนั้น
Adám

1
ขณะนี้เป็นที่มาของอัลกอริทึมในขณะนี้ใช้กันอย่างแพร่หลายที่มันจะมีการอธิบายที่นี่
Adám

28

05AB1E ,  8 7  5 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Adnan

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
คำอธิบายที่สวยงาม
อดัม

1
การแทนที่ʒd}ด้วยþควรช่วยคุณสองไบต์
Adnan

@Adnan อาดี ขอบคุณ!
Arnauld

7

Python 3 , 37 ไบต์

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

ลองออนไลน์!

-5 ไบต์โดยเปลี่ยนเป็น Python 3 ด้วย Sarien


Python 2 , 47 43 42 ไบต์

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

ลองออนไลน์!

สำรอง:

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

ลองออนไลน์!


ใน Python 3 คุณสามารถทิ้ง [: -1], บันทึก 5 ไบต์
ซารีน

@Sarien ขอบคุณ: D ฉันไม่รู้ว่าแผนที่แตกต่างใน python 2 และ 3
TFeld

7

Haskell , 32 ไบต์

(0%)
p%(h:t)=max(h-p)0+h%t
p%_=0

ลองออนไลน์!

การปรับปรุงโซลูชันของ Lynnที่ติดตามองค์ประกอบก่อนหน้าpแทนที่จะมองไปที่องค์ประกอบถัดไป นี้จะทำให้กรณีฐานและโทร recursive (0%)สั้นในการแลกเปลี่ยนสำหรับจำเป็นที่จะเรียก

max(h-p)0อาจมีmax h p-pความยาวเท่ากัน



5

K (oK) , 12 7 ไบต์

-5 ไบต์ขอบคุณ ngn!

k (OK)พอร์ตของการแก้ปัญหา 05AB1E Arnauld (และวิธีการแก้ปัญหาของ JavaScript TSH):

+/0|-':

ลองออนไลน์!

J , 15 ไบต์

AJ พอร์ตของโซลูชั่น 05AB1E ของ Arnauld (และโซลูชัน JavaScript ของ tsh):

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

ลองออนไลน์!

โซลูชันไร้เดียงสาของฉัน:

J , 27 ไบต์

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

ลองออนไลน์!


2
oK: แต่ละอันก่อน ( ':) ใช้องค์ประกอบตัวตนโดยนัย ( 0สำหรับ-) ก่อนรายการดังนั้นจึง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

Haskell , 34 32 ไบต์

2 ไบต์ถูกตัดแต่งโดย Lynn

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

ลองออนไลน์!

zipWith(-)ดังนั้นการเริ่มต้นที่เรามี สิ่งนี้ใช้สองรายการและสร้างรายการใหม่ของความแตกต่างของจำนวนคู่ จากนั้นเราจะรวมกับและ x เป็นฟังก์ชั่นที่เพิ่มศูนย์ไปที่ด้านหน้าของรายการและโดยการรวมเข้ากับเราจะได้รับความแตกต่างระหว่างองค์ประกอบที่ต่อเนื่องกันของรายการนั้นกับศูนย์ที่ด้านหน้า จากนั้นเราก็เปิดทุกคนที่เป็นลบให้เป็นศูนย์ด้วย สิ่งนี้จะสร้างรายการใหม่ที่แต่ละองค์ประกอบคือจำนวนจังหวะใหม่ที่ต้องเริ่มในแต่ละหอคอย ที่จะได้รับทั้งหมดที่เราเพิ่งสรุปเหล่านี้ด้วย(0:x)(0:)zipWith(-)(max 0<$>)sum


2
g x=sum$max 0<$>zipWith(-)x(0:x)คือ 32 ไบต์ :)
Lynn

ตามที่เป็นsum.zipWith((max 0.).(-))<*>(0:)
ลินน์

@Lynn คนที่สองของคุณจะต้องวงเล็บพิเศษตั้งแต่มีลำดับความสำคัญสูงกว่า. <*>
ข้าวสาลีตัวช่วยสร้าง

3

Japtet , 8 ไบต์

-2 ไบต์จาก @Shaggy

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 bytes:mîT Õ¸¸è
Shaggy

1
ใช้A.y()ช่องว่างภายในของดีโดยวิธีการ
ปุย

3

MATL , 8 ไบต์

0whd3Y%s

ลองออนไลน์!

อัลกอริทึมของ @ Arnauld ค่อนข้างมาก บันทึกหนึ่งไบต์ (ขอบคุณ @LuisMendo) โดยการส่งไปที่uint64แทนที่จะเลือก)รายการที่เป็นบวก


3

เยลลี่ 5 ไบต์

พอร์ตของฉันคำตอบ 05AB1Eที่ตัวเองมีความคล้ายคลึงกับ@tsh คำตอบ

ŻI0»S

ลองออนไลน์!

แสดงความคิดเห็น

ŻI0»S    - main link, expecting a list of non-negative integers  e.g. [10, 9, 8, 9]
Ż        - prepend 0                                             -->  [0, 10, 9, 8, 9]
 I       - compute the deltas                                    -->  [10, -1, -1, 1]
  0»     - compute max(0, v) for each term v                     -->  [10, 0, 0, 1]
    S    - sum                                                   -->  11

3

Japt , 7 6 ไบต์

änT fq

ลองมัน

บันทึก 1 ไบต์ขอบคุณ Oliver

ä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

C # (Visual C # Interactive Compiler)พร้อมแฟลก/u:System.Math47 ไบต์

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

ฉันรู้สึกว่าวิธีนี้สวยงามกว่าโซลูชันแรก มันจะผ่านอาร์เรย์ที่มี tuple สองค่าเป็นค่าเริ่มต้นยกค่าและเก็บค่าก่อนในส่วนที่สองของ tuple

ลองออนไลน์!


1

Pyth, 8 ไบต์

s>#0.++0

แต่พอร์ตอีกคำตอบที่ยิ่งใหญ่ของ @ TSH รับผลรวม ( s) ของค่าบวก ( >#0) ของ deltas (. +) ของอินพุตด้วย 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

Clojure 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 แต่การค้นหาอย่างรวดเร็วแสดงให้เห็นว่าคุณจะต้องประเมินความขี้เกียจสำหรับลูป ลองออนไลน์! (เคล็ดลับ: คุณสามารถใช้ปุ่มลิงก์เพื่อจัดรูปแบบคำตอบของคุณโดยอัตโนมัติ) หวังว่าคุณจะได้สนุกไปกับมัน!
Jo King

1

Java (JDK) , 57 ไบต์

a->{int s=0,p=0;for(int x:a)s-=(x>p?p:x)-(p=x);return s;}

ลองออนไลน์!

ท่าเรืออีกTSH 's คำตอบ Javascript ดังนั้นให้แน่ใจว่าคุณได้ upvoted พวกเขา

โปรดทราบว่าฉันใช้การลบแทนการเพิ่มเพราะมันทำให้ฉันเขียน(p=x)เป็นตัวถูกต้องในคำสั่งเดียวกัน


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

Perl 5, 21 ไบต์

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

TIO

อย่างไร

  • -p+ }{+ $\เคล็ดลับ
  • //จับคู่สตริงว่างเพื่อให้ postmatch บรรทัดถัดไป$'จะมีบรรทัดก่อนหน้า
  • $\+=$_>$'&&$_-$'เพื่อสะสมความแตกต่างระหว่างบรรทัดปัจจุบันและก่อนหน้าถ้ากระแสมีค่ามากกว่าก่อนหน้า (สามารถเขียน$\+=$_-$' if$_>$'ได้ แต่ Perl ไม่แยกวิเคราะห์$\+=$_-$'if$_>$'เหมือนกัน)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.