ミアセットの順序


9

サイコロゲームMiaは、サイズ2のセットの非常に重要な順序を導入します。

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

一般に、タプル内の順序は重要{x,y}={y,x}{1,2}はなく、何よりも大きく、ペアは非ペアよりも大きく、同数の場合は数値によって決定されます。

ここで、nサイコロを使用したいとします。また、サイコロにはm顔があります。

例:

  • {1,5,3,4} < {1,2,6,3} 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} 両方のセットにそれぞれ1つのペアがあり、611> 522であるため

一言で言えば、{1, ..., n}何よりも優れています。とするp > qと、p-of-a-kindはq-of-a-kindよりも大きくなります。引き分けの場合は、2番目(3番目、...)に最も長い種類の勝者です。最後に、まだ決定を下すことができない場合は、最大の数値が優先されます。セットの数値は、連結を使用して、セット内の使用可能な数値から作成できる最大の整数です。例:

  • {2,5,4,3} 5432になります
  • {4,11,3,4} B443になります(> 6面のダイスが許可され、B = 11)

あなたの仕事は、選択した言語で可能な限り最小のプログラム(つまり関数)を書くことです。つまり、2つのコンテナー(リスト、配列、セットなど)が与えられると、最初のものか2番目のもののどちらが勝るかを返します。

注:2つのコンテナーは同じ長さで、正の整数のみを含み、それ以外は何も含まないと想定できます。特にそれらはソートされない場合があります。戻り値は何でもかまいません。たとえば、{-1、0、1}は{最初の勝利、同点、2番目の勝利}です。


1
どちらが勝利の{1,1,6}{2,2,5}?最大のPの種類または任意のサイコロの数値を比較しますか?
マーティンエンダー2017年

1
順序の理解が正しいかどうか確認してみましょう。最初に、{1、...、n}が最高です。リストごとに、最も一般的な値を取り、同様に一般的な値の中で最も大きい値を取ります。1つのリストにそれ以上ある場合は、それが優先されます。同様に一般的な場合は、どちらか大きい方が勝ちです。共通性と値の両方が等しい場合は、各リストからすべてを削除して、もう一度比較します。
xnor 2017年

@Martin:すばらしい質問です。それについての「標準的な」決定はないと思います、そして私のジュリアプログラムは{1,1,6}が{2,2,5}に勝つと言っているので、それはそれだけです。
pasbi 2017年

@xnor:はい、ただしmartinのコメントと私の回答を検討してください。
pasbi 2017年

@oVooVoそうそう、数字を最大から最小に並べ替えた後に数値で並べ替える例を考えると、それは実際に理にかなっています。
マーティンエンダー2017年

回答:


2

ゼリー、16 バイト

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

それぞれがロールを表すリストのリストを取り(したがって、必要に応じて2つ以上になる場合があります)、勝者のリストを返します。

オンラインでお試しください!...代わりに、ここでは代わりにロールを最弱から最強にソートするバージョンがあります。

どうやって?

Ṣ⁼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ゴルフしようとしているときには、これより私が気づい1,1,21,2,2同等とみなされているが、スペックは現在、いずれかの区別はありません。
ジョナサンアラン

@oVooVo詳細な調査の結果、例の{1,1,5,6} < {1,1,5,5}どこにあるか6 > 5。明確にしてもらえますか?
ジョナサンアラン

@oVooVo多分それはこのようになるはずです-私は「最大の選択」をÐṀソートのÞためにテスト目的で置き換えました-サンプルからのアイテムを使用して、それらを同じ順序にソートします。使用される順序は次のとおりです。最初に「トップドッグ」の場合、次に等しい面の数の降順、最後に一意の面の降順。
ジョナサンアラン

{1,1,5,5}には、(1,1)と(5,5)の2つの「種類」があります。{1,1,5,6}には、「2の種類」が1つだけあります。したがって、{1,1,5,5}が勝ちます。ここでは値は関係ありません。同様に、{1,1,2,2}> {4,5,6,6}。
pasbi 2017年

{1,2,2}> {1,1,2}。両方に1種類の2があるため、数値的なタイブレイクが適用されます。{1,2,2} => 221および{1,1,2} => 211。明らかに221は211よりも大きいです。仕様でこれを明確にします。
pasbi 2017年

2

JavaScript(ES6)、162バイト

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

説明:パラメーターとして2つの配列を取ります。g各配列をカウントのリストに変換します。次に、リストがセットに対応しているかどうかがチェックされ1..nます。カウントがソートされ、ソートされた値が連結されます。次に、2つの結果を比較します。戻り値は、2番目の配列が勝った場合は正の整数、最初の配列が勝った場合は負の整数ですundefined。それ以外の場合は、偽のJavaScript値が返されます。


プログラムは{1,1,6} <{2,2,5}と言っていますが、これは誤りです。
pasbi 2017年

@oVooVo申し訳ありませんが、私はルールを誤解していたに違いありません(種類が最も長い数値に基づいて関係を破ったと思います)。
Neil

0

PHP 333バイト

1から始まる通りのように、サイコロの数が最も少なく、最も高い値に直面していると思います

もう少し作ります。入力は2つ以上の値を持つ配列です。出力はソートされた配列です。

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

壊す

$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

ジュリア(489バイト)

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

読みやすい:

  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

長さを比較するのはなぜですか?指示には、「2つのコンテナーは同じ長さです」と書かれています。何か不足していますか?
DavidC 2017年

31行目で長さの比較を削除しました。これは必要ありませんでしたが、問題にはなりませんでした。cmpLexは40行目で生の入力を比較するためだけでなく、38行目でもcountNOfAKindの結果を比較するために使用されるため、15行目の比較が必要です。ただし、この関数は、同じサイズの入力に対して異なるサイズの出力を生成する可能性があります。 [0、1](非孤独な数と一組が存在しないため。
pasbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.