Досить плавні рухи


18

В арифметиці n-гладне число , де n - задане просте число, математично визначається як натуральне ціле число, яке не має простих коефіцієнтів більше n. Наприклад, 42 є 7-гладким, оскільки всі його основні коефіцієнти менші або рівні 7, але 44 не є 7-гладкими, оскільки він також має 11 як основний фактор.

Визначте досить гладке число як число без простих факторів, що перевищує його власний квадратний корінь. Таким чином, список досить гладких чисел можна сформулювати так:

  • (ЗДОРОВАНО!) 1 - досить плавне число, через повну відсутність будь-яких простих факторів. (Зверніть увагу, що в оригінальній версії цього питання 1 помилково було виключено зі списку, тому якщо ви виключите його зі своїх результатів, ви не будете позначені неправильно.)
  • Між 4 (= 2 2 ) і 8, досить гладкі числа є 2-гладкими, тобто 2 є єдиним простим фактором.
  • Між 9 (= 3 2 ) і 24, досить гладкі числа є 3-гладкими, і вони можуть мати 2s і 3s у своїх простих множниках.
  • Між 25 (= 5 2 ) і 48, досить гладкі числа є 5-гладкими, і вони можуть мати 2s, 3s і 5s у своїх простих множниках.
  • І так далі, удосконалюючи критерії щоразу, коли буде досягнуто квадрат наступного простого числа.

Список досить рівних чисел фіксується і починається так: 1, 4, 8, 9, 12, 16, 18, 24, 25, ...

Ваше завдання полягає в тому, щоб написати код, який видасть усі досить гладкі числа до 10 000 (= 100 2 ). Між кожним номером у списку та наступним має бути принаймні один роздільник (не важливо, який вид - пробіл, кома, новий рядок, що завгодно), але абсолютно не має значення, який символ використовується.

Як завжди, найнижча кількість байтів виграє - очевидно, просто виведення списку не буде для вас надто вигідним. Удачі!


9
Чому 1 не дуже гладкий?
Денніс

Чи можемо ми вивести список у зворотному порядку?
Leaky Nun

5
OEIS A048098 (включає додатково 1)
Leaky Nun

1
@Mego "Немає досить рівних цифр менше 4." досить зрозуміло. Не обов'язково очевидно, але точно визначено.
viraptor

1
@viraptor Оголошено як незрозуміло не тому, що не було зазначено, що 1 не є рівним, а тому, що ваше визначення та ваша заява про виключення суперечать одна одній.
Leaky Nun

Відповіді:



7

Желе , 12 байт

Æf>½S
³²ḊÇÐḟ

Спробуйте в Інтернеті!

Як це працює

³²ḊÇÐḟ  Main link. No arguments.

³       Yield 100.
 ²      Square it to yield 10,000.
  Ḋ     Dequeue; yield [2, ..., 10,000].
   ÇÐḟ  Filter-false; keep elements for which the helper link returns 0.

Æf>½S   Helper link. Argument: n

Æf      Compute the prime factorization of n.
  >½    Compare the prime factors with the square root of n.
    S   Sum; add the resulting Booleans.

7

Брахілог , 21 19 байт

1 байт завдяки Fatalize, за натхнення ще 1 байт.

100^:4reP$ph^<=P@w\

Спробуйте в Інтернеті!

Тут потрібно близько 6 секунд.

100^:4reP$ph^<=P@w\
100                      100
   ^                     squared
    :4                   [10000,4]
      r                  [4,10000]
       eP                P is an integer in that interval (choice point),
        P$ph^<=P         P, prime factorized (from biggest to smallest),
                         take the first element, squared, is less than
                         or equal to P
               P@w       Write P with a newline,
                  \      Backtrack to the last choice point and make
                         a different choice until there is no more
                         choice and the program halts.

Попереднє 21-байтове рішення

100^:4reP'($pe^>P)@w\

Спробуйте в Інтернеті!

Тут потрібно близько 6 секунд.

100^:4reP'($pe^>P)@w\
100                      100
   ^                     squared
    :4                   [10000,4]
      r                  [4,10000]
       eP                P is an integer in that interval (choice point),
        P'(      )       The following about P cannot be proved:
           $pe               one of its prime factor
              ^              squared
               >P            is greater than P
                  @w     Write P with a newline,
                    \    Backtrack to the last choice point and make
                         a different choice until there is no more
                         choice and the program halts.

100^:4reP$pot^<=P@w\є на один байт коротшим, хоча і менш елегантним.
Фаталізувати

@Fatalize Спасибі, я зіграв ще один байт
Leaky Nun

4

Haskell, 53 байти

r=[1..10^4]
[n|n<-r,product[x|x<-r,x*x<=n]^n`mod`n<1]

Зараз у мене немає часу на те, щоб провести гольф, але я хочу проілюструвати метод тестування, якщо nвін досить гладкий: помножте числа 1на sqrt(n)(тобто обчисліть фактор), підніміть продукт на високу потужність і перевірте, чи результат є кратним числом n.

Змініть на, r=[2..10^4]якщо 1не слід виводити.


Не те, щоб це був якийсь гольфіст, але я впевнений, що куба вистачає ( 8вимагає цього).
Ніл

2

Pyth , 16 15 байт

1 байт завдяки Jakube.

tf!f>*YYTPTS^T4

Спробуйте в Інтернеті!

tf!f>*YYTPTS^T4
             T   10
            ^T4  10000
           S^T4  [1,2,3,...,10000]
 f               filter for elements as T for
                 which the following is truthy: 
         PT          prime factorization of T
   f                 filter for factor as Y:
     *YY                 Y*Y
    >   T                greater than T ?
  !                  logical negation
t                remove the first one (1)

Напевно Pyth має квадратну функцію? Отже, ви можете замінити *dd цю функцію?
Conor O'Brien

@ ConorO'Brien Nope, Pyth не має квадратної функції.
Leaky Nun

це здається начебто недоглядом
Конор О'Браєн


2

Матлаб, 58 57 56 52 48 байт

for k=1:1e4
if factor(k).^2<=k
disp‌​(k)
end
end

Для кожного числа він перевіряє, чи всі коефіцієнти в квадраті не перевищують саме число. Якщо так, відображається це число.

Дякуємо @Luis Mendo за те, що гольф цей підхід


Інший підхід (50 байт):

n=1:10^4;for k=n
z(k)=max(factor(k))^2>k;end
n(~z)

Для кожного числа обчислюється, чи є його максимальний простий коефіцієнт у квадраті менше самого числа. Потім використовує його для індексації.


1
Ваш попередній підхід можна скоротити:for k=4:1e4,if factor(k).^2<=k,disp(k);end;end
Луїс Мендо

1

SQF , 252 227 220

Стандартний формат сценарію:

#define Q(A,B) for #A from 2 to B do{
Q(i,10000)if([i]call{params["j"];u=sqrt j;a=true;Q(k,u)a=a and((j%k!=0)or(j/k<u)or!([j/k]call{params["x"];q=true;Q(z,sqrt x)q=q and(x%z!=0)};q}))};a})then{systemChat format["%1",i]}}

Включіть попередній процесор у ланцюжок компіляції, коли дзвоніть, наприклад:

  • execVM "FILENAME.sqf"
  • call compile preprocessFile "FILENAME.sqf"

Це записується до журналу системного чату, який є найбільш близьким до того, що SQF повинен відшаровувати



1

Пайк, 13 12 11 байт

T4^S#DP#X<!

Спробуйте тут!

(Посилання піднімається лише до 10 ^ 3, оскільки 10 ^ 4 рази виходить)

T4^S        -  one_range(10^4)
    #DP#X<! - filter_true(V, ^): (as i)
      P     -   factors(i)
       #X<! -  filter_true(V, ^):
        X   -   ^ ** 2
         <! -    not (i < ^)



0

R, 97 байт

b=F;for(j in 1:1e4){for(i in which(!j%%1:j)[-1])if(which(!i%%1:i)[2]==i)b=i<=j^0.5;if(b)print(j)}

неозорий

b <- F                               #Initializes
for (j in 1:1e4){                    #Loop across integers 1..10^4
    a <- which(!j%%1:j)[-1]          #Finds all factors
    for (i in a)                     #Loop across factors
         b <- which(!i%%1:i)[2]==i   #Tests primeness
         if(b) c <- i<=j^0.5         #If prime, tests smoothness
    if(c) print(j)                   #If biggest prime factor gives smooth
}                                    #result, Prints the number.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.