Ранги в J на примере конкретной задачи
От: AutumnLeaf Великобритания  
Дата: 26.04.07 16:50
Оценка:
Решая задачки на projecteuler.net столкнулся с такой проблемой.

Задача №35:
The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.
There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
How many circular primes are there below one million?


написал функции:
  primes =: i.&.(p:^:_1) 1e6 NB. список простых чисел до миллиона
  list   =: (#~ *./@(e.&'1379')@":"0) primes NB. выкинем все, в которых есть цифры отличные от 1,3,7,9 (к результату потом надо добавить числа 2 и 5)
  m      =: (".)@((|."0 1)~ (i.)@#)@(":)

m генерирует список списков циклических перестановок, то есть, например
   m"0 (123 456 789)
123 231 312
456 564 645
789 897 978

дальше я хочу сделать следующую вещь.
Подзадача: написать функцию, которая будучи примененной к списку, даст для каждого элемента 0 (если хотя бы одна циклическая перестановка отсутствует в списке) или 1 (если они все там есть), затем по этому списку выберу нужные мне элементы :)

так вот... рассмотрим частные случаи:
   (m 13) e. (13 31 133) NB. обе перестановки числа 13 есть в списке, применяя AND, получаем, что 13 удовлетворяет условиям подзадачи
1 1
   (m 313) e. (13 31 133) NB. только одна из трех перестановок числа 313 есть в списке, применяя AND, получаем, что 313 не удовлетворяет условиям подзадачи
0 1 0

Но!
   (m"0 (13 313)) e. (13 31 133) NB. если после этого применить AND к строчкам, то неправильный ответ
1 1 0
0 1 0

Куда и как воткнуть этот *./ (выполняющий роль AND для списка) и с каким рангом, чтобы он выполнился до построения таблицы и в итоге получился список или одномерная таблица из 0 и 1, я ума не приложу.
И еще, как записать
(m"0 list) e. (list)
в тацитной форме? Что-то не выходит...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.