Орден Міа наборів


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)

Ваше завдання полягає в тому, щоб написати найменшу можливу програму (тобто функцію) на обрану вами мову, яка з урахуванням двох контейнерів (список, масив, набір, ...) повертає, чи виграє перший чи другий.

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


1
Який з них виграші {1,1,6}, {2,2,5}? Чи порівнюєте ви числове значення найбільшого у своєму роді чи будь-яких кубиків?
Мартін Ендер

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

@Martin: Відмінне запитання. Я думаю, що немає «канонічного» рішення щодо цього, і оскільки моя програма для юлії каже, що {1,1,6} перемагає {2,2,5}, то це просто так.
пасбі

@xnor: Так, проте врахуйте коментар Мартіна та мою відповідь.
пасбі

@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 Може бути , це повинно бути , як це - я замінив «максимальний вибір», ÐṀз яким -то , Þдля цілей тестування - з використанням елементів з прикладу сортує їх у тому ж порядку. Використовується впорядкування: спочатку, якщо це "верхня собака", потім за кількістю рівних граней, що спадають, і, нарешті, унікальними обличчями, що спадають.
Джонатан Аллан

{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. Підрахунки відсортовані, а відсортовані значення об'єднані. Потім ці результати порівнюються. Повернене значення - це додатне ціле число, якщо другий масив виграє, і від'ємне ціле, якщо виграє перший масив, інакше undefinedповернеться хибне значення JavaScript .


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

@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.