Talvez você conheça o jogo de Set (um jogo maravilhoso para crianças), um jogo de cartas com 81 cartas, onde cada carta tem uma figura com 4 atributos diferentes (forma, número, cor e preenchimento). Cada atributo possui 3 valores diferentes:
form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.
12 cartas são abertas na mesa e agora o desafio é indicar sets. Um conjunto consiste em três cartas em que cada valor de atributo ocorre 0, 1 ou 3 vezes. Ter 2 cartas com figuras vermelhas, opacas ou 1 número não é bom. Veja o link fornecido para uma explicação mais visual.
Eu imagino um código para um cartão em que todos os atributos sejam codificados para
"WP2N"
apoia
2 Purple Waves with No fill
Juntamente com, por exemplo, OR1N
eDG3N
e
é um conjunto (3 formas diferentes, 3 cores diferentes, 3 números diferentes, 1 preenchimento).
A entrada é uma sequência delimitada por espaço de códigos exclusivos (escolhidos aleatoriamente dentre os 81 códigos possíveis) que representam cartões.
"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"
A solução deve indicar todos os conjuntos possíveis dentro da coleção fornecida. então
OR1N, WP2N, DG3N
deve fazer parte da solução junto com todos os outros conjuntos.
Respostas:
Ruby,
104988180 caracteresExemplo de execução (usando seus dados de exemplo):
Ele sai
WP2N,DR1D,OG3O
duas vezes porque você tem doisDR1D
s nos dados da amostra.Explicação:
$*.combination(3).map{|c|
- cada combinação de 3 cartõesputs c*?,if
- gera o conjunto, se ...(0..3).all?{|i|
- se todos os números de 0 a 3 (os indeces das propriedades da string) forem avaliadostrue
quando passados para este blococ.map{|x|x[i]}
- pegue oi
th index de cada string.uniq.size!=2}
- se a quantidade de propriedades únicas (forma, cor etc.) não for 2 (portanto, 1 ou 3)fonte
end
mais vários quebras de linha: transformeif ... puts ... end
emputs ... if ...
b) todos podem ter um bloco, assim,x.map{}.all?
é igual ax.all?{}
if
.Mathematica
93 92 93 82 7673A lógica
StringSplit@#~Subsets~{3}
produz uma lista de subconjuntos de 3 placas. Cada triplo, como:{{"D", "G", "3", "N"}, {"W", "G", "3", "S"}, {"O", "G", "3", "O"}}
ou
é então transposto,
e
Tally/@(Characters@#^T)
registra o número de itens distintos em cada linha.3 corresponde a "todos diferentes"; 1 corresponde a "todos iguais".
FreeQ[...,2]
determina se 2 cartas do mesmo tipo ou no triplo. Se 2 não estiver entre as notas, as três cartas serão um "set", de acordo com as regras do Jogo de Set.Uso
fonte
f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&
A saída será{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
Mathematica 73
Uso
fonte
Braquilog , 12 bytes
Experimente online!
Leva a entrada através da variável de entrada e gera a saída através da variável de saída.
Segundo caso de teste extraído de uma duplicata fechada recentemente em sua codificação, já que esta solução não se importa com o que realmente significa.
fonte
GolfScript, 53 caracteres
A entrada deve ser fornecida no STDIN, exemplo online :
Código comentado:
fonte
0\zip{.&,2=|}/!
pode ser encurtado parazip{.&,}%2&!
javascript
323313é uma função que pega uma matriz de objetos e retorna uma matriz de objetos.
DEMO violino (com arrumar).
fonte
APL (IBM), 76
Não tenho o IBM APL, mas acredito que isso funcionará.
Execução de amostra (emulando o IBM APL no Dyalog APL)
fonte
Sage, 71
Se
C
for uma sequência, digamos"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"
, executepara obter
[{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]
E aqui está uma abordagem muito diferente usando a interpretação de que um conjunto é uma linha projetiva em
GF(3)^4
:Fiquei um pouco irritado por ter
D
sido usado duas vezes ... até descobrir como abusar disso. Mas, melhor ainda, também abuso dofind
método.str.find
retorna -1 se uma letra não for encontrada. Desde então-1 = 2 mod 3
, a cartaS
é tratada adequadamente porque não ocorre em'WODRPG123N'
.fonte
Python 2 , 99 bytes
Experimente online!
fonte