Условие динамического глагола в Do While (^ :)

Этот вопрос возник у меня при решении этой проблемы.

NB. Find the next number whose prime factorization exponents
NB. match those of the given number.

exps=. /:~@{:@(__&q:)
f=. 3 : 0
  target=. exps y
  (>:^:(-.@(target-:exps))^:_) y+1
)

f 20 NB. 28

Обратите внимание, что для того, чтобы указать условие while для Do ... While, я сначала вычислил простые показатели аргумента y и сохранил этот ответ в target. Затем я смог написать -.@(target-:exps) в качестве условия Пока.

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


j
person Jonah    schedule 02.10.2017    source источник


Ответы (1)


Я подошел к этому так, чтобы думать о f как о центре диадической вилки, где левым аргументом является exps y, что является неизменным сравнением target, а правым аргументом является >: y, который выполняет начальное приращение. Следующим шагом было использование ] на каждом ^: в f, чтобы exps оставался монадическим. [ втягивает exps y из левого аргумента.

Написано молчаливо

   exps=. /:~@{:@(__&q:)
   ft=: exps >:@]^:([ -.@-: exps@])^:_ >: 
   ft 20
28
person bob    schedule 03.10.2017
comment
Отлично, спасибо. По какой-то причине я предположил, что v не имеет доступа к левому аргументу, что, как вы показали, явно неверно. - person Jonah; 03.10.2017