Мне нужно было рассчитать количество различных возможных рулонов, которые могут возникнуть в результате прокатки 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)
?
Делитесь своими предпочтениями. Если нулевые ролики или кости необходимы для получения нуля в результате, я бы сделал
[ (! <:) +
правильной иглой этой более широкой вилки:*&* * ([ (! <:) +)
– kaleidicЯ не могу понять, как сделать комментарий на самом деле отображающим код. Слева от оригинального глагола должна быть звезда-амперсанд-звезда-звезда-звезда. (Разумеется, пространство является декоративным, а не семантическим). – kaleidic
Итак, вы имеете в виду '(* & * * [(! <:) +)'? Теперь есть идея. Вы не можете просто подписывать товар, потому что я думаю, что один способ бросить 0 кубиков с N сторон делает комбинаторный смысл. Но эта идея приводит нас к '(* @] * [(! <:) +)', что соответствует счету. Ницца! – algorithmshark