Golf strzelcem golfa

25

Jako dziecko często grałem w grę karcianą golf . Twoim wyzwaniem, jeśli zdecydujesz się je zaakceptować, jest obliczenie wyniku ręki golfowej. Ponieważ w tej grze karcianej 1 jest ponad 9000 odmian , zastosujemy się do zasad, które pamiętam.

Zasady gry)

  • Kończysz rundę 6 kartami i chcesz mieć jak najmniej punktów.

  • Jokery nie są używane.

  • Asy i 2s są warte odpowiednio -1 i -2 punktów.

  • Walety i królowie są warte 0 punktów.

  • Karty od 3 do 10 są warte wartości nominalnej. Są one jednak anulowane po ich sparowaniu. Na przykład 5 jest wart 5 punktów, ale dwa 5 są warte zero. Trzy 5s są warte 5 punktów (ponieważ pierwsze 2 są sparowane, ale trzeci nie jest.), A cztery 5s są warte 0 (ponieważ tworzy 2 pary).

  • Królowe są warte 15 punktów. Królowych nie można anulować, np. 2 królowe są warte 30 punktów.

Zasady (wyzwania)

Wejście będzie tablicą liczb całkowitych lub 6 pojedynczych liczb całkowitych. Którykolwiek wolisz. 1 oznacza asa, 2-10 oznacza 2-10, a Jack, Queen i King reprezentują 11, 12 i 13. Wynik jest wynikiem rozdania zgodnie z powyższymi zasadami. Możesz bezpiecznie założyć, że wszystkie dane wejściowe są prawidłowe, np. Żadna liczba nie pojawia się więcej niż 4 razy, a wszystkie liczby są w zakresie [1, 13]. Dane wejściowe i wyjściowe mogą mieć dowolny rozsądny format.

Test IO:

[11, 10, 3, 1, 2, 2]    --> 8
[4, 5, 5, 3, 8, 7]      --> 22
[2, 2, 2, 2, 1, 1]      --> -10 (The lowest score possible)
[12, 12, 12, 12, 10, 9] --> 79 (The highest score possible)
[9, 9, 9, 9, 11, 1]     --> -1
[8, 8, 8, 8, 11, 13]    --> 0
[10, 9, 3, 7, 12, 2]    --> 42
[1, 2, 3, 4, 5, 6]      --> 15
[10, 9, 2, 3, 4, 1]     --> 23
[10, 3, 12, 3, 7, 12]   --> 47

Najkrótsza odpowiedź w bajtach wygrywa!


1 nie bardzo, ale istnieje wiele odmian.

DJMcMayhem
źródło

Odpowiedzi:

3

Pyth, 28 27 25 bajtów

s+*L%/Qd2}3Tm?<d3_d*15q12

Wypróbuj online. Zestaw testowy.

Wyjaśnienie

  • Po pierwsze, Pyth automatycznie dołącza niektóre zmienne. Kod jest teraz s+*L%/Qd2}3Tm?<d3_d*15q12dQ.
  • }3Tgeneruje listę [3, 4, 5, 6, 7, 8, 9, 10].
  • Pomnóż każdą liczbę na tej liście ( *L) przez liczbę tej liczby na input ( /Qd), modulo 2 ( %2 ). Wynik to 0 dla liczb sparowanych i sama liczba dla liczb niesparowanych.
  • Zamapuj na liczbach wejściowych ( mQ):
    • Jeśli liczba jest mniejsza niż 3 ( ?<d3), zaneguj ją ( _d).
    • W przeciwnym razie sprawdź, czy jest to 12 ( q12d), i pomnóż wartość logiczną przez 15 ( *15). Wynik to 15 dla królowych i 0 dla wszystkiego innego.
  • Połącz listy ( +). Wynikowa lista zawiera teraz wyniki dla liczb niesparowanych (pierwsza część) i kart specjalnych A, 2, Q (druga część), z kilkoma dodatkowymi zerami.
  • Na koniec weź sumę wyniku ( s).

Alternatywne 25-bajtowe rozwiązanie

-+s*L%/Qd2}3T*15/Q12s<#3Q

Działa to podobnie do pierwszego, ale zlicza królowe osobno i neguje asy i dwójki z filtrem.

PurkkaKoodari
źródło
11

Python 2, 72 70 bajtów

f=lambda x,*T:[x*(-1)**T.count(x),~x%2*15,-x][(x-3)/8]+(T>()and f(*T))

W pewnym momencie chciałem, żeby Python został potraktowany 0**0 == 0raz, bym mógł (-condition)**num. Zadzwoń jak f(11, 10, 3, 1, 2, 2).

Poprzednia 72-bajtowa wersja:

f=lambda x,*T:[~x%2*15,x*(-1)**(x<3or T.count(x))][x<11]+(T>()and f(*T))
Sp3000
źródło
5

> <> , 63 57 56 + 2 = 65 59 58 bajtów

Liczby wejściowe powinny znajdować się na stosie na początku programu, więc +2 bajty dla -vflagi. Wypróbuj online!

</!?lp6$+1g6:
3\0
?\::6g2%*{+}1+:b=
;\~16g-26g2*-c6gf*+n

Ponieważ inicjowane są wszystkie nieużywane wartości w polu kodu 0, można go użyć do ustalenia, ile z każdej wartości znajduje się na stosie, poprzez pobranie wartości [value,6], zwiększenie jej i ponowne umieszczenie w polu kodu. Następnie suma jest obliczana jako:

T = 0 + {for x in 3 to 10, x*([x,6]%2)} - [1,6] - 2*[2,6] + 15*[12,6]

Edycja: wyłączono 6 bajtów, zmieniając dane wejściowe i zmieniając kroki obliczeń. Poprzednia wersja:

:6g1+$6pl0=?\
/-*2g62-g610/
c ;n$\
6:b=?/>::6g2%*{+}1+!
\gf*+3/

Edycja 2: zapisano 1 bajt dzięki Sp3000

Sok
źródło
Widziałem, że 0=?kilka razy korzystałeś lub coś podobnego - możesz użyć ?!zamiast tego?
Sp3000,
@ Sp3000 Ack, oczywiście, masz rację. Dzięki, dodam to w
Sok
5

MATL , 27 26 bajtów

3:10=s2\7M*G12=15*Gt3<*_vs

Dane wejściowe to tablica kolumn, tzn. Wartości są oddzielone średnikami.

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe (dodaje to pętlę do pobierania wszystkich danych wejściowych i zastępuje Gją, 1$0Gaby przekazać najnowsze dane wejściowe).

Wyjaśnienie

3:10=    % Take input implicitly. Compare with range [3 4 ... 10], with broadcast
s        % Sum of each column: how may threes, fours, ... tens there are
2\       % Modulo 2
7M       % Push [3 4 ... 10] again
*        % Element-wise multiply (the sum of this array is the score of 3...10)
G        % Push input again
12=      % Compare with 12, element-wise
15*      % Multiply by 15 (this is the score of 12)
G        % Push input again
t3<      % Duplicate. True for entries 1 or 2
*_       % Multiply and negate (the sum of this array is the score of 1, 2)
v        % Concatenate all stack concents into a vertical array
s        % Sum of array. Implicitly display
Luis Mendo
źródło
4

Pyth - 37 36 35

To wydaje się zbyt duże, ale FGITW.

J<#h;K-QS2++*15/K12sm*d%/Jd2{J_s@S2

Pakiet testowy .

Maltysen
źródło
2
„To wydaje się zbyt duże, ale FGITW”. Więc golf to pierwszy?
kot
Nie widziałem tego, dopóki nie skończyłem własnego, ale są prawie identyczne, z wyjątkiem używania JiK wydają się zupełnie niepotrzebne, a także możesz grać +_w golfa -;) Mam 31:+*15/Q12-sm*d%/Qd2{>#2<#11Qs@S2
FryAmTheEggman
1
@FryAmTheEggman 24:+*15/Q12-s*R%/Qd2}3Ts@S2
Jakube
3

JavaScript (ES6), 63 bajty

a=>a.map(e=>r+=e<3?-e:e>10?e-12?0:15:(m[e]^=1)?e:-e,r=0,m=[])|r

Lub jeśli wolisz

a=>a.map(e=>r-=e<3?e:e>10?e-12?0:-15:(m[e]^=1)?-e:e,r=0,m=[])|r
Neil
źródło
0

Perl 5.10.0 + -n, 115 64 60 56 bajtów

$p+=$_-12?$_>2?$_<11?++$l[$_]%2?$_:-$_:0:-$_:15}{say$p

Wypróbuj online!

Wyjaśnienie:

Dodanie -npętli wokół niego:

# Used variables:
# $_: input (auto)
# $p: points
# $l[n]: number of occurences of n (for 3-10)
while (<>) { # for every input
    $p += $_ - 12 ? # if the input is not 12 (queen) ...
        $_ > 2 ? # then: if it's > 2 (not ace or 2) ...
            $_ < 11 ? # then: if < 11 (3-10) ...
                ++$l[$_] % 2 ? # then: if it's an odd occurence (1st, 3rd, 5th, ...)
                    $_ # add it
                    : -$_ # else subtract it
            : 0 # no points for other stuff (J, K)
        : -$_ # negative points for ace and 2
    : 15 # 15 points for queen
}
{ # after input:
    say $p # output points
}
pustkowie
źródło