ซ่อนสิ่งปลูกสร้าง


15

เวอร์ชั่นสั้นของChallenge ตึกระฟ้า

งาน

เมื่อกำหนดความสูงของอาคารและจำนวนเต็มบวกkให้ค้นหาการเรียงสับเปลี่ยนทั้งหมด (โดยไม่ซ้ำกัน) ของความสูงดังกล่าวเพื่อให้kอาคารสามารถมองเห็นได้

สิ่งปลูกสร้างใด ๆ จะซ่อนสิ่งปลูกสร้างที่เตี้ยกว่าหรือเท่ากับ

รูปแบบใด ๆ สำหรับอินพุตและเอาต์พุตนั้นถูกต้อง

อาร์เรย์อินพุตจะไม่ว่างเปล่า

ในกรณีที่เป็นไปไม่ได้ที่จะเห็นอาคารหลายหลังให้ส่งสิ่งที่ไม่สามารถตอบได้ แต่ไม่มีข้อผิดพลาด

ตัวอย่าง:

(ความยาวของเอาต์พุตถูกแสดงสำหรับเอาต์พุตที่ยาวมาก แต่เอาต์พุตของคุณควรเป็นพีชคณิตที่เป็นไปได้ทั้งหมด)

input:[1,2,3,4,5],2
output: 50

input:[5,5,5,5,5,5,5,5],2
output: []

input:[1,2,2],2
output:[(1,2,2)]
Seeing from the left, exactly 2 buildings are visible.

input:[1,7,4],2
output:[(4, 7, 1), (1, 7, 4), (4, 1, 7)]

input:[1,2,3,4,5,6,7,8,9],4
output:67284

input:[34,55,11,22],1
output:[(55, 34, 11, 22), (55, 22, 34, 11), (55, 34, 22, 11), (55, 11, 34, 22), (55, 22, 11, 34), (55, 11, 22, 34)]

input:[3,4,1,2,3],2
output:31

นี่คือรหัส - กอล์ฟเพื่อให้ได้รหัสที่สั้นที่สุด

ตัวเลือก: if length is greater than 20: print length else print answerถ้าเป็นไปได้คุณสามารถเพิ่มสิ่งที่ต้องการ ในส่วนท้ายไม่ใช่ในรหัส


เอาต์พุตควรเป็นพีชคณิตที่มีคุณสมบัติครบทั้งหมดหรือจำนวนของมัน?
Luis Mendo

มันควรจะเป็นพีชคณิตที่มีคุณสมบัติครบถ้วน @LuisMendo
Vedant Kandoi

[1,2,3,4,5],5 -> [(1,2,3,4,5)]กรณีทดสอบที่แนะนำ: ไม่มีกรณีทดสอบในปัจจุบันรับรองว่าคำตอบสามารถรองรับการแสดงสิ่งปลูกสร้างทั้งหมด (แม้ว่าฉันไม่รู้ว่าจริง ๆ มีปัญหากับสิ่งนั้น)
Kamil Drakari

คำตอบ:


6

05AB1E , 10 9 ไบต์

œÙʒη€àÙgQ

ลองออนไลน์หรือตรวจสอบ (เกือบ) ทุกกรณีทดสอบ (กรณีทดสอบ[1,2,3,4,5,6,7,8,9],4หมดเวลา)
ส่วนท้ายของ TIO ทำสิ่งที่ OP ถามที่ด้านล่าง:

ตัวเลือก: if length is greater than 20: print length else print answerถ้าเป็นไปได้คุณสามารถเพิ่มสิ่งที่ต้องการ ในส่วนท้ายไม่ใช่ในรหัส

คำอธิบาย:

œ            # Permutations of the (implicit) input-list
             #  i.e. [1,2,2] → [[1,2,2],[1,2,2],[2,1,2],[2,2,1],[2,1,2],[2,2,1]]
 Ù           # Only leave the unique permutations
             #  i.e. [[1,2,2],[1,2,2],[2,1,2],[2,2,1],[2,1,2],[2,2,1]]
             #   → [[1,2,2],[2,1,2],[2,2,1]]
  ʒ          # Filter it by:
   η         #  Push the prefixes of the current permutation
             #   i.e. [1,2,2] → [[1],[1,2],[1,2,2]]
    ۈ       #  Calculate the maximum of each permutation
             #   i.e. [[1],[1,2],[1,2,2]] → [1,2,2]
      Ù      #  Only leave the unique maximums
             #   i.e. [1,2,2] → [1,2]
       g     #  And take the length
             #   i.e. [1,2] → 2
        Q    #  And only leave those equal to the second (implicit) input
             #   i.e. 2 and 2 → 1 (truthy)

1
น่าประทับใจทุก ๆ ไบต์ที่นี่เป็นส่วนหนึ่งของแผนผังฟังก์ชั่น!
lirtosiast

1
@lirtosiast ใช่แล้ว 05AB1E มีบางตัวที่ค่อนข้างสั้นซึ่งสมบูรณ์แบบในความท้าทายนี้ :) จริง ๆ แล้วคล้ายกับคำตอบ Pyth ของคุณที่ฉันเห็น สิ่งที่ตลกคือว่าส่วนท้ายของif length is greater than 20: print length; else print answer;มันคือa̶̶b̶y̶t̶e̶̶l̶o̶n̶g̶e̶r̶ที่มีความยาวเท่ากันเมื่อเปรียบเทียบกับตัวโปรแกรมเอง xD
Kevin Cruijssen


5

เจลลี่ , 12 10 ไบต์

Œ!Q»\QL=ʋƇ

ลองออนไลน์!

-2 ไบต์โดย@Erik the Outgolfer

นี่เป็นฟังก์ชั่นการย้อมสีที่รับความสูงของอาคารและkตามลำดับ

Œ!                All permutations of first input
Œ!Q               Unique permutations of first input
   »\              Running maximum
     Q             Unique values
      L            Length of this array
       =           Equals k
        ʋ        Create a monad from these 4 links
   »\QL=ʋ        "Are exactly k buildings visible in arrangement x?"
         Ƈ     Filter if f(x)
Œ!Q»\QL=ʋƇ     All distinct perms of first input with k visible buildings.

1
ทักทายใหม่ʋ! (มันค่อนข้างเก่ากว่าƇจริง ๆ : P)
Erik the Outgolfer

4

Pyth, 18 16 ไบต์

fqvzl{meSd._T{.p

ลองที่นี่นี่

โปรดทราบว่าล่าม Pyth รุ่นออนไลน์จะพ่นข้อผิดพลาดของหน่วยความจำในกรณีทดสอบที่ใหญ่ที่สุด

f                       Filter lambda T:
  q                       Are second input and # visible buildings equal?
    v z                     The second input value
    l {                     The number of unique elements in
        m                   the maximums
          e S d             ...
          ._ T              of prefixes of T
    { .p                  over unique permutations of (implicit first input)

ยินดีต้อนรับกลับ! :-)
Luis Mendo

2

Perl 6 , 81 63 ไบต์

-18 ไบต์ขอบคุณ nwellnhof!

{;*.permutations.unique(:with(*eqv*)).grep:{$_==set [\max] @_}}

ลองออนไลน์!

f(n)(list)รหัสที่ไม่ระบุชื่อบล็อกที่จะเข้าแกงกะหรี่เช่น นั่น.unique(:with(*eqv*))มันนานน่ารำคาญ:(

คำอธิบาย:

{;                                                            }  # Anonymous code block
  *.permutations.unique(:with(*eqv*))  # From all distinct permutations
                                     .grep:{                 }  # Filter where
                                                set [\max] @_   # Visible buildings
                                            $_==      # Equals num

1
FWIW ฉันเพิ่งยื่นเรื่องRakudoเพื่อที่เราจะได้กำจัดสิ่งที่น่ารำคาญ;ในที่สุด;)
nwellnhof

2

Japt , 11 ไบต์

á f_åÔâ Ê¥V

ลองออนไลน์!

สำหรับผลลัพธ์ที่ยาวขึ้นการเพิ่ม} lไปยังจุดสิ้นสุดจะส่งออกความยาวแทน ล่ามออนไลน์หมดเวลาสำหรับ[1,2,3,4,5,6,7,8,9],4กรณีทดสอบโดยไม่คำนึงถึงการแสดงความยาวหรือรายการ

คำอธิบาย:

á              :Get all permutations
  f_           :Keep only ones where:
    åÔ         : Get the cumulative maximums (i.e. the visible buildings)
      â Ê      : Count the number of unique items
         ¥V    : True if it's the requested number

1

JavaScript (ES6), 108 107 ไบต์

(k)(array)จะเข้าเป็น alert()พิมพ์ผลกับ

k=>P=(a,p=[],n=k,h=0)=>a.map((v,i)=>P(a.filter(_=>i--),[...p,v],n-(v>h),v>h?v:h))+a||n||P[p]||alert(P[p]=p)

ลองออนไลน์!

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

k =>                        // k = target number of visible buildings
  P = (                     // P = recursive function taking:
    a,                      //   a[] = list of building heights
    p = [],                 //   p[] = current permutation
    n = k,                  //   n = counter initialized to k
    h = 0                   //   h = height of the highest building so far
  ) =>                      //
    a.map((v, i) =>         // for each value v at position i in a[]:
      P(                    //   do a recursive call:
        a.filter(_ => i--), //     using a copy of a[] without the i-th element
        [...p, v],          //     append v to p[]
        n - (v > h),        //     decrement n if v is greater than h
        v > h ? v : h       //     update h to max(h, v)
      )                     //   end of recursive call
    )                       // end of map()
    + a ||                  // unless a[] was not empty,
    n ||                    // or n is not equal to 0,
    P[p] ||                 // or p[] was already printed,
    alert(P[p] = p)         // print p[] and store it in P


0

J, 43 38 ไบต์

-5 ไบต์หลังจากรวมการเพิ่มประสิทธิภาพจากคำตอบ O5AB13 ของ Kevin

(]#~[=([:#@~.>./\)"1@])[:~.i.@!@#@]A.]

ลองออนไลน์!

ungolfed

(] #~ [ = ([: #@~. >./\)"1@]) ([: ~. i.@!@#@] A. ])

คำอธิบาย

เราเพียงแสดงรายการ perms ที่เป็นไปได้ทั้งหมดi.@!@#@] A. ]นำรายการ uniq ไปด้วย~.แล้วกรองสิ่งเหล่านั้นด้วยจำนวนสิ่งปลูกสร้างที่มองเห็นได้ซึ่งจะต้องเท่ากับอินพุตด้านซ้าย

ตรรกะสำคัญอยู่ในคำกริยาเกี่ยวกับผู้ปกครองซึ่ง calcs จำนวนอาคารที่มองเห็นได้:

([: #@~. >./\)

ที่นี่เราใช้การสแกนสูงสุด>./\เพื่อรักษาจำนวนอาคารที่สูงที่สุดเท่าที่เห็น จากนั้นเราก็ใช้องค์ประกอบที่ไม่ซ้ำกันของการสแกนสูงสุดและนั่นคือจำนวนอาคารที่มองเห็นได้

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