Наборы Ордена Миа


9

Игра в кости Миа вводит очень нетривиальный порядок наборов второго размера:

{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-of-a-kind больше, чем q-of-a-kind. В случае ничьей побеждает второй (третий) ... самый длинный в своем роде. Наконец, если решение еще не принято, выигрывает наибольшее числовое значение. Числовое значение набора - это наибольшее целое число, которое вы можете построить из доступных чисел в наборе, используя конкатенацию. Пример:

  • {2,5,4,3} становится 5432
  • {4,11,3,4} становится B443 (> разрешены 6-гранные кости, B = 11)

Ваша задача - написать наименьшую возможную программу (т. Е. Функцию) на выбранном вами языке, которая при наличии двух контейнеров (list, array, set, ...) возвращает, выиграет первый или второй.

Примечание: вы можете предположить, что два контейнера имеют одинаковую длину и содержат только положительные целые числа, но не более того. Особенно они могут быть не отсортированы. Возвращаемое значение может быть любым, например, {-1, 0, 1} для {первых побед, ничьих, вторых побед}.


1
Какой из них выигрыши {1,1,6}, {2,2,5}? Сравниваете ли вы числовое значение самого большого р-типа или какой-либо кости?
Мартин Эндер

1
Позвольте мне проверить, правильно ли я понимаю порядок: во-первых, {1, ..., n} самое высокое. Для каждого списка возьмите самое распространенное значение, а из одинаково общих значений - самое большое. Если один список имеет больше этого, он выигрывает. Если одинаково часто, то, что больше, побеждает. Если они одинаковы по общности и значению, удалите все из каждого списка и сравните снова.
xnor

@Martin: Отличный вопрос. Я полагаю, что никакого «канонического» решения по этому поводу не существует, и, поскольку моя программа Джулии говорит, что {1,1,6} выигрывает у {2,2,5}, то это просто так.
pasbi

@xnor: Да, однако рассмотрите комментарий Мартина и мой ответ.
pasbi

@oVooVo О да, это действительно имеет смысл, учитывая ваш пример, где вы просто сортируете их по числовому значению после сортировки цифр от самой большой до самой маленькой.
Мартин Эндер

Ответы:


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,2и 1,2,2считаются равными, но спецификации в настоящее время не отличают их либо.
Джонатан Аллан

@oVooVo при дальнейшей проверке в примере есть {1,1,5,6} < {1,1,5,5}где 6 > 5. Не могли бы вы уточнить?
Джонатан Аллан

@oVooVo Может быть , это должно быть , как это - я заменил «максимальный выбор», ÐṀс каким -то , Þдля целей тестирования - с использованием элементов из примера сортирует их в том же порядке. Используется следующий порядок: сначала по «top-dog», затем по убыванию равных граней и, наконец, по убыванию уникальных граней.
Джонатан Аллан

{1,1,5,5} имеет два «2 в своем роде»: (1,1) и (5,5). {1,1,5,6} имеет только одну "2 в своем роде". Следовательно, {1,1,5,5} выигрывает. Значение здесь не имеет значения. Аналогично, {1,1,2,2}> {4,5,6,6}.
Пасби

{1,2,2}> {1,1,2}. Поскольку оба имеют один в своем роде, применяется числовой разрыв связей. {1,2,2} => 221 и {1,1,2} => 211. Очевидно, что 221 больше, чем 211. Я поясню это в спецификациях.
Пасби

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)

Объяснение: принимает два массива в качестве параметров. gпреобразует каждый массив в список отсчетов. Затем список проверяется, чтобы увидеть, соответствует ли он набору 1..n. Подсчет отсортирован, а отсортированные значения объединены. Затем результаты сравниваются. Возвращаемое значение является положительным целым числом, если второй массив выигрывает, и отрицательным целым числом, если первый массив выигрывает, в противном случае возвращается ложное значение JavaScript undefined.


Ваша программа говорит {1,1,6} <{2,2,5}, что неправильно.
pasbi

@oVooVo Извините, я, наверное, неправильно понял правила (я думал, что вы разорвали связи, основываясь на числовом значении самого длинного в своем роде).
Нил

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. Это было не нужно, но и не повредило. Сравнение в строке 15 необходимо, поскольку cmpLex используется не только в строке 40 для сравнения необработанных входных данных, но также и в строке 38 для сравнения результатов countNOfAKind. Однако эта функция может создавать выходы разного размера для входов одинакового размера: countNOfAKind ([3,2]) = [2] (поскольку есть два одиноких числа (3 и 2)), countNOfAKind ([2,2]) = [0, 1] (потому что нет одинокого номера и одной пары.
pasbi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.