Гра в основні сітки


10

Мені було весело вирішувати це питання, тому я пропоную цю проблему для гольфу.

Завдання цього гольфу - знайти найбільше просте число, яке можна побудувати за допомогою наведених інструкцій.

Ви повинні прийняти 3x3 сітку з однозначних цифр як вхідні дані. (Ви вирішуєте, як ви хочете це зробити, але вкажіть це у своїй програмі.)

Ви можете рухатись ортогонально по сітці (ліворуч, праворуч, вгору чи вниз), а під час руху продовжуєте додавати цифри, якими ви ходите поперек.

Напр

1 2 3
3 5 6 
1 8 9

Скажімо, ми починаємо з 1, ми можемо сформувати число 1236589, але не можемо 15.

Ви повинні оцінювати кожну вихідну позицію.

Якщо праймер неможливо знайти, надрукуйте -1, інакше роздрукуйте сам прайм.

Найкоротший код виграє, переконайтеся, що він працює протягом 10 секунд.

Веселіться!

Редагувати: Використовуйте одну позицію рівно один раз у всьому номері.

Ось тестовий випадок

Вхід:

1 2 3
4 5 6
7 8 9

Вихід: 69854123


Я припускаю, що ми не можемо повторити позиції?
Кіт Рендалл

Ні, ви не можете. Інакше це буде нескінченний пошук :) Вибачте, забув це згадати. Редагування.
st0le

Я можу мати тестові випадки?
MtnViewMark

@MtnViewMark, я затримав тестовий зразок і підтвердив свою відповідь. Ура! :)
st0le

Відповіді:


4

Haskell, 239 символів

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

Введення подається як один рядок з дев'яти чисел:

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

Я можу підтвердити вашу відповідь :)
st0le

3

Пітон, 286 274 символів

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

Це дає попередження про анулювання для аргументу float до range. Ігноруйте це або витратьте ще 5 символів, щоб обернутися int()навколо нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.