Re[2]: Ранги в J на примере конкретной задачи
От: ie Россия http://ziez.blogspot.com/
Дата: 27.04.07 08:07
Оценка: 1 (1)
Здравствуйте, ie, Вы писали:

ie>С ее помощью можно получить результат так:

ie>
ie>(-.&0 @: (*~ -. @: (+./ @: |: @ ((0&p:)@:m"0@])))) list
ie>


Пока обедал, понял что намудрил, достаточно так:
(#~ -. @ (+./ @ (0&p:) @ m"0)) list
Превратим окружающую нас среду в воскресенье.
Ранги в 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)
в тацитной форме? Что-то не выходит...
Re: Ранги в J на примере конкретной задачи
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 27.04.07 04:37
Оценка:
AutumnLeaf,

AL>И еще, как записать
(m"0 list) e. (list)
в тацитной форме? Что-то не выходит...


Ну это всего лишь маленький хук
(U x) V x  <=> (V~ U) x

А вот в остальное надо сначало вьехать
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: Ранги в J на примере конкретной задачи
От: ie Россия http://ziez.blogspot.com/
Дата: 27.04.07 04:50
Оценка:
Здравствуйте, AutumnLeaf, Вы писали:

Начну с этого:

AL>И еще, как записать
(m"0 list) e. (list)
в тацитной форме? Что-то не выходит...


(e.~ m"0) list


Теперь собственно к проблеме:

AL>написал функции:

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


Я поменял list:
list   =: 2,(0{l),5,}.l=.(#~ *./@(e.&'1379')@":"0) primes NB. выкинем все, в которых есть цифры отличные от 1,3,7,9 (и вернем на место числа 2 и 5)

но, к вопросу это отношение не имеет.

AL>так вот... рассмотрим частные случаи:

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

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


Это вполне нормальное поведение, честно говоря не понятно, что ты ожидал тут получить применяя m"0

AL>Куда и как воткнуть этот *./ (выполняющий роль AND для списка) и с каким рангом, чтобы он выполнился до построения таблицы и в итоге получился список или одномерная таблица из 0 и 1, я ума не приложу.


Да бог с ней таблицей, пусть себе строится. Тебя смущают лишние нули? Дык, можно не только на вхождения проверять, но и на их отсутствие
Но я бы вообще к списку привязываться не стал. Ведь есть функция проверки числа на простоту:
x p: y
NB. x=0: 0 if y is prime, 1 otherwise 
NB. x=1: 1 if y is prime, 0 otherwise

С ее помощью можно получить результат так:
(-.&0 @: (*~ -. @: (+./ @: |: @ ((0&p:)@:m"0@])))) list

При этом, заметь, нули в таблице мне особо не мешают, лишь требуют одного лишнего телодвижения
Превратим окружающую нас среду в воскресенье.
Re[2]: Ранги в J на примере конкретной задачи
От: AutumnLeaf Великобритания  
Дата: 27.04.07 08:36
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Ну это всего лишь маленький хук

LCR>
LCR>(U x) V x  <=> (V~ U) x
LCR>


а, ну конечно. было уже поздно и я упорно пытался вместо этого написать
(m"0 e.~) list

Re[3]: Ранги в J на примере конкретной задачи
От: AutumnLeaf Великобритания  
Дата: 27.04.07 08:48
Оценка:
Здравствуйте, ie, Вы писали:

ie>Здравствуйте, ie, Вы писали:


ie>>С ее помощью можно получить результат так:

ie>>
ie>>(-.&0 @: (*~ -. @: (+./ @: |: @ ((0&p:)@:m"0@])))) list
ie>>


ie>Пока обедал, понял что намудрил, достаточно так:

ie>
ie>(#~ -. @ (+./ @ (0&p:) @ m"0)) list
ie>


ну да, так работает, но приходится заново определять, простое ли число — не самый эффективный вариант.

кажется, я понял в чем штука. если писать
(m"0 e.~) list
то в таком варианте е. применяется уже к таблице (поэтому поздно вставлять И). А надо, чтобы это происходило сразу после генерации перестановок.

Вот так работает
(#~ (*./)@(e.&list)@(m"0)) list


И еще один вопрос можно?
Как прервать процесс выполнения какой-либо функции, если создается впечатление, что перемудрил и она будет считаться очень долго. Убивать интерпретатор и терять все что написал, как-то не хочется
Re[4]: Ранги в J на примере конкретной задачи
От: ie Россия http://ziez.blogspot.com/
Дата: 27.04.07 09:24
Оценка:
Здравствуйте, AutumnLeaf, Вы писали:

AL>ну да, так работает, но приходится заново определять, простое ли число — не самый эффективный вариант.


А определить присутствует ли число в 1111 элементном массиве быстрее? Спорно...

AL>И еще один вопрос можно?

AL>Как прервать процесс выполнения какой-либо функции, если создается впечатление, что перемудрил и она будет считаться очень долго. Убивать интерпретатор и терять все что написал, как-то не хочется

Регулярно сохраняться
Превратим окружающую нас среду в воскресенье.
Re[4]: Ранги в J на примере конкретной задачи
От: Mirrorer  
Дата: 27.04.07 09:38
Оценка:
Здравствуйте, AutumnLeaf, Вы писали:

AL>Как прервать процесс выполнения какой-либо функции, если создается впечатление, что перемудрил и она будет считаться очень долго. Убивать интерпретатор и терять все что написал, как-то не хочется


Вроде бы в 6-й версии они добавили утилиту jbreak, которая позволяет делать именно такую штуку

цитата

Run Jbreak to signal an interrupt to a running J program.
> ~/j601/jbreak (~/j601_64/jbreak for linux64)

Re[4]: Ранги в J на примере конкретной задачи
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 27.04.07 09:49
Оценка:
AutumnLeaf,

AL>И еще один вопрос можно?

AL>Как прервать процесс выполнения какой-либо функции, если создается впечатление, что перемудрил и она будет считаться очень долго. Убивать интерпретатор и терять все что написал, как-то не хочется

Сохраняться, перед тем как жмёшь Ctrl+W, нет?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[4]: Ранги в J на примере конкретной задачи
От: Quintanar Россия  
Дата: 27.04.07 14:28
Оценка:
Здравствуйте, AutumnLeaf, Вы писали:

ie>>>
ie>>>(-.&0 @: (*~ -. @: (+./ @: |: @ ((0&p:)@:m"0@])))) list
ie>>>

ie>>
ie>>(#~ -. @ (+./ @ (0&p:) @ m"0)) list
ie>>


AL>Вот так работает

AL>
AL>(#~ (*./)@(e.&list)@(m"0)) list
AL>


А в чем прикол таких обозначений? Реально писать нисколько не меньше, а результат даже хуже. Вот на q это вычисляется так, например:
tmp[;0] where 0={count x except primes} each tmp:"I"${(til count x) rotate\:x} each string primes

Много слов, а длина почти такая же.
Re[5]: Ранги в J на примере конкретной задачи
От: ie Россия http://ziez.blogspot.com/
Дата: 28.04.07 05:08
Оценка:
Здравствуйте, Quintanar, Вы писали:

ie>>>>
ie>>>>(-.&0 @: (*~ -. @: (+./ @: |: @ ((0&p:)@:m"0@])))) list
ie>>>>

ie>>>
ie>>>(#~ -. @ (+./ @ (0&p:) @ m"0)) list
ie>>>


AL>>Вот так работает

AL>>
AL>>(#~ (*./)@(e.&list)@(m"0)) list
AL>>


Q>А в чем прикол таких обозначений?


Эээ... Каких?

Q>Реально писать нисколько не меньше,


А "реально" — это как?

Q>а результат даже хуже.


Хуже чего?

Q>Вот на q это вычисляется так, например:

Q>
Q>tmp[;0] where 0={count x except primes} each tmp:"I"${(til count x) rotate\:x} each string primes
Q>




Q>Много слов, а длина почти такая же.


А тут кто-то чем-то меряется?
Превратим окружающую нас среду в воскресенье.
Re[5]: Ранги в J на примере конкретной задачи
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 28.04.07 08:15
Оценка:
Quintanar,

Q>А в чем прикол таких обозначений? Реально писать нисколько не меньше, а результат даже лучше. Вот на q это вычисляется так, например:


Нет, в данном (довольно специфичном случае) Q хуже, потому как натыкать стилусом "tmp[;0] ..." более напряжно, чем аналог на J. Хотя вот лично мне определения функций в K (в Q такой же?) нравятся больше.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: Ранги в J на примере конкретной задачи
От: Трурль  
Дата: 28.04.07 10:20
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Нет, в данном (довольно специфичном случае) Q хуже, потому как натыкать стилусом "tmp[;0] ..." более напряжно, чем аналог на J. Хотя вот лично мне определения функций в K (в Q такой же?) нравятся больше.


На K тоже можно покороче (в Q вроде есть режим совместимости с К).
N:1000000
is_prime: 0,0,(N-1)#1; {if[is_prime[x];is_prime[x*x+!(_ 1+N%x)-x]:0]}'! __sqrt N; / решето древнего грека
primes:&is_prime
primes@&&/'is_prime@0${(!#x)!\:x}'$primes

А если букв все равно много, можно имена выбрать покороче
Re[7]: Ранги в J на примере конкретной задачи
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 28.04.07 10:54
Оценка:
Трурль,

Т>На K тоже можно покороче (в Q вроде есть режим совместимости с К).

Т>[code ... /code]

Понял, спасибо.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[7]: Ранги в J на примере конкретной задачи
От: Quintanar Россия  
Дата: 28.04.07 12:18
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>(в Q вроде есть режим совместимости с К).

k)primes@&&/'isprime"I"${(!#x).q.rotate\:x}'$primes

/ 0$ -> "I"
/ is_prime@ -> isprime    @ - no need, _ - forbidden
/ ! -> .q.rotate          (! is used for dictionaries)


Т>
Т>N:1000000
Т>is_prime: 0,0,(N-1)#1; {if[is_prime[x];is_prime[x*x+!(_ 1+N%x)-x]:0]}'! __sqrt N; / решето древнего грека
Т>primes:&is_prime
Т>primes@&&/'is_prime@0${(!#x)!\:x}'$primes
Т>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.