割草机模式


9

取自Google Code Jam 2013资格赛问题B

爱丽丝(Alice)和鲍勃(Bob)在他们的房屋前有一块草坪,形状像N米x M米的矩形。每年,他们都尝试以某种有趣的方式修剪草坪。他们过去常常用剪刀剪东西,这很费时间。但是现在他们有了一个具有多种设置的新型自动割草机,他们想尝试一下。

新的割草机具有一个高度设置-您可以将其设置为1到100毫米之间的任意高度h,并且将所有比其遇到的h高的草剪成高度h。您可以通过在草坪边缘的任何部分进入草坪来运行它;然后割草机沿一条直线移动,垂直于它进入的草坪的边缘,以1m宽的草条割草,直到割草机从另一侧离开草坪为止。仅当割草机不在草坪上时才能设置其高度。

爱丽丝和鲍勃在草坪上可以放多种草。对于每个人,他们想知道是否有可能用他们的新割草机将草切成这种图案。通过在草坪的每1m x 1m正方形上指定草的高度来描述每种图案。

最初,草在整个草坪上高100毫米。

编写一个函数,该函数采用2D整数高度的数组,并确定是否可以相应地修剪草坪。

这是Google Code Jam的100个测试用例。 前35例应该通过,其余的不应该通过。

最短的代码胜出。


2
您能否指出可以提供Google Code Jam问题测试用例的许可证?
彼得·泰勒

我已将其更改为链接到问题,而不是直接复制它。
cardboard_box

我认为如果仅在此处显示难题/问题仅是一个链接,那是非常不幸的。该问题应提供所有必要的详细信息。
霍华德

2
“所有问题陈述,输入数据和竞赛分析均已获得知识共享署名许可。” 〜来自问题页面
MrZander 2013年

Answers:


9

J,15个字符

   (-:>./"1<./>./)

没想到这个简短的解决方案。

简短说明:

(input == ((max of rows of input) table with min of left and right (max in columns of input)))
(      -:          >./"1                        <./                       >./              )

如果您的函数是4个其他函数,例如在解决方案中:(f1 f2 f3 f4)并且输入J像f1(input,f3(f2(input),f4(input)))ie 那样计算它input f1 ((f2 input) f3 (f4 input))


请说明算法(我无法读取J代码^^)
Olivier Dulac

2
@OlivierDulac现在添加。
randomra

5

APL,15个字符

{⍵≡(⌈/⍵)∘.⌊⌈⌿⍵}

说明:

  • ⌈⌿⍵ 计算rhs列的最大值
  • ⌈/⍵ 与行相同
  • ∘.⌊ 关于函数最小值,前两个的外部乘积
  • ⍵≡ 将结果与rhs比较

例子:

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 3 3 ⍴ 2 1 2 1 1 1 2 1 2
1

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 2 3 ⍴ 2 2 2 2 1 1
0 

3

Python中,112 104

z=zip
y=lambda l:[[max(r)]*len(r)for r in l]
f=lambda l:l==[map(min,z(*r))for r in z(y(l),z(*y(z(*l))))]

1
使用map(min,z(*r))而不是[min(a)for a in z(*r)]保存8个字符
波动率

0

我的Python代码更长一些,但它通过了Google Code Jam 2013给出的所有测试用例。

 a=input();io=0
 while io<a:
     io+=1;[b,c]=map(int,raw_input("").strip().split());koi=[];koi1=[]
     for i in xrange(b):
         koi.append(map(int,raw_input("").strip().split()))
    rowmax=[]
    for i in koi:
        rowmax.append(max(i))
    for i in xrange(c):
        t=[]
        for j in koi:
            t.append(j[i])
        koi1.append(t);colmax=[]
    for i in koi1:
        colmax.append(max(i))
    toi1=[]
    for i in xrange(b):
        s=[]
        for j in xrange(c):
           s.append(min(colmax[j],rowmax[i]))
        toi1.append(s)
     if toi1==koi:
        print "Case #%d:"%io,"YES"
     else:
        print "Case #%d:"%io,"NO"
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.