En el juego de mesa The Settlers of Catan , hay cinco tipos de recursos: Brick, Log, Ore, Wheat y Sheep. La construcción de un asentamiento cuesta un ladrillo, un tronco, un trigo y una oveja. Sin embargo, también puede intercambiar cuatro recursos idénticos para obtener un recurso de un tipo diferente. Por ejemplo, si tuviera cuatro minerales en la mano, podría intercambiarlos y obtener una oveja.
Su trabajo es determinar si puedo o no construir un acuerdo, dada mi mano.
Tu tarea
De entrada será una secuencia de las letras B
, L
, O
, W
, y S
, tomada en cualquier formato razonable. Estas letras corresponden a los cinco tipos de recursos dados anteriormente. Debe indicar si tengo o no los recursos necesarios para construir un acuerdo, teniendo en cuenta la posibilidad de negociar cuatro de un tipo.
Este es el código de golf , por lo que gana el código más corto en bytes.
Notas
- No tiene que dar salida a las operaciones que necesito realizar o cuántos asentamientos podría construir. Un simple "sí" o "no" servirá.
- Es posible que no se supone que la entrada está en ningún orden específico. En particular, no puede suponer que los recursos del mismo tipo están agrupados, por lo que
OBLSO
es una entrada válida. - Este es un problema de decisión , por lo que puede usar cualquier valor que quiera que signifique "sí" y "no", siempre que los dos valores elegidos sean distintos y consistentes.
- Las únicas reglas que nos interesan aquí son las enumeradas anteriormente. Las reglas más complicadas de los Colonos de Catan, como comerciar con otros jugadores o en puertos, no son relevantes aquí.
- Los caracteres de entrada (
B
,L
,O
,W
,S
) pueden ser sustituidos por otros valores si es más fácil para su idioma particular de la elección, siempre y cuando hay cinco entradas distintas. Si utiliza otros valores de entrada, especifíquelos en su respuesta.
Ejemplos
BLWS -> Yes
OOOOWLB -> Yes (trade four O for a S)
OOW -> No
BBBO -> No
(empty input) -> No
BBBBLW -> No
BBBBBLW -> Yes (trade four B for a S)
OOOOOOOOOOOOOOOO -> Yes (sixteen O; trade for B, L, W, S)
BLBLBLBLBL -> Yes (trade L for W and B for S)
BLSWBLSWBLSW -> Yes (extra, unused resources are ignored)
fuente
Respuestas:
Python 2 , 54 bytes
Pruébalo en línea!
Para cada uno de nuestros recursos, contamos el número de "libertades" otorgadas al tener n de ese recurso. Una libertad representa una oportunidad para llenar una de las ranuras de ladrillos, troncos, trigo y ovejas que necesitamos llenar para establecernos, teniendo en cuenta el hecho de que podemos convertir nuestros recursos.
Para todos los BLSW, tener uno de los recursos nos da esa libertad, y cada exceso adicional de 4 nos da otro. La regla de contar la libertad es así:
Entonces n ladrillos / troncos / trigo / ovejas dan ⌊ (n + 3) / 4⌋ libertades.
Para los minerales, solo cuenta el exceso de foursomes. La regla de contar la libertad es así:
Así n minerales dar ⌊n / 4⌋ libertades.
Teorema: podemos resolver si y solo si tenemos ≥ 4 de tales "libertades".
Entonces contamos nuestras libertades y verificamos si hay ≥ 4 de ellas. Para manejar el conteo de minerales como ⌊n / 4⌋ pero otros recursos ⌊ (n + 3) / 4⌋, inflamos artificialmente los recuentos de los otros recursos en 3 y luego contamos ⌊n / 4⌋ para todos ellos. Hacemos esto mediante el mapeo en
(s+"BLSW"*3).count
lugar des.count
.Prueba :
Supongamos que podemos resolver. Luego, para cada uno de [B, L, S, W], o (a) usamos 1 de ese recurso que ya teníamos, o (b) sacrificamos 4 de algún otro recurso (incluidos los minerales) para crearlo. En cualquier caso, contamos al menos 1 libertad según las reglas anteriores. Entonces tenemos ≥ 4 libertades.
Supongamos que tenemos 4 libertades, k de las cuales se deben a "excesos" (cada libertad de minerales es un exceso, y cada libertad de otros recursos más allá del primero también lo es) y 4 −k de los cuales son testigos de poseer al menos uno ladrillo / tronco / trigo / oveja (el que dio la "primera libertad"). Luego, llenamos las ranuras de 4 k con el ladrillo / tronco / trigo / oveja que nos dio nuestra primera libertad, y llenamos las ranuras k restantes al convertir nuestros excesos. Los 4 espacios están llenos y podemos resolver. Obviamente, aún podemos hacer esto si tenemos más de 4 libertades.
Esta prueba apesta, pero tengo sueño. Estoy seguro de que hay una mejor explicación.
fuente
s
esOOOOBLW
, se llega a unasum(n/4for n in map(("OOOOBLWBBBLLLSSSWWW").count,"BLSWO"))>3
... así que para cada uno de losBLOWS
que cuente cuántas veces que aparece en esa cadena de arranque de"BLWS"*3
, a continuación, resumir,."OOOOBLWBLSWBLSWBLSW"
, en realidad, pero los recuentos son los mismos, por supuesto.)in"BLSWO"
es innecesario en Python, ¿no? Parece trabajar en TIO al menos ..Python 2 ,
5251 bytes-1 byte gracias a Luke (reemplazar
>=0
con<0
, invirtiendo elFalse
/True
resultados)Una función sin nombre que toma una cadena de los caracteres B , O , W , L y S (como en el OP) y regresa
False
si puede resolver oTrue
no.Pruébalo en línea! (obliga a la salida a la
yes/no
del OP).¿Cómo?
Este es un puerto de mi respuesta Jelly. Necesitamos compensar los B , W , L o S que faltan del resto después de usar uno de cada uno de ellos. Como tal, podemos agregar un O adicional a nuestra mano, luego reducir todos los recuentos por uno, luego dividir todos los recuentos entre cuatro y luego sumar; si el resultado es cero o más, podemos resolver (ya sea porque no faltaron los recursos necesarios) o porque podemos comerciar para adquirir los que faltan).
fuente
False
para'yes'
yTrue
para'no'
? Entonces podría cambiar>=
a<
, ahorrando 1 byte.Pyth , 14 bytes
Pruébalo aquí! o Verificar todos los casos de prueba.
Pyth ,
31 27 1716 bytesVerificar los casos de prueba.
¿Cómo funcionan estos?
Explicación # 1
Explicación # 2
Estos son los códigos utilizados por mi programa:
fuente
+%ld4/ld4
->s.Dld4
//Q4 4
puede ser,/Q16
pero no estoy muy seguro ...BBBO
, por ejemplo4
y dividir por4
.Jalea ,
1312 bytesUn enlace monádico que acepta una lista de números que representan los recursos que posee y que devuelve
1
si puede establecerse o0
no.Los recursos son
1, 2, 3, 4, 5
donde5
representa el mineral .Pruébalo en línea! o vea el conjunto de pruebas (usando el OP IO).
¿Cómo?
La idea es contar primero los recursos por tipo, luego reducir todos los recuentos de B , L , W y S en uno: si no contamos ninguno para ninguno de estos cuatro, ahora tendrán entradas de -1 ; necesitamos adquirir ellos de nuestros recursos restantes (Esto en realidad se logra agregando un O (
5
) adicional y reduciendo los cinco recuentos en 1 ). A continuación, dividimos todos estos valores entre cuatro para ver cuántas unidades podemos intercambiar con cada uno de nuestros recuentos restantes por tipo de recurso sin afectar los recuentos -1 y 0 (tenga en cuenta que -1 dividido entre cuatro es-1 , no 0 ). Finalmente, sumamos los valores y verificamos si el resultado es mayor o igual a cero (aquí se puede usar mayor que -1 ya que siempre tenemos enteros).fuente
Java 8, 101 bytes
Lambda de
int[]
aboolean
. Asignar aFunction<int[], Boolean>
.Pruébalo en línea
Entrada y salida
La entrada es una matriz de enteros de 0 a 4, inclusive. 4 representa el mineral, y las otras asignaciones son irrelevantes. Mis casos de prueba son traducciones directas de aquellos en la pregunta, con 0 como Brick, 1 como Log, 2 como Wheat y 3 como Sheep.
La salida es si se puede construir un asentamiento.
Sin golf
Explicación
h
es el número de cuádruples de recursos disponibles para comerciar. Realizamos iteraciones sobre cada tipo de recurso (excepto Mineral), incrementandoh
por cada cuádruple de recursos adicionales que tenemos, y disminuyendo donde no hay recursos presentes. Entonces nuestro resultado es sih
es no negativo.La línea
se ajusta
h
adecuadamente independientemente de si no hay recursos (escasez) o si hay al menos un recurso (excedente).f[i]
se decrementa para tener en cuenta el recurso requerido en el caso de excedente, produciendo -1 en el caso de escasez. El desplazamiento a la derecha con signo reduce la expresión a 0 (caso excedente) o -1 (caso de escasez), de modo que un OR bit a bit con el númerof[i++] / 4
de cuádruples excedentes (en el caso excedente) no tiene ningún efecto en el caso de escasez, pero da como resultado el número en sí mismo en el caso excedente.Expresiones de gratitud
fuente
...for(h=f[4]/4;i<4;h+=f[i++]/4)n+=--f[i]>>-1;return~h<n;
.a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;h+=f[i++]/4)h+=--f[i]>>-1;return~h<0;}
a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;)h+=--f[i]>>-1|f[i++]/4;return~h<0;}
Retina , 34 bytes
Pruébalo en línea! Explicación: la creación de una solución requiere 4 recursos, que son sus primeros B, L, W o S, o cualquier otro recurso 4 del mismo tipo. Esto es equivalente a agregar tres de cada uno de esos cuatro tipos de recursos, y luego contar para ver si tiene cuatro conjuntos de cuatro.
fuente
Jalea , 23 bytes
Pruébalo en línea!
Consulte la siguiente tabla para conocer los valores:
fuente
Retina , 43 bytes
Pruébalo en línea!
fuente
Python 3 ,
7978 bytesEditar: -1 byte gracias a @ Mr.Xcoder
Pruébalo en línea!
fuente
MATL , 19 bytes
La entrada es un vector de fila numérico donde las letras se representan como números de la siguiente manera:
La salida es
1
para la verdad,0
para la falsedad.¡Pruébelo en línea !: verifique todos los casos de prueba .
Cómo funciona
BLWS
) no son cero. Esto le da un número c .Código comentado
fuente
> <> , 61 bytes
Pruébalo en línea!
Utiliza la siguiente asignación de recursos:
Realmente no importa lo que la cartografía se utiliza, siempre y cuando estén en el rango
0-4
, y0
se utiliza para O. hace uso del hecho de que la búsqueda de la combinaciónBLWS
es la misma que en busca de la combinaciónOBLWS
, mientras que ya tienen unaO
en mano.fuente
05AB1E , 19 bytes
0 -> Mineral
1 -> Ladrillo
2 -> Registro
3 -> Trigo
4 -> Oveja
Devuelve 0 cuando es falso y 1 en caso contrario.
Pruébalo en línea!
Explicación:
Solución no competitiva: 17 bytes
Hubo un error en 05AB1E cuando presenté por primera vez esa solución, donde algunos operadores manejaban mal las entradas vacías. Esto dio como resultado que esta solución respondiera
1
con una entrada vacía. Esto ya se ha solucionado, por lo que esta solución funciona bien.La diferencia aquí es que agregamos un mineral antes de eliminar uno de cada recurso, indiscriminadamente, contando la cantidad de recursos eliminados de esa manera. Luego disminuimos el contador en 1 para obtener el número correcto de B, L, W y S.
Pruébalo en línea!
fuente
JavaScript (SpiderMonkey) , 116 bytes
Pruébalo en línea!
Súper torpe mala respuesta. Estoy seguro de que podría limpiarse más. Método inspirado en la respuesta de Lynn en este hilo.
fuente
Kotlin ,
131129 bytesSumisión
Prueba
No puede funcionar en TryItOnline, pero funciona en try.kotlinlang.org
fuente