芝刈り機パターン


9

Google Code Jam 2013予選ラウンド問題Bから抜粋:

アリスとボブは家の前にNメートルx Mメートルの長方形の形の芝生を置いています。毎年、彼らは芝生を興味深いパターンに切り取ろうとします。彼らは非常に時間がかかる剪断機で切断を行っていました。しかし、今では複数の設定が可能な新しい自動芝刈り機があり、試してみたいと思っています。

新しい芝刈り機には高さ設定があります。1〜100ミリメートルの任意の高さhに設定でき、高さhに到達するhより高いすべての芝生を刈り取ります。あなたは芝生の端のどこかで芝生に入ってそれを実行します。次に、芝刈り機は、進入した芝生の端に垂直に直線状に進み、幅1mの草を刈り取り、反対側の芝生から出るまで刈り取ります。芝刈り機の高さは、芝生の上にないときにのみ設定できます。

アリスとボブには、芝生の上に置くことができるさまざまなパターンの草があります。それらのそれぞれについて、彼らは彼らの新しい芝刈り機でこのパターンに草を切ることが可能であるかどうか知りたいです。各パターンは、芝生の各1m x 1mの正方形の芝生の高さを指定することによって記述されます。

芝生全体の芝生の高さは、最初は100mmです。

整数の高さの2D配列を取り、それに応じて芝生を切断できるかどうかを決定する関数を記述します。

Google Code Jamの100のテストケースを以下に示します。 最初の35ケースはパスするはずですが、残りはパスしません。

最短のコードが勝ちます。


2
Google Code Jamの問題がテストケースであるライセンスが利用可能になったことを指摘できますか?
— Peter Taylor

直接コピーするのではなく、問題にリンクするように変更しました。
— cardboard_box

パズル/質問がリンクのみでここに提示されている場合、それは非常に残念です。問題は、すべての必要な詳細とともに完全に提供されるべきです。
— ハワード

2
「すべての問題ステートメント、入力データ、およびコンテスト分析は、Creative Commons Attribution Licenseの下でライセンスされています。」〜問題のページから
— MrZander

回答:


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 '15

2
@OlivierDulacたった今追加されました。
— randomra 2013

5

APL、15文字

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

説明:

  • ⌈⌿⍵ rhsの列の最大値を計算します
  • ⌈/⍵ 行についても同じことを行います
  • ∘.⌊ 関数の最小値に関して前の2つの外積を行います
  • ⍵≡ 結果をrhsと比較します

例:

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

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


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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.