Wyzwanie
Notacja Forsyth – Edwards (FEN) to standardowa notacja opisująca konkretną pozycję na planszy w szachach. Twoim zadaniem jest ocena wyniku za pomocą ciągu FEN. To jest przykład ciągu FEN:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Za pomocą tego ciągu możesz obliczyć ocenę materiału dla każdego koloru za pomocą następującej tabeli wyników:
- p / P = pionek = 1 punkt
- n / N = rycerz = 3 punkty
- b / B = Biskup = 3 punkty
- r / R = Wieża = 5 punktów
- q / Q = królowa = 9 punktów
- k / K = król, nie mają one żadnych punktów, ponieważ każda pozycja prawna zawiera króla z każdej strony
Białe elementy są oznaczone dużymi literami („PNBRQK”), a czarne - małymi literami („pnbrqk”). Puste kwadraty są zapisywane za pomocą cyfr od 1 do 8 (liczba pustych kwadratów), a „/” rozdziela szeregi.
Na podstawie przykładowego ciągu FEN możemy obliczyć oceny materiałowe dla każdej strony:
Dla czerni:
5 k 2 / ppp 5 / 4P3 / 3R3 p / 6P1 / 1K2N r 2 / PP3P2 / 8
Wszystkie pozostałe czarne kawałki: p + p + p + p + r, w sumie jest to 9
Dla bieli:
5k2 / ppp5 / 4 P 3/3 R 3p / 6 P 1/1 K 2 N r2 / PP 3 P 2/8
Zostały wszystkie białe pionki: P + R + P + N + P + P + P, w sumie 13
Wynik końcowy określa się według następującego wzoru: Wynik biały - wynik czarny = wynik końcowy , więc na przykład wynik końcowy to: 13 - 9 = 4
Przykład :
Wejście:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Wynik:
4
Wszystko w golfa kodowego tutaj zasady , wygrywa rozwiązanie z najmniejszą liczbą bajtów.
Jak publikować
# Language Name, N bytes
[code]
[explaination, etc.]
Odpowiedzi:
CJam,
282726 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
> <> ,
64575653 bajtów(-7 bajtów z pewną inspiracją z odpowiedzi @ El'endiaStarman, -3 bajty dzięki @randomra)
Wyjaśnienie
Program używa codbox jako tabeli przeglądowej. Pozycje poza zasięgiem nie działają z tłumaczem online, więc działa to tylko z oficjalnym tłumaczem w języku Python.
Pierwszy wiersz popycha kawałki, a następnie wartości kawałków. Przesuwa również początkowe 0, aby rozpocząć sumę dla trzeciej linii.
Drugi wiersz następnie umieszcza odpowiednią wartość dodatnią lub ujemną w odpowiedniej komórce kawałka, np.
-1
Umieszcza się w('p', 4)
i1
umieszcza('P', 4)
. Długość stosu jest sprawdzana, aby upewnić się, że pętla działa 5 razy.Po zakończeniu pętli stos składa się z naszego pojedynczego zera z pierwszej linii. Dla każdego znaku wykonujemy wyszukiwanie odpowiedniej komórki w tabeli i dodajemy ją do naszej sumy. Domyślnie niezainicjowane wartości komórek wynoszą 0, co jest idealne do naszych celów.
Ostatnia linia po prostu wypisuje wynik.
źródło
Ruby, 88 znaków
To niezręczne i brzydkie, i prawdopodobnie jest lepszy sposób, ale no cóż.
{foo: 'bar'}
Składnia Ruby'ego jest po prostu cukrem dla{:foo => 'bar'}
- jest to denerwujące dla golfa, ponieważ oznacza, że muszę przekonwertować klucz na symbol przed użyciem go do uzyskania dostępu do elementu skrótu (:"#{x}"
jest o jeden znak krótszy niżx.to_sym
).źródło
Pip, 39 bajtów
Przejdę moją krótką kolejkę, zanim nadejdą odpowiedzi CJam i Pyth ...
Pobiera ciąg FEN jako argument wiersza polecenia. Oto wyjaśnienie nieco nie golfowej wersji:
źródło
Perl, 44 bajty
Licząc shebang jako jeden, dane wejściowe są pobierane ze standardowego wejścia.
Przykładowe użycie
Wyjaśnienie
Kawałki są transliterowane z ich odpowiednimi wartościami. Jeśli utwór jest pisany wielką literą (tzn. Mniej niż
a
), jego wartość jest dodawana do sumy, jeśli nie, jest odejmowana.źródło
JavaScript ES7, 79 bajtów
124131Tak krótko, jak tylko mogę. Używa fantazyjnych interpretacji tablic, aby przewijać ciąg.
Wyjaśnienie
źródło
Minkolang 0,9 ,
72656460444241 bajtówWypróbuj tutaj.
Ogromne podziękowania dla Sp3000 za wskazanie znacznie bardziej wydajnego sposobu na zrobienie tego!
Wyjaśnienie
13359"QRBNP"m
popycha wyniki oraz odpowiadające im znaki, to przeplata je, więc wygląda jak stos to:[1,80,3,78,3,66,5,82,9,81]
. Następnie5[d3~c~$r48*+0p0p]
umieszcza wynik każdego znaku, zarówno małymi, jak i dużymi, w swoim miejscu w obszarze kodu. Wreszcie,$I[o0q+]N.
pętle przechodzą przez dane wejściowe, aż będą puste, dodając wyniki w miarę upływu czasu.źródło
CJam, 33 bajty
Oto super naiwny sposób na wyszukiwanie strun. Wypróbuj online .
źródło
Ouroboros , 82
Ouroboros to esolang, który zaprojektowałem w tym tygodniu. Czas na wyprawę!
Każda linia poleceń 1 -znakowych 1 reprezentuje węża usoboros, w którym wykonywanie przebiega od głowy (początek) do ogona (koniec) i zapętla się z powrotem do głowy.
(
i)
umożliwiają zjedzenie części ogona lub cofnięcie go, zmieniając w ten sposób, które polecenia zostaną wykonane. Jeśli wskaźnik instrukcji zostanie kiedykolwiek połknięty, wąż umiera (przestaje działać). Program Ouroboros składa się z jednego lub więcej węży wykonujących się równolegle. Każdy wąż ma własny stos, a także wspólny stos.1 Jeden wyjątek, który odróżnia Ouroboros od wielu języków 2D: liczby wielocyfrowe można pisać prosto, bez konieczności wykonywania obliczeń matematycznych lub wypychania 0.
Snake 1
Pierwszy wąż czyta znak (
i
) i sprawdza, czy jest to -1 / EOF (.1+!
). Jeśli tak, zjada większość ogona, aż doM
(57*(
).Wąż następnie zamienia kod znakowy z licznikiem znajdującym się nad nim na stosie (
\
), przenosi licznik do wspólnego stosu (m
) i połyka inny znak (1(
). Jeśli już połknął pęczek, oznacza to, że połyka,(
że adres IP jest aktualnie włączony i umiera. W przeciwnym razie wykonanie przebiega przez przesunięcie licznika z powrotem do stosu węża 1, zamianę go kodem char i ponowne zwrócenie znaku, który został wcześniej połknięty (M\1)
).Następnie używamy operacji matematycznych i operacji na stosie, aby wygenerować odpowiedni wynik dla postaci.
.96>
sprawdza, czy ma małe litery, czy nie; kolejne są32*-
konwertowane na wielkie litery. Następnie długi odcinek od.80=
do81=9*++++
mapP
->1
,N
->3
itd. Wreszcie,\2*1\-*
neguje wynik, jeśli litera była pisana małymi literami, i+
dodaje go do licznika wyników. Wąż zapętla się i czyta inną postać.Snake 2
Drugi wąż zaczyna się od operacji regurgitacji (
)
), która za pierwszym razem nic nie robi (ponieważ nic nie zostało jeszcze połknięte, a także odkąd wyskakuje pusty stos0
). Następnie wypycha długość współdzielonego stosu do własnego stosu i logicznie neguje (L!
). Daje to,1
jeśli stos jest pusty, w0
przeciwnym razie. Wąż mnoży się przez 4 i zjada tyle znaków (4*(
).Jeśli wspólny stos był pusty, oznacza to, że wąż kończy się przed
S
. Odsuwa się4
i zapętla z powrotem do miejsca)
, w którym powraca do postaci, które właśnie połknął i zaczyna od nowa.Jeśli jednak na stosie wspólnym znajdowała się wartość, żadne znaki nie są połykane i wykonywanie jest kontynuowane. Wąż przełącza się na wspólny stos i wypisuje tam liczbę (
Sn
); następnie połyka swój ostatni znak i umiera (1(
).Synchronizacja
Dwa węże muszą być dokładnie zsynchronizowane, aby nigdy nie było wartości na stosie wspólnym, gdy wąż 2 sprawdza, aż do osiągnięcia końca danych wejściowych. Snake 1 umieszcza wartość na wspólnym stosie na krótko przy każdym przejściu przez swoją pętlę. Dlatego
L
polecenie węża 2 nie może być nigdy wykonywane między poleceniamim
iM
w wężu 1. Na szczęście węże układają się bardzo dobrze. Co najważniejsze, długość pętli węża 1 (70 instrukcji) jest wielokrotnością pętli węża 2 (7 instrukcji), więc obie nigdy się nie zsynchronizują:Gdyby liczby nie wyszły tak idealnie, wybrałbym jednego lub oba węże spacjami, aby dopasować je w razie potrzeby.
Wszystko to bardzo dobrze, ale chcę to zobaczyć w akcji!
Oto powyższy program za pośrednictwem Stack Snippet. Nawet przy 1000 operacjach na sekundę potrzeba około 10 sekund, aby wypluć odpowiedź na przykładowe dane wejściowe - ale tak się dzieje!
Pokaż fragment kodu
źródło
JavaScript ES6, 71
Jako funkcja anonimowa
źródło
Perl 5,
7163 bajtówZmienia to
$\
(separator liniiprint
, od którego zaczyna się fałsz) dla każdego alfanumerycznego ciągu, który jest kluczem skrótu%a
zdefiniowanego na początku. Zwiększa$\
wartość skrótu, jeśli litera jest kluczem; w przeciwnym razie zwiększa wartość ujemną wartości skrótu, jeśli wielka litera jest kluczem; w przeciwnym razie nic nie dodaje.Ogromne podziękowania dla primo za uratowanie mi ośmiu bajtów (w komentarzu do tej odpowiedzi).
Mogę zapisać kolejny bajt z inną sugestią od primo (dzięki!): Zmień
$a{$_}||-$a{uc$_}
na$a{$_}-$a{$"^$_}
. Ale to chyba inna odpowiedź niż moja, więc nie wezmę za to „kredytu” (-1 bajtu).źródło
Clojure / ClojureScript, 63 znaków
Napisany przy użyciu ClojureScript REPL, powinien być również prawidłowym Clojure. Wypróbuj tutaj . Wpisz go, a następnie zadzwoń, używając
(*1 "FEN_string_here")
Całkiem proste.
{"P"1..."q"-9}
jest dosłowną strukturą danych dla mapy „P” na 1, „N” na 3 itd.map
przyjmuje tę funkcję jako pierwszy argument, a strukturę danych jako drugą - w tym przypadku używa funkcji struktura danych (dosłowna mapa) może działać jako własna funkcja akcesora. Parametr ciągu (%
z makra funkcji) można traktować jako listę pojedynczych ciągów znaków. Każda postać, której nie ma na mapie, znajdzie sięnil
na liście wynikowej, co na+
szczęście ignoruje.źródło
Pyth, 25 bajtów
Demonstracja
Używa następującej formuły mapowania dla liter w
pbnrq
, jeślik
jest to litera:Jest to reprezentowane w Pyth jako:
Najpierw program tworzy wersję danych z zamienianą wielkością liter, a następnie na obu ciągach filtrów dla małych liter, następnie stosuje powyższą formułę, a następnie sumuje i odejmuje wartości czarne od wartości białych.
źródło
Python 3, 93
źródło