นี่เป็นหมายเลขที่ต่อเนื่องกันหรือมีค่าคงที่หรือไม่?


22

เมื่อไม่นานมานี้ฉันได้ดูการแยกตัวประกอบเฉพาะ 27000:

27000 = 2 3 × 3 3 × 5 3

มีสองสิ่งที่พิเศษเกี่ยวกับที่:

  • นายก - ต่อเนื่อง : ช่วงเวลาที่ต่อเนื่องกัน: 2 คือนายก 1, 3 คือนายกที่ 2, 5 คือนายกรัฐมนตรีที่ 3
  • ค่าคงที่เลขชี้กำลัง : เลขชี้กำลังจะเหมือนกันสำหรับทุก ๆ ช่วงที่สำคัญ (เสมอ 3)

แสดงทางคณิตศาสตร์:

จำนวนเต็มxเป็นจำนวนนายกต่อเนื่อง / คงที่เลขชี้กำลังหากมีจำนวนเต็มบวกอย่างเคร่งครัดn , k , mซึ่งx = p n m × p n +1 m × ... × p n + k mโดยที่p jคือj- th prime

งานของคุณคือการทดสอบว่าจำนวนเต็มบวกตอบสนองเงื่อนไขเหล่านี้

การป้อนข้อมูล:

จำนวนเต็มบวก> 1 ในรูปแบบที่สมเหตุสมผล

เอาท์พุท:

หนึ่งในสองค่าอย่างน้อยหนึ่งค่าจะต้องเป็นค่าคงที่เพื่อระบุว่าอินพุตเป็นหมายเลขที่ต่อเนื่องกันหรือมีค่าคงที่เลขชี้กำลัง

กรณีขอบ:

  • ช่วงเวลานั้นเป็นเรื่องจริงเนื่องจากตัวประกอบสำหรับนายกpคือp 1
  • ตัวเลขอื่น ๆ ที่สามารถเขียนเป็นp mโดยที่pเป็นนายกก็เป็นจริงเช่นกัน

กฎ:

  • ช่องโหว่มาตรฐานใช้
  • ไม่ต้องกังวลเกี่ยวกับจำนวนเต็มล้น แต่ตัวเลขที่มากถึง 255 จะต้องใช้งานได้
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ:

Truthy:

2
3
4
5
6
7
8
9
11
13
15
27000
456533

Falsy:

10
12
14
72
10000000

นี่คือสคริปต์ python ที่สร้างกรณีทดสอบบางกรณี

ความจริงที่ว่าฉันยอมรับคำตอบไม่ได้หมายความว่าความท้าทายจบลงแล้ว ผู้ชนะยังคงสามารถเปลี่ยนแปลงได้!


คุณอาจจะมาที่นี่ด้วยวิธีอื่นโดยสร้างรายการของตัวเลขทั้งหมดและตรวจสอบว่าอินพุตอยู่ในรายการหรือไม่
Engineer Toast

@EngineerToast มีตัวเลขที่เป็นความจริงมากมายอย่างไม่สิ้นสุด
Alexis Olson

@AlexisOlson แน่นอน แต่เป็นขอบเขตที่สามารถจัดการเป็นจำนวนเต็มได้หลายภาษา
Engineer Toast

นิพจน์ทางคณิตศาสตร์ของคุณมี Pj ไม่เกี่ยวข้องกับx = Pn^mส่วนนั้น ฉันสมมติว่าคุณหมายถึง Pn คือนายกคนที่สาม
Veskah

@Veskah nมีค่าเฉพาะ (ดัชนีของการหารนายกตัวแรกx ) ดังนั้นการบอกว่าPnคือn -th primeนั้นน่าอึดอัดใจถ้าคุณต้องการบอกเป็นนัยว่าPn + 1คือn + 1- prime
เดนนิส

คำตอบ:


13

05AB1E , 4 ไบต์

Ó0ÛË

ลองออนไลน์!

คำอธิบาย

Ó     # get a list of prime exponents
 0Û   # remove leading zeroes
   Ë  # all remaining elements are equal

ÎÓKËคือทั้งหมดที่ฉันสามารถคิดนอกเหนือจากนี้เป็นคนดี ... ฉันคิดßแต่มันตรงข้ามกับสิ่งที่ฉันคิด
Magic Octopus Urn

7

Regex (ECMAScript), 276 205 201 193 189 ไบต์

การเปรียบเทียบหลายหลาก (เลขยกกำลัง) ของปัจจัยสำคัญต่าง ๆ เป็นปัญหาที่น่าสนใจสำหรับการแก้ด้วย ECMAScript regex - การขาดการอ้างอิงย้อนกลับที่ยังคงมีอยู่ผ่านการวนซ้ำของลูปทำให้มันนับเป็นเรื่องท้าทาย แม้ว่าจะมีการนับลักษณะตัวเลขที่เป็นไปได้ แต่บ่อยครั้งที่วิธีทางอ้อมมากขึ้นทำให้กอล์ฟดีขึ้น

เช่นเดียวกับการโพสต์ regex ECMA อื่น ๆ ของฉันฉันจะให้คำเตือนผู้สปอยเลอร์:ฉันขอแนะนำให้เรียนรู้วิธีการแก้ปัญหาทางคณิตศาสตร์ที่ไม่ธรรมดาใน ECMAScript regex มันเป็นการเดินทางที่น่าสนใจสำหรับฉันและฉันไม่ต้องการที่จะทำลายมันสำหรับใครก็ตามที่อาจต้องการลองด้วยตัวเองโดยเฉพาะผู้ที่มีความสนใจในทฤษฎีจำนวน ดูโพสต์ก่อนหน้านี้สำหรับรายการปัญหาที่แนะนำติดแท็กสปอยเลอร์ติดต่อกันเพื่อแก้ไขทีละรายการ

ดังนั้นไม่ได้อ่านเพิ่มเติมใด ๆ ถ้าคุณไม่ต้องการบางขั้นสูงมายากล regex เอกมากมายสำหรับคุณ หากคุณต้องการถ่ายภาพเพื่อหาเวทมนตร์นี้ด้วยตัวเองฉันขอแนะนำให้เริ่มต้นด้วยการแก้ปัญหาบางอย่างใน ECMAScript regex ดังที่อธิบายไว้ในโพสต์ที่ลิงก์ด้านบน

น้ำหนักบรรทุกหลักจาก regex ที่ฉันพัฒนาขึ้นก่อนหน้านี้เปิดใช้งานเพื่อความท้าทายนี้มาก นั่นคือregex ที่พบนายก (s) ของหลายหลากสูงสุด วิธีแก้ปัญหาแรกของฉันนั้นยาวมากและต่อมาฉันก็ตีมันลงเป็นขั้นตอนเขียนใหม่ให้ใช้โมเลกุลลุคเฮดแล้วเปลี่ยนกลับเป็น ECMAScript ธรรมดาโดยใช้เทคนิคขั้นสูงเพื่อแก้ปัญหาการขาดอณูของโมเลกุลและต่อมา ตีกอล์ฟให้เล็กลงกว่า ECMAScript แบบเดิม ๆ

ส่วนจาก regex นั้นที่ใช้กับปัญหานี้คือขั้นตอนแรกซึ่งพบ Q ซึ่งเป็นปัจจัยที่เล็กที่สุดของ N ที่แบ่งใช้ปัจจัยสำคัญทั้งหมดของมัน เมื่อเรามีจำนวนนี้สิ่งที่เราต้องทำเพื่อแสดงว่า N คือ "จำนวนเลขชี้กำลัง - คงที่" จะหาร N ด้วย Q จนกว่าเราจะทำไม่ได้อีกต่อไป ถ้าผลลัพธ์คือ 1 primes ทั้งหมดมีหลายหลากเท่ากัน

หลังจากส่งคำตอบโดยใช้อัลกอริทึมที่พัฒนาขึ้นก่อนหน้านี้ของฉันเพื่อค้นหา Q ฉันรู้ว่ามันสามารถคำนวณได้ในวิธีที่แตกต่างกันโดยสิ้นเชิง: ค้นหาตัวประกอบแบบไม่มีช่องสี่เหลี่ยมที่ใหญ่ที่สุดของ N (ใช้อัลกอริทึมแบบเดียวกับเลขทะเบียน Carmichaelของฉัน) มันกลับกลายเป็นว่าไม่มีความยุ่งยากเลย * ในแง่ของการก้าวไปรอบ ๆ โดยที่ไม่มีโมเลกุล lookahead และ lookbehind ความยาวผันแปร (ไม่จำเป็นต้องดึงเทคนิคขั้นสูงที่ใช้ก่อนหน้านี้) และสั้นกว่า 64 ไบต์! นอกจากนี้ยังช่วยลดความซับซ้อนในการรักษา N แบบไม่มีสี่เหลี่ยมและไพรม์ N เป็นกรณีพิเศษที่แตกต่างกันโดยทิ้งอีก 7 ไบต์จากโซลูชันนี้

(ยังคงมีปัญหาอื่น ๆ ที่ต้องใช้เทคนิคขั้นสูงซึ่งก่อนหน้านี้ใช้เพื่อคำนวณการคำนวณ Q แต่ปัจจุบันไม่มีโพสต์ PPCG ของฉันแสดง)

ฉันใส่การทดสอบหลายหลากก่อนการทดสอบช่วงต่อเนื่องเพราะช่วงหลังช้ากว่ามาก การทดสอบที่สามารถล้มเหลวได้เร็วขึ้นก่อนทำให้ regex เร็วขึ้นสำหรับการป้อนข้อมูลแบบกระจาย นอกจากนี้ยังเป็นสนามกอล์ฟที่ดีกว่าที่จะนำมาไว้ก่อนเพราะจะใช้การอ้างอิงย้อนกลับมากขึ้น (ซึ่งจะมีค่าใช้จ่ายมากกว่า

ฉันสามารถปล่อย 4 ไบต์จาก regex นี้ (193 → 189) โดยใช้กลอุบายที่พบโดยGrimyซึ่งสามารถแบ่งส่วนที่สั้นลงในกรณีที่รับประกันหารหารหารได้มากกว่าหรือเท่ากับตัวหาร

^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))

ลองออนไลน์!

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \2.
# If N is square-free, \2 will be unset.
(?=
    # Search through all factors of N, from largest to smallest, searching for one that
    # satisfies the desired property. The first factor tried will be N itself, for which
    # \2 will be unset.
    (|(x+)\2*(?=\2$))     # for factors < N: \2 = factor of N; tail = \2
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\4*$)    # \4 = smallest prime factor of tail
        (?=(x+)(\5+$))    # \5 = tail / \4 (implicitly); \6 = tool to make tail = \5
        \6                # tail = \5
        (?!\4*$)          # Assert that tail is no longer divisible by \4, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that either \2 is unset, or that the result of repeatedly
# dividing tail by \2 is 1.
(?=
    .*$\2
|
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \2-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \2-1 above, and can use a better-golfed form of the division.
        (?=
            (              # \8 = tail / \2
                (x*)       # \9 = \8-1
                (?=\2\9+$)
                x
            )
            (\8*$)         # \10 = tool to make tail = \8
        )
        \10               # tail = \8
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \11 = a factor of N
        (                      # \12 = a non-factor of N between \11 and \13
            (x+)(?=\13+$)      # \13 = a factor of N smaller than \11
            (x+)               # \14 = tool (with \15) to make tail = \13
        )
        (?!\12+$)
        (x+)                   # \15 = tool to make tail = \12
    )
    \11*(?=\11$)               # tail = \11

    # Assert that \11, \12, and \13 are all prime
    (?!
        (\15\14?)?             # tail = either \11, \12, or \13
        ((xx+)\18+|x?)$
    )
)


* มันยังคงสะอาดกว่าด้วย lookahead ในระดับโมเลกุลโดยไม่มีกรณีพิเศษสำหรับ N ที่ไม่มีรูปทรงสี่เหลี่ยม สิ่งนี้จะลดลง 6 ไบต์ซึ่งให้ผลการแก้ปัญหา195 187 183 ไบต์ :

^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (?*(x+))              # \1 = proposed factor of N
    \1*(?=\1$)            # Assert that \1 is a factor of N; tail = \1
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\3*$)    # \3 = smallest prime factor of tail
        (?=(x+)(\4+$))    # \4 = tail / \3 (implicitly); \5 = tool to make tail = \4
        \5                # tail = \4
        (?!\3*$)          # Assert that tail is no longer divisible by \3, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(?=
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \1-1 above, and can use a better-golfed form of the division.
        (?=
            (             # \7 = tail / \1
                (x*)      # \8 = \7-1
                (?=\1\8+$)
                x
            )
            (\7*$)        # \9 = tool to make tail = \7
        )
        \9                # tail = \7
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \10 = a factor of N
        (                      # \11 = a non-factor of N between \10 and \12
            (x+)(?=\12+$)      # \12 = a factor of N smaller than \10
            (x+)               # \13 = tool (with \14) to make tail = \12
        )
        (?!\11+$)
        (x+)                   # \14 = tool to make tail = \11
    )
    \10*(?=\10$)               # tail = \10

    # Assert that \10, \11, and \12 are all prime
    (?!
        (\14\13?)?             # tail = either \10, \11, or \12
        ((xx+)\17+|x?)$
    )
)

นี่คือพอร์ตไปยัง lookbehind ความยาวผันแปร:

Regex (ECMAScript 2018) 198 195 194 186 182 ไบต์

^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))

ลองออนไลน์!

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (x+)(?=\1*$)      # \1 = factor of N; head = \1
    (?<=              # This is evaluated right-to-left, so please read bottom to top.
        ^x
        (
            (?<!^\5*)        # Assert that head is no longer divisible by \6, i.e. that
                             # that prime factor was of exactly single multiplicity.
            \3               # head = \4
            (?<=(^\4+)(x+))  # \4 = head / \5 (implicitly); \3 = tool to make head = \4
            (?<=^\5*(x+?x))  # \5 = smallest prime factor of head
        )*
    )
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(
    # In the following division calculation, we can skip the test for divisibility
    # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
    # capture \1-1 above, and can use a better-golfed form of the division.
    (?=
        (             # \7 = tail / \1
            (x*)      # \8 = \7-1
            (?=\1\8+$)
            x
        )
        (\7*$)        # \9 = tool to make tail = \7
    )
    \9                # tail = \7
)*
x$                    # Require that the end result is 1

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
# This is evaluated right-to-left, so please read bottom to top, but switch back to
# reading top to bottom at the negative lookahead.
(?<!
    # Assert that \13, \15, and \17 are all prime.
    (?!
        (\14\16?)?           # tail = either \13, \15, or \17
        ((xx+)\12+|x?)$
    )

    (?<=^\13+)
    (                        # tail = \13
        (x+)                 # \14 = tool to make tail = \15
        (?<!^\15+)
        (
            (x+)             # \16 = tool (with \14) to make tail = \17
            (?<=^\17+)(x+)   # \17 = a factor of N smaller than \13
        )                    # \15 = a non-factor of N between \13 and \17
    )                        # \13 = a factor of N
)

คุณสามารถแทนที่.*$\2ด้วย\2^
H.PWiz

แม้ว่าฉันเชื่อว่าสิ่งนี้ใช้ได้:^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
H.PWiz

ดูเหมือนจะไม่ใกล้เคียงกับความเหมาะสม
H.PWiz

6

เยลลี่ , 13 6 5 ไบต์

ÆEt0E

ลองออนไลน์!

ยังคงดีกว่า ... (ขอบคุณ Erik สำหรับ -1 ไบต์)


คำอธิบาย

ÆE     # get a list of prime exponents (noooo long builtin name)
  t0   # remove zeroes on both sides (leading or trailing)
    E  # all remaining elements are equal

œlt-> ไม่มีเหตุผลใด ๆ ที่จะนำเสนอศูนย์ต่อท้ายในเอาต์พุตของÆE
Erik the Outgolfer

นี้ไม่ได้ค่อนข้างทำงาน แต่อาจจะนำไปสู่การแก้ปัญหา
แลน

@dylnan ที่ล้มเหลวสำหรับ2250
เดนนิส

@Dennis ขอบคุณฉันได้ตระหนักถึงมันจะไม่ทำงาน แต่ผมหวังว่ามันจะสร้างแรงบันดาลใจเป็นทางออกที่สี่ไบต์
dylnan

6

JavaScript (ES6), 87 ไบต์

ส่งคืนค่า0สำหรับความจริงหรือจำนวนเต็มที่ไม่เป็นศูนย์สำหรับค่าเท็จ

f=(n,k=2,j,i)=>n%k?j*(P=d=>k%--d?P(d):d==!i)(k)|j-i|(n>1&&f(n,k+1,j||i)):f(n/k,k,j,-~i)

ลองออนไลน์!

แสดงความคิดเห็น

f = (                     // f() = recursive function taking:
  n,                      //   n = input
  k = 2,                  //   k = current factor
  j,                      //   j = reference exponent, initially undefined
  i                       //   i = current exponent, undefined each time we start testing
) =>                      //       the next factor
  n % k ?                 // if k is not a divisor of n:
    j * (                 //   ignore the primality of k if j is still undefined
      P = d =>            //     P() = function testing if k is prime:
        k % --d ?         //       decrement d; if d is not a divisor of k:
          P(d)            //         do a recursive call until it is
        :                 //       else:
          d == !i         //         unless i is already defined: d must not be equal to 1
                          //         (if it is: k is the next prime but does not divide n)
    )(k) |                //   initial call to P() with d = k
    j - i | (             //   if both i and j are defined, they must be equal
      n > 1 &&            //   if n is not yet equal to 1,
      f(n, k + 1, j || i) //   go on with k + 1; if j is undefined, set it to i
    )                     //   (otherwise, stop recursion and return what we have)
  :                       // else:
    f(n / k, k, j, -~i)   //   increment the current exponent and go on with n / k

นี้ถูกทำลายโดยการเปลี่ยนแปลงของการj||i iตอนนี้ให้ผลบวกปลอมจำนวนมาก
Deadcode

@ รหัสฉันไม่สามารถตรวจสอบหรือแก้ไขได้ในขณะนี้ดังนั้นฉันเพิ่งย้อนกลับไปตอนนี้
Arnauld

5

CJam , 30 29 ไบต์

{mFz~)-!\__W=,\0=>\-:mp1#W=&}

ลองออนไลน์!

คำตอบแรกของฉันหลังจากหยุดเกือบ 2 ปี (!) - ปีดังนั้นมันอาจจะเป็นกอล์ฟมากกว่า นี่คือบล็อกที่รับอินพุตเป็นจำนวนเต็ม (สามารถแมปผ่านสำหรับอาร์เรย์ของจำนวนเต็ม)

คำอธิบาย

{        e# Begin block
 mF      e# Factor input, giving an array of primes and their powers
 z~      e# Transpose and dump, giving an array of primes and an array of powers
 )-      e# Check that the powers are the same: subtract each power from the last element
 !       e# Negate to make sure they're all 0
 \__W=,  e# Get the range from 0 to the largest prime minus one
 \0=>    e# Slice that array so it only includes everything larger than the smallest prime
 \-      e# Remove the original primes from the range array
 :mp     e# Check each element for primality. If the input's primes are consecutive,
         e# this will contain no primes
 1#W=    e# Make sure a "1" is not found
 &       e# If the powers are the same AND primes are consecutive, return 1. Otherwise, 0.
}

5

Stax , 5 6 ไบต์

╣♥qJ╬c

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

|n    get the exponents of the prime factorization
0:D   trim leading zeroes
:u    array has exactly a single distinct element

แก้ไข: นี้ไม่ได้ทำงานใน 512ฉันจะให้ความคิดและหวังว่าจะแก้ไขในภายหลัง มันใช้งานได้แล้ว


3

Stax , 9 ไบต์

1 คือความจริง 0 เป็นเท็จ

αAG<└\{┬⌠

เรียกใช้และแก้ไขข้อบกพร่อง

คำอธิบาย

|nX0-u%x:^=      # Full Program, unpacked, implicit input
|n               # Exponents of sequential primes in factorization. (eg. 20 -> [2 0 1])
  X              # Save to X register
   0-            # Remove all '0' from array
     u%          # Get unique numbers and get length of array
       x         # Copy back the array saved to X
        :^       # Is it ascending
         =       # Are the two comparisons equal? implicit output

อาจจะเล่นกอล์ฟได้มากกว่านี้ แต่มันครอบคลุมกรณีที่ฉันหายไปในการแก้ไขครั้งสุดท้าย


3

MATL , 12 11 10 ไบต์

YFtgYsg)Zs

ลองที่ MATL Online!

ขอบคุณ Luis Mendo สำหรับชิ้นส่วนนำที่เป็นศูนย์ นอกจากนี้เขายังชี้ให้เห็นว่าอนุญาตให้สลับค่าความจริงได้ดังนั้นจะได้ผลลัพธ์เป็น0สำหรับตัวเลขที่ตรงตามข้อกำหนดการท้าทายและค่าบวกอื่น ๆ

Grosso Modo สิ่งนี้จะสร้างเลขชี้กำลังของการแยกตัวประกอบเฉพาะตามลำดับลบเลขศูนย์นำหน้าและคำนวณค่าเบี่ยงเบนมาตรฐาน


ฉันคิดว่าใช้0iYFhdzงานได้ 7 ไบต์: เติม 0 ให้กับเลขชี้กำลังของการแยกตัวประกอบแบบต่อเนื่องความแตกต่างติดต่อกันจำนวนที่ไม่ใช่ศูนย์ ผลลัพธ์คือ1อินพุต iff ตรงตามข้อกำหนด
Luis Mendo

@LuisMendo ขออภัยสำหรับการตอบกลับที่ล่าช้า แต่คุณสามารถโพสต์นั้นเป็นคำตอบแยกต่างหาก มันแตกต่างกันมากที่สุดแน่นอน
นาย Xcoder

ตกลงฉันโพสต์มันเป็นคำตอบ
Luis Mendo

3

Java 10, 223 191 178 176 168 ไบต์

n->{var s=new java.util.HashSet();for(int f=1,i=1,x,j;n>1;){for(x=++i,j=2;j<x;)x=x%j++<1?1:x;if(x>1){for(j=0;n%i<1&&n>(f=0);n/=i)j++;if(f<1)s.add(j);}}return s.size();}

ผลตอบแทน1เป็นความจริงและ>=2เป็นเท็จ

ลองออนไลน์

คำอธิบาย:

n->{                   // Method with integer parameter and boolean return-type
  var s=new java.util.HashSet();
                       //  Set to keep track of the prime exponents
  for(int f=1,         //  Prime-flag, starting at 1
          i=1,x,j;     //  Index and temp integers
          n>1;){       //  Loop as long as `n` is still larger than 1
    for(x=++i,         //   Set `x` to `i`, after we've increased `i` by 1 first with `++i`
        j=2;           //   Set `j` to 2 (first prime)
        j<x;)          //   Inner loop as long as `j` is still smaller than `x`
      x=x%j++<1?       //    If `x` is divisible by `j`:
         1             //     Set `x` to 1
        :              //    Else:
         x;            //     Leave `x` unchanged
    if(x>1){           //    If `x` is larger than 1 (if `i` is a prime):
      for(j=0;         //     Use `j` as counter, and set it to 0
          n%i<1        //     If `n` is divisible by `i`:
                       //      And loop as long as `n` is still divisible by `i`,
          &&n>         //      and `n` is larger than 0
              (f=0);   //      (and set `f` to 0 at the same time)
          n/=i)        //       Divide `n` by `i`
        j++;           //       And increase `j` by 1
      if(f<1)          //     If the flag `f` is now/still 0:
        s.add(j);}}    //      Add counter `j` to the Set
  return s.size();}    //  Return the amount of items in the Set
                       //  (1 being true, >=2 being false)

ตัวอย่างอินพุต:

n=15:

  • ธงยังคงอยู่ 1ในช่วง Prime 2 แรก (เพราะ 15 ไม่สามารถหารได้ด้วย 2)
  • ธงไปจาก1การ0ให้เร็วที่สุดเท่าที่เรากำลังที่นายก 3. ตั้งแต่ 15 หารด้วย 3 nจะกลายเป็น 5 (15/3 1 ) และกลายเป็นชุด[] → [1]และกลายเป็นชุด
  • จากนั้นเราตรวจสอบไพรม์ถัดไป 5 เนื่องจาก 5 หารด้วย 5 nกลายเป็น 1 (5/5 1 ) และเซตยังคงเดิม ([1] → [1] )
  • ทีนี้n=1เราก็หยุดวนรอบนอก Set ( [1]) มีเพียงหนึ่งรายการเท่านั้น1จากทั้งสองช่วงเวลาติดกัน 3 และ 5 ดังนั้นเราจึงคืนค่าจริง

n=14:

  • ธงเริ่มจาก 1เป็น0สำหรับนายกรัฐมนตรี 2 คนแรก (เพราะ 14 หารด้วย 2)nกลายเป็น 7 (14/2 1 ) [] → [1]และกลายเป็นชุด
  • จากนั้นเราตรวจสอบไพรม์ถัดไป 3 เนื่องจาก 7 ไม่หารด้วย 3 n[1] → [1,0]ยังคงเหมือนเดิมและจะกลายเป็นชุด
  • จากนั้นเราตรวจสอบไพรม์ถัดไป 5 เนื่องจาก 7 ยังไม่หารด้วย 5 nยังคงเหมือนเดิมและเซตยังคงเหมือนเดิมเช่นกัน ([1,0] → [1,0] )
  • จากนั้นเราตรวจสอบไพร์มต่อไป 7 เนื่องจาก 7 หารด้วย 7 nกลายเป็น 1 (7/7) 1) ) และเซตยังคงเหมือนเดิม ([1,0] → [1,0] )
  • ทีนี้n=1เราก็หยุดวนรอบนอก Set ( [1,0]) มีสองรายการ1จากช่วงเวลาที่ไม่อยู่ติดกัน 2 และ 7 และ0จากช่วง 3 และ 5 ดังนั้นเราจึงกลับเท็จ

n=72:

  • ธงเปลี่ยนจาก1เป็น0สำหรับนายกรัฐมนตรี 2 คนแรกเนื่องจาก 72 สามารถหารด้วย 2 (หลายครั้ง) ดังนั้นnกลายเป็น 9 (72/2 3) ) และเซตกลายเป็น[] → [3]และชุดจะกลายเป็น
  • จากนั้นเราตรวจสอบไพรม์ถัดไป 3 เนื่องจาก 9 หารด้วย 3 (หลายครั้ง) nกลายเป็น 1 (9/3 2 ) และเซตกลายเป็น[3] → [3,2]และกลายเป็นชุด
  • ทีนี้n=1เราก็หยุดวนรอบนอก Set ( [3,2]) มีสองรายการ, 3จาก Prime 2 และ2จาก Prime 3 ดังนั้นเราจึงคืนค่าเท็จ

1
คุณสามารถลบ<2และคืนค่า int (ระบุว่าคุณคืนค่า 1 สำหรับความจริง)
กำจัด

@wastl Ah พลาดกฎเพียงหนึ่งในสองค่าที่สอดคล้องกัน ในกรณี1นั้นคือความจริงและ2หรือสูงกว่าเป็นเท็จ ขอบคุณ
Kevin Cruijssen

ขอบคุณใครก็ตามที่ให้เงินฉัน แต่ทำไม?
Kevin Cruijssen

1
ฉันได้เริ่มให้รางวัล "คำตอบที่มีอยู่เดิม" เพื่อให้ความสนใจกับคำตอบ ECMAScript ของฉันมากขึ้นซึ่งฉันยังเชื่อว่าสมควรได้รับมากกว่าที่ได้รับ เมื่อสัปดาห์ที่ผ่านมาฉันต้องเลือกคำตอบอื่นที่ไม่ใช่ของฉันเองเพื่อมอบรางวัลให้ ฉันไม่คิดว่าสมควรได้รับมัน แต่คำตอบของคุณมีคำอธิบายที่ดีที่สุดและนั่นคือเหตุผลที่ฉันมอบให้คุณ คำอธิบายที่ดีนั้นหาได้ยากใน PPCG สำหรับคำตอบของฉันฉันคิดว่าฉันต้องเขียนมันให้ดีขึ้นซึ่งฉันวางแผนไว้ว่าเมื่อไหร่ที่ฉันจะมีเวลา
Deadcode

1
@ รหัสหัวหน้าอ่านั่นเป็นเหตุผล ฉันคิดว่าอาจมีคนเริ่มต้นเงินรางวัล แต่พวกเขาตั้งใจปล่อยให้มันหมดอายุและมันกลับมาหาฉันแทน ยังคงสับสนอยู่เล็กน้อยว่าทำไมคำตอบของฉันในตอนนั้นไม่ใช่คะแนนสูงสุด ฉันต้องบอกว่าฉันประทับใจกับคำตอบ Regex ทั้งหมดของคุณ ฉันเคยเห็นพวกเขาบ้างและทุกครั้งที่ฉันประหลาดใจ โดยเฉพาะอย่างยิ่งเมื่อฉันกลับมาที่คำตอบเดิมและคุณเล่นกอล์ฟมันยิ่งเพิ่ม : DI เพิ่งสังเกตุว่าฉันไม่ได้เห็นหรือไม่สนับสนุนการท้าทายนี้ คุณจะรู้ว่าผมจะเพิ่มเงินรางวัลให้คำตอบนี้ของคุณ :)
Kevin Cruijssen

2

J , 16 ไบต์

ขอบคุณ FrownyFrog เป็นอย่างยิ่งสำหรับ -8 ไบต์!

(=&#+/\=@#])_&q:

ลองออนไลน์!

โซลูชันเก่าของฉัน:

J , 24 ไบต์

[:(1=[:#@~.{.@I.}.])_&q:

ลองออนไลน์!

คำอธิบาย:

_&q: เลขชี้กำลังจำนวนมาก

{.@I.}.] ลบศูนย์นำหน้าด้วยการค้นหาองค์ประกอบที่ไม่ใช่ศูนย์แรก:

     }.   drop
       ]  from the list of exponents
{.@       as much items as the first of the 
   I.     indices of non-zero elements

1=[:#@~. ทดสอบว่าตัวเลขที่เหลือทั้งหมดเท่ากัน:

  [:#@~.  finds the length of the list after removing the duplicates
1=        is it 1?


2

MATL , 7 ไบต์

0iYFhdz

ผลที่ได้คือ 1อินพุต iff ตรงตามความต้องการ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

0    % Push 0
i    % Push input number
YF   % Exponents of consecutive prime factors
h    % Concatenate horizontally
d    % Consecutive differences
z    % Number of nonzeros. Implicitly display

2

อ็อกเทฟ 67 ไบต์

@(x)~any(diff(find(h=histc(factor(x),primes(x))))-1)&h(h>0)==max(h)

ลองออนไลน์!

ฉันเชื่อว่านี่เป็นทางออกเดียวที่ใช้ฮิสโตแกรม

คำอธิบาย:

สิ่งนี้ทำให้ฮิสโตแกรมซึ่งตัวแปรที่จะนับเป็นปัจจัยของอินพุตและวางลงในถังขยะ primes(x)ซึ่งเป็นช่วงเวลาทั้งหมดน้อยกว่าอินพุท จากนั้นเราจะหาที่ตั้งของปัจจัยสำคัญนำความแตกต่างระหว่างดัชนีแต่ละตัวและลบหนึ่งตัว หากมีองค์ประกอบใด ๆ ที่ไม่เป็นศูนย์ (เช่นความแตกต่างของดัชนีของจำนวนเฉพาะไม่ได้เป็น 1) ดังนั้นสิ่งนี้จะส่งผลให้มีค่าเท็จไม่เช่นนั้นจะส่งคืนค่าความจริง

จากนั้นเราจะตรวจสอบว่าองค์ประกอบที่ไม่เป็นศูนย์ทั้งหมดในฮิสโตแกรมเท่ากับองค์ประกอบสูงสุด หากมีค่าที่ไม่เท่ากันจะส่งผลให้มีค่าเท็จมิฉะนั้นจะส่งคืนค่าความจริง

หากบล็อกทั้งสองนั้นเป็นความจริงข้อมูลของเราคือจำนวนเลขชี้กำลังค่าคงที่ไพร์มต่อเนื่อง!


1

APL (Dyalog Extended) , 28 ไบต์

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵}

ลองออนไลน์!

วิธี:

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵} ⍝ Monadic function, takes an argument ⍵
       ⍭⍵                     ⍝ Prime factors and exponents of ⍵
     `                         split the resulting matrix in 2 vectors
 f p                           assign the factors to f and the powers to p
                               then
                          ⍳⍵    range [1..⍵]
                        1      primality check for each element in the vector
                                where; returns the indices of truthy values
                     f          find the factors; returns a boolean vector
                   ∨/            logical OR reduction
                                logical AND
           (   p)               unique members of the powers
                                tally; returns the number of elements in the vector
            1=                   check if there's only one element



0

J , 14 ไบต์

1#.2~:/\0,_&q:

1 ในผลลัพธ์บ่งชี้เลขชี้กำลังคงที่ต่อเนื่อง

ลองออนไลน์!

        0,_&q:   zero followed by the prime exponents of input
   2~:/\         for every two consecutive values, 1 if they are different
1#.              convert from base-1, just add them up

0

ทำความสะอาด , 127 ไบต์

import StdEnv
@n=[]== $n
?n#j= $n
= @n||j==filter@[hd j..last j]&&any(\p=(prod j)^p==n)[1..n]
$n=[i\\i<-[2..n-1]|n/i*i==n&& @i]

ลองออนไลน์!

กำหนดฟังก์ชั่นที่? :: Int -> Boolใช้$ :: Int -> [Int]เพื่อแยกตัวประกอบและ@ :: Int -> Boolเพื่อตรวจสอบสภาพดั้งเดิม


0

APL (NARS) 41 ตัวอักษร 82 ไบต์

{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}

{π⍵} เป็นฟังก์ชั่นการแยกตัวประกอบของการโต้แย้ง⍵ในรายการของปัจจัยสำคัญ (ทำซ้ำถ้าหนึ่งนายกรัฐมนตรีปรากฏขึ้นอีกครั้ง);
{1π⍵} เป็นฟังก์ชันถัดไปที่สำคัญ (โปรดทราบว่าในกรณีนี้อาร์กิวเมนต์ของมันไม่ได้เป็นสเกลาร์ แต่เป็นจำนวนเต็มหนึ่งอาร์เรย์) ทดสอบ:

  h←{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}
  (2..30)/⍨h¨2..30
2 3 4 5 6 7 8 9 11 13 15 16 17 19 23 25 27 29 30 
  h¨27000 456533 72 10000000
1 1 0 0 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.