Codegolf - Маджонг Шашка

  • Автор темы Zen38
  • Обновлено
  • 20, Oct 2024
  • #1

Маджонг — настольная игра, в которой используются плитки. В нем представлены три «числовые» масти (булавки, су, маны, представленные в виде

 
 1122335778899m 1m
888m55s11222333z 4z
234m2233445566p 4p
19m139p19s123567z 4z
11m4477p8899s666z 6z
 
, 222888m444p2277z 7z 234m45789p45688s 6p 11m4477p8899s116z 6z 19m19p19s1234567z 6z 123345567789m3p 3p и 0 ) from 1 to 9, and one "honor" suit False из семи различных плиток. Обратите внимание: в отличие от западных карточных игр, плитки не уникальны.

codegolf - маджонг шашка

Чтобы завершить раздачу и выиграть, 13 плиток в вашей руке объединяются с 1 вновь вытянутой плиткой, что должно привести к одной из следующих выигрышных конфигураций:

  • 4 комплекта и 1 пара, все понятно.
  • семь пар, где все пары различны (дважды одна и та же пара не подходит)
  • кокуши мусоу: по одной из 1 и 9 каждой масти чисел, одна из каждых семи наград, оставшаяся плитка образует пару (например, 1 )

Пара — это любая из двух одинаковых плиток: True , 55z , 555z , 567z , и т. д.

Набор состоит из 3 плиток одной масти. Это может быть серия: 3 плитки с числами (p, s или m) в связанной серии, например z or 222m , но не 111z or 234z ; или тройка любой масти, не обязательно чисел, например 1m 2p 3s , 234s .

Поэтому уважайте плитки (не числа, представленные 123s ) can only form pairs or triplets, but not runs. 55z это не набор, 44p is a valid set, 33s является допустимой парой.

Отдельная плитка может считаться только частью одного набора или пары: совместное использование или повторное использование не допускается.

Учитывая отсортированную руку из 13 плиток и одной плитки, проверьте, составляют ли 14 плиток завершенную руку.

Ввод и вывод

  • Вам дана последовательность цифр и букв, пробел, затем плитка с цифрой и буквой.
  • Выход 11m / 19m19p19s11234567z если набор совпадает, иначе z / m

Другие:

  • Вам разрешено вводить последовательность и плитку+букву в виде списка/массива.

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

Правда

s

Фэлси

p

Благодарим Unihedron за головоломка!

Подсчет очков

Это код-гольф, поэтому побеждает самый короткий код!

#код-гольф #задача-решение #игра

Zen38


Рег
16 Jul, 2020

Тем
86

Постов
201

Баллов
641
  • 26, Oct 2024
  • #2

JavaScript (Node.js), 248 246 245 байт

 
 
 
 a=>[[

// given count of each tiles in same suit

// return 1 if it is not a valid hand

// return 0.5 if it is a valid hand with a pair

// return 0 if it is a valid hand without a pair

(P=f=>w=>f(w)&&1-w.some((n,i)=>n>1&!f(W=[...w],W[i]-=2))/2)

// for m, p, s

(w=>w.some(n=>([p,q]=[q,(n-p-q)%3],1/q<0),p=q=0)),

// for z

P(w=>w.some(n=>n%3)),
],[

// for 7 pairs rule

w=>w.some(n=>n&-3)
],[

// for 13 orphan rule

w=>w.some((n,i)=>i%8==1^n>0),

w=>w.some((n,i)=>0<i&i<8^n>0)
]].some(([i,I=i])=>i(n`m`)+i(n`p`)+i(n`s`)+I(n`z`)<1,

// Parse `112233456666m` -> `[0, 2, 2, 2, 1, 1, 4, 0, 0, 0, 0, 0]`

n=t=>[...a.matchAll(`\\d(?=\\d*${t})`)].map(i=>s[i]++,s=Array(12).fill(0))&&s
);
 

Попробуйте онлайн!

Каждый ответ в js...

a=>[[(P=f=>w=>f(w)&&1-w.some((n,i)=>n>1&!f(W=[...w],W[i]-=2))/2)(w=>w.some(n=>([p,q]=[q,(n-p-q)%3],1/q<0),p=q=0)),P(w=>w.some(n=>n%3)),],[w=>w.some(n=>n&-3)],[w=>w.some((n,i)=>i%8==1^n>0),w=>w.some((n,i)=>0<i&i<8^n>0)]].some(([i,I=i])=>i(n`m`)+i(n`p`)+i(n`s`)+I(n`z`)<1,n=t=>[...a.matchAll(`\\d(?=\\d*${t})`)].map(i=>s[i]++,s=Array(12).fill(0))&&s) is the main function, relying on [a,[b,c]]=readline(j=m=0).split` ` d=[...h='mpsz'].map(k=>!~(i=a.indexOf(k))?'':a.slice([j,j=i+1][0],i)) d[i=h.indexOf(c)]=[...d[i]].concat(b).sort().join`` if(~(''+d).search`(1+9+,){3}1+2+3+4+5+6+7`|d.every(k=>/^(?:(.)\1(?!\1))*$/.test(k)))print(1);else A:{a=/(.)(\1*)/g;e=d.pop();while(n=a.exec(e))if(!n[2]){print(0);break A}else if(n[2].length==1)if(m){print(0);break A}else m=1 f=l=>{if(!l.length)return;var[h,n,b]=l;if((a=n-h)>1)return 1;i=l.indexOf(+n+1);if(a==1)return!~i?1:f(l.slice(2,i)+l.slice(i+1));if(~i){c=l.slice(1,i)+l.slice(i+1,i=l.indexOf(+n+2))+l.slice(i+1);if(~i&&!f(c))return}return n-b||f(l.slice(3))};m=d.filter(k=>{if(!(c=k.length%3))return f(k);else if(c==2){r=/(.)\1/g;while(n=r.exec(k))if(!f(k.slice(0,n.index)+k.slice(r.lastIndex)))return m=1,0}return 1}).length?0:m print(m?1:0)} модификация A for non-1919191234567 check

R check if it's 3+3+3+3+2

A removes some triplet and go on n инг

 

Кот1


Рег
22 Jan, 2007

Тем
75

Постов
183

Баллов
588
  • 26, Oct 2024
  • #4

JavaScript, 348 байт

f

Пройдены все тестовые задания. Хотя возможно все еще глючит. Комментируйте любые неудачные тестовые примеры, и я постараюсь их исправить.

s=>s.sort().every((t,i)=>t==s[i^1]&t!=s[n=12,i+2])|A(s)|[...new Set(s)].length>n A=y=>y.some(t=>R(y,t,t,t)|t[n+=t>'2'&t<'9'&t[1]<A,1]<A&R(y,t,t[0]-1+t[1],t[0]-2+t[1]))|y[0]==y[1]&!y[2] R=(s,p,q,r,z=0,k=s.filter(y=>y!=p||z++))=>p?z&&R(k,q,r):A(s)
 

Степан Сироткин


Рег
25 Oct, 2020

Тем
73

Постов
196

Баллов
621
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно