Geçerli bir satranç hamlesi mi?


15

Alternatif isim: ChessMoveQ

Her biri 4 öğeden oluşan en fazla 32 öğeden oluşan bir liste ve 4 öğeden oluşan ikinci bir liste verildiğinde, ikinci girdide ayrıntılı olarak verilen hareketin geçerli bir satranç hareketi olup olmadığını belirleyin.

İlk liste tahtadaki 32 parçanın konumunu gösterir. Her element , beyaz kralın açık olduğunu gösteren ( normal bir satranç tahtasında) <colour>, <piece-name>, <x-coord>, <y-coord>gibi yapıyı takip edecektir . İlk girişin tüm öğeleri benzersiz olacaktır. ve her zaman 1 ile 8 arasında olacaktır. Bir örnek:["W", "K", 5, 1]5, 1e1<x-coord><y-coord>

[["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]]

yönetim kurulunu temsil eder:

bir satranç tahtası örneği

İkinci girdi, birincinin alt listeleriyle aynı yapılardan oluşacaktır, ancak parçanın nerede olduğunu gösteren x ve y koordinatları yerine, nereye taşınmaya çalıştığını gösterirler.

Yukarıdaki örnek için geçerli bir hamle olabilir ["W", "B", 4, 3](piskopos bir kareyi ileri ve sola hareket ettirebilir) ["B", "R", 4, 1]ve kale bir şövalyeden geçmek zorunda kalacağı için geçersiz bir hamle ve piyon kareye ulaşmak için olabilir. Hareket zaman zaman birden fazla parçaya atıfta bulunabileceğinden , belirtilen parçalardan herhangi birinin hareketi yapıp yapamayacağını test etmelisiniz , sadece bunlardan birini değil. Örneğin, ilk örnek yalnızca bir fil için geçerlidir, ancak yine de geçerli bir harekettir. Ancak, hiçbir siyah kale ikinci hareketi gerçekleştiremez, bu nedenle geçersizdir.

Göreviniz, ikinci girdide ayrıntılı hareketin geçerli bir satranç hamlesi olup olmadığını belirlemektir. Kuralın geçerliliği, taşınmaya çalışan parçaya bağlı olarak değişir (geçerli hareketlerin şeması için parçanın adına tıklayın):

  • Herhangi bir parça : Bu kare diğer renkten bir parça tarafından işgal edilmedikçe, zaten işgal edilmiş bir kareye veya tahtadan hiçbir parça hareket edemez. Örneğin, beyaz bir parça siyah bir parça tarafından işgal edilen bir kareye doğru hareket edebilir, ancak beyaz bir parçaya değil. Ayrıca, Şövalyeler dışında hiçbir parça, başka bir parça tarafından doğrudan engellenen karelere taşınamaz.
    • Bir parça tarafından bir hareket B kare için C parçası tarafından, "doğrudan engel" bir A ise bir arasında, bir düz (ortogonal veya çapraz) hattı içinde, doğrudan B ve C .
  • Herhangi bir taş : Kralın pozisyonu bir taş hareketinin geçerliliğini de etkileyebilir. Bu iki koşuldan biri karşılanırsa, taşıma geçersizdir:
    • Nesli tükenmekte olan kralla aynı tarafta bir parça hareket ettirerek kralı kontrol etmeye teşhir etmek. Bu, sadece kralı kontrol etmek için hareket eden karşıt bir parça yerine, karşıt olmayan bir parça hareket yaparsa geçerlidir.
    • O bu durumda kontrol altında kral bırakarak vardır çek dışına taşımak için. Kral çek ve hareket dikte ise nedenle, başka bir parça taşır, geçersiz bir hamle olduğunu sürece diğer parça kontrolü engelliyor. Bir parça kontrolü iki yoldan biriyle önleyebilir: ya parça kontrol kontrolü yapar ya da parça kontrol kontrolü ve kral arasındaki yolu engeller.
    • “Çek”, kralın rakibinin (hamle sırası ise) yasal olarak bir şahı o krala taşıyabildiği bir durumdur. Bu kural tekrarlı olarak uygulanmaz, yani rakibin o krala hamle kendi kralını kontrol altında bıraksa bile bir kral kontrol altındadır.
  • Piyonlar : Bir piyon, bir kareyi boş bir kareye doğru (yani beyaz ise yukarı, siyah ise aşağı doğru) hareket ettirebilir. Ayrıca üç özel durum vardır:
    • Piyon henüz hareket etmediyse (Y koordinatını kullanarak bunu belirleyebilirsiniz; Y koordinatları 2 ise beyaz piyonlar hareket etmedi, Y koordinatları 7 ise siyah piyonlar hareket etmedi), piyon iki kareyi boş bir kareye ilerletebilir.
    • Piyonun önünde çapraz olarak bir rakibin parçası varsa (yani beyaz ise piyonun kuzey-batı veya kuzey-doğu ya da siyah ise güney-batı veya güney-doğudaki kare üzerinde), piyonun söz konusu işgal edilen kareye taşınmasına izin verilir.
    • Bir piyon normal satranç kurallarında son Y koordinatına (beyaz için 8 veya siyah için 1) hareket ederse, aynı renkteki bir kraliçe, kale, şövalye veya piskoposa yükseltilmelidir. Bu sorunun amaçları doğrultusunda, terfi seçiminin hareketin geçerli olup olmadığı (ve girdi biçiminde ifade edilememesi) ile ilgisi yoktur, ancak terfi ile sonuçlanacak piyon hareketlerine izin verilmelidir.
  • Piskoposlar : Piskoposlar, kesintisiz engelsiz kartlar arası (yani diyagonal) yol boyunca 1 ila 8 kare arasında hareket edebilir.
  • Şövalyeler : ŞövalyelerL, aşağıdaki (eşdeğer) hareketlerden birini içerenbirşekilde hareket edebilir:
    • Herhangi bir kardinal yönde tek bir kare, ardından 90/270 ° dönüş, ardından 2 kare ileri hareket.
    • Herhangi bir kardinal yönde 2 kare, ardından 90/270 ° dönüş, ardından tek bir karenin ileri doğru son hareketi.
    (Son karesinin hala yasal olmasına rağmen, bir şövalyenin yolunun araya giren parçalar tarafından engellenemeyeceğini unutmayın.)
  • Kale : Kale sürekli engelsiz kardinal yol boyunca 1 ile 8 kare arasında hareket edebilir.
  • Kraliçeler : Kraliçeler, herhangi bir sürekli kardinal veya kartlararası (yani diyagonal) engellenmemiş yol boyunca 1 ila 8 kare arasında hareket edebilir.
  • Krallar : Krallar kraliçe gibi hareket ederler, ancak her hamle başına sadece bir kare hareket etmekle sınırlıdırlar (yani bir kral sadece kardinal veya çapraz olarak bitişik karelere hareket edebilir). Hatırlatma olarak, kralınızı kontrol altında tutan bir hamle yapamazsınız; böylece kralınızı da kontrol altına alamazsınız.

Satranç kuralları "fırlatma" ve "pasif" olarak adlandırılan özel hamleler de içerir. Bununla birlikte, bu hamlelerin yasallığı sadece mevcut pozisyona değil, oyunun tarihine bağlı olduğundan (ve cast, aynı anda iki parçanın hareket etmesini gerektirdiğinden, giriş formatına uymayan), bu hamlelerin hiçbirini dikkate almamalısınız. var olmak (yani, patlayan veya geçen bir hareket yasadışı sayılmalıdır).

Bir taşınmanın geçerliliğini belirtmek için iki farklı sonuç çıktısı alabilirsiniz ve istediğiniz yöntemde girdi alabilirsiniz. İsterseniz konumlar için 1 dizinleme yerine 0 dizinini de seçebilirsiniz. Bu bir , bu yüzden en kısa kod kazanır!

Test senaryoları

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)

Bu meydan okuma korumalı . Herhangi bir açıklama yapmadan downvotes aldı, bu yüzden yine de göndermeye karar verdim


"Aynı taraftaki bir parça, kralı kontrol etmek için açığa çıkarır." - bu ifadeler artık altında olduğu başlığı taşıdığınız için uygun görünmüyor. Bunu "Bu parçayı taşımak kralı kontrol etmek için açığa çıkaracak" gibi bir şeye değiştiririm
FlipTack

Bu soru Sandbox'ta indirildi ve şimdi burada tek bir açıklama olmadan. Bana neden aşağı indirdiğinizi söylemenizi sağlamak için yapabileceğim hiçbir şey yok, ama en azından gölgelerde sessiz kalmak yerine eylemlerinizi açıklama nezaketinde bulunun. Bu yazının geliştirilebileceğini düşünüyorsanız, kendinizi açıklamadan bir pot çekimi yapmak yerine nasıl yapacağınızı lütfen önerin.
Caird coinheringaahing

2
Kimse onu indirmedi ...?
FlipTack

1
Giriş olarak 2 boyutlu bir dizi alabilir miyiz?
17:36

1
@ovs Evet, bu kabul edilebilir görünüyor
caird coinheringaahing

Yanıtlar:


3

Python 2 ( python-satranç ile ),  141131133131321  bayt

Gerçekten ilginç kodların herhangi birini yapmadan - ama belki bu golf dilleri ile rekabet edebilir veya (bahsetmeye cesaret) Mathematica?

Not: python-satranç bir olduğunu Pypi paketi ile 2.7.9+ Python kurun:
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)`)

Üç öğenin girişini kabul eden tam program:

  1. bir FEN kaydının başlangıcı - ilk iki alanı içeren dize. Bu, pano durumunu VE hangi rengin hareket ettiğini tanımlamak içindir (çünkü OP'deki girişteki bilgiler budur, oysa üç ile altı arasındaki alanlar OP tarafından "sabitlenir" bu nedenle girişin bir parçası olmamalıdır)
  2. Parça adı (OP verilen - biri hareket teşebbüs PRNBQK)
  3. adlı parça yere gitme girişiminde olduğu için kare a1olduğunu 0, b1bir 1... a2edilir 8, ..., h8ise 63,

Program , geçerli girdi verildiğinde çıkış kodu üzerinden çıktı alır:

  • 1 taşıma geçerliyse (program bir hata yarattı - sıfıra bölme nedeniyle);
  • 0 öyle değil (program normal olarak çıkıldı)

(Yapma) Çevrimiçi deneyin! (Python-satranç paketi orada kurulu olmadığından ve TIO internet bağlantısına izin vermediğinden, başlıktaki pip-install kodu çalışmaz).

Python güç operatörü yapar Not 1**1 == 1**0 == 0**0 == 1ama 0**1 == 0
... dolayısıyla 1/0**1sıfır hata ile bir bölünme yükseltir ederken 1/1**1, 1/1**0ve 1/0**0tüm başarılı
(... ve Python o Falseve Trueequate için 0ve 1sırasıyla).


2
Bu tamamen geçerli bir cevap, ama sadece yerleşik bir Mathematica cevabına benzer bir şekilde hile gibi geliyor.
Caird coinheringaahing

Evet, bu yüzden en üste koyduğum yorum "Gerçekten ilginç kodlardan herhangi birini yapmadan ..." belki biraz daha zamanım olduğunda (bu modülü içe aktaramıyorum :))
Jonathan Allan

1
... hala sana biraz çaba sarf etti.
Jonathan Allan

Yeniden str(S.piece_at(m.from_square))==p fordüzenleyin p==str(S.piece_at(m.from_square))for, bu bir bayt tasarruf etmelidir.
Zacharý

Ah, evet - teşekkürler @ Zacharý Sadece kurtarmak repriçin değiştirmek striçin backticks ayrıştırmak olmadığını görmek için bakıyordum ...
Jonathan Allan

3

Düzenli İfade (PCRE2), 931 925 837 bayt

Bu çözüm, bir yönetim kurulu durumu ve bir hamle yerine iki yönetim kurulu durumunun normal ifadeye aktarılmasıyla ilgili sorun ifadesinden ayrılmaktadır. Hareket, iki yönetim kurulu devleti arasındaki farktan anlaşılmaktadır. Bu yüzden, test senaryolarını bu soru tarafından sağlanan formatta almayı, açıklanan parçanın tüm örneklerini tahtada bulmayı ve her biriyle, onu hedef konuma taşımayı ve normal ifadeyi değerlendirmeyi denedim. bu olasılıkla, normal ifadeyle geçerli olup olmadığını bildirmek. Bu uygun değilse bana bildirin; reggex'i pozisyon + hareket olarak uygulamak mümkündür, ancak çok daha az zarif ve ciddi yeniden düzenleme gerektirir.

: Kurulu beyaz parçalar büyük harf ve siyah küçük harf olur 8 x 8 ASCII temsil edilmektedir P kılçık, k , N ight, B iShop, R, bakınız, S ueen, K ing. Siyah tarafı (8. sıra) üstte ve beyaz tarafı (1. sıra) altta. Her sıralama bir satırsonu ile ayrılır ve boş kareler olarak işaretlenir -. İki kart pozisyonu ekstra bir satırsonu ile ayrılır.

Bu projenin asıl amacı, sadece tek hamleleri değil, tüm oyunları doğrulamaktır. Mevcut ilerleme durumu için aşağıya bakın.

()?(?>|((.|
(?=.)){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)))

Çevrimiçi deneyin!

Güzel yazdırılmış ve kısmen ungolfed (mutlak geri başvurular göreceli olarak değiştirildi ve yakalama grupları yakalanmamaya veya bazı durumlarda hız için atomik hale geldi):

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

Atomik olmayan alt rutin çağrıları kullanarak -88 bayt, böylece PCRE1'den PCRE2'ye yeniden hedefleme

Yukarıdaki sürüm, yolcu veya rıhtıma izin vermeyecek şekilde değiştirildi, ancak tam proje şu anda başlangıçtaki tahta durumundan başlayarak (standart satranç başlangıç ​​pozisyonu olmalıdır - Chess960 değil) ancak en azından desteklenir). Yolcu ve rıhtım kurallarının tamamı uygulanır.

İşte tam regex tarafından onaylanmış bir örnek oyun (PCRE1 - henüz yeniden hedeflenmemiş) [regex101.com] .

Geçersiz bir hamle, sonraki her tahta pozisyonunun eşleşmemesine / vurgulanmamasına neden olur. Şah mat / çıkmaz tespiti ve dolayısıyla kazananın kim olduğunu (ya da berabere olup olmadığını) tespit etme henüz uygulanmamıştır; bu yüzden bu örnekteki son kurul durumu vurgulanmamıştır.

İşte cebirsel gösterimi bu normal ifade tarafından tanınan biçime dönüştüren bir C / C ++ programı. Şu anda cebirsel gösterim, kaynak kodunda satır içi bir dizi biçiminde, her hareket için ayrı dizeler olacak şekilde yerleştirilmeli, ancak stdin'den tek bir dize veya komut satırı bağımsız değişkeni olarak okunmalı ve tüm hareket dizisi boşluklarla ayrılmış olmalıdır. ve nokta sonlu hareket sayıları planlanır.

Ayrıca, sadece cebirsel satranç notasyonunda tam bir oyunu doğrulayan ve standart başlangıç ​​pozisyonunun ima edildiği bir regex'e başladım. İhtiyaç duyduğu tek şey, girişin sonuna (hamle listesinden sonra) eklenen boş bir "karalama tahtası" dır. Bunu tam olarak uygulamak ve bir ara bitirmeyi planlamak mümkün olduğundan eminim.


Bir Sudoku doğrulama sorusu için 3000 baytlık bir regex monstrosity öksürdüğümden beri bu kadar dehşete kapılmadım (kazanan cevabın 75'ten az aldığını düşünen büyük bir hata). Bir problemi çözmek için regex kullandığınızda, iki problemle sonuçlandığınızı gerçekten kanıtlarsınız
Value Ink

@ValueInk Heh, belki haklısın, ama tamamen pratik olmamaya bakılmaksızın (veya belki de yüzünden) hoşuma gidiyor. Yorumunuz bana bu Sudoku sorusunu cevaplamaya çalışmam için ilham verdi, ancak sadece 200 bayt yönettim . Oh iyi.
Deadcode
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.