เฉพาะช่วงเวลาที่ไม่ซ้ำกันกี่ครั้ง


14

วิธีหนึ่งในการแทนจำนวนธรรมชาติคือการคูณเลขชี้กำลังของจำนวนเฉพาะ ตัวอย่างเช่น 6 สามารถแทนด้วย 2 ^ 1 * 3 ^ 1 และ 50 สามารถแทนได้ด้วย 2 ^ 1 * 5 ^ 2 (โดยที่ ^ หมายถึง exponention) จำนวนของจำนวนเฉพาะในการเป็นตัวแทนนี้สามารถช่วยในการกำหนดว่ามันจะสั้นกว่าที่จะใช้วิธีการเป็นตัวแทนนี้เมื่อเทียบกับวิธีการอื่น ๆ แต่เนื่องจากฉันไม่ต้องการคำนวณสิ่งเหล่านี้ด้วยตนเองฉันต้องการโปรแกรมที่จะทำเพื่อฉัน อย่างไรก็ตามเนื่องจากฉันจะต้องจำโปรแกรมจนกว่าฉันจะถึงบ้านจึงต้องสั้นที่สุด

งานของคุณ:

เขียนโปรแกรมหรือฟังก์ชั่นเพื่อกำหนดจำนวนช่วงเวลาที่แตกต่างกันในการแทนตัวเลข

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

จำนวนเต็ม n เช่นที่ 1 <n <10 ^ 12 ถ่ายโดยวิธีปกติ

เอาท์พุท:

จำนวนของช่วงเวลาที่แตกต่างกันซึ่งจำเป็นต้องใช้เพื่อแสดงอินพุตตามที่อธิบายไว้ในบทนำ

กรณีทดสอบ:

24      -> 2 (2^3*3^1)
126     -> 3 (2^1*3^2*7^1)
1538493 -> 4 (3^1*11^1*23^1*2027^1)
123456  -> 3 (2^6*3^1*643^1)

นี่คือOEIS A001221

เกณฑ์การให้คะแนน:

นี่คือคะแนนต่ำสุดเป็นไบต์ชนะ!


3
เมื่อเร็ว ๆ นี้มีคำถามสำคัญมากมาย! ฉันรักมัน.
Giuseppe


3
เหตุผลที่อยู่เบื้องหลัง downvote อาจเป็นเรื่องเล็กน้อย เท่าที่ฉันเห็นมี 3 สถานการณ์เมื่อพูดถึงภาษากอล์ฟ: 1. บิวด์อิน 2. สายโซ่ของสองบิวด์อิน 3. เชนของบิวด์อิน 3 ตัว (ฉันมีคำตอบ 2 ไบต์สามตัว); ฉันไม่รู้ว่านี่เป็นเหตุผลที่ดีสำหรับการลงคะแนนเสียง แต่เป็นสาเหตุที่เป็นไปได้
Mr. Xcoder

1
อาจเป็นไปได้ แต่ฉันจะขอบคุณถ้าหนึ่งในสามผู้ลงคะแนนเสียงจะแสดงความคิดเห็นที่บอกฉันว่า แม้ว่ามันจะเป็นเรื่องเล็กน้อยในภาษากอล์ฟ แต่ก็มีคำตอบที่น่าสนใจบางประการในภาษาที่ไม่ใช่กอล์ฟซึ่งเป็นสิ่งที่ฉันต้องการเห็นเมื่อฉันโพสต์ความท้าทายนี้ ท้ายที่สุดมีความท้าทายมากมายบนเว็บไซต์ซึ่งเป็นเรื่องเล็กน้อยสำหรับ golflangs แต่จะผลิตโซลูชันที่ไม่ใช่สนามกอล์ฟที่น่าสนใจ
Gryphon

1
มันจะเป็นประโยชน์ในการรวมนายกในกรณีทดสอบ นอกจากนี้บางภาษา / วิธีการนั้นยากที่จะทดสอบจำนวนมาก กรณีทดสอบเล็ก ๆ น้อย ๆ น่าจะดี
Dennis

คำตอบ:


6

MATL , 4 3 ไบต์

-1 ไบต์ขอบคุณ Luis Mendo

YFz

ลองออนไลน์!

YF         Exponents of prime factors
  z        Number of nonzeros

คำตอบเดิม:

Yfun

ลองออนไลน์!

เวอร์ชั่นYfunคำตอบ

          (Implicit input)
Yf         Prime factorization
  u        Unique
   n       Numel
           (Implicit output)

1
สนุกทำไม - ;-)
2560

1
ข้ามออก 4 ยังคงเป็นปกติ 4
Gryphon

5

05AB1E , 2 ไบต์

อีกคำตอบที่น่าเบื่อ ...

fg

โปรแกรมเต็มรูปแบบที่รับอินพุตตัวเลขและพิมพ์ผลลัพธ์

ลองออนไลน์!

อย่างไร?

fg - implicitly take input
f  - get the prime factors with no duplicates
 g - get the length
   - implicit print

5

Mathematica ขนาด 7 ไบต์

PrimeNu

ใช่มีในตัว

Mathematica ขนาด 21 ไบต์

Length@*FactorInteger

ทางยาวรอบ


เครื่องหมายดอกจันคืออะไร ไม่Length@FactorIntegerเหมือนกันเหรอ
numbermaniac

1
Length@*FactorIntegerก่อให้เกิดการทำงานที่บริสุทธิ์องค์ประกอบของและLength FactorIntegerฉันสามารถกำหนดแล้วโทรfun=Length@*FactorInteger fun[1001]บนมืออื่น ๆ ที่Length@FactorIntegerจะหมายถึงและประเมินผลการLength[FactorInteger] 0
Misha Lavrov


4

Python 2, 56 ไบต์

f=lambda n,p=2,k=1:n/p and[f(n,p+1),k+f(n/p,p,0)][n%p<1]

นี่เป็นคำตอบของเดนนิสที่นี่หรือเปล่า?
Jonathan Allan

1
@JanathanAllan ใช่แล้วแก้ไขเพื่อนับปัจจัยหลักที่ไม่ซ้ำกันแทน
orlp

4

เรติน่า31 31ไบต์

&`(?!(11+)\1+$)(11+)$(?<=^\2+)

อินพุตไม่พร้อมกัน

ขอบคุณ @MartinEnder สำหรับการเล่นกอล์ฟขนาด 1 ไบต์!

ลองออนไลน์! (รวมโปรแกรมแปลงทศนิยมเป็นทศนิยม)

มันทำงานอย่างไร

เนื่องจากโปรแกรมประกอบด้วย regex เพียงตัวเดียวพร้อมด้วย&ตัวปรับแต่งจอประสาทตา Retina จึงนับจำนวนการจับคู่ที่เหลื่อมซ้อนกัน การป้อนข้อมูลจะถือว่าประกอบด้วยการทำซ้ำnจาก1และไม่มีอะไรอื่น

หัวลูกเชิงลบ

(?!(11+)\1+$)

การแข่งขันในสถานที่ระหว่าง1 's ที่ไม่ได้ตามมาด้วยสองคนหรือมากกว่า1 ' s ( 11+) ตามด้วยหนึ่งหรือมากกว่าหนึ่งซ้ำของจำนวนเงินเดียวกันของ1 's ( \1+) ตามด้วยในตอนท้ายของการป้อนข้อมูล ( $)

ใด ๆ จำนวนคอมโพสิตABกับA, B> 1สามารถเขียนเป็นซ้ำของซ้ำของ1เพื่อให้ตรงกับ lookahead เฉพาะสถานที่ตั้งตามหน้าซ้ำ 1ที่p = 1หรือหน้าเป็นสำคัญ

regex

(11+)$

ทำให้แน่ใจว่าp> 1โดยกำหนดอย่างน้อยสอง1 's (11+ ) และเก็บหางของ1ในกลุ่มการจับภาพที่สอง ( \2)

ในที่สุดมองในแง่บวก

(?<=^\2+)

ตรวจสอบว่าอินพุตทั้งหมดประกอบด้วยการเกิดขึ้นของkp ( k ≥ 1 ) ของ1โดยตรวจสอบว่าpหารอินพุต

ดังนั้นการแข่งขันแต่ละสอดคล้องกับเอกลักษณ์สำคัญหารพี


4

ยูทิลิตี Bash + GNU, 33

  • บันทึก 1 ไบต์ขอบคุณ @Dennis
factor|grep -Po ' \d+'|uniq|wc -l

ลองมันออนไลน์

คำอธิบาย

factor|                            # Split input into prime factors
       grep -Po ' \d+'|            # group factors onto lines
                       uniq|       # remove duplicates
                            wc -l  # count the lines

1
grep -Po ' \d+'tr \ \\n|sed 1dประหยัดกว่าไบต์
Dennis

แต่น่าเสียดายที่grep -Po '( \d+)\1*'ล้มเหลวสำหรับการป้อนข้อมูล46
Dennis

@Dennis ขอขอบคุณ - ฉันแก้ไขโดยใช้คำแนะนำดั้งเดิมของคุณ
Digital Trauma

3

เยลลี่ 3 ไบต์

คำตอบที่น่าเบื่อ ...

ÆFL

ลิงก์ monadic ที่ใช้ตัวเลขและส่งคืนตัวเลข

ลองออนไลน์!

อย่างไร?

ÆFL - Link: number, n
ÆF  - prime factorisation as a list of prime, exponent pairs
  L - length

1
คุณคิดถึงÆvอย่างไร
สรรพนามของฉันคือ monicareinstate

มันง่ายมาก - ฉันไม่เคยใช้มันมาก่อนและไม่ได้ค้นหารายการในวิกิ
Jonathan Allan

คุณจะพิมพ์อักขระวุ้นโดยไม่มีรายการอะตอมและรายการ quicks ได้อย่างไร
สรรพนามของฉันคือ monicareinstate

1. Æคือรหัส alt 0198 2. คุณสามารถตั้งค่าแป้นพิมพ์ (ฉันไม่มี) 3. หน้ารหัส
Jonathan Allan



3

อลิซ 10 ไบต์

/o
\i@/Dcd

ลองออนไลน์!

คำอธิบาย

/o
\i@/...

นี่เป็นเพียงกรอบมาตรฐานสำหรับโปรแกรมเชิงเส้นเลขคณิตหนักที่ต้องการทศนิยม I / O โปรแกรมจริงนั้นเป็นเพียง:

Dcd

ซึ่งทำ:

D    Deduplicate prime factors. Does what it sounds like: for every p^k which
     is a divisor n, this divides n by p^(k-1).
c    Push the individual prime factors of n. Since we've deduplicated them
     first, the number of factors is equal to the value we're looking for.
d    Push the stack depth, i.e. the number of unique prime factors.

3

JavaScript 45 ไบต์

* สำหรับ @SEJPM ขอคำอธิบาย: สิ่งที่ฉันกำลังทำอยู่นี่คือสิ่งนี้ฉันจะเริ่มจาก 2 - n (ซึ่งการเปลี่ยนแปลงและในที่สุดจะเป็นปัจจัยสำคัญที่สุด) - ตอนนี้หากจำนวนปัจจุบันหารหาร ni ต้องการนับเพียงครั้งเดียว (แม้ แม้ว่ามันจะเป็นปัจจัยของ 2 * 2 * 2 * 3 - 2 นับเป็นครั้งเดียว) ดังนั้น "j" จึงมาที่รูปภาพเมื่อ j ไม่ได้ระบุไว้ในการเรียกของ funcion - j จะได้รับค่าของ " ไม่ได้กำหนด ", และเมื่อ n% i == 0 จากนั้นฉันเรียกใช้ฟังก์ชันด้วย j = 1 ในการโทรครั้งถัดไป) - แล้วฉันจะเพิ่ม 1 เมื่อ j เท่ากับไม่ได้กำหนดซึ่งก็คือ! j + ฟังก์ชั่น (n / i, i, ( j = 1 หรือเพียง 1)) ฉันไม่เปลี่ยนฉันในเรื่องนี้เพราะมันอาจจะยังคงถูกหารด้วยฉันอีกครั้ง (2 * 2 * 3) แต่แล้ว j จะเท่ากับ 1 และจะไม่นับเป็นปัจจัย หวังว่าฉันจะอธิบายได้ดีพอ

P=(n,i=2,j)=>i>n?0:n%i?P(n,i+1):!j+P(n/i,i,1)

console.log(P(1538493)==4);
console.log(P(24)==2);
console.log(P(126)==3);
console.log(P(123456)==3);

ถ้านายกคนสุดท้ายมีขนาดใหญ่กว่ามันจะมีการเรียก max stack - หากเป็นปัญหาฉันสามารถทำซ้ำได้


คุณจะเขียนคำอธิบายสำหรับคำตอบนี้หรือไม่? ดูเหมือนว่าจะใช้วิธีการปกติจากคำตอบที่เหลือ
SEJPM

@SEJPM ฉันได้เพิ่มคำอธิบายที่นั่น
DanielIndie

1
FYI เราอาจสมมติว่าทรัพยากรการโทรที่ไม่สิ้นสุด / ทรัพยากรไม่สิ้นสุดสำหรับความท้าทายส่วนใหญ่ของรหัสกอล์ฟ
Jonathan Allan

3

CJam , 7 5 ไบต์

ขอบคุณ Martin Ender สำหรับการปิด 2 ไบต์!

{mF,}

บล็อกแบบไม่ระบุชื่อ (ฟังก์ชัน) ที่คาดว่าจะมีหมายเลขอินพุตในสแต็กและแทนที่ด้วยหมายเลขเอาต์พุต

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

คำอธิบาย

{   }   e# Define block
 mF     e# List of (prime, exponent) pairs
   ,    e# Length







2

R + numbers, 30 14 bytes

16 bytes removed thanks to @Giuseppe

numbers::omega

Also, here is the Try it online!! link per @Giuseppe.


You may omit the f=function(x) and the (x) as numbers::omega is a function already. However, as numbers is not standard for R, you should make your answer "R + numbers". Also, you should include a TIO link. Still, +1, very nice.
Giuseppe

@Giuseppe, you are too nice. Thanks for your help. BTW, in addition to some of your insightful answers, I checked out Tips for golfing in R, as you suggested. There are some real gems there. Anywho, I will update my answer with your recommendations. Also, your MATL solution is very nice (+1 yesterday).
Joseph Wood

NP, feel free to ping me in chat or comment on an answer of mine if you have questions.
Giuseppe

@Giuseppe is there a meta consensus on needing to explicitly state "R + numbers"? It seems like if we state the additional package then we should be able to save the bytes of explicitly calling it with numbers::. Otherwise, to me it's the same as using an import in any other language.
BLT

(scrolls down and sees a python example of this...) I guess I'm wondering about a broader meta consensus, then. It just sort of seems silly to me.
BLT



1

Haskell, 58 bytes

-4 bytes thanks to @Laikoni

f n=sum[1|x<-[2..n],gcd x n>1,all((>)2.gcd x)[2..x-1]]

Try it online!

Explanation

Essentially generates all primes at most as large as n and filters them for being a factor of n and then takes the length of the result.

f n=                                                   -- main function
    sum[                                             ] -- output the length of the list
        1|x<-[2..n],                                   -- consider all potential primes <=n
                                                       -- and insert 1 into the list if predicates are satisfied
                    gcd x n>1,                         -- which are a factor of n
                              all(          )[2..x-1]  -- and for which all smaller numbers satisfy
                                  (>)2.                -- 2 being larger than
                                       gcd x           -- the gcd of x with the current smaller number

You can use sum[1|x<- ... ] instead of length.
Laikoni


1

ARBLE, 28 bytes

len(unique(primefactors(n)))

Try it online!

This is a very literal solution


I was looking at this and going "Hey, wait a minute, this is a snippet!" And then I see... is this supposed to be a non-esoteric language with implicit IO?!
totallyhuman

@icrieverytim Congratulations, you have discovered one of the main reasons this language exists.
ATaco


0

Python 2,  63  55 bytes

A much more interesting answer...

-8 bytes thanks to Jonathan Frech (use an argument with a default for the post-adjustment of the result of primes from 0 to 1 -- much better than a wrapping lambda!!)

f=lambda n,o=1:sum(n%i+f(i,0)<1for i in range(2,n))or o

A recursive function taking a positive integer, n, and returning a positive integer, the count.

Try it online! Really inefficient, don't even bother with the other test cases.



@JonathanFrech Thanks, that is much cleaner.
Jonathan Allan

0

J, 12 bytes

{:@$@(__&q:)

q: is J's prime exponents function, giving it the argument __ produces a matrix whose first row is all nonzero prime factors and whose 2nd row is their exponents.

We take the shape $ of that matrix -- rows by columns -- the number of columns is the answer we seek.

{: gives us the last item of this two items (num rows, num columns) list, and hence the answer.

Try it online!



0

Javascript ES6, 56 chars

n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)

Test:

f=n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)
console.log([24,126,1538493,123456].map(f)=="2,3,4,3")

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