Punktacja Briscola


11

Wprowadzenie

Briscola to jedna z najpopularniejszych gier karcianych we Włoszech. Jest to gra karciana polegająca na podchodzeniu do lew, jak Bridge. Briscola jest dobrze znany ze swojego dziwnego systemu punktowego. W tym wyzwaniu, biorąc pod uwagę dwie karty, wyjdziesz, czy pierwsza zdobędzie więcej, mniej lub tyle samo punktów, co druga w systemie punktowym Briscoli.

Wyzwanie

W Briscola gra się talią włoskich kart do gry. W talii znajduje się czterdzieści kart, 1-10 w każdym z czterech kolorów: puchary, miecze, maczugi i monety. Będziemy ignorować kolory tego wyzwania. Karty 2–7 to karty numeryczne, a karty 8, 9 i 10 to karty twarzy. Ranking kart, od najwyższego do najniższego, to:

 +------------------------+-------------+
 |     Cards, by Rank     | Point Value |
 +------------------------+-------------+
 | Ace (1)                |     11      |
 | Three (3)              |     10      |
 | King (10)              |      4      |
 | Knight (9)             |      3      |
 | Jack (8)               |      2      |
 | Numeric Cards (2, 4-7) |      0      |
 +------------------------+-------------+

Dzięki Orphevs za miły stół! :)

Twoim zadaniem jest utworzenie pełnego programu lub funkcji, która akceptuje dwie liczby 1-10 reprezentujące rangi kart i wysyła (lub zwraca), czy wartość punktowa pierwszej karty jest większa, mniejsza niż lub równa wartości punktowej druga karta. Dodatkowe uwagi:

  • Twój program może wypisać dowolne trzy wartości, aby wskazać wartość mniejszą, większą niż i równą, jednak za każdym razem musi wypisywać tę samą wartość dla każdego warunku.
  • Twój program może używać dowolnych ustawień domyślnych we / wy .
  • Standardowe luki są niedozwolone.
  • Dozwolona jest pełna funkcja lub program.
  • To pytanie dotyczy , więc wygrywa najmniej bajtów.

  • Oto kilka przykładowych danych wejściowych i wyjściowych:

     1, 4 => więcej niż (as 11 punktów, 4 wyniki 0 punktów, pierwszy to więcej niż drugi.
     8, 3 => mniej niż (8 wyników 2, 3 wyniki 10, pierwszy jest mniejszy niż drugi.
     5, 2 => równe (5 i 2 oba mają wynik 0)

Jeśli masz jakieś pytania, nie wahaj się zapytać. Powodzenia!


1
Zawsze myślałem, że pierwiosnek Scopy był bardziej dziwaczny;)
FryAmTheEggman

@FryAmTheEggman masz rację, zmieniłem to. Ponadto, może masz rację o primiera ...;)
Amphibological

Czy możemy wziąć tablicę z dwiema wartościami jako danymi wejściowymi?
digEmAll

1
@digEmWszystko pewne.
Amfibologiczny

Nie takie dziwne. Bardzo podobne wyniki istnieją w portugalskich grach karcianych Sueca i Bisca!
sergiol

Odpowiedzi:


2

Galaretka , 12 11 bajtów

“®µ½¤¢‘iⱮIṠ

Wypróbuj online!

  • -1 bajt przy użyciu metody Luisa Mendo .

Wyjścia 0dla równych, -1większych i 1mniejszych. Używa indeksu strony kodowej, “®µ½¤¢‘który ocenia [8, 9, 10, 3, 1].

Pobiera dane wejściowe jako parę kart. Użyj 1,2jako przykładu.

“®µ½¤¢‘iⱮIṠ
“®µ½¤¢‘       [8,9,10,3,1]
       i      index of 
        Ɱ     each element in the input -> 5,0
         I    Finds the forward difference: 0-5 = -5.
          Ṡ   Sign -> -1.
                When ranks are equal, Ṡ returns 0 and when the rank of the second
                card is higher, Ṡ returns 1.

1
Nie zirytowany, ale czy ktokolwiek głosowałby z góry, dlaczego?
dylnan

W przypadku, gdyby był to przypadkowy głos negatywny - i przy założeniu, że nastąpił po ostatniej edycji - sugeruję zrobienie sztucznej aktualizacji postu, aby można go było cofnąć, gdy / jeśli osoba oceniająca zda sobie sprawę, że coś poszło nie tak.
Arnauld

5

MATL , 12 bajtów

[DEXIl]&mdZS

Dane wejściowe to tablica dwóch liczb. Wyjście jest -1, 0i 1odpowiednio do ponad , równą lub mniejszą niż .

Wypróbuj online!

Wyjaśnienie

Rozważ dane wejściowe [1 4]jako przykład.

[DEXIl]    % Push [8 9 10 3 1]
           % STACK: [8 9 10 3 1] 
&m         % Implicit input. Index (1-based) of membership, 0 if not member
           % STACK: [5 0]
d          % Consecutive difference
           % STACK: -5
ZS         % Sign. Implicit display
           % STACK: -1

5

JavaScript (ES6), 42 bajty

Zajmuje obie pozycje w składni curry (a)(b). Zwraca 1 dla większej niż , -1 dla mniejszej lub 0 dla równej .

a=>b=>Math.sign((s="05040000123")[a]-s[b])

Wypróbuj online!


Przy użyciu formuły 48 bajtów

Jest to zdecydowanie dłużej niż przy użyciu tabeli odnośników, ale jest też nieco bardziej interesujące.

Ten sam format we / wy.

a=>b=>Math.sign((g=n=>(1<<n&1802)*6%13)(a)-g(b))

Wypróbuj online!

W jaki sposób?

0n

p=2)n i (2)1+2)3)+2)8+2)9+2)10)
p=2)n i 1802
  n (card)   | 2**n | AND 1802
-------------+------+----------
  1 (Ace)    |    2 |      2
  2          |    4 |      0
  3 (Three)  |    8 |      8
  4          |   16 |      0
  5          |   32 |      0
  6          |   64 |      0
  7          |  128 |      0
  8 (Jack)   |  256 |    256
  9 (Knight) |  512 |    512
 10 (King)   | 1024 |   1024

Chcemy teraz przekształcić pozostałe niezerowe wartości w taki sposób, aby można je było sortować we właściwej kolejności. Używamy:

q=6pmod13
    p (card)   |   6p | MOD 13
---------------+------+--------
    2 (Ace)    |   12 |   12
    8 (Three)  |   48 |    9
  256 (Jack)   | 1536 |    2     --> Ace > Three > King > Knight > Jack
  512 (Knight) | 3072 |    4
 1024 (King)   | 6144 |    8

Czy była meta dyskusja na temat tego podejścia z wykorzystaniem parametrów curry? Technicznie nie odpowiada to wyzwaniu, ponieważ napisana funkcja zwraca funkcję, a nie odpowiedź.
Sparr


3

Japt , 25 21 16 bajtów

  • 1 => więcej niż
  • -1 => mniej niż
  • 0 => równe

£"78920"bXÉÃr- g

Wypróbuj online!


Możesz użyć -gflagi, aby zapisać 2 bajty.
Kudłaty

Mam rozwiązanie 13-bajtowe (również używam -gflagi, jeśli chcesz spróbować).
Kudłaty

@Shaggy Nie powiedziałbym, że oszczędza to dwa bajty, oflagowane zgłoszenia to tylko oddzielne rozwiązania językowe i nie liczą się jako rozwiązania Japt.
Nit

Jeśli nie chcesz używać flagi, rozwiązanie, o którym wspomniałem powyżej, ma 15 bajtów. (Wskazówka: używa [8,9,10,3,1]konwersji tablicy i bazy)
Shaggy

3

Japt -g , 13 bajtów

Wyjścia -1dla >, 1dla <i 0dla ===.

m!b#ù991ìD)rn

Wypróbuj lub uruchom wiele testów (drugi wiersz replikuje funkcjonalność -gflagi, aby umożliwić użycie flag do przetwarzania wielu danych wejściowych)


Wyjaśnienie

                   :Implicit input of 2 integer array
m                  :Map
   #ù991           :  249991
        ìD         :  Convert to array of base-13 digits = [8,9,10,3,1]
 !b                :  Get the index of the current element in that
          )        :End map
           rn      :Reduce by subtraction
                   :Implicitly output the sign of the result

2

R , 35 bajtów

rank(c(6,0,5,1:4*0,1:3)[scan()])[1]

Wypróbuj online!

  • -6 Bajtów dzięki sugestii @JayCe, aby przejść do pełnego programu zamiast funkcji

Program zwraca 2dla 'greater than', 1dla 'less than', 1.5dla'equal'

Objaśnienie:

      c(6,0,5,1:4*0,1:3)[v]          # extract the score of each card in v (got from scan());
                                     # cards in v are used as indexes in the cards rank 
                                     # vector, which is based on briscola scores vector 
                                     # c(11,0,10,0,0,0,0,2,3,4) but divided by 2 and rounded 
                                     # to integer preserving the original order

rank(                      )[1]      # rank returns : c(1,  2)   if v[1] < v[2]
                                     #                c(2,  1)   if v[1] > v[2]
                                     #                c(1.5,1.5) if v[1] == v[2]
                                     # and we select the first value

1
rank(c(6,0,5,1:4*0,1:3)[scan()])[1](pełny program) pozwoli Ci zaoszczędzić 6 bajtów
JayCe,

@JayCe: tak, zauważyłem to, ale wciąż jestem zdezorientowany co do konieczności dodania cat (), gdy jest to pełny program ... zresztą zaktualizowałem mój kod;)
digEmAll

2

Java 8, 69 66 bajtów

a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))

Lambda biorąc parametry w składni curry, port odpowiedzi JavaScript Arnaulda .

Zwroty 0.0 są równe , 1.0na większy niż , a -1.0za mniej niż . Wypróbuj online tutaj .

Dzięki Kevin Cruijssen za grę w golfa 3 bajty.


1
Możesz zapisać 3 bajty, wykonując bezpośredni zwrot z dwukrotnością "05040000123".charAt(...)zamiast tablicy liczb całkowitych:a->b->Math.signum("05040000123".charAt(a)-"05040000123".charAt(b))
Kevin Cruijssen

2

MarioLANG , 578 548 530 bajtów

 )                    <
 ====================="
                   >-[!)
                   "==#)
                >-[!)) )
                "==#=) +
         >-----[!))) + +
         "======#==  + +
     >--[!)))   ++++              -(- <
     "===#===================    ====="
  >-[!)))+++++                    >) [!)+:
; "==#=======================     "===#===
>[!                      )))[!((>[!)[!):
"=#==========================#====#==#===
!;((                         <       >)-:
#============================"       "===

Wypróbuj online!

Wyjaśnienie:

  • Pierwszy duży zamek odczytuje numer karty jako dane wejściowe i oblicza jej równoważną wartość punktową, dopóki nie odczyta 0(brak danych). To zakłada, że ​​na wejściu będą tylko dwie wartości ściśle dodatnie.
  • Zauważ, że tak naprawdę nie ustawiam odpowiednich wartości punktowych, ponieważ nie są one potrzebne, po prostu ustawiam jako wartość punktową liczbę pomiędzy, [1-5]aby pomóc obliczyć, która karta ma najwięcej wartości punktowych.
  • Drugi, mały zamek porównuje tylko dwie obliczone wartości punktowe.
  • Zwraca, 1jeśli pierwsza wartość punktu jest większa niż druga, -1jeśli druga wartość punktu jest większa niż pierwsza i 0jeśli wartości punktu są takie same.


1

C (gcc) , 57 bajtów

Zwraca zwykłe [-1..1] odpowiednio dla <, = i>.

char*s="-FAEAAAABCD";f(a,b){a=s[a];b=s[b];b=(a>b)-(a<b);}

Wypróbuj online!


Sugeruj *s=L"...zamiast char*s="...i a=(s[a]>s[b])-(s[a]<s[b])zamiasta=s[a];b=s[b];b=(a>b)-(a<b)
ceilingcat

1

05AB1E , 14 bajtów

ε78920S>sk}`.S

Powroty 1, -1lub 0dla więcej niż; mniej niż; lub odpowiednio równe.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ε              # Loop over the input-array
 78920S>       #  Convert 78920 to a list of digits, and increase each by 1,
               #  resulting in [8,9,10,3,1]
        sk     #  Index this list with the input-number (-1 if not found)
               #   i.e. [1,4] → [4,-1]
          }    # Stop the loop
`              # Put all items of the now mapped list separated onto the stack
 .S            # Take the signum (1 if a>b; -1 if a<b; 0 if a==b)
               #  i.e. 4 and -1 → 1

1

PHP , 51 45 bajtów

<?=($m=_5040000123)[$argv[1]]<=>$m[$argv[2]];

Wypróbuj online!

Aby uruchomić:

php -n <filename> <card1> <card2>

Przykład:

php -n briscola_score.php 3 1

Uwaga: ten kod używa operatora statku kosmicznego PHP 7 . Więc nie będzie działać na żadnej wersji PHP wcześniejszej niż 7.


Wynik:

  • 1 = więcej niż (card1 > card2 )
  • 0 = równe (card1 == card2 )
  • -1 = mniej niż ( card1 < card2)

W jaki sposób?

Takie samo podejście jak w wielu innych odpowiedziach, ale w PHP. Tworzy mapę wartości dla kart i porównuje z niej wartości kart. Pozycja wartości na mapie jest taka sama jak numer karty.


0

JavaScript ES2016 +, 73 znaki

Nie najkrótszy, ale mam nadzieję, że interesujący ze względu na matematykę i przepełnienie :)

(x,y)=>Math.sign((x&8?x:(16-(x**40|0)%7)^16)-(y&8?y:(16-(y**40|0)%7)^16))

I inna wersja z 74 znakami, niestety:

(x,y)=>eval('(x>y)-(x<y)'.replace(/\w/g,'($&&8?$&:(16-($&**40|0)%7)^16)'))

Test

Otwórz konsolę przeglądarki przed uruchomieniem

f=(x,y)=>Math.sign((x&8?x:(16-(x**40|0)%7)^16)-(y&8?y:(16-(y**40|0)%7)^16))
console.table(Array(11).fill().map((x,i)=>Array(11).fill().map((x,j)=>f(i,j))))

zrzut ekranu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.