Ordem dos Conjuntos Mia


9

O jogo de dados Mia apresenta uma ordem não trivial de conjuntos de tamanho dois:

{3,1} < {3,2} < {4,1} < {4,2} < {4,3} < {5,1} < {5,4} < {6,1} < {6,5} < {1,1} < {2,2} < {6,6} < {1,2}

Em geral, a ordem dentro de uma tupla não importa {x,y}={y,x}, {1,2}é maior que qualquer outra coisa, Pares são maiores que não pares e o valor numérico decide em caso de empate.

Agora, suponha que você queira usar ndados. Além disso, os dados têm mrostos.

Exemplo:

  • {1,5,3,4} < {1,2,6,3} desde 5431 <6321
  • {1,2,3,5} < {1,1,5,6} < {1,1,5,5}, {1,1,6,6} < {1,1,1,3} < {2,2,2,3} < {1,1,1,1} < {1,2,3,4}
  • {2,2,5} < {1,1,6} uma vez que os dois conjuntos têm cada par e 611> 522

Em poucas palavras, {1, ..., n} é maior do que qualquer outra coisa. Vamos p > q, então p-do-tipo é maior que q-do-tipo. Em caso de empate, o segundo (, terceiro, ...) - o maior do gênero vence. Finalmente, se nenhuma decisão puder ser tomada ainda, o maior valor numérico vence. O valor numérico de um conjunto é o maior número inteiro que você pode construir a partir dos números disponíveis no conjunto, usando concatenação. Exemplo:

  • {2,5,4,3} torna-se 5432
  • {4,11,3,4} torna-se B443 (dados com 6 faces são permitidos, B = 11)

Sua tarefa é escrever o menor programa possível (ou seja, função) no idioma de sua escolha, que, considerando dois contêineres (lista, matriz, conjunto, ...) retorne se o primeiro ou o segundo vence.

Nota: você pode assumir que os dois contêineres têm o mesmo comprimento e contêm apenas números inteiros positivos, mas nada mais. Especialmente eles podem não ser classificados. O valor de retorno pode ser qualquer coisa, por exemplo, {-1, 0, 1} para {primeiras vitórias, empate, segundas vitórias}.


11
Qual deles vence de {1,1,6}, {2,2,5}? Você compara o valor numérico do maior p-de-um-tipo ou de qualquer dado?
Martin Ender

11
Deixe-me verificar se meu entendimento da ordem está correto: primeiro, {1, ..., n} é mais alto. Para cada lista, pegue o valor mais comum e, com valores igualmente comuns, o maior. Se uma lista tiver mais disso, ela vence. Se igualmente comum, o que for maior, ganha. Se for igual em comum e em valor, remova todos os de cada lista e compare novamente.
Xnor

@ Martin: Excelente pergunta. Eu acho que não existe uma decisão "canônica" sobre isso, e como meu programa julia diz que {1,1,6} vence {2,2,5}, então é exatamente isso.
pasbi

@ xnor: Sim, no entanto, considere o comentário de Martin e minha resposta.
pasbi

@oVooVo Ah, sim, isso realmente faz sentido, considerando o seu exemplo, onde você simplesmente os classifica por valor numérico após classificar os dígitos do maior para o menor.
Martin Ender

Respostas:


2

Gelatina , 16 bytes

ṢŒrUṢṚZ
Ṣ⁼J;ǵÐṀ

Pega uma lista de listas, cada uma das quais representa um rolo (podendo ser mais de duas, se desejado) e retorna uma lista dos vencedores.

Experimente online! ... alternativamente, aqui está uma versão que classifica os rolos do mais fraco para o mais forte.

Como?

Ṣ⁼J;ǵÐṀ - Main link: list of list of dice rolls, L
     µÐṀ - filter keep maximal (i.e. sort L by the previous link as a key and keep maximums)
         -                                            e.g. [5,3,1,3]
Ṣ        -     sort roll                                   [1,3,3,5]
  J      -     range(length(roll))                         [1,2,3,4]
 ⁼       -     equal? [1,2,3,...n] beats everything        0
    Ç    -     call last link as a monad with input roll   [[2,1,1],[3,5,1]]
   ;     -     concatenate                                 [0,[2,1,1],[3,5,1]]

ṢŒrUṢṚZ - Link 1, rest of sort key: dice rolls        e.g. [5,3,1,3]
Ṣ       - sort the roll                                    [1,3,3,5]
 Œr     - run length encode                                [[1,1],[3,2],[5,1]]
   U    - upend (reverse each)                             [[1,1],[2,3],[1,5]]
    Ṣ   - sort                                             [[1,1],[1,5],[2,3]]
     Ṛ  - reverse                                          [[2,3],[1,5],[1,1]]
      Z - transpose                                        [[2,1,1],[3,5,1]]
        -     ...this is a list of: 1) the group sizes descending; and
                 2) the face values of each group, descending across equal group sizes

@oVooVo Ao tentar golf isso mais eu notei que 1,1,2e 1,2,2são considerados iguais, mas a especificação atualmente não distingui-los também.
Jonathan Allan

@oVooVo após uma inspeção mais aprofundada, o exemplo tem {1,1,5,6} < {1,1,5,5}onde 6 > 5. Você poderia esclarecer?
Jonathan Allan

@oVooVo Talvez ele deve ser como este - eu ter substituído o "seleção máxima", ÐṀcom uma espécie, Þ, para fins de teste - usando os itens a partir do exemplo ele classifica-los na mesma ordem. A ordem usada é: primeiro se for "top-dog", depois por contagens de faces iguais descendo e finalmente por faces únicas descendo.
Jonathan Allan

{1,1,5,5} possui dois "dois tipos": (1,1) e (5,5). {1,1,5,6} possui apenas um "tipo 2". Daí {1,1,5,5} vitórias. O valor não importa aqui. Da mesma forma, {1,1,2,2}> {4,5,6,6}.
288 pasbi

{1,2,2}> {1,1,2}. Como ambos têm um desempate numérico único, aplicável. {1,2,2} => 221 e {1,1,2} => 211. Obviamente 221 é maior que 211. Vou esclarecer isso nas especificações.
pasbi

2

JavaScript (ES6), 162 bytes

(a,b,g=a=>a.map(n=>e[n]=e[n]+1||1,e=[1])&&[[...e].every(n=>n==1),...e.filter(i=x=>x).sort(h=(a,b)=>b-a),...a.sort(h)],c=g(a),d=g(b))=>d.map((n,i)=>n-c[i]).find(i)

Explicação: Leva duas matrizes como parâmetros. gconverte cada matriz em uma lista de contagens. A lista é então verificada para ver se corresponde a um conjunto 1..n. As contagens são classificadas e os valores classificados são concatenados. Os dois resultados são então comparados. O valor de retorno é um número inteiro positivo se a segunda matriz vencer e um número inteiro negativo se a primeira matriz vencer, caso contrário, o valor JavaScript falso undefinedserá retornado.


Seu programa diz {1,1,6} <{2,2,5}, o que está errado.
pasbi

@oVooVo Desculpe, eu devo ter entendido errado as regras (eu pensei que você quebrou os laços com base no valor numérico dos mais longos).
Neil

0

PHP 333 bytes

Suponho que haja menos dados, em seguida, enfrenta o valor mais alto, pois a rua começa com 1

Eu faço um pouco mais. A entrada é uma matriz com mais de dois valores. Saída é a matriz classificada.

<? $m=$_GET[m];foreach($m as$k=>$v){rsort($v);$m[$k]=$v;}function t($a,$b){if($a==$r=range($x=count($a),1))return 1;elseif($b==$r)return-1;$c=array_pad(array_values(array_count_values($a)),$x,0);$d=array_pad(array_values(array_count_values($b)),$x,0);rsort($c);rsort($d);if($e=$c<=>$d)return$e;return$a<=>$b;}usort($m,t);print_r($m);

Demolir

$m=$_GET["m"]; # Array as Input
foreach($m as$k=>$v){
    rsort($v); # reverse sort of an item
    $m[$k]=$v; # replace the sort item
}
function t($a,$b){ #sorting algorithm
    if($a==$r=range($x=count($a),1))return 1; # $a is highest value
    elseif($b==$r)return-1; # $b is highest value
    $c=array_pad(array_values(array_count_values($a)),$x,0); 
# prepare check multiple values for fist value
    $d=array_pad(array_values(array_count_values($b)),$x,0); 
# prepare check multiple values for second value
    rsort($c);
    rsort($d);
    if($e=$c<=>$d)return$e; # compare first and second multiples
    return$a<=>$b; # compare dices
}
usort($m,"t"); # start sort
print_r($m); #print sorted array from low to high

0

Julia (489 bytes)

function a(x,y)l=length;g=collect;s=sort;m=maximum;r=repmat;function b(z)w=sum(r(z,1,m(z)).==r(g(1:m(z))',l(z),1),1);u=zeros(m(w));map(i->if i>0 u[i]+=1;end,w);return u end;function c(x,y)if l(x)>l(y)return-1 elseif l(x)<l(y)return 1 else for i=l(x):-1:1 if x[i]>y[i] return-1 elseif x[i]<y[i] return 1 end end;return 0;end end;x=s(x);y=s(y);if x==y return 0;elseif x==g(1:l(x));return-1 elseif y==g(1:l(y))return 1 else d=c(b(x),b(y));if d==0 return c(x,y);else return d;end end end

Legível:

  1 function a(ds1, ds2)
  2     function countNOfAKind(ds)
  3         # return array. n-th value is number of occurences of n-of-a-kind.
  4         # e.g. findNOfAKind([1, 1, 1, 2, 2, 3, 3]) == [0, 2, 1]
  5         ps = sum(repmat(ds, 1, maximum(ds)) .== repmat(collect(1:maximum(ds))', length(ds), 1), 1);
  6         ls = zeros(maximum(ps));
  7         map(i -> if i>0 ls[i] += 1 end, ps);
  8         return ls
  9     end
 10 
 11     function cmpLex(ds1, ds2)
 12         # compare ds1, ds2 reverse-lexicographically, i.e. compare last distinct value.
 13         if length(ds1) > length(ds2)
 14             return -1
 15         elseif length(ds1) < length(ds2)
 16             return 1
 17         else
 18             for i = length(ds1):-1:1
 19                 if ds1[i] > ds2[i]
 20                     return -1
 21                 elseif ds1[i] < ds2[i]
 22                     return 1
 23                 end
 24             end
 25             return 0;
 26         end
 27     end
 28     
 29     ds1=sort(ds1);
 30     ds2=sort(ds2);
 31     if ds1 == ds2
 32         return 0;
 33     elseif ds1 == collect(1:length(ds1))
 34         return -1
 35     elseif ds2 == collect(1:length(ds2))
 36         return 1
 37     else
 38         d = cmpLex(countNOfAKind(ds1), countNOfAKind(ds2))
 39         if d == 0
 40             return cmpLex(ds1, ds2);
 41         else
 42             return d;
 43         end
 44     end
 45 end

Por que você está comparando comprimentos? As instruções dizem "os dois contêineres têm o mesmo comprimento". Estou esquecendo de algo?
DavidC

Eu removi a comparação de comprimento na linha 31. Não era necessário, mas também não doeu. A comparação na linha 15 é necessária, pois o cmpLex não é usado apenas na linha 40 para comparar as entradas brutas, mas também na linha 38 para comparar o resultado de countNOfAKind. Essa função, no entanto, pode produzir saídas de tamanhos diferentes para entradas de tamanhos iguais: countNOfAKind ([3,2]) = [2] (porque existem dois números solitários (3 e 2)), countNOfAKind ([2,2]) = [0, 1] (porque não há número solitário e um par.
pasbi 4/17/17
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.