Kontekst
Chess960 (lub Fischer Random Chess) to odmiana szachów wymyślona i popierana przez byłego mistrza świata w szachach Bobby'ego Fischera, ogłoszona publicznie 19 czerwca 1996 r. W Buenos Aires w Argentynie. Używa tej samej planszy i pionków co standardowe szachy; jednakże początkowa pozycja pionków na domowych poziomach graczy jest losowa
Zasady
- Białe pionki są umieszczane na drugiej pozycji, tak jak w standardowych szachach
- Wszystkie pozostałe białe pionki są losowane na pierwszym poziomie
- Biskupi muszą być umieszczeni na kwadratach o przeciwnych kolorach
- Król musi zostać umieszczony na kwadracie między wieżami.
- Kawałki czarnych są umieszczane równo i przeciwnie do kawałków białych.
Od: http://en.wikipedia.org/wiki/Chess960
Dla wszystkich osób, które chciałyby zamieszczać odpowiedzi ...
musisz stworzyć generator pozycji Chess960, zdolny do losowego wygenerowania jednej z 960 pozycji zgodnie z zasadami opisanymi powyżej (musi być w stanie wyprowadzić dowolną z 960, twarde kodowanie jednej pozycji nie jest akceptowane!), i musisz tylko wyślij białą rangę jeden kawałek.
Przykładowe dane wyjściowe:
rkrbnnbq
gdzie:
- król
- q królowa
- biskup
- n rycerzu
- wieża
To będzie golf golfowy, a remis będzie pozytywny.
źródło
Odpowiedzi:
GolfScript (
4948 znaków lub 47 dla wydruku wielkimi literami)Wykorzystuje standardową technikę permutacji losowo, dopóki nie spełnimy kryteriów. W przeciwieństwie do rozwiązania GolfScript firmy w0lf, sprawdza oba ciąg, więc prawdopodobnie przepłynie przez pętlę więcej razy.
Użycie wielkich liter pozwala zapisać jeden znak:
źródło
Ruby 1.9,
6765 znakówAch, stara technika „kontynuuj losowanie, aż wygenerujesz coś ważnego” ...
(W Ruby 2.0
%w(r r n n b b q k)
może być'rrnnbbqk'.chars
)źródło
~
kosztach ostrzeżenia, jeśli są dostępne. pastebin.com/nuE9zWSw$_
zmienna. Działa, ponieważ Ruby ma kilka schludnych metod, takich jak Kernel # chop, które działają jak równoważna metoda String # chop, ale z$_
ich odbiornikiem. Oszczędza to dużo czasu, gdy (na przykład) piszesz pętlę odczytu / przetwarzania / zapisu za pomocąruby -n
lubruby -p
.GolfScript
6049(skrócono do 49 znaków dzięki doskonałym wskazówkom Petera Taylora)
Test online tutaj .
Objaśnienie kodu:
źródło
b
wydaje się bardzo długa. Jak o.'b'/1=,2%
?'qbbnnxxx'
pętlę i przetasowując ten sam ciąg.J, 56 znaków
na moim komputerze zajmuje kilka sekund z powodu nieefektywnego algorytmu. Pewną szybkość można uzyskać, dodając wcześniej
~.
(usuń duplikaty)'kqbbnnrr'
.wyjaśnienie:
?~!8
zajmuje8!
losowe elementy z0 ... 8!
'kqbbnnrr'A.~
używa ich jako indeksów anagramów do łańcuchakqbbnnrr
.(#~'...'&rxeq"1)'
filtruje je według wyrażenia regularnego w cudzysłowie.{.
oznacza „weź pierwszy element”źródło
K, 69
źródło
Python, 105 znaków
Zasadniczo technika chroniona, bez eleganckich rubinowych elementów.
Podziękowania dla Petera Taylora za skrócenie wyrażenia regularnego.
źródło
not s('b(..)*b',a)
Wydaje się, że to przesadne powiedzenies('b.(..)*b',a)
. Ponadto,sample
może być krótszy niż jeden znakshuffle
, ale wymaga dodatkowego argumentu.Shuffle
powracaNone
, więc nie jest dobrze :(or
regularnych , ponieważ sprawdzasz ten sam ciąg znaków i jest on równoważny wyrażeniom regularnym wyrażenia regularnego (|
). Zapisuje 13 znaków.