Довольно плавные движения


18

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

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

  • (ИЗМЕНЕНО!) 1 - довольно гладкое число из-за полного отсутствия каких-либо основных факторов. (Обратите внимание, что в исходной версии этого вопроса 1 был ошибочно исключен из списка, поэтому, если вы исключите его из выходных данных, вы не будете помечены неправильно.)
  • Между 4 (= 2 2 ) и 8 довольно гладкие числа являются 2-гладкими, что означает, что они имеют 2 в качестве единственного простого множителя.
  • Между 9 (= 3 2 ) и 24 довольно гладкие числа являются 3-гладкими и могут иметь 2 и 3 в своих основных факторизациях.
  • Между 25 (= 5 2 ) и 48 довольно гладкие числа являются 5-гладкими и могут иметь 2, 3 и 5 в своих основных факторизациях.
  • И так далее, обновляя критерии каждый раз, когда достигается квадрат следующего простого числа.

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

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

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


9
Почему 1 не очень гладко?
Деннис

Можем ли мы вывести список в обратном порядке?
Утренняя монахиня

5
OEIS A048098 (включает дополнительно 1)
Утренняя монахиня

1
@Mego "Нет более гладких чисел, чем 4." довольно ясно. Не обязательно очевидно, но определенно ясно.
Вираптор

1
@viraptor За это проголосовали как непонятные не потому, что не было указано, что 1 не является гладким, а потому, что ваше определение и ваше заявление об исключении противоречат друг другу.
Утренняя монахиня

Ответы:


1

На самом деле, 11 байтов

4╤R`;yM²≤`░

Попробуйте онлайн!

Не включает 1.

Объяснение:

4╤R`;yM²≤`░
4╤R          range(10**4)
   `;yM²≤`░  filter: take values where
    ;yM²       the square of the largest prime factor
        ≤      is less than or equal to the value

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 байт благодаря Якубе.

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)

Конечно, Пиф имеет квадратную функцию? Таким образом, вы можете заменить *dd эту функцию?
Конор О'Брайен

@ ConorO'Brien Нет, у Пита нет квадратной функции.
Утренняя монахиня

это похоже на недосмотр
Конор О'Брайен


2

Matlab, 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 ближе всего подходит к stdout



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)}

ungolfed

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.