Конкретный вопрос требует найти все числа палиндрома между 900 и 1000.
new_set ← (900 + ⍳100)
901, 902, 903, 904, ..., 999, 1000
⍕¨(new_set ∘.× new_set)
{⍵≡⌽⍵} ⍕¨(new_set ∘.× new_set)
Первая строка создает новый набор чисел.
Вторая строка умножает все числа в new_set на любое другое число, включая само себя. Создает своего рода таблицу умножения внешнего произведения, а затем преобразует числа в строки.
Последняя строка пытается найти все палиндромы, но терпит неудачу и возвращает 0..
Любая помощь приветствуется!
⍕¨(new_set ∘.× new_set)
имеет форму 100 100
, а Match (≡
) сравнивает целые массивы, поэтому ваш окончательный dfn сравнивает массив 100 на 100 с обратным (⌽
) всего массива.
Похоже, вы хотите изменить отдельные строки. Пытаясь скопировать ваш стиль, мы получаем что-то вроде этого:
{(⊃⍵)≡⌽⊃⍵}¨ ⊂∘⍕¨ (new_set ∘.× new_set)
Обратите внимание на двойное использование каждого (¨
) и необходимость заключить (⊂
) строки только для второго каждого, а затем сразу же раскрыть (⊃
) в dfn. Это, вероятно, должно быть грязным.
Мы можем сделать лучше.
Во-первых, почему бы не объединить две итерации Each?
{(⊃⍵)≡⌽⊃⍵}∘⊂∘⍕¨ (new_set ∘.× new_set)
Но, на самом деле, Outer Product (∘.×
) уже работает именно с теми элементами, которые нам нужны, так что имеет смысл просто сделать все там:
new_set ∘.{(⊢≡⌽)⍕⍺×⍵} new_set
Н.Б. Вместо того, чтобы повторять new_set
слева и справа, вероятно, более идиоматично использовать Commute (⍨
). Я также добавлю другое написание (⊢≡⌽)
, просто для удовольствия:
∘.{≡∘⌽⍨⍕⍺×⍵}⍨ new_set
Превратить эту бинарную маску в фактический набор палиндромов довольно просто, поэтому я не буду портить вам удовольствие.
Спасибо за помощь, Б. Уилсон! Я попытался понять трюк с двоичной маской... Прямо сейчас у меня есть: ∘.{≡∘⌽⍨⍕⍺×⍵}⍨ new_set / (new_set ∘.× new_set), поскольку я сжимаю все 0 и 1 в таблица продуктов заказа, которая у меня была изначально. Однако это дает мне «Ошибку ранга». Не могли бы вы помочь мне еще немного?
Вторая команда, которую я выполнил в TryAPL: {(⊃⍵)≡⌽⊃⍵}¨ ⊂∘⍕¨ (new_set ∘.× new_set) ⊆ ∘⍕¨ (new_set ∘.× new_set). Эта команда работает, но не дает мне того, что я хочу :(.. Когда я превращаю ее в компрессор {(⊃⍵)≡⌽⊃⍵}¨ ⊂∘⍕¨ (new_set ∘.× new_set) / ∘⍕¨ (new_set ∘.× new_set), появляется предупреждение «WS FULL: Максимальное рабочее пространство 512 килобайт».
Посмотрим. Во-первых, будьте осторожны с порядком оценки. Ваш левый аргумент для /
должен быть заключен в скобки. При этом мы знаем, что левый и правый аргументы в порядке, выполняя их независимо, поэтому ошибка ранга происходит внутри вызова Replicate (/
). Вы проверили документы для Replicate на help.dyalog.com? В частности, левый аргумент должен быть вектором, но здесь вы передаете ему двумерный массив. Поскольку вам на самом деле не нужна информация о форме, зачисление (∊
) обоих аргументов должно дать вам то, что вы хотите!
Хороший совет. Я сделал это. Я ценю полезные предложения. Я принял ваш ответ, Б. Уилсон.
Вы забыли каждый после dfn