2013-10-03 3 views
3

Мне нужно было рассчитать количество различных возможных рулонов, которые могут возникнуть в результате прокатки K-кубиков, каждая с N-сторонами. Мое определение roll состоит в том, что что-то вроде {1, 1, 2, 3, 4} эквивалентно {1, 4, 3, 1, 2} (порядок не имеет значения), но не {1, 1, 3 , 3, 3} (это не тот набор результатов). Например: Yahtzee - игра с участием рулонов 5 6-сторонних кубиков —, по крайней мере, первоначально, до повторений — и, следовательно, количество различных валков 252. Случай, когда N = K приводит к OEIS sequence A001700.Количество различных рулонов K N-сторонних кубиков

Если я не ошибаюсь, это определяется как «(N-1 + K) выбирает (N-1)» или, что то же самое, «(N + K-1) выбирает K», которое равно K ! <: K + N в J. Это приводит меня к четырем различным молчаливым представлениям:

  • d =: ([ ! [: <: +). Простой поезд, без круглых скобок, хотя мне нужно использовать кепку.
  • d =: ([ (! <:) +). Нет колпачка, но скобки внутреннего крючка.
  • d =: (] !&<: +). Только три глагола, но с использованием Compose. Он использует версию (<: N) ! <: K + N.
  • d =: (([ ! +) * ] % +). Это переписывает «C (N + K-1, K)» как «C (N + K, K) * N/(N + K)». Это уродливее, но в случае 0 кубиков 0-сторонности он дает 0 вместо 1, что, возможно, является менее бессмысленным ответом.

Какое из них является самым «J-ish» решением?

Кроме того, монадический корпус для всех этих целей не имеет смысла: 1 0 0 0 0 ... для первых трех и 0 1 1 1 ... для четвертого. Более логичная монада для этого глагола была бы рефлексивной, как задано d~, так лучше было бы определить этот глагол как (d~ : d)?

ответ

2

Мое предпочтение было бы:

d =: ([ (! <:) +) 

и добавить монадический вариант двоичного

d =: d~ : ([ (! <:) +) NB. 4 d 5 (4 rolls of 5 sided dice : 70 possible combinations) 

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

Конечно, окончательная версия была бы выбором, если бы 0 d 0 должно было возвращать 0, даже если это выглядит немного сложнее.

+0

Делитесь своими предпочтениями. Если нулевые ролики или кости необходимы для получения нуля в результате, я бы сделал [ (! <:) + правильной иглой этой более широкой вилки: *&* * ([ (! <:) +) kaleidic

+0

Я не могу понять, как сделать комментарий на самом деле отображающим код. Слева от оригинального глагола должна быть звезда-амперсанд-звезда-звезда-звезда. (Разумеется, пространство является декоративным, а не семантическим). – kaleidic

+0

Итак, вы имеете в виду '(* & * * [(! <:) +)'? Теперь есть идея. Вы не можете просто подписывать товар, потому что я думаю, что один способ бросить 0 кубиков с N сторон делает комбинаторный смысл. Но эта идея приводит нас к '(* @] * [(! <:) +)', что соответствует счету. Ницца! – algorithmshark

Смежные вопросы