Захоплення на шахівниці пішака


17

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

Вхід є у позначенні FEN , що описує положення білих та чорних пішаків без інших фігур. Ви повинні вирішити, чи є пішак, який може захопити ворога.

Кожен ранг описується, починаючи з рангу 8 і закінчуючи рангом 1; у межах кожного рангу вміст кожного квадрата описується з файлу "a" через файл "h". Кожна пішака ідентифікується однією буквою (білий пішак = "P", чорний пішак = "p",). Порожні квадрати відзначаються за допомогою цифр від 1 до 8 (кількість порожніх квадратів), а "/" розділяє ряди. (частково взято з Вікіпедії)

Наприклад

8/pppppppp/8/8/4P3/8/PPPP1PPP/8

описує дошку

--------

pppppppp


    P   

PPPP PPP

--------

Білий пішак може захоплювати чорний, якщо чорний розташований по діагоналі вгору від нього (чорний вгору ліворуч або вгору праворуч), а чорний пішак може захоплювати білий, якщо білий знаходиться по діагоналі нижче від нього (білий є вниз-вліво або вниз-вправо). Жоден інший хід захоплення ( ендосант ) не повинен розглядатися.

Вхідні дані

  • А Fen -як рядок , що складається з символів 12345678pP/.
  • Вхід описує пішаки дійсної позиції в шаховій грі. Це означає (серед інших більш складних обмежень) буде щонайменше 8 пішаків для кожної сторони, а пішаків у рядах 1 та 8 не буде.

Вихідні дані

  • Якщо є можливе захоплення для обох сторін Виведіть на truthy значення і falsy значення в іншому випадку.

Приклади

Вхідні дані з надійним результатом (по одному на рядок)

8/7p/6P1/8/8/8/8/8
8/8/p7/1P6/3P3p/8/8/8
8/2P5/8/4P1p1/2p2P2/3p4/3p1P2/8
8/P7/8/5P2/2pp4/3P2p1/3pP3/8
8/P7/p7/p1P1P3/1P3p2/8/1p6/8
8/4p1P1/2P2P1P/2p1pPpp/8/6P1/pP1p4/8

Входи з фальшивим виходом (по одному на рядок)

8/8/8/8/8/8/8/8
8/7P/6p1/8/8/8/8/8
8/7p/7P/8/8/8/8/8
8/pppppppp/8/8/8/8/PPPPPPPP/8
8/p7/8/1p6/5P2/8/8/8
8/p7/P7/2P1p1p1/2p5/8/PP6/8

Це кодовий гольф, тому найкоротший запис виграє.


Чи не слід описати прикладну дошку 8/pppppppp/8/8/8/7P/PPPP1PPP/8?
TheNumberOne

@TheNumberOne Ні, 7Pце означатиме, що пішак знаходиться на останньому, 8-му файлі. (Діаграма була невірною, проте я це виправив.)
randomra

1
Я відчуваю, що видалення з-за пасанта робить це менш цікавою головоломкою.
corsiKa

Відповіді:


6

Pyth, 25 байт

/smC,>JsXz`M9*LN9dJ,8T"Pp

Тестовий набір

Кроки:

Перетворіть вхід, замінивши цифри на еквівалентну кількість лапок ( N). Це збережено в J. Потім відрізаємо перші 8 або 10 символів, а результат зашпилюємо оригіналом. Будь-яка пара захоплення буде перетворена на "Pp", тож ми знайдемо кількість цього рядка у списку результатів. Це вихід.

Як бонус, це фактично враховує кількість можливих захоплень на вході.


Ще 25 рішення: :sXz`M9*LN9"p.{7}(..)?P"1На жаль, останній параметр :не є необов'язковим (я думаю, він повинен бути).
Якубе

3
@Jakube Зробить.
isaacg

12

Сітківка , 33 29 байт

T`d`w
)`\d
$0.
_

p.{7}(..)?P

Для запуску коду з одного файлу використовуйте -sпрапор.

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

Вихід позитивний (truthy), якщо можливий захоплення, і нуль (false), якщо його немає.

Пояснення

T`d`w
)`\d
$0.

Це петля двох етапів. Перший - це етап транслітерації, який зменшує кожну цифру і перетворює нулі на підкреслення. Чому? Тому що dі wрозгорніть на наступні два рядки:

0123456789
_0123456789AB...YZab...yz

Якщо цільовий набір етапу транслітерації довший, ніж набір джерела, сторонні символи ігноруються, отже, поведінка декрементації (якщо чесно, я просто вирішив поставити підкреслення перед цифрами при розширенні wкласу символів) .

Тоді другий етап - це заміна, яка додає a .до кожної цифри. Це означає , що для кожної цифри n, nперіоди додаються до того, що цифра перетворилася в підкреслення.

_
<empty>

Це просто позбавляється від підкреслень.

p.{7}(..)?P

Нарешті ми знаходимо сірники. Оскільки ми ігноруємо прохідність, зйомки можливі лише в тому випадку, якщо під ним pє Pдіагоналі, а потім по діагоналі. У лінійному рядку це просто означає, що між двома пішаками повинно бути 7 або 9 символів. Це збігається з .{7}(..)?(тобто збігайте 7 символів, а потім, за бажанням, збігайте ще два).

Такий етап матчу повертає кількість знайдених матчів.


Re "Повинен бути легко переможеним чимось на зразок Perl, де розширення цифр на рядки пробілів (або інших символів) не займає 17 байт.": Я не можу змусити Perl навіть зв'язати ваш рахунок, не кажучи вже пробити його . ( Моя відповідь Perl. ) Але, можливо, хтось інший може ....
msh210

3

Javascript, 272 символи

function h(t){b=[[]];for(i=-1;i++<7;){c=0;b.push(l=[]);for(j=-1;j++<7;){o=t.split('/')[i][j];switch(o){case'P':l[c++]=-1;break;case'p':l[c++]=1;break;default:c+=parseInt(o);}}}b.push([]);for(i=1;i<9;i++)for(j=0;j<8;j++)if((p=b[i][j])&&(b[i+p][j-1]||b[i+p][j+1]))return 1;}

Напевно, є багато можливостей для вдосконалення.


3

Рубі, 145 123 46 байт

->b{b.gsub(/\d/){|x|?.*x.to_i}=~/p.{7}(..)?P/}

Я не знаю, чому я не думав про це в першу чергу. Це набагато коротше, а також досить читабельне.

Ось тест: http://ideone.com/Gzav8N


Старий підхід:

->b{l={}
r=p
b.split(?/).map{|s|c={}
i=0
s.chars.map{|x|n=x.to_i;c[i]=x;i+=n<1?1:n;x==?P&&r||=l[i-2]==?p||l[i]==?p}
l=c}
r}

Тест в Інтернеті: http://ideone.com/9L01lf , версія перед гольфом: http://ideone.com/CSmqlW

Історія модифікацій доступна тут .


2

ES6, 64 байти

Відповідне число байтів, якщо воно триває!

f=s=>/p.{7}(..)?P/.test(s.replace(/\d/g,n=>"        ".slice(-n)))

Я насправді думав про це рішення, не читаючи спочатку інших відповідей, але не заперечу, якщо ти мені не повіриш.



0

PHP, 94 87 80 байт

for(;$i++<8;)$t[$i]=$s.=" ";echo preg_match("#p.{7}(..)?P#",strtr($argv[1],$t));

Ця петля + strtrнабагато коротша, ніж preg_replace_callbackу str_pad.


0

Желе, 88 84 79 72 69 65 64 63 60 байт

Однозначно місце для вдосконалення. Без конкуренції, тому що Jelly був створений перед питанням. Дякую @lirtosiast за те, що мені це сказали!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.