미아 세트의 순서


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} 두 세트 모두 각각 한 쌍과 611> 522를 갖기 때문에

간단히 말해서, {1, ..., n}다른 것보다 큽니다. 하자 p > q- 종류는 P-의-Q 뿐인보다 큰 다음,. 동점 인 경우, 두 번째 (, 세 번째, ...) 가장 긴 종류의 승리가 있습니다. 마지막으로 아직 결정을 내릴 수 없으면 가장 큰 수치가 이깁니다. 집합의 숫자 값은 연결을 사용하여 집합의 사용 가능한 숫자로 만들 수있는 가장 큰 정수입니다. 예:

  • {2,5,4,3} 5432가된다
  • {4,11,3,4} B443이 됨 (> 6면 주사위 허용, B = 11)

당신의 임무는 두 개의 컨테이너 (목록, 배열, 설정, ...)가 주어진 첫 번째 또는 두 번째 컨테이너가 승리하는지 여부를 결정하는 가장 작은 가능한 프로그램 (즉 기능)을 선택한 언어로 작성하는 것입니다.

참고 : 두 컨테이너의 길이가 같고 양의 정수만 포함하고 다른 것은 없다고 가정 할 수 있습니다. 특히 정렬되지 않을 수 있습니다. 리턴 값은 {첫 승, 동점, 두 번째 승}에 대해 {-1, 0, 1} 일 수 있습니다.


1
어느 하나 승리 {1,1,6}, {2,2,5}? 가장 큰 종류의 주사위 또는 주사위의 숫자 값을 비교합니까?
Martin Ender

1
순서에 대한 나의 이해가 올바른지 확인하겠습니다 : 먼저 {1, ..., n}이 가장 높습니다. 각 목록에 대해 가장 일반적인 값을 취하고 동일한 값 중 가장 큰 값을 사용하십시오. 하나의 목록에 더 많은 것이 있으면 승리합니다. 동일하게 일반적인 경우 더 큰 쪽이 이깁니다. 공통성과 가치가 모두 같으면 각 목록에서 모든 것을 제거하고 다시 비교하십시오.
xnor

@ 마틴 : 훌륭한 질문. 나는 그것에 대한 "정규적인"결정이 없다고 생각합니다. 그리고 나의 julia 프로그램이 {1,1,6}이 {2,2,5}를 이겼다고 말했기 때문에, 그것은 바로 그 것입니다.
pasbi

@ xnor : 예, 그러나 martin의 의견과 내 대답을 고려하십시오.
pasbi

@oVooVo 오 예, 실제로 숫자를 큰 숫자에서 작은 숫자로 정렬 한 후 숫자 값으로 정렬하는 예제를 고려하는 것이 좋습니다.
Martin Ender

답변:


2

젤리 , 16 바이트

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

각 목록이 롤을 나타내는 목록 (필요한 경우 둘 이상일 수 있음)을 가져 와서 승자 목록을 리턴합니다.

온라인으로 사용해보십시오! ... 또는 여기 에 롤을 가장 약한 것에서 가장 강한 것으로 분류하는 버전이 있습니다.

어떻게?

Ṣ⁼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동일한 것으로 간주되지만, 스펙은 현재 중 하나를 구분하지 않습니다.
Jonathan Allan

@oVooVo 추가 검사시 예 갖는 {1,1,5,6} < {1,1,5,5}6 > 5. 당신은 명확히 할 수 있습니까?
Jonathan Allan

@oVooVo 아마 같이해야 - 나는 "최대 선택"교환 한 ÐṀ, 일종의으로, Þ예로부터 항목을 사용하여 같은 순서로 정렬 - 테스트 목적을. 사용 된 순서는 다음과 같습니다. 먼저 "상위 개"인 경우 내림차순으로 내림차순으로, 마지막으로 내림차순으로 내림차순으로 계산됩니다.
Jonathan Allan

{1,1,5,5}에는 (1,1)과 (5,5)의 두 가지 "종류"가 있습니다. {1,1,5,6}에는 "2 가지 종류"만 있습니다. 따라서 {1,1,5,5}가 이깁니다. 여기서 가치는 중요하지 않습니다. 마찬가지로 {1,1,2,2}> {4,5,6,6}.
pasbi

{1,2,2}> {1,1,2}. 둘 다 하나의 독특한 종류를 가지고 있기 때문에 숫자 타이 브레이킹이 적용됩니다. {1,2,2} => 221 및 {1,1,2} => 211. 분명히 221은 211보다 큽니다. 나는 스펙에서 이것을 명확히 할 것입니다.
pasbi

2

자바 스크립트 (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)

설명 : 두 개의 배열을 매개 변수로 사용합니다. g각 배열을 카운트 목록으로 변환합니다. 그런 다음 목록이 세트에 해당하는지 확인합니다 1..n. 카운트가 정렬되고 정렬 된 값이 연결됩니다. 그런 다음 두 결과를 비교합니다. 반환 값은 두 번째 배열이 이기면 양의 정수이고 첫 번째 배열이 이기면 음의 정수이고, 그렇지 않으면 거짓 JavaScript 값 undefined이 반환됩니다.


프로그램에 {1,1,6} <{2,2,5}가 잘못되었습니다.
pasbi

@oVooVo 죄송합니다. 규칙을 이해하지 못했을 것입니다.
Neil

0

PHP 333 바이트

나는 거리가 1로 시작하여 가장 높은 가치를 향한 오지가 적다고 가정합니다.

나는 조금 더 만든다. 입력은 두 개 이상의 값을 가진 배열입니다. 출력은 정렬 된 배열입니다.

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

왜 길이를 비교하고 있습니까? 지시 사항은 "두 용기의 길이가 동일합니다"라고 말합니다. 뭔가 빠졌습니까?
DavidC

31 행에서 길이 비교를 제거했습니다. 필요하지는 않았지만 다 치지 않았습니다. cmpLex는 40 행에서 원시 입력을 비교하는 데 사용될뿐만 아니라 38 행에서도 countNOfAKind의 결과를 비교하기 때문에 15 행의 비교가 필요합니다. 그러나이 함수는 같은 크기의 입력에 대해 다른 크기의 출력을 생성 할 수 있습니다. countNOfAKind ([3,2]) = [2] (2 개의 외로운 숫자 (3과 2)가 있기 때문에), countNOfAKind ([2,2]) = [0, 1] (고독한 숫자와 한 쌍이 없기 때문에.
pasbi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.