Movimentos bastante suaves


18

Na aritmética, um número n suave , onde n é um número primo, é matematicamente definido como um número inteiro positivo que não possui fatores primos maiores que n. Por exemplo, 42 é 7 bom porque todos os seus fatores primos são menores ou iguais a 7, mas 44 não é 7 bom porque também tem 11 como fator primo.

Defina um número bastante suave como um número sem fatores primos maiores que sua própria raiz quadrada. Assim, a lista de números bastante suaves pode ser formulada da seguinte maneira:

  • (EDITADO!) 1 é um número bastante suave, devido à completa falta de fatores primos. (Observe que na versão original desta pergunta, 1 foi erroneamente excluído da lista; portanto, se você o excluir de suas saídas, não será marcado como errado.)
  • Entre 4 (= 2 2 ) e 8, os números bastante suaves são 2-suaves, o que significa que eles têm 2 como seu único fator primo.
  • Entre 9 (= 3 2 ) e 24, os números bastante suaves são 3 suaves e podem ter 2s e 3s em suas fatorações primárias.
  • Entre 25 (= 5 2 ) e 48, os números bastante suaves são 5-suaves e podem ter 2s, 3s e 5s em suas fatorações primárias.
  • E assim por diante, atualizando os critérios sempre que o quadrado do próximo número primo for atingido.

A lista de números bastante suaves é fixa e começa da seguinte forma: 1, 4, 8, 9, 12, 16, 18, 24, 25, ...

Seu desafio é escrever um código que produza todos os números bastante suaves, incluindo até 10.000 (= 100 2 ). Deve haver pelo menos um separador (não importa que tipo - espaço, vírgula, nova linha, qualquer coisa) entre cada número na lista e no próximo, mas é completamente irrelevante qual caractere é usado.

Como de costume, a menor contagem de bytes vence - obviamente, simplesmente exibir a lista não será muito benéfico para você aqui. Boa sorte!


9
Por que 1 não é muito bom?
Dennis

Podemos imprimir a lista em ordem inversa?
Leaky Nun

5
OEIS A048098 (inclui adicional 1)
Leaky Nun

1
@Mego "Não há números muito suaves com menos de 4." é bem claro. Não necessariamente óbvio, mas definitivamente claro.
Viraptor 15/08/16

1
@viraptor É votado como não claro, não porque não foi declarado que 1 não seja tranquilo, mas porque sua definição e sua declaração de exclusão se contradizem.
Leaky Nun

Respostas:


1

Na verdade, 11 bytes

4╤R`;yM²≤`░

Experimente online!

Não inclui 1.

Explicação:

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

Gelatina , 12 bytes

Æf>½S
³²ḊÇÐḟ

Experimente online!

Como funciona

³²ḊÇÐḟ  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

Braquilog , 21 19 bytes

1 byte graças a Fatalize, pela inspiração de mais 1 byte.

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

Experimente online!

Leva cerca de 6 segundos aqui.

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.

Solução anterior de 21 bytes

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

Experimente online!

Leva cerca de 6 segundos aqui.

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\é um byte mais curto, embora menos elegante.
Fatalize 16/08

@Fatalize Obrigado, eu golfed fora de um outro byte
Leaky Nun

4

Haskell, 53 bytes

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

Não tenho tempo para jogar isso agora, mas quero ilustrar um método para testar se né bastante suave: multiplique os números de 1para sqrt(n)(ou seja, calcule um fatorial), aumente o produto para uma potência alta e verifique se o resultado é um múltiplo de n.

Mude para r=[2..10^4]se 1não deve ser emitido.


Não que seja um golfista, mas tenho certeza de que o cubo é suficiente ( 8requer).
Neil

2

Pitão , 16 15 bytes

1 byte graças a Jakube.

tf!f>*YYTPTS^T4

Experimente online!

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)

Certamente Pyth tem uma função quadrada? Então você pode substituir *dd por essa função?
Conor O'Brien

@ ConorO'Brien Não, Pyth não tem uma função quadrada.
Freira vazada

que parece ser uma espécie de supervisão
Conor O'Brien

2

05AB1E, 16 14 13 bytes

4°L¦vyf¤yt›_—

Explicação

4°L¦v             # for each y in range 2..10000
      yf¤         # largest prime factor of y
         yt       # square root of y
           ›_     # less than or equal
             —    # if true then print y with newline

Experimente online


é a abreviação de 10000.
Adnan

@Adnan Thanks! Esqueceu sobre isso.
Emigna

2

Matlab, 58 57 56 52 48 bytes

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

Para cada número, verifica se todos os fatores ao quadrado não são maiores que o próprio número. Se sim, exibe esse número.

Obrigado a @Luis Mendo por jogar essa abordagem


Outra abordagem (50 bytes):

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

Para cada número calcula se o seu fator primo máximo ao quadrado é menor que o próprio número. Em seguida, usa-o para indexação.


1
Sua abordagem anterior pode ser reduzida:for k=4:1e4,if factor(k).^2<=k,disp(k);end;end
Luis Mendo

1

SQF , 252 227 220

Formato de script padrão:

#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]}}

Inclua o pré-processador na cadeia de compilação ao chamar, por exemplo:

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

Isso grava no log do bate-papo do sistema, que é a coisa mais próxima que o SQF tem de stdout


1

C, 113 bytes

#include<stdio.h>
main(a){for(;++a<10001;){int n=2,c=a;for(;n*n<=a;n++)while(c%n<1)c/=n;if(c<2)printf("%d ",a);}}

Ideone it!


1

Pyke, 13 12 11 bytes

T4^S#DP#X<!

Experimente aqui!

(O link só aumenta para 10 ^ 3 porque 10 ^ 4 excede o tempo limite)

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 bytes

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

destroçado

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.

0

Pitão, 12 bytes

g#^ePT2tS^T4

Não inclui 1.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.