Поселенці Катану - найдовша дорога!


16

Це дошка для ендгемів поселенців Катану:

Катанська дошка

Фон:

Дороги (довгі палички) та населені пункти (та міста) роздаються маленькими хатами. Ми кодуємо розміщення цих частин за допомогою наступної схеми: Зверху маємо ряд горизонтальних вершин і країв, де можна розмістити дорогу. Тоді у нас стовпчик лише доріг тощо. Використовуючи R для червоного, O для помаранчевого та B для синього, а _ для нічого, зображена дошка буде закодована як:

________RR_R_
__R_
__RR_R_RRR_____R_
B___R
_B_________B__OO_OOR_
B__B_R
BB_BBB_____B____RR_R_
OBB_O
OO__BB_BB__OOO_OO
O_O_
_O_OOO_O_____

Такою дошкою буде ваша вхідна рядок. Будь-яка літера [A-Z]може вказувати колір гравця, але максимум чотири кольори (включаючи порожній). Інакше дошки гарантують свою дійсність згідно з правилами поселенців, що означає:

  • Кожен колір матиме щонайменше дві суміжні дорожні мережі, які можуть бути або не можуть бути розбиті іншими населеними пунктами / містами (вершинні будівлі). Побачте, як помаранчеве поселення розбиває червону дорогу в правій частині зразка зображення.
    • Кожна дорожня мережа гарантовано має принаймні одне поселення.
  • Усі населені пункти та міста гарантовано знаходяться як мінімум за два краї від найближчого іншого населеного пункту / міста (вашого чи іншого)
  • На одного гравця може бути лише 15 доріг на ігровій дошці.
  • Для любителів катану: для цієї проблеми немає різниці між населеними пунктами та містами, тому я не розрізняю вхідний рядок.

Все це для конкретизації рядка "введення".

Найдовша дорога:

У поселенців гравці отримують два очки перемоги за те, що мають "найдовшу дорогу". Це визначається як: Найдовший суміжний єдиний шлях (вимірюється дорогами) від початкової точки до кінцевої точки, що не розбивається на поселення супротивників чи місто . Цикли нормальні, якщо ви можете простежити шлях від однієї конкретної початкової точки до однієї конкретної кінцевої точки. Отже, петля з 6 доріг плюс одна дорога, що відгалужується, - це довжина 7, але одна з двома відгалуженнями від 6 доріжної петлі з протилежних сторін все ще варта лише 7.

На прикладі карти Червона дорога з правого боку коштує лише 4, оскільки він відрізаний помаранчевим поселенням з правого боку дошки (тому поселення взагалі включені). Синій має дорогу довжиною 13, а помаранчевий - дорогу 12. Верхня дорога червоного коштує лише 7, оскільки вона не з'єднується з двома окремими дорогами поруч.

Вихід:

Усі гравці, які мають дорогу найдовшої довжини (вона може бути більше однієї, якщо є зв'язки), а потім пробіл та / або підкреслення підкреслюється в базі 10, як триває ця дорога.

Отже, вихід для прикладної дошки буде таким:

B 13

Постановка проблеми:

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

Це , найкоротший виграш програми. Звичайно, стандартні лазівки заборонені .


2
Справжня проблема проблеми: Orange player - це ривок.
corsiKa

From the top, we have a row horizontal vertices and edges where a road can be placed. Then we have a column of only roads, and so forth. Мені знадобилося кілька хвилин, щоб зрозуміти, що це означає. Вам слід чіткіше пояснити, що горизонтальні рядки містять також населені пункти та місця поселення.
DLosc

@corsiKa У мене раніше хтось робив це зі мною!
Джеррі Єремія

1
Помаранчевий і червоний на зображенні дійсно схожі. Ви повинні були вибрати інший колір.
mbomb007

Відповіді:


3

Python 2, 445 400 байт

Я фанат поселенців, тому цей виклик був веселим.

T="^"
Z=26
A=T*52
for i in range(11):A+=(T*(i%2)*3).join(x for x in raw_input()).center(Z,T)
A+=T*52
def f(c,p=0,l=0,B=A):
 b=l;C=B[0:p]+T+B[p+1:];n=(Z,1)[p%2]
 for i in(p<1)*range(390):
    if(i/Z%2<1&i%2>0)|(i/Z%2>0&i%2<1):b=max(b,f(c,i))
 for i in(p-n,p+n)*(B[p]==c):
    for j in(i-Z,i-1,i+1,i+Z)*(B[i]in c+"_"):b=max(b,f(c,j,l+1,C))
 return b
i=l=0
for x in A:
 if x<T:i=f(x)
 if i>l:c=x;l=i
print c,l

Оцінка відображає заміну кожного виникнення 4 пробілів на вкладку.

Пояснення

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

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________RR_R_^^^^^^^
^^^^^^_^^^_^^^R^^^_^^^^^^^
^^^^__RR_R_RRR_____R_^^^^^
^^^^B^^^_^^^_^^^_^^^R^^^^^
^^_B_________B__OO_OOR_^^^
^^B^^^_^^^_^^^B^^^_^^^R^^^
^^BB_BBB_____B____RR_R_^^^
^^^^O^^^B^^^B^^^_^^^O^^^^^
^^^^OO__BB_BB__OOO_OO^^^^^
^^^^^^O^^^_^^^O^^^_^^^^^^^
^^^^^^_O_OOO_O_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

При виклику з параметрами за замовчуванням функція повертає довжину дороги заданого кольору. Перший цикл активний лише тоді, коли введено параметр позиції (p). Він рекурсивно знаходить довжину дороги на кожному дійсному положенні дороги і відстежує найдовшу. Коли є параметр дороги за параметром позиції, функція рекурсивно додає довжину сусідніх доріг одного кольору. Дорога замінена на "~" у робочій копії дошки, щоб переконатися, що вона не перераховує вже відлічені сегменти.

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

Демонструйте це тут

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