Padrões de cortador de grama

9

Retirado do Problema B da Rodada de Qualificação do Google Code Jam 2013 :

Alice e Bob têm um gramado em frente à casa, em forma de um retângulo de N metro por M metro. A cada ano, eles tentam cortar o gramado em algum padrão interessante. Eles costumavam cortar com tesouras, o que consumia muito tempo; mas agora eles têm um novo cortador de grama automático com várias configurações e desejam testá-lo.

O novo cortador de grama tem uma configuração de altura - você pode configurá-lo para qualquer altura h entre 1 e 100 milímetros, e cortará toda a grama mais alto que h que encontre na altura h. Você o executa entrando no gramado em qualquer parte da borda do gramado; depois, o cortador de grama segue uma linha reta, perpendicular à borda do gramado em que entrou, cortando a grama em uma faixa de 1 m de largura, até sair do gramado do outro lado. A altura do cortador de grama só pode ser ajustada quando não estiver no gramado.

Alice e Bob têm vários padrões de grama que eles poderiam ter no gramado. Para cada um deles, eles querem saber se é possível cortar a grama nesse padrão com o novo cortador de grama. Cada padrão é descrito especificando a altura da grama em cada quadrado de 1m x 1m do gramado.

A grama tem inicialmente 100 mm de altura em todo o gramado.

Escreva uma função que utilize uma matriz 2D de alturas inteiras e determine se o gramado pode ser cortado adequadamente.

Aqui estão 100 casos de teste do Google Code Jam. Os primeiros 35 casos devem passar, o resto não.

O menor código vence.

caixa de papelão
fonte
2
Você pode indicar a licença sob a qual os problemas do Google Code Jam são casos de teste disponíveis?
Peter Taylor
Eu mudei para vincular ao problema em vez de copiá-lo diretamente.
cardboard_box
Eu acho muito lamentável se o quebra-cabeça / pergunta for apresentado aqui apenas com um link. O problema deve ser fornecido na íntegra com todos os detalhes necessários.
15913 Howard
2
"Todas as declarações de problemas, dados de entrada e análises de concursos são licenciadas sob a Licença de Atribuição Creative Commons." ~ Da página do problema
MrZander 15/13

Respostas:

9

J, 15 caracteres

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

Não esperava essa solução curta.

Breve explicação:

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

Se sua função for 4, outra função como na solução: (f1 f2 f3 f4)e uma entrada J calcula como f1(input,f3(f2(input),f4(input)))isto é input f1 ((f2 input) f3 (f4 input)).

randomra
fonte
por favor explique o algoritmo (eu não posso ler o código J ^^)
Olivier Dulac
2
@OlivierDulac Acabou de adicionar agora.
randomra
5

APL, 15 caracteres

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

Explicação:

  • ⌈⌿⍵ calcula o máximo das colunas de rhs
  • ⌈/⍵ faz o mesmo com linhas
  • ∘.⌊ faz o produto externo dos dois anteriores em relação à função mínima
  • ⍵≡ compara o resultado com o rhs

Exemplos:

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

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 2 3 ⍴ 2 2 2 2 1 1
0 
Howard
fonte
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))))]
caixa de papelão
fonte
11
Use em map(min,z(*r))vez de [min(a)for a in z(*r)]salvar 8 caracteres
Volatilidade
0

Eu tenho um código python um pouco mais longo, mas ele passou em todos os casos de teste fornecidos no 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"
tusharmakkar08
fonte