隐藏建筑物


15

摩天大楼挑战赛的短版

任务

给定建筑物高度的数组和正整数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。在页脚中,而不在代码中。


输出是否应该是所有合格排列或其数量?
路易斯·门多

这应该是所有符合条件的排列@LuisMendo
Vedant Kandoi '18

建议的测试用例:[1,2,3,4,5],5 -> [(1,2,3,4,5)]。当前的测试用例都无法确保答案能够支持显示所有建筑物(尽管我不知道是否有任何问题)。
卡米尔·德拉卡里

Answers:


6

05AB1E10 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;与程序本身相比,页脚的长度是等长的。xD
Kevin Cruijssen


5

果冻12 10字节

Œ!Q»\QL=ʋƇ

在线尝试!

-2个字节,@ Outrik的@Erik

这是按建筑物高度并按此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 还要老)
Outgolfer的Erik,18年

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)

欢迎回来!:-)
路易斯·门多

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问题,因此我们;最终可以摆脱烦人的
话题

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

Python 2中114个 113字节

lambda a,n:{p for p in permutations(a)if-~sum(p[i]>max(p[:i])for i in range(1,len(p)))==n}
from itertools import*

在线尝试!

-1字节,感谢ovs


Python 3,113字节

lambda a,n:{p for p in permutations(a)if sum(v>max(p[:p.index(v)]+(v-1,))for v in{*p})==n}
from itertools import*

在线尝试!


0

J,43 38字节

合并了Kevin's O5AB13的优化后的-5个字节

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

在线尝试!

不打高尔夫球

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

说明

我们仅列出所有可能的权限i.@!@#@] A. ],使用,对其进行uniq项~.过滤,然后根据可见建筑物的数量(必须等于左侧输入)过滤这些权限。

关键逻辑在带括号的动词中,该动词计算可见建筑物的数量:

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

在这里,我们使用最大扫描>./\来保持到目前为止所看到的最高建筑物的计数。然后,我们仅采用最大扫描的独特元素,那就是可见建筑物的数量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.