Puede que conozcas el juego de Set (un juego maravilloso para niños, por cierto), un juego de cartas con 81 cartas, donde cada carta tiene una figura con 4 atributos diferentes (forma, número, color y relleno). Cada atributo tiene 3 valores diferentes:
form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.
Se ponen 12 cartas abiertas sobre la mesa y ahora el desafío es indicar conjuntos. Un conjunto consta de tres cartas donde cada valor de atributo ocurre 0, 1 o 3 veces. Tener 2 tarjetas con figuras rojas, u opacas, o 1 número no es bueno. Vea el enlace provisto para una explicación más visual.
Sí imagino un código para una tarjeta donde todos los atributos están codificados
"WP2N"
representa
2 Purple Waves with No fill
Junto con por ejemplo OR1N
yDG3N
y
es un conjunto (3 formas diferentes, 3 colores diferentes, 3 números diferentes, 1 relleno).
La entrada es una cadena delimitada por espacios de códigos únicos (elegidos aleatoriamente entre 81 códigos posibles) que representan tarjetas.
"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"
La solución debe indicar todos los conjuntos posibles dentro de la colección dada. Entonces
OR1N, WP2N, DG3N
debe ser parte de la solución junto con todos los demás conjuntos.
Respuestas:
Ruby,
104988180 caracteresEjecución de muestra (utilizando sus datos de ejemplo):
Produce
WP2N,DR1D,OG3O
dos veces porque tiene dosDR1D
s en sus datos de muestra.Explicación:
$*.combination(3).map{|c|
- cada combinación de 3 cartasputs c*?,if
- genera el conjunto, si ...(0..3).all?{|i|
- si todos los números del 0 al 3 (las indecesiones de las propiedades en la cadena) se evalúantrue
cuando se pasan a este bloquec.map{|x|x[i]}
- toma eli
índice th de cada cadena.uniq.size!=2}
- si la cantidad de propiedades únicas (forma, color, etc.) no es 2 (entonces, 1 o 3)fuente
end
más varios saltos de línea: transformarif ... puts ... end
enputs ... if ...
b) todos pueden tomar un bloqueo, por lo tantox.map{}.all?
es igual ax.all?{}
if
.Mathematica
93 92 93 82 7673La lógica
StringSplit@#~Subsets~{3}
produce una lista de subconjuntos de 3 cartas. Cada triple como:{{"D", "G", "3", "N"}, {"W", "G", "3", "S"}, {"O", "G", "3", "O"}}
o
luego se transpone,
y
Tally/@(Characters@#^T)
cuenta el número de elementos distintos en cada fila.3 corresponde a "todos diferentes"; 1 corresponde a "todos iguales".
FreeQ[...,2]
determina si 2 cartas del mismo tipo o en el triple. Si 2 no está entre los tantos, entonces las tres cartas son un "conjunto", de acuerdo con las reglas del Juego de conjunto.Uso
fuente
f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&
La salida será{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
Mathematica 73
Uso
fuente
Brachylog , 12 bytes
Pruébalo en línea!
Toma la entrada a través de la variable de entrada y genera la salida a través de la variable de salida.
Segundo caso de prueba tomado de un duplicado recientemente cerrado en su codificación, ya que a esta solución realmente no le importa lo que realmente signifique algo.
fuente
GolfScript, 53 caracteres
La entrada se debe proporcionar en STDIN, ejemplo en línea :
Código comentado:
fuente
0\zip{.&,2=|}/!
se puede acortar azip{.&,}%2&!
javascript
323313es una función que toma una matriz de objetos y devuelve una matriz de objetos.
Violín DEMO (con ordenado).
fuente
APL (IBM), 76
No tengo IBM APL, pero creo que esto funcionará.
Ejecución de muestra (Emulación de IBM APL en Dyalog APL)
fuente
Sabio, 71
Si
C
es una cadena, por ejemplo"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"
, ejecutarLlegar
[{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]
Y aquí hay un enfoque muy diferente usando la interpretación de que un Set es una línea proyectiva en
GF(3)^4
:Estaba un poco molesto porque
D
lo usé dos veces ... hasta que descubrí cómo abusar de eso. Pero aún mejor, también abuso delfind
método.str.find
devuelve -1 si no se encuentra una letra. Desde entonces-1 = 2 mod 3
, la cartaS
se maneja adecuadamente porque no aparece en'WODRPG123N'
.fuente
Python 2 , 99 bytes
Pruébalo en línea!
fuente