Gra Prime Grid

10

Świetnie się bawiłem, rozwiązując to, więc oferuję to wyzwanie golfowe.

Celem tego golfa jest znalezienie największej liczby pierwszej, jaką można zbudować przy użyciu podanych instrukcji.

Jako dane wejściowe należy przyjąć siatkę 3x3 pojedynczych cyfr. (Od Ciebie zależy, jak chcesz to zrobić, ale określ to w swoim programie).

Możesz poruszać się wzdłuż siatki ortogonalnie (w lewo, w prawo, w górę lub w dół), a gdy się poruszasz, dodajesz cyfry, po których się poruszasz.

Na przykład

1 2 3
3 5 6 
1 8 9

Załóżmy, że zaczynamy od 1, możemy utworzyć numer 1236589, ale nie możemy utworzyć 15.

Musisz ocenić każdą pozycję początkową.

Jeśli nie można znaleźć liczby pierwszej -1, wydrukuj , w przeciwnym razie wydrukuj samą liczbę pierwszą.

Wygrywa najkrótszy kod, upewnij się, że działa w ciągu 10 sekund.

Baw się dobrze!

Edycja: Użyj dokładnie jednej pozycji w całym numerze.

Oto przypadek testowy

Wejście:

1 2 3
4 5 6
7 8 9

Wyjście: 69854123

st0le
źródło
Zakładam, że nie możemy powtarzać pozycji?
Keith Randall
Nie, nie możesz. W przeciwnym razie będzie to wyszukiwanie nieskończone :) Przepraszam, zapomniałem o tym wspomnieć. Redagowanie.
st0le
Czy mogę testować przypadki Haz?
MtnViewMark
@MtnViewMark, i haz postd testcase, a także potwierdziłem twoją odpowiedź. Twoje zdrowie! :)
st0le

Odpowiedzi:

4

Haskell, 239 znaków

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

Dane wejściowe podano jako pojedynczy wiersz dziewięciu cyfr:

$> 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
źródło
Mogę potwierdzić odpowiedź :)
st0le
3

Python, 286 274 znaków

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))

Daje to ostrzeżenie o wycofaniu argumentu float dla range. Zignoruj ​​go lub wydaj 5 dodatkowych znaków, aby go owinąć int().

Keith Randall
źródło