Su tarea es encontrar cuántas secuencias distintas de Blackjack se pueden encontrar en una lista ordenada de 12 cartas.
Una secuencia de Blackjack se define como una secuencia de cartas consecutivas cuya suma de puntos es exactamente 21. Los puntos se cuentan de acuerdo con la siguiente tabla:
Symbol | Name | Points Symbol | Name | Points
-------+-------+-------- -------+-------+--------
2 | Two | 2 9 | Nine | 9
3 | Three | 3 T | Ten | 10
4 | Four | 4 J | Jack | 10
5 | Five | 5 Q | Queen | 10
6 | Six | 6 K | King | 10
7 | Seven | 7 A | Ace | 1 or 11
8 | Eight | 8
Entrada
Una cadena de 12 caracteres, utilizando los símbolos descritos anteriormente. No nos importan los colores de las tarjetas, por lo que no se proporcionan.
Ejemplo:
K6K6JA3Q4389
Salida
El número de secuencias distintas de Blackjack que se pueden encontrar en la cadena de entrada.
Ejemplo:
K6K6JA3Q4389
incluye dos secuencias distintas de Blackjack:
JA
, con el As contado como 11 puntos (10 + 11 = 21)A3Q43
, con el As contado como 1 punto (1 + 3 + 10 + 4 + 3 = 21)
Entonces la respuesta sería 2
.
Reglas
- Dos secuencias de Blackjack se consideran distintas si contienen cartas diferentes o las mismas cartas en diferentes órdenes. Si la misma secuencia exacta aparece en diferentes posiciones en la lista de entrada, debe contarse solo una vez.
- Las secuencias de Blackjack pueden superponerse entre sí.
- Cada tipo de tarjeta puede aparecer hasta 12 veces en la secuencia. (Suponemos que las cartas se seleccionan de al menos 3 mazos diferentes).
- Si no se puede encontrar una secuencia de Blackjack en la cadena de entrada, debe devolver
0
o cualquier otro valor falso. - Este es el código de golf, por lo que gana la respuesta más corta en bytes. Las lagunas estándar están prohibidas.
Casos de prueba
Las secuencias se proporcionan con fines informativos, pero solo se requiere que envíe el número de ellas.
Input | Output | Distinct sequences
-------------+--------+--------------------------------------------------------
3282486Q3362 | 0 | (none)
58A24JJ6TK67 | 1 | 8A2
Q745Q745Q745 | 1 | Q74
AAAAAAAAAAAA | 1 | AAAAAAAAAAA
T5AQ26T39QK6 | 2 | AQ, 26T3
JQ4A4427464K | 3 | A442, 44274, 7464
Q74Q74Q74Q74 | 3 | Q74, 74Q, 4Q7
37AQKA3A4758 | 7 | 37A, 37AQ, AQ, AQK, QKA, KA, A3A475
TAQA2JA7AJQA | 10 | TA, TAQ, AQ, QA, A2JA7, 2JA7A, JA, AJ, AJQ, JQA
TAJAQAKAT777 | 13 | TA, TAJ, AJ, JA, JAQ, AQ, QA, QAK, AK, KA, KAT, AT, 777
fuente
Respuestas:
Jalea ,
3029 bytes¡Pruébelo en línea! o echa un vistazo a la suite de prueba
¿Cómo?
Tenga en cuenta que, si siempre valoramos un as como 1, entonces las únicas sumas válidas son 21 y 11 , siendo este último aceptable si aparece un as en la secuencia.
fuente
Python 2, 215 bytes
Comentarios agregados:
fuente
Python ,
134130 bytesPruébalo en línea!
¿Cómo?
Una función sin nombre, que toma la cadena de longitud 12 como
x
.x[i:j]
es un pedazo de la cadena de la i + 1 ª a la j- ésimo carácter.Los cortes se toman de tal manera que tenemos todas las sublistas al pasar de
i=0
ai=11
confor i in range(12)
, para cada una de las cuales atravesamos dej=0
aj=12
confor j in range(13)
.(Solo necesitamos
j=i+1
y hacia arriba, pero las rebanadas conj<=i
son solo cadenas vacías, por lo que podemos jugar desde 4 bytesfor j in range(i+1,13)
)Estos se filtran para aquellos con la suma correcta ...
Las sumas válidas son 11 y 21 si hay un as en una rebanada, o solo 21 si no.
'A'in x[i:j]
nos da esta información y~(v)
lleva a cabo-1-v
, que utilizamos para la rebanada[11,21]
- tanto si es un as en la secuencia que obtenemos[11,21][-2:]
y si no tenemos[11,21][-1:]
, lo que resulta en[11,21]
y[21]
respectivamente.La suma en sí necesita tratar
A
como 1, dígitos como sus valores, yT
,J
,Q
, yK
como 10. Este mapeo se logra por primera fundición a ordinales:" 2 3 4 5 6 7 8 9 T J Q K A"
(sin los espacios) se convierte[50, 51, 52, 53, 54, 55, 56, 57, 84, 74, 81, 75, 65]
, restar 48 para obtener[ 2, 3, 4, 5, 6, 7, 8, 9, 36, 26, 33, 27, 17]
, tomando elmin
con 26 rendimientos[ 2, 3, 4, 5, 6, 7, 8, 9, 26, 26, 26, 26, 17]
, y mOD (%
) dieciséis son los que[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 1]
, como se requiere para la suma,sum(...)
.Los resultados filtrados se colocan en un conjunto con
{...}
, por lo que solo quedan los resultados únicos y la longitud,len(...)
es el recuentofuente
05AB1E ,
393837 bytesPruébalo en línea!
Explicación
fuente
JavaScript (ES6), 123 bytes
fuente
0
porAAAAAAAAAAAA
más que1
. (A
puede ser simultáneamente 1 y 11)s=>eval("q=new Set;for(i=0;s[i];i++)for(t=A=0,j=i;c=s[j++];t==21|t==11&A&&q.add(s.slice(i,j)))t+=+c||(c<'B'?A=1:10);q.size")
124 bytesJavaScript (ES6),
144138129128126124 bytesViejo intento en 128:
fuente
s.search`A`>-1
podría ser~s.search`A`
-2
, y1&-2 == 0
t
a0
la.slice(0,-1)
llamada (ahorra 2B)?t
es una variable global y se restablecería debido a la llamada af(s.slice(0,-1))
. Pero encontré una forma des.search`A`>-1
JavaScript (ES6), 112 bytes
Esta lógica de código es bastante similar a la utilizada en las respuestas JS existentes de ETHproductions y Neil . Pero está utilizando una matriz básica para realizar un seguimiento de las secuencias de Blackjack encontradas en lugar de a
Set
.Formateado y comentado
Casos de prueba
Mostrar fragmento de código
fuente
05AB1E ,
40 39 38 3736 bytes-4 Gracias a Emigna
Pruébalo en línea!
Necesitamos hacer el decremento -> subcadena -> cosa de incremento para que las tarjetas faciales estén representadas por un número de un solo dígito.
fuente
S
mientrasÇ
convierte la cadena en una lista de códigos de caracteres."SIPJ"
podría ser„èµJu
„
en la documentación.Ç<çJŒÙ'@0:)vy„èµJuS9:S>D1å2‚T*>sOå}O
Entonces eres 1 byte más corto que mi respuesta :)Utilidades Bash + Unix,
145142141 bytesPruébalo en línea!
Pruebas de funcionamiento:
fuente
PHP, 240 bytes
Sin golf:
Pruébalo aquí!
fuente
$i
no fue declarado. Se agregaron 4 bytes y funciona perfectamente.