Анализировать перетасованные перетасовки

13

Род модерирует карточную игру между двумя игроками: Джорджем и Тимом. В настоящее время Тим тасует карты. Род подозревает, что Тим пытается обмануть, поэтому он нуждается в вашей помощи, чтобы проверить, что случайный выбор справедлив.

Тим делает перетасованный перетасовкой: он вырезает стопку карт из нижней части колоды, затем разрезает различные части от верхней части стопки до верхней части колоды и повторяет процесс несколько раз.

Род с орлиными глазами и может точно видеть, сколько карт каждый раз вырубает Тим, однако он не может рассчитывать и отслеживать карты так быстро, как тасует Тим. Вот где вы приходите: Род хочет, чтобы вы написали программу или функцию, которая получает подробную информацию о перетасовании и определяет, является ли перестановка честной, слабой или хитрой.

  • Если после перетасовки менее 25 пар смежных карт остаются смежными (в том же порядке), тогда перетасовка является справедливой, и игра может продолжаться.
  • Если по крайней мере 25 (но не все) пары смежных карт остаются смежными, то перетасовка слабая, и Род ударит Тима по голове и попросит его еще раз перемешать.
  • Если в конце все карты остаются в одном и том же положении, то Тим явно обманывает, и Род ударит его большой форелью.

Это код гольф, поэтому выигрывает самый короткий код.

Входные данные:

Вы получите ряд чисел от 0 до 52 (оба исключительных), разделенных пробелами по нескольким строкам, где каждая строка представляет раунд перетасовки, который начинается и заканчивается всеми сложенными вместе картами.

В каждой строке первое число - это количество карт, которые Тим вырезает из нижней части колоды, а каждое последующее число - это количество карт, которые он сбрасывает из своей руки на верх колоды. Если какие-либо карты остаются после последнего номера в строке, вы должны предположить, что Тим кладет их на верх колоды.

Вклад гарантированно будет действительным. Существует как минимум одна строка чисел, и каждая строка содержит как минимум 2 числа. Первое число в каждой строке не меньше, чем сумма всех других чисел в той же строке. Завершающий перевод строки не обязателен, вы можете предположить, что вход имеет один или что он не имеет.

Выход:

Ваша программа должна печатать / возвращать «честно», если случайное перемешивание справедливо, «слабое», если случайное перемешивание слабое, и «обманывать», если Тим держит все карты в одном порядке. Завершающий перевод строки не является обязательным.

Пример:

Предполагается, что в колоде 52 карты, но для демонстрации я буду использовать меньшую колоду из 10 карт.

Входные данные:

5 3 1
4 2 2

Начальная колода, если смотреть сверху: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9в руке)
35 6 7 0 1 2 3 4( 8 9в руке)
18 5 6 7 0 1 2 3 4( 9в руке)
конец строки ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4в руке)
21 2 9 8 5 6 7 0( 3 4в руке)
23 4 1 2 9 8 5 6 7 0
4 пары остаются смежными:(3 4) (1 2) (5 6) (6 7)

Тестовые случаи:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

Выход: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

Выход: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

Выход: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

Выход: weak


26 13
26 13
26 13
26 13

Выход: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Выход: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Выход: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Выход: fair

Требования:

  • Если вы пишете функцию, она может либо читать из стандартного ввода, либо получать ввод в виде единственного строкового параметра. Кроме того, функция может распечатать вывод или вернуть его.
  • Программа должна быть запущена в Linux с использованием свободно доступного программного обеспечения.
  • Исходный код должен использовать только символы ASCII.
  • Нет стандартных лазеек.
уйти, потому что SE это зло
источник
2
Почему ограничение ASCII? Многие языки (APL, машинный код, TI-BASIC) вообще не используют ASCII, поэтому вы неявно запрещаете их.
lirtosiast
@ThomasKwa Потому что мне не нравятся проблемы, связанные с отображением и подсчетом не-ASCII символов. Некоторые из этих языков имеют представления ASCII или альтернативы. Я думаю, что это не очень жесткое ограничение, и оно немного выравнивает игровое поле.
Адицу ушел, потому что SE это зло
Я думаю, что система оценки, такая как «Записи, использующие только печатаемые символы ASCII, будут иметь количество байтов, умноженное на log (95) / log (256)», было бы лучшим вариантом, если вы хотите справедливо стимулировать печатные представления ASCII. Причина заключается в том, что информационное содержание записей с одинаковым счетом будет одинаковым. Лично я все же предпочел бы простой подсчет байтов.
lirtosiast
@ThomasKwa Хорошо, а как насчет этого? Только печатаемые символы
Юникода

Ответы:

4

CJam, 76 75 байт

52,qN/{[~](52\-@/(\e_@{/(@+\e_}/\+}/2ew::m2f/0-,_!\26>-"weak trick fair"S/=

Попробуйте онлайн в интерпретаторе CJam .

Деннис
источник
5
LOL, "форель" :)
адицу ушел, потому что SE ЗЛО
2

JavaScript, 292 289 байт

Вероятно, из этого можно извлечь еще несколько байтов, но пока это первый быстрый проход:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

РЕДАКТИРОВАТЬ: Сохранено 3 байта путем повторного использования значения iиз цикла построения колоды при подсчете количества смежных карт.

Шон Лэтэм
источник