Ordine di Mia Sets


9

Il gioco di dadi Mia introduce un ordine molto insignificante di set di dimensioni due:

{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}

In generale, l'ordine all'interno di una tupla non ha importanza {x,y}={y,x}, {1,2}è maggiore di ogni altra cosa, le coppie sono maggiori delle non coppie e il valore numerico decide in caso di pareggio.

Supponiamo ora che tu voglia usare i ndadi. Inoltre, i dadi hanno mfacce.

Esempio:

  • {1,5,3,4} < {1,2,6,3} dal 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} poiché entrambi i set hanno ciascuno una coppia e 611> 522

In poche parole, {1, ..., n}è più grande di ogni altra cosa. Let p > q, allora p-of-a-kind è maggiore di q-of-a-kind. In caso di pareggio, vince il secondo (, terzo, ...) - il più lungo nel suo genere. Infine, se non è ancora possibile prendere una decisione, vince il massimo valore numerico. Il valore numerico di un set è il numero intero più grande che puoi costruire dai numeri disponibili nel set, usando la concatenazione. Esempio:

  • {2,5,4,3} diventa 5432
  • {4,11,3,4} diventa B443 (> sono ammessi dadi a 6 facce, B = 11)

Il tuo compito è quello di scrivere il programma più piccolo possibile (cioè la funzione) nella lingua che preferisci, che, dati due contenitori (elenco, matrice, set, ...) restituisce se vince il primo o il secondo.

Nota: si può presumere che i due contenitori abbiano la stessa lunghezza e contengano solo numeri interi positivi, ma nient'altro. Soprattutto potrebbero non essere ordinati. Il valore di ritorno può essere qualsiasi, ad esempio {-1, 0, 1} per {prime vittorie, pareggio, seconde vittorie}.


1
Quale delle due vittorie di {1,1,6}, {2,2,5}? Confronti il ​​valore numerico del più grande p-of-a-kind o di qualsiasi dado?
Martin Ender,

1
Vorrei verificare se la mia comprensione dell'ordine è corretta: in primo luogo, {1, ..., n} è il più alto. Per ogni elenco, prendi il valore più comune e di valori ugualmente comuni prendi il valore più grande. Se una lista ne ha di più, vince. Se ugualmente comune, qualunque sia maggiore vince. Se uguali sia in termini comuni che di valore, rimuovi tutti quelli da ogni elenco e confronta nuovamente.
xnor

@Martin: Ottima domanda. Immagino che non ci sia una decisione "canonica" al riguardo, e dato che il mio programma julia dice che {1,1,6} vince su {2,2,5}, allora è proprio quello.
pasbi

@xnor: Sì, tuttavia considera il commento di Martin e la mia risposta.
pasbi

@oVooVo Oh sì, questo ha effettivamente senso considerando il tuo esempio in cui li ordini semplicemente per valore numerico dopo aver ordinato le cifre dal più grande al più piccolo.
Martin Ender,

Risposte:


2

Gelatina , 16 byte

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

Prende un elenco di liste ognuna delle quali rappresenta un tiro (quindi può essere più di due se lo si desidera) e restituisce un elenco dei vincitori.

Provalo online! ... in alternativa ecco una versione che ordina invece i rotoli dal più debole al più forte.

Come?

Ṣ⁼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 Durante il tentativo di golf questo più ho notato che 1,1,2e 1,2,2sono considerati uguali, ma le specifiche attualmente non distinguerli neanche.
Jonathan Allan,

@oVooVo su ulteriore ispezione l'esempio ha {1,1,5,6} < {1,1,5,5}dove 6 > 5. Potresti chiarire?
Jonathan Allan,

@oVooVo Forse dovrebbe essere come questo - ho sostituito la "selezione massima", ÐṀcon una sorta, Þ, a scopo di test - utilizzando gli elementi dalla esempio, li ordina nello stesso ordine. L'ordinamento utilizzato è: prima se è "top-dog", poi per numero di facce uguali in ordine decrescente e infine per facce uniche in ordine decrescente.
Jonathan Allan,

{1,1,5,5} ha due "2 di un tipo": (1,1) e (5,5). {1,1,5,6} ha solo un "2-of-a-kind". Quindi {1,1,5,5} vince. Il valore non ha importanza qui. Allo stesso modo, {1,1,2,2}> {4,5,6,6}.
pasbi

{1,2,2}> {1,1,2}. Poiché entrambi hanno un 2-of-a-kind, si applica il tie-breaking numerico. {1,2,2} => 221 e {1,1,2} => 211. Ovviamente 221 è maggiore di 211. Chiarirò questo nelle specifiche.
pasbi

2

JavaScript (ES6), 162 byte

(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)

Spiegazione: accetta due array come parametri. gconverte ciascun array in un elenco di conteggi. L'elenco viene quindi verificato per vedere se corrisponde a un set 1..n. I conteggi vengono ordinati e i valori ordinati vengono concatenati. I due risultati vengono quindi confrontati. Il valore restituito è un numero intero positivo se vince il secondo array e un numero intero negativo se vince il primo array, altrimenti undefinedviene restituito il valore JavaScript errato .


Il tuo programma dice {1,1,6} <{2,2,5}, che è sbagliato.
pasbi

@oVooVo Mi spiace, devo aver frainteso le regole (pensavo che avessi rotto i legami in base al valore numerico del più lungo di un tipo).
Neil

0

PHP 333 byte

Presumo che ci siano meno dadi che facce per il valore più alto come strada che inizia con 1

Ne faccio un po 'di più. L'input è un array con più di due valori. L'output è l'array ordinato.

<? $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);

Abbattersi

$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 byte)

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

Leggibile:

  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

Perché stai confrontando le lunghezze? Le istruzioni dicono "i due contenitori hanno la stessa lunghezza". Mi sto perdendo qualcosa?
DavidC

Ho rimosso il confronto della lunghezza nella riga 31. Non era necessario ma non faceva male neanche. È necessario il confronto nella riga 15, poiché cmpLex non viene utilizzato solo nella riga 40 per confrontare gli input non elaborati, ma anche nella riga 38 per confrontare il risultato di countNOfAKind. Tale funzione tuttavia può produrre output di dimensioni diverse per input di dimensioni uguali: countNOfAKind ([3,2]) = [2] (perché ci sono due numeri solitari (3 e 2)), countNOfAKind ([2,2]) = [0, 1] (perché non c'è un numero solitario e una coppia.
pasbi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.