The Prime Grid Game

10

Eu me diverti resolvendo isso, então ofereço esse desafio de golfe.

O objetivo deste golfe é encontrar o maior número primo que pode ser construído usando as instruções fornecidas.

Você deve aceitar a grade 3x3 de dígitos únicos como entrada. (Você decide como deseja fazer isso, mas especifique isso em seu programa.)

Você pode mover-se ao longo da grade ortogonalmente (esquerda, direita, para cima ou para baixo) e, à medida que se move, continua anexando os dígitos pelos quais passa.

Por exemplo

1 2 3
3 5 6 
1 8 9

Digamos que começamos às 1, podemos formar o número 1236589, mas não podemos formar 15.

Você tem que avaliar todas as posições iniciais.

Se um primo não puder ser encontrado, imprima -1; caso contrário, imprima o próprio primo.

O código mais curto vence, verifique se ele é executado em 10 segundos.

Diverta-se!

Editar: use uma posição exatamente uma vez, no número inteiro.

Aqui está um caso de teste

Entrada:

1 2 3
4 5 6
7 8 9

Saída: 69854123

st0le
fonte
Presumo que não podemos repetir posições?
Keith Randall
Não, você não pode. Caso contrário, será uma pesquisa infinita :) Desculpe, esqueci de mencionar isso. Edição.
st0le
Posso casos de teste haz?
MtnViewMark
@MtnViewMark, i haz postd testcase e também confirmou sua resposta. Felicidades! :)
st0le

Respostas:

4

Haskell, 239 caracteres

p=2:q[3..]
q=filter(#p)
n#(x:y)=n==x||n`mod`x/=0&&(n`div`x<x||n#y)
(n§m)q=n:maybe[](\i->[q-4,q-1,q+1,q+4]>>=(n*10+i)§filter(/=(q,i))m)(lookup q m)
i=[0,1,2,4,5,6,8,9,10]
main=getLine>>=print.maximum.(-1:).q.(i>>=).(0§).zip i.map read.words

A entrada é fornecida como uma única linha de nove números:

$> echo 1 2 3  3 5 6  1 8 9 | runhaskell 2485-PrimeGrid.hs
81356321
$> echo 1 2 3  4 5 6  7 8 9 | runhaskell 2485-PrimeGrid.hs
69854123
$> echo 1 1 1  1 1 1  1 1 1 | runhaskell 2485-PrimeGrid.hs
11
$> echo 2 2 2  2 2 2  2 2 2 | runhaskell 2485-PrimeGrid.hs
2
$> echo 4 4 4  4 4 4  4 4 4 | runhaskell 2485-PrimeGrid.hs
-1
MtnViewMark
fonte
Posso confirmar sua resposta :)
st0le
3

Pitão, 286 274 caracteres

I=lambda:raw_input().split()
m=['']
G=m*4+I()+m+I()+m+I()+m*4
def B(s,p):
 d=G[p]
 if''==d:return-1
 G[p]='';s+=d;n=int(s)
 r=max(n if n>1and all(n%i for i in range(2,n**.5+1))else-1,B(s,p-4),B(s,p+4),B(s,p-1),B(s,p+1))
 G[p]=d;return r
print max(B('',i)for i in range(15))

Isso fornece um aviso de descontinuação para o argumento float range. Ignore-o ou gaste mais 5 caracteres para envolvê int()-lo.

Keith Randall
fonte