Gerakan Cukup Halus


18

Dalam aritmatika, bilangan n-smooth , di mana n adalah bilangan prima yang diberikan, secara matematis didefinisikan sebagai bilangan bulat positif yang tidak memiliki faktor prima lebih besar dari n. Sebagai contoh, 42 adalah 7-smooth karena semua faktor prima kurang dari atau sama dengan 7, tetapi 44 tidak 7-smooth karena ia juga memiliki 11 sebagai faktor prima.

Tetapkan angka yang cukup halus sebagai angka tanpa faktor prima lebih besar dari akar kuadratnya sendiri. Dengan demikian, daftar angka yang cukup halus dapat dirumuskan sebagai berikut:

  • (Diedit!) 1 adalah angka yang cukup mulus, karena tidak ada faktor prima. (Perhatikan bahwa dalam versi asli pertanyaan ini, 1 secara keliru dikecualikan dari daftar, jadi jika Anda mengecualikannya dari hasil Anda, Anda tidak akan ditandai salah.)
  • Antara 4 (= 2 2 ) dan 8, angka yang cukup halus adalah 2-halus, artinya mereka memiliki 2 sebagai satu-satunya faktor utama mereka.
  • Antara 9 (= 3 2 ) dan 24, angka yang cukup halus adalah 3-halus, dan dapat memiliki 2s dan 3s dalam faktorisasi prima mereka.
  • Antara 25 (= 5 2 ) dan 48, angka yang cukup halus adalah 5-halus, dan dapat memiliki 2s, 3s, dan 5s di faktorisasi utamanya.
  • Dan seterusnya, meningkatkan kriteria setiap kali kuadrat dari bilangan prima berikutnya tercapai.

Daftar angka yang cukup halus diperbaiki, dan dimulai sebagai berikut: 1, 4, 8, 9, 12, 16, 18, 24, 25, ...

Tantangan Anda adalah menulis kode yang akan menampilkan semua angka yang cukup lancar hingga dan termasuk 10.000 (= 100 2 ). Harus ada setidaknya satu pemisah (tidak peduli apa jenisnya - ruang, koma, baris baru, apa saja) antara setiap angka dalam daftar dan yang berikutnya, tetapi sama sekali tidak relevan karakter apa yang digunakan.

Seperti biasa, jumlah byte terendah menang - jelas, hanya mengeluarkan daftar tidak akan terlalu bermanfaat bagi Anda di sini. Semoga berhasil!


9
Mengapa saya tidak cukup lancar?
Dennis

Bisakah kita mengeluarkan daftar dalam urutan terbalik?
Leaky Nun

5
OEIS A048098 (termasuk tambahan 1)
Leaky Nun

1
@Mego "Tidak ada angka yang cukup halus kurang dari 4." cukup jelas. Belum tentu jelas, tetapi jelas jelas.
viraptor

1
@ Viraptor Dipilih sebagai tidak jelas bukan karena tidak dinyatakan bahwa 1 tidak lancar, tetapi karena definisi Anda dan pernyataan pengecualian Anda saling bertentangan.
Leaky Nun

Jawaban:


1

Sebenarnya, 11 byte

4╤R`;yM²≤`░

Cobalah online!

Tidak termasuk 1.

Penjelasan:

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

Jelly , 12 byte

Æf>½S
³²ḊÇÐḟ

Cobalah online!

Bagaimana itu bekerja

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

Brachylog , 21 19 byte

1 byte berkat Fatalize, untuk inspirasi 1 byte lainnya.

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

Cobalah online!

Membutuhkan waktu sekitar 6 detik di sini.

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.

Solusi 21 byte sebelumnya

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

Cobalah online!

Membutuhkan waktu sekitar 6 detik di sini.

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\lebih pendek satu byte, meskipun kurang elegan.
Fatalkan tanggal

@Formatisasi Terima kasih, saya bermain golf byte lain
Leaky Nun

4

Haskell, 53 byte

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

Saya tidak punya waktu untuk bermain golf sekarang, tetapi saya ingin menggambarkan metode untuk menguji apakah ncukup lancar: Kalikan angka dari 1ke sqrt(n)(yaitu menghitung faktorial), naikkan produk ke daya tinggi, dan periksa apakah hasilnya adalah kelipatan dari n.

Ubah ke r=[2..10^4]jika 1seharusnya tidak menjadi output.


Bukan berarti ada pegolf, tapi saya cukup yakin kubusnya cukup ( 8membutuhkannya).
Neil

2

Pyth , 16 15 byte

Terima kasih 1 byte untuk Jakube.

tf!f>*YYTPTS^T4

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

Tentunya Pyth memiliki fungsi persegi? Jadi Anda bisa mengganti *dd dengan fungsi itu?
Conor O'Brien

@ ConorO'Brien Tidak, Pyth tidak memiliki fungsi persegi.
Leaky Nun

yang kelihatannya seperti kekeliruan
Conor O'Brien

2

05AB1E, 16 14 13 byte

4°L¦vyf¤yt›_—

Penjelasan

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

Cobalah online


adalah kependekan dari 10000.
Adnan

@ Adnan Terima kasih! Lupa tentang itu.
Emigna

2

Matlab, 58 57 56 52 48 byte

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

Untuk setiap angka itu memeriksa apakah semua faktor kuadrat tidak lebih besar dari angka itu sendiri. Jika ya, tampilkan nomor itu.

Terima kasih kepada @Luis Mendo untuk bermain golf dengan pendekatan ini


Pendekatan lain (50 byte):

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

Untuk setiap angka menghitung apakah faktor prima maksimum kuadratnya kurang dari angka itu sendiri. Kemudian gunakan untuk pengindeksan.


1
Pendekatan Anda sebelumnya dapat dibuat lebih pendek:for k=4:1e4,if factor(k).^2<=k,disp(k);end;end
Luis Mendo

1

SQF , 252 227 220

Format skrip standar:

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

Sertakan pra-prosesor dalam rantai kompilasi saat memanggil mis .:

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

Ini menulis ke log Obrolan Sistem, yang merupakan hal terdekat yang harus dilakukan SQF


1

C, 113 byte

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

Ide itu!


1

Pyke, 13 12 11 byte

T4^S#DP#X<!

Coba di sini!

(Tautan hanya naik hingga 10 ^ 3 karena 10 ^ 4 kali lipat)

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 byte

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.