Це дійсний шаховий хід?


15

Інша назва: ChessMoveQ

Давши список до 32 елементів, кожен з яких складається з 4-х елементів, і другий список з 4-ма елементами, визначте, чи є детальний хід, поданий на другому введенні, шаховим ходом.

Перший список вказує положення всіх 32 штук на дошці. Кожен елемент буде слідувати <colour>, <piece-name>, <x-coord>, <y-coord>такій структурі , як, наприклад ["W", "K", 5, 1], що вказує, що білий король увімкнено 5, 1( e1на звичайній шаховій дошці). Усі елементи першого введення будуть унікальними. <x-coord>і <y-coord>завжди буде від 1 до 8. Одним із прикладів може бути:

[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8],
 ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7],
 ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7],
 ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3],
 ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1],
 ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2],
 ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]

який би представляв правління:

приклад шахової дошки

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

У наведеному вище прикладі може бути дійсний хід ["W", "B", 4, 3](єпископ рухається на один квадрат вперед і вліво), і недійсним може бути рух, ["B", "R", 4, 1]оскільки грак повинен буде рухатися через лицаря, а пішак діставатись до площі. Оскільки хода може посилатися на кілька штук часом, ви повинні перевірити, чи може хтось із зазначених фрагментів зробити хід, а не лише один із них. Наприклад, перший приклад дійсний лише для одного єпископа, але це все-таки дійсний крок. Однак жоден чорний грак не може виконати другий хід, тому він недійсний.

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

  • Будь-який шматок : жоден шматок не може переміститися на вже зайнятий квадрат або поза дошкою, якщо цей квадрат не зайнятий шматочком іншого кольору. Наприклад, білий шматок може переміститися на квадрат, зайнятий чорним шматочком, але не білий шматок. Крім того, жоден шматок, за винятком Лицарів, не може переміщатися до квадратів, які безпосередньо перешкоджають інший шматок.
    • Рух по частинах B квадратного C є «безпосередньо перешкоджають» по частинах А , якщо безпосередньо, в прямому (ортогонально або діагоналі) лінії, між B і C .
  • Будь-який твір : Посада короля також може вплинути на обгрунтованість ходу твору. Якщо будь-яка з цих двох умов виконана, переміщення недійсне:
    • Піддаючи королю перевірку, перемістивши шматок на ту ж сторону, що і цар, що перебуває під загрозою зникнення. Це застосовується лише в тому випадку, якщо непротилежний твір робить хід, а не протилежний твір, який рухається, щоб поставити короля на перевірку.
    • Залишивши король в узді, в цьому випадку він має , щоб вийти з перевірки. Тому, якщо король перебуває під контролем, а хід диктує, що рухається інший твір, це недійсний хід, якщо інший твір не заважає чеку. Шматок може запобігти перевірці одним із двох способів: або він бере частину, яка виконує перевірку, або перешкоджає шляху між твором, який виконує чек, і королем.
    • "Перевірка" - це ситуація, коли супротивник короля міг би (якщо настала їх черга рухатися) легально перемістити шматок на цього царя. Це правило не застосовується рекурсивно, тобто король перебуває під контролем, навіть якщо рух супротивника на цього царя залишить свого царя під контролем.
  • Пішаки : пішак може рухатися вперед (тобто вгору, якщо білий, вниз, якщо чорний) на один квадрат до незайнятого квадрата. Існують також три особливі ситуації:
    • Якщо пішак ще не перемістився (ви можете визначити це за допомогою координати Y; білі пішаки не перемістилися, якщо їх координата Y 2, чорні пішаки не перемістилися, якщо їх координата Y дорівнює 7), пішак дозволяється рухати два квадрати вперед до незайнятого квадрата.
    • Якщо перед пішаком є ​​шматок противника по діагоналі (тобто на площі на північний захід або північний схід пішака, якщо він білий, або на південний захід або південний схід, якщо він чорний), пішак дозволяється переміщатися на займану площу, про яку йдеться.
    • Якщо пішак переходить до остаточної координати Y (8 для білого або 1 для чорного) у звичайних шахових правилах, його потрібно передати королеві, граку, лицарю або єпископу одного кольору. Для цілей цього питання вибір реклами не має значення щодо того, чи є хода дійсною чи ні (і не може бути виражена у вхідному форматі), але потрібно дозволити ходи пішаків, які призвели б до просування.
  • Єпископи : Єпископи можуть рухатись між 1 та 8 квадратами по будь-якому безперервному міжкардинальному (тобто діагональному) шляху.
  • Лицарі : лицарі можуть рухатися уLформі, що складається з будь-якого з наступних (еквівалентних) рухів:
    • Один квадрат у будь-якому кардинальному напрямку з наступним поворотом на 90/270 ° з подальшим остаточним рухом на 2 квадрата вперед.
    • 2 квадрати в будь-якому кардинальному напрямку з наступним поворотом на 90/270 ° з подальшим остаточним рухом одного квадрата вперед.
    (Пам'ятайте, що шлях лицаря не може бути перекритий втручаними частинами, хоча його остаточний квадрат все ще повинен бути законним.)
  • Граки : Граки можуть переміщатися між 1 і 8 квадратами по будь-якому безперервному безперешкодному кардинальному шляху.
  • Королеви : королеви можуть рухатися між 1 і 8 квадратами по будь-якому безперервному кардинальному або міжкардинальному (тобто діагональному) шляху, що не перешкоджає.
  • Королі : Королі рухаються як королеви, за винятком того, що вони обмежуються переміщенням лише одного квадрата за хід (тобто король може рухатися лише до кардинально або по діагоналі сусідніх квадратів). Нагадування, ви не можете зробити хід, який залишає вашого короля під контролем; таким чином, ви також не можете перемістити свого короля.

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

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

Тестові справи

Board
Move => Output (Reason)

[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8], ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7], ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7], ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3], ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1], ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2], ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]
["W", "R", 8, 2] => True (The rook on h1 can move forward one)

[['B', 'K', 6, 8], ['B', 'Q', 1, 7], ['B', 'N', 1, 3], ['B', 'N', 7, 1], ['B', 'B', 8, 8], ['B', 'B', 2, 5], ['B', 'R', 4, 3], ['B', 'R', 1, 5], ['B', 'P', 5, 5], ['B', 'P', 7, 2], ['B', 'P', 5, 7], ['B', 'P', 5, 6], ['B', 'P', 4, 4], ['W', 'K', 7, 3], ['W', 'Q', 3, 2], ['W', 'N', 4, 8], ['W', 'N', 7, 5], ['W', 'B', 1, 1], ['W', 'B', 8, 1], ['W', 'R', 1, 8], ['W', 'R', 3, 7], ['W', 'P', 8, 2], ['W', 'P', 6, 3], ['W', 'P', 4, 2], ['W', 'P', 1, 4], ['W', 'P', 8, 7]]
['W', 'N', 1, 5] => False (Neither knight to move to a5 from where they are)

[['B', 'K', 7, 3], ['B', 'Q', 2, 4], ['B', 'N', 5, 2], ['B', 'N', 1, 6], ['B', 'B', 7, 7], ['B', 'B', 1, 8], ['W', 'K', 7, 1], ['W', 'Q', 6, 1], ['W', 'N', 5, 6], ['W', 'N', 3, 3], ['W', 'B', 2, 2], ['W', 'B', 6, 5]]
['B', 'K', 8, 3] => False (The white bishop would put the king in check)

[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 5, 8] => False (The white queen currently has the king in check, and this move doesn't prevent that)

[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 7, 5] => True (The king is in check, and the knight blocks that)

[['B', 'K', 8, 3], ['B', 'Q', 6, 5], ['B', 'N', 7, 8], ['B', 'N', 3, 7], ['B', 'B', 4, 1], ['B', 'B', 1, 1], ['W', 'K', 7, 7], ['W', 'Q', 7, 1], ['W', 'N', 2, 2], ['W', 'N', 1, 3], ['W', 'B', 3, 5]]
['B', 'B', 2, 2] => True (takes the white knight)

[['B', 'K', 6, 1], ['B', 'Q', 6, 2], ['W', 'K', 8, 1]]
['B', 'Q', 7, 1] => True (Smallest checkmate possible, in terms of bounding box)

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


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

Це питання було скасовано в «Пісочниці», і тепер тут без жодного пояснення. Я нічого не можу зробити, аби ти змусив мене сказати, чому ти зголосився, але хоча б мати пристойність пояснити свої дії, а не мовчати в тіні. Якщо ви думаєте, що цю посаду можна вдосконалити, будь ласка, підкажіть як, а не робити знімок, не пояснюючи себе.
caird coinheringaahing

2
Ніхто цього не відмовив ...?
FlipTack

1
Чи можемо ми отримати 2d масив фрагментів як вхід?
ов

1
@ovs Так, це здається прийнятним
caird coinheringaahing

Відповіді:


3

Python 2python-chess ),  141 138 134 133  132 байт

Не роблячи жодного із дійсно цікавих кодів - але, можливо, це може змагатися з мовами для гри в гольф чи (смію це згадувати) Mathematica?

Примітка: пітон-шахи є PyPi пакет установки на Python 2.7.9+ з:
python -m pip install python-chess)

import chess
a,p,n=input()
S=chess.Board(a+' - - 0 1')
for m in S.legal_moves:1/(m.to_square!=n)**(`p`in`S.piece_at(m.from_square)`)

Повна програма, що приймає дані з трьох елементів:

  1. початок запису FEN - рядок, що містить перші два поля. Це для визначення стану плати ТА, який колір рухається (оскільки це інформація на вході в ОП, тоді як поля три-шість "фіксуються" ОП, отже, вони не повинні бути частиною вводу)
  2. назва твору, який намагається перемістити (як зазначено в ОП - один із PRNBQK)
  3. квадрат , до якого названої частина намагається рухатись , де a1їсти 0, b1їсти 1, ... a2є8 ..., h8є 63,

Програма виводить через свій вихідний код із заданим дійсним входом:

  • 1 якщо переміщення є допустимим (програма підняла помилку - через поділ на нуль);
  • 0 це не так (програма виходила нормально)

(Не варто) Спробуйте в Інтернеті! (тому що пакет python-chess не встановлений там і TIO не дозволяє підключення до Інтернету, тому код встановлення pip у заголовку не працює).

Зверніть увагу , що оператор харчування в Python робить , 1**1 == 1**0 == 0**0 == 1але 0**1 == 0
... звідси 1/0**1виникає поділ на нуль , а 1/1**1, 1/1**0і 1/0**0все вийде
(... і що в Python Falseі Trueприрівняти 0і 1відповідно).


2
Це абсолютно достовірна відповідь, але це трохи схоже на обман, схожий на вбудований лише відповідь Mathematica.
caird coinheringaahing

Так, отже, коментар я ставлю вгорі "Не роблячи жодного із дійсно цікавого коду ..." можливо, коли у мене ще є якийсь час, я зароблю Jelly (який не може імпортувати цей модуль :))
Джонатан Аллан

1
... пам'ятайте, це все-таки потребувало певних зусиль.
Джонатан Аллан

Перестановка str(S.piece_at(m.from_square))==p forна p==str(S.piece_at(m.from_square))for, що слід зберегти один байт.
Zacharý

Ага, так - спасибі @ Zacharý, я просто дивився, чи зможу розібратися з reprвикористанням задніх клавіш для заміни, strщоб зберегти ...
Джонатан Аллан

3

Regex (PCRE2), 931 925 837 байт

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

Дошка представлена в 8 × 8 ASCII , де білі фігури є великими літерами і чорного в нижньому регістрі: Р ості, до N РАВО, В ishop, R ООК, Q ueen, К Ing. Сторона Чорного (8-й ранг) знаходиться вгорі, а біла сторона (1-й ранг) - внизу. Кожен ранг розділений новим рядком, а порожні квадрати позначені як -. Дві позиції дошки розділені додатковою лінією.

Актуальною метою цього проекту є перевірка цілих ігор, а не лише окремих ходів. Нижче див. Поточний стан прогресу.

()?(?>|((.|
(?=.)){2})((?=(\X{72})-))((?=(?(1)[-a-z]|[-A-Z])))((?5)(?(?=(.*
)
)[qnrb]|p))((?5)(?(?=(?8){8}
)[QNRB]|P)))(?>((.)(?=(?5)\11)|(?(m)$)((?(1)(-(?=(?9))(?=(?3){8}((?3){9})?P(?4))(?(-1)(?=(?8){4}
))|[a-z](?=(?9))(?=(?3){7}(?2)?P(?4)))|(p(?4)((?=(?3){8}((?3){9})?-(?7))(?(-1)(?=(?8){7}
))|(?=(?3){7}(?2)?[A-Z](?7)))))|(?<e>(?6).)?(?=(?i:(?|(?(e)|(B|Q))(?27)(?(e)(B|Q))|(?(e)|(R|Q))(?31)(?(e)(R|Q))|(?(e)|(N))(?34)(?(e)(N))|(?(e)|(K))(?35)?(?(e)(K))))(?(e)(?<=(?!(?6)).)(?4)|(?6).(?5)\19))(?(e)(?=(?5)\20)|(?!(?6)).(?4)))(?<m>)|(?(+1)$)(.))+
)+\k<m>
(?!\X{0,70}((?(1)p|k)(?=(?3){7}(?2)?(?(1)K|P))|(?i:(?<E>(?!(?6))K)?((?(E)|((?6)[BQ]))(()?((?(-1)-)(?3){7}(?(-2)(?2)))+)(?(E)(?-4))|(?(E)|((?6)[RQ]))(-*|((?(-1)-)(?3){8})+)(?(E)(?-3))|(?(E)|((?6)N))((?<=..)(?2){3}|(?=.)(?2){5}|(?2){8}(?2)?)(?(E)(?-2)))(?(E)|(?&E))|K((?3){7,9})?K)))

Спробуйте в Інтернеті!

Досить надруковані та частково неопущені (абсолютні зворотні зміни змінилися на відносні, а групи захоплення змінилися на нехоплені, а в деяких випадках атомні за швидкістю):

# Chess move validation regex (PCRE)
()?                 # decide whether to evaluate this as white's or black's move; \1 set = white, \1 unset (NPCG) = black
(?>|                # subroutines:
  ((.|\n(?=.)){2})                  # (?3) = for moving within the board, without wrapping to the next board, (?2) = (?3){2}
  ((?=                              # (?4) = assert that position of just-consumed piece is vacated on the next turn
    (\X{72})                        # (?5) = skip to the position of the just-consumed piece on the next turn
  -))
  ((?=(?(1)[-a-z]|[-A-Z])))         # (?6) = assert that the piece at the current position belongs to the current player's opponent or is empty
  ((?5)(?(?=(.*\n)\n)[qnrb]|p))     # (?7) = black pawn that might be promoted, (?8) = .*\n
  ((?5)(?(?=(?8){8}\n)[QNRB]|P))    # (?9) = white pawn that might be promoted
)
(?>
  (?>
    # Handle squares that don't change (empty->empty or pieces that doesn't move)
    (.)(?=(?5)\g{-1}) |
    # Handle a piece that moves (and optionally captures an enemy piece)
    (?(m)$)  # allow only one move to be made per turn
    (?>
      (?(1)
        (?:                                                         # white pawn
            -  (?=(?9))(?=(?3){8}((?3){9})?P(?4))(?(-1)(?=(?8){4}\n)) |   # move 1 or 2 spaces forward
          [a-z](?=(?9))(?=(?3){7}(?2)?     P(?4))                     )   # capture diagonally
      |
        (?:p(?4)(?:                                                 # black pawn
          (?=(?3){8}((?3){9})?  -  (?7))(?(-1)(?=(?8){7}\n)) |            # move 1 or 2 spaces forward
          (?=(?3){7}(?2)?     [A-Z](?7)) )                   )            # capture diagonally
      ) |
      # bishops, rooks, queens, knights, or kings
      (?<e>(?6).)?   # decide between scanning forward (<e> is unset) or backwards (<e> is captured)
      (?=
        (?i:
          (?|
            (?(e)|(B|Q)) (?&B)  (?(e)(B|Q)) | # bishops or queens
            (?(e)|(R|Q)) (?&R)  (?(e)(R|Q)) | # rooks or queens
            (?(e)|(N  )) (?&N)  (?(e)(N  )) | # knights
            (?(e)|(K  )) (?&K)? (?(e)(K  ))   # kings
          )
        )
        (?(e)(?<=(?!(?6)).)(?4)|(?6).(?5)\g{-2})   # verify that the piece moved, and optionally captured piece, are of the correct color
      )
      (?(e)(?=(?5)\g{-1})|(?!(?6)).(?4))   # verify that the piece moved is the same type and color at its destination in the next turn's board position
    )(?<m>) |
    (?(+1)$)(.)  # handle the destination/source square that a piece moved to/from (only allow matching one of these per turn)
  )+\n
)+
\k<m>         # assert that a move has taken place
\n
# don't allow moving into check  
(?!
  \X{0,70}
  (?:
    # pawns (capture diagonally)
    (?(1)p|k)(?=(?3){7}(?2)?(?(1)K|P)) |
    # bishops, rooks, queens, knights, or kings
    (?i:
      (?<E>(?!(?6))K)?   # decide between scanning forward (<E> is unset) or backwards (<E> is captured)
      (?:
        (?(E)|((?6)[BQ])) (?<B>()?((?(-1)-)(?3){7}(?(-2)(?2)))+)         (?(E)(?-4)) | # bishops or queens
        (?(E)|((?6)[RQ])) (?<R>-*|((?(-1)-)(?3){8})+)                    (?(E)(?-3)) | # rooks or queens
        (?(E)|((?6) N  )) (?<N>(?<=..)(?2){3}|(?=.)(?2){5}|(?2){8}(?2)?) (?(E)(?-2))   # knights
      )
      (?(E)|(?&E)) |
      K(?<K>(?3){7,9})?K   # kings
    )
  )
)

-88 байт, використовуючи безатомні виклики підпрограми, таким чином перенацілюючи з PCRE1 на PCRE2

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

Ось зразкова гра, затверджена повним регулярним виразом (PCRE1 - ще не повторно знято) [regex101.com] .

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

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

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


Я не був сповнений такої страхітливості з того часу, як я закашляв чудовисько з регексу в 3000 байтів для питання про перевірку судоку (велика помилка, враховуючи, що переможна відповідь отримала її менше ніж 75). Дійсно доводить те, що іноді, використовуючи регулярний вираз для вирішення проблеми, у вас виникають дві проблеми
Value Ink

@ValueInk Хе, можливо, ти маєш рацію, але мені подобається, незважаючи на (а може, через) його цілковиту непрактичність. Ваш коментар надихнув мене на спробу відповісти на це питання судоку, але мені вдалося лише 200 байт . Що ж, добре.
Deadcode
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.