การเคลื่อนไหวที่ราบรื่น


18

ในเลขคณิตจำนวนn-smoothโดยที่ n คือจำนวนเฉพาะที่กำหนดจะถูกกำหนดทางคณิตศาสตร์เป็นจำนวนเต็มบวกที่ไม่มีปัจจัยสำคัญมากกว่า n ตัวอย่างเช่น 42 เป็น 7-smooth เพราะปัจจัยสำคัญทั้งหมดมีค่าน้อยกว่าหรือเท่ากับ 7 แต่ 44 ไม่ราบรื่น 7 เพราะมันมี 11 เป็นปัจจัยสำคัญ

กำหนดจำนวนที่ค่อนข้างเรียบเป็นจำนวนโดยไม่มีปัจจัยสำคัญใด ๆ ที่ดีกว่ารากที่สองของตัวเอง ดังนั้นรายการของตัวเลขที่ราบรื่นสวยสามารถกำหนดสูตรดังนี้

  • (แก้ไข!) 1 เป็นตัวเลขที่ค่อนข้างราบเรียบเนื่องจากไม่มีปัจจัยที่สมบูรณ์ (โปรดทราบว่าในคำถามเดิมของคำถามนี้มีการยกเว้น 1 อย่างผิดพลาดจากรายการดังนั้นหากคุณแยกออกจากผลลัพธ์คุณจะไม่ถูกทำเครื่องหมายผิด)
  • ระหว่าง 4 (= 2 2 ) ถึง 8 ตัวเลขที่ค่อนข้างราบเรียบคือ 2-smooth ซึ่งหมายความว่าพวกเขามี 2 เป็นปัจจัยหลักเท่านั้น
  • ระหว่าง 9 (= 3 2 ) ถึง 24 ตัวเลขที่ค่อนข้างราบเรียบคือ 3-smooth และสามารถมี 2s และ 3s ในช่วงเวลาที่เหมาะสมที่สุด
  • ระหว่าง 25 (= 5 2 ) ถึง 48 ตัวเลขที่ค่อนข้างราบเรียบนั้นคือ 5-smooth และสามารถมี 2s, 3s, และ 5s ใน factorizations ที่สำคัญของพวกเขา
  • ดังนั้นการอัพเกรดเกณฑ์ทุกครั้งที่ถึงจำนวนเฉพาะจำนวนถัดไป

รายการของตัวเลขที่ราบรื่นสวยได้รับการแก้ไขและเริ่มต้นดังนี้: 1, 4, 8, 9, 12, 16, 18, 24, 25, ...

ความท้าทายของคุณคือการเขียนโค้ดที่จะส่งออกตัวเลขเรียบเนียนทั้งหมดและรวมถึง 10,000 (= 100 2 ) ต้องมีตัวคั่นอย่างน้อยหนึ่งตัว (ไม่สำคัญว่าควรเว้นวรรคแบบใดเครื่องหมายจุลภาคขึ้นบรรทัดใหม่อะไร) ระหว่างตัวเลขแต่ละตัวในรายการและหมายเลขถัดไป แต่ไม่เกี่ยวข้องอย่างสมบูรณ์กับอักขระที่ใช้

ตามปกติจำนวนไบต์ที่น้อยที่สุดจะชนะ - แน่นอนว่าการแสดงรายการนั้นจะไม่เป็นประโยชน์กับคุณมากเกินไป โชคดี!


9
ทำไม1ไม่สวยเรียบ
Dennis

เราสามารถส่งออกรายการในลำดับกลับกันได้หรือไม่
แม่ชีที่รั่ว

5
OEIS A048098 (รวมพิเศษ1)
Nun

1
@Mego "ไม่มีตัวเลขที่ค่อนข้างราบเรียบน้อยกว่า 4" ค่อนข้างชัดเจน ไม่จำเป็นต้องชัดเจน แต่ชัดเจนแน่นอน
viraptor

1
@viraptor มีการลงคะแนนว่าไม่ชัดเจนไม่ใช่เพราะมันไม่ได้ระบุว่า 1 ไม่ราบรื่น แต่เนื่องจากคำจำกัดความและคำสั่งยกเว้นของคุณขัดแย้งกับกันและกัน
Leun 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

Brachylog , 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\สั้นลงหนึ่งไบต์แม้ว่าจะดูสง่างามน้อยลง
ลดขนาด

@ ขอบคุณขอบคุณฉันเล่นกอล์ฟอีกไบต์
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ต้องการ)
Neil

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 ไม่มีฟังก์ชันกำลังสอง
แม่ชีที่รั่ว

ดูเหมือนว่าเป็นการกำกับดูแล
Conor O'Brien

2

05AB1E, 16 14 13 ไบต์

4°L¦vyf¤yt›_—

คำอธิบาย

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

ลองออนไลน์


สั้นสำหรับ 10,000
Adnan

@Adnan ขอบคุณ! ลืมเรื่องนั้นไป
Emigna

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
Luis Mendo

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






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.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.