Golf (6 cartas) ¡Golf!

10

Golf Golf!

Este es mi primer desafío, ¡así que sé gentil! El desafío es escribir un programa que genere la puntuación correcta para un diseño en el juego de cartas "Golf".

El juego de cartas Golf tiene muchas variaciones. Las reglas de la casa que uso siguen las reglas estándar para Six-Card Golf dadas por Pagat, con una ligera diferencia. Ya existe un desafío similar aquí, pero creo que este es más interesante porque requiere que tengas en cuenta la orientación de las tarjetas.

Cada jugador tiene un diseño de cartas de 2x3. Al final de cada ronda, todas las cartas se ponen boca arriba y se puntúan de la siguiente manera:

  • Cada as cuenta 1 punto.
  • Cada dos cuenta menos dos puntos.
  • Cada tarjeta numérica de 3 a 10 puntajes tiene un valor nominal.
  • Cada Jack o Queen obtiene 10 puntos.
  • Cada rey obtiene cero puntos.
  • Un par de cartas iguales en la misma columna obtiene cero puntos para la columna (incluso si las cartas iguales son dos).
  • Un conjunto de tres cartas iguales en la misma fila obtiene cero puntos para la fila (incluso si las cartas iguales son dos).

Entrada

La entrada puede ser una cadena o matriz de cualquier tipo.

Salida

Un entero que representa el puntaje de la mano Golf.

Ejemplos

Estos ejemplos usan la notación A23456789TJQKpero no necesita usar esa notación en su respuesta.

Layout
AK3
J23

Score
9
-----------------------    
Layout
25Q
25J

Score
20
-----------------------        
Layout
T82
T8A

Score
-1
-----------------------        
Layout
QQQ
234

Score
5
-----------------------        
Layout
TJQ
QTJ

Score
60
-----------------------
Layout
888
382

Score
1
-----------------------
Layout
888
888

Score
0

Este es el código de golf, por lo que gana la respuesta más corta en bytes.

qdread
fuente
66
¿No debería el primer ejemplo puntuar 9?
Jonathan Allan
2
¡Buen primer desafío! Como una pequeña nota, las partes "(incluso si las cartas iguales son dos)" son innecesarias y ligeramente confusas en este desafío, ya que el puntaje resultante no se compara con los puntajes de otros jugadores. En cambio, es posible que desee aclarar que los puntajes de columna y fila iguales son anulados por los puntajes individuales de las tarjetas en sus respectivas columnas o filas.
Erik the Outgolfer
1
"... o una matriz de cualquier tipo": ¿el contenido debe ser caracteres (o podemos eludir la asignación de caracteres a valores)?
Jonathan Allan
@JonathanAllan Hm, dice "Estos ejemplos usan la notación A23456789TJQKpero no necesitas usar esa notación en tu respuesta".
Erik the Outgolfer
2
Sugeriría agregar un caso de prueba con una columna Y una fila iguales, como JJJ 2J2-> -4.
Jonathan Allan

Respuestas:

5

Jalea , 9 bytes

n/aEÐḟẎḞS

Pruébalo en línea!

-1 gracias a Jonathan Allan .

[[A, B, C], [D, E, F]]AF(1,-2,3,4 4,5 5,6 6,7 7,8,9 9,10,10,1,10,2,0 0)UNA,2,3,4 4,5 5,6 6,7 7,8,9 9,T,J,Q,K

Erik el Outgolfer
fuente
4

Haskell , 107 103 98 bytes

f m=sum[min 10k|r<-m,o<-m,any(/=r!!0)r,(j,x)<-zip o r,j/=x,(k,c)<-zip[-2..]"2 KA 3456789TJQ",c==x]

Pruébalo en línea!

Aprovecha el hecho de que solo hay dos filas. Repetimos dos veces sobre las filas tomando una fila ry una fila o. Cuando son la misma fila, el resultado siempre será cero (debido a la coincidencia de "columnas"), por lo que solo consideraremos las dos iteraciones en las que ryo se refieren a las filas distintas. Pongo a cero las filas al verificar primero si alguna entrada en la fila no es igual a la primera. Si la fila es igual, esto será falso y la lista estará vacía, con una suma de 0. De lo contrario, comprimo esta fila con la otra e itero sobre los pares que no son iguales (esto pone a cero columnas iguales en una similar conducta). Finalmente indizo una lista de rangos de cartas que comienzan con -2 rellenos con espacios según sea necesario para asignar cada rango a su puntaje. Solo tengo que usarmin 10 sujetar ese índice para hacer que los gatos y las reinas cuestan 10 en lugar de 11 y 12.

EDITAR: ¡gracias a @xnor por despegar 4 bytes! ¡No sabía que podías poner identificadores directamente después de los literales numéricos, eso es realmente genial!

EDIT2: ¡Gracias nuevamente a @xnor por otros 5 bytes! Gran idea iterar sobre las filas así

usuario1472751
fuente
1
Buena solución! Dos pequeñas optimizaciones: no es necesario el espacio después 10, y es más corto para omitir el @(a:_)y en lugar de escribir r!!0para a.
xnor
1
Otro pensamiento: ya a%ay b%bson cero, parece que se puede definir fdirectamente por iteración en pares de líneas de este tipo .
xnor
3

Carbón de leña , 50 bytes

F²⊞υS≔⁰ζF⭆υΦι∧⊙ι¬⁼λν⊙υ¬⁼λ§νμ≡ι2≧⁻²ζA≦⊕ζKω≧⁺∨ΣιχζIζ

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

F²⊞υS

Lea el diseño en una matriz.

≔⁰ζ

Inicializa el puntaje a cero.

F⭆υΦι∧⊙ι¬⁼λν⊙υ¬⁼λ§νμ

Filtre en la entrada, eliminando caracteres que sean iguales a todos los caracteres en su fila o columna.

≡ι

Cambia cada personaje restante.

2≧⁻²ζ

2puntajes -2.

A≦⊕ζ

Apuntajes 1. (Estos 4 bytes podrían eliminarse si 1se usara para denotar 1, pero en mi humilde opinión, es un abuso del formato de entrada).

No hacer nada para K.

≧⁺∨Σιχζ

De lo contrario, los dígitos puntúan su valor y otras letras puntúan 10.

Iζ

Convierta la suma a cadena para impresión implícita.

Neil
fuente
2

J , 39 28 bytes

[:+/@,]<.@*]+:&(1=#@~.)"1/|:

Pruébalo en línea!

Gracias a Erik the Outgolfer y Jonathan Allen por la idea de codificación de entrada.

explicación

Una solución muy "J". Te explicaré con el ejemplo ...

Tomemos la entrada:

AK3
J23

y aplica esta codificación:

┌─┬──┬─┬─┬─┬─┬─┬─┬─┬──┬────┬────┬─┐
│A│2 │3│4│5│6│7│8│9│T │J   │Q   │K│
├─┼──┼─┼─┼─┼─┼─┼─┼─┼──┼────┼────┼─┤
│1│_2│3│4│5│6│7│8│9│10│10.1│10.2│0│
└─┴──┴─┴─┴─┴─┴─┴─┴─┴──┴────┴────┴─┘

que produce:

   1  0 3
10.1 _2 3

Veamos la primera parte de la solución, eludiendo algunos detalles para comenzar:

] (...)"1/ |:

Esto dice tomar la entrada ]y su transposición |:y crear una "tabla de multiplicación" de todas las combinaciones, excepto que en lugar de multiplicar aplicaremos el verbo entre paréntesis. El "1especificador de clasificación asegura que tomamos todas las combinaciones de filas de ambos argumentos, pero dado que las filas de la transposición son las columnas de la matriz original, esto significa que tomaremos todas las combinaciones de filas y columnas. Es decir, haremos:

  Rows                            Cols
┌─────────┐                     ┌──────┐
│1 0 3    │                     │1 10.1│
├─────────┤  "times" table      ├──────┤
│10.1 _2 3│                     │0 _2  │
└─────────┘                     ├──────┤
                                │3 3   │
                                └──────┘

which produces:

┌───────────────────────┬─────────────────────┬────────────────────┐
│┌─────┬────┬──────┐    │┌─────┬────┬────┐    │┌─────┬────┬───┐    │
││1 0 3│verb│1 10.1│    ││1 0 3│verb│0 _2│    ││1 0 3│verb│3 3│    │
│└─────┴────┴──────┘    │└─────┴────┴────┘    │└─────┴────┴───┘    │
├───────────────────────┼─────────────────────┼────────────────────┤
│┌─────────┬────┬──────┐│┌─────────┬────┬────┐│┌─────────┬────┬───┐│
││10.1 _2 3│verb│1 10.1│││10.1 _2 3│verb│0 _2│││10.1 _2 3│verb│3 3││
│└─────────┴────┴──────┘│└─────────┴────┴────┘│└─────────┴────┴───┘│
└───────────────────────┴─────────────────────┴────────────────────┘

Ahora, lo verbque aplicamos a cada uno de estos combos es +:&(1=#@~.)y este verbo devuelve falso si "cualquiera de los argumentos consiste en un solo elemento repetido" y verdadero de lo contrario. Lo hace tomando la protuberancia, o uniq ~., preguntando si su longitud es una 1=#, y tomando el nor del resultado +:.

Es decir, esto devolverá una máscara booleana con la misma forma que la matriz de entrada, pero con ceros para cualquier elemento en una fila o columna de todos los elementos iguales.

1 1 0
1 1 0

Ahora simplemente mutliply la matriz original por esta máscara y tomar el piso ]<.@*:

1   0 0
10 _2 0

y luego aplanar y sumar el resultado de eso: +/@,

9
Jonás
fuente
2

JavaScript (ES6),  97 95  93 bytes

Toma la entrada como una matriz de 2 matrices de 3 caracteres.

a=>a.map((r,i)=>r.map((c,j)=>t-=c!=a[i^1][j]&r!=c+[,c,c]?{K:[],2:2,A:-1}[c]||-c||~9:0),t=0)|t

Pruébalo en línea!

Comentado

a =>                        // a[] = input
  a.map((r, i) =>           // for each row r[] at position i:
    r.map((c, j) =>         //   for each card c at position j in r[]:
      t -=                  //     update t:
        c != a[i ^ 1][j] &  //       if c is not equal to the sibling card in the other row
        r != c + [, c, c] ? //       and r is not made of 3 times the same card:
          { K: [],          //         add 0 point for a King (but [] is truthy)
            2: 2,           //         subtract 2 points for a Two
            A: -1           //         add 1 point for an Ace
          }[c]              //
          || -c             //         or add the face value
          || ~9             //         or add 10 points (Jack or Queen)
        :                   //       else:
          0                 //         add nothing
    ),                      //   end of inner map()
    t = 0                   //   start with t = 0
  ) | t                     // end of outer map; return t
Arnauld
fuente
0

PHP , 145109 bytes

Después de usar la A23456789TJQKcodificación predeterminada para las entradas y no obtener un buen resultado, cambié a usar esta codificación de manera similar a otras respuestas:

A |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |  T |    J |    Q | K
1 | -2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 10.1 | 10.2 | 0

Entrada es una matriz de dos dimensiones en este formato: [[1,0,3],[10.1,-2,3]]. Básicamente verifica que la fila (usando miny max) y la columna para cada tarjeta no contengan valores iguales y luego agrega el valor de la tarjeta al puntaje total y al final imprime la parte entera del puntaje total.

function($a){for(;$x++<2;)for($i=3;$i--;)min($r=$a[$x-1])-max($r)&&$r[$i]-$a[$x%2][$i]&&$s+=$r[$i];echo$s^0;}

Pruébalo en línea! (Nota: TIO para PHP está roto en este momento, debido a una actualización de versión incorrecta, pero debería volver OK)

Noche2
fuente
0

Python 3 , 79 bytes

lambda d:sum([({*a}!={x}!={y})*int(x)for a,b in(d,d[::-1])for x,y in zip(a,b)])

Pruébalo en línea!

Utiliza el mismo formato de entrada que otras respuestas, valores 1,-2,3,4 4,5 5,6 6,7 7,8,9 9,10,10,1,10,2,0 0 por las cartas.


Python 3 , 118 bytes

Formato de entrada más legible

lambda d:sum([({*a}!={x}!={y})*[10,10,10,1,0,-2,int(x,36)]['TJQAK2'.find(x)]for a,b in(d,d[::-1])for x,y in zip(a,b)])

Pruébalo en línea!

ovs
fuente
0

Kotlin , 159 bytes

Lambda toma 1.3456789TJQ0 como entrada. El código externo toma A23456789TJQK como entrada, convierte el as, dos y el rey para que las matemáticas funcionen, y muestra las tarjetas y el puntaje.

{d:List<String>->Int
var s=0
for(r in 0..1)for(c in 0..2)if((d[r][0]!=d[r][1]||d[r][1]!=d[r][2])&&d[0][c]!=d[1][c]){
val n=d[r][c]-'0'
s+=if(n>9)
10
else
n}
s}

Pruébalo en línea!

JohnWells
fuente