ยุติหมดจดเป็นระยะหรือในที่สุดเป็นระยะ?


21

บทนำ

ทศนิยมจะถูกยกเลิกหากมีจำนวนทศนิยมเป็นจำนวน จำกัด ตัวอย่างเช่น 0.4 (2/5) กำลังยกเลิกเนื่องจากมีเลขทศนิยมหนึ่งหลัก

ทศนิยมจะเป็นคาบอย่างหมดจดหากมีจำนวนทศนิยมที่ไม่มีที่สิ้นสุดและไม่มีเลขทศนิยมก่อนที่จะเกิดซ้ำ (ส่วนหนึ่งของทศนิยมที่ซ้ำกัน) ตัวอย่างเช่น 0.142857142857142 … (1/7) เป็นระยะหมดจดเพราะมีการทำซ้ำ 142857 ซึ่งจะเริ่มทำซ้ำทันทีหลังจากจุดทศนิยม

ในที่สุดทศนิยมจะมีเป็นระยะถ้ามันมีจำนวนทศนิยมที่ไม่มีที่สิ้นสุดและมีจำนวนทศนิยมที่แน่นอนก่อนที่จะเกิดซ้ำ (ส่วนหนึ่งของทศนิยมที่ซ้ำกัน) ตัวอย่างเช่น 0.16666666666666666 … (1/6) เป็นระยะเพราะในที่สุด ทำซ้ำ 6 เริ่มทำซ้ำหลังจาก 1

งานของคุณ

เขียนโปรแกรมหรือฟังก์ชั่นที่เมื่อได้รับตัวเลขpและq (จำนวนเต็ม, 0 <= p < q <= 100) จะพิจารณาว่าการแสดงทศนิยมของp / qนั้นสิ้นสุดลงเป็นระยะหรือในที่สุดเป็นระยะ

คุณจะต้องส่งออกaถ้ามันของการสิ้นสุด (เช่น 0.1) bถ้าหากมันเป็นธาตุบริสุทธิ์ (เช่น 0.333 ... ) หรือcถ้าหากมันเป็นธาตุในที่สุด (เช่น 0.166 ... ), ที่a, bและcมีความแตกต่างใด ๆ สตริงคงที่ของทางเลือกของคุณ

กรณีทดสอบ

0/1 => Terminating
0/2 => Terminating
1/2 => Terminating
0/3 => Terminating
1/3 => Purely Periodic
2/3 => Purely Periodic
0/4 => Terminating
1/4 => Terminating
2/4 => Terminating
3/4 => Terminating
0/5 => Terminating
1/5 => Terminating
2/5 => Terminating
3/5 => Terminating
4/5 => Terminating
0/6 => Terminating
1/6 => Eventually Periodic
2/6 => Purely Periodic
3/6 => Terminating
4/6 => Purely Periodic
5/6 => Eventually Periodic
0/7 => Terminating
1/7 => Purely Periodic
2/7 => Purely Periodic
3/7 => Purely Periodic
4/7 => Purely Periodic
5/7 => Purely Periodic
6/7 => Purely Periodic
0/8 => Terminating
1/8 => Terminating
2/8 => Terminating
3/8 => Terminating
4/8 => Terminating
5/8 => Terminating
6/8 => Terminating
7/8 => Terminating
0/9 => Terminating
1/9 => Purely Periodic
2/9 => Purely Periodic
3/9 => Purely Periodic
4/9 => Purely Periodic
5/9 => Purely Periodic
6/9 => Purely Periodic
7/9 => Purely Periodic
8/9 => Purely Periodic
0/10 => Terminating
1/10 => Terminating
2/10 => Terminating
3/10 => Terminating
4/10 => Terminating
5/10 => Terminating
6/10 => Terminating
7/10 => Terminating
8/10 => Terminating
9/10 => Terminating
0/11 => Terminating
1/11 => Purely Periodic
2/11 => Purely Periodic
3/11 => Purely Periodic
4/11 => Purely Periodic
5/11 => Purely Periodic
6/11 => Purely Periodic
7/11 => Purely Periodic
8/11 => Purely Periodic
9/11 => Purely Periodic
10/11 => Purely Periodic
0/12 => Terminating
1/12 => Eventually Periodic
2/12 => Eventually Periodic
3/12 => Terminating
4/12 => Purely Periodic
5/12 => Eventually Periodic
6/12 => Terminating
7/12 => Eventually Periodic
8/12 => Purely Periodic
9/12 => Terminating
10/12 => Eventually Periodic
11/12 => Eventually Periodic
0/13 => Terminating
1/13 => Purely Periodic
2/13 => Purely Periodic
3/13 => Purely Periodic
4/13 => Purely Periodic
5/13 => Purely Periodic
6/13 => Purely Periodic
7/13 => Purely Periodic
8/13 => Purely Periodic
9/13 => Purely Periodic
10/13 => Purely Periodic
11/13 => Purely Periodic
12/13 => Purely Periodic
0/14 => Terminating
1/14 => Eventually Periodic
2/14 => Purely Periodic
3/14 => Eventually Periodic
4/14 => Purely Periodic
5/14 => Eventually Periodic
6/14 => Purely Periodic
7/14 => Terminating
8/14 => Purely Periodic
9/14 => Eventually Periodic
10/14 => Purely Periodic
11/14 => Eventually Periodic
12/14 => Purely Periodic
13/14 => Eventually Periodic
0/15 => Terminating
1/15 => Eventually Periodic
2/15 => Eventually Periodic
3/15 => Terminating
4/15 => Eventually Periodic
5/15 => Purely Periodic
6/15 => Terminating
7/15 => Eventually Periodic
8/15 => Eventually Periodic
9/15 => Terminating
10/15 => Purely Periodic
11/15 => Eventually Periodic
12/15 => Terminating
13/15 => Eventually Periodic
14/15 => Eventually Periodic

คุณสามารถค้นหากรณีทดสอบทั้งหมดที่นี่

คุณได้รับอนุญาตให้เลือก 3 ค่าของคุณเองสำหรับผลลัพธ์ แต่ต้องชัดเจนว่าเป็นค่าใด

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

คำแนะนำ

ยกเลิก:

การแยกตัวประกอบเฉพาะของตัวหารทศนิยมในรูปแบบที่ง่ายที่สุดประกอบด้วยเพียง 2 วินาทีและ 5 วินาที

หมดจดเป็นระยะ:

การแยกตัวประกอบเฉพาะของตัวหารทศนิยมอย่างหมดจดในรูปแบบที่ง่ายที่สุดไม่รวม 2s หรือ 5s ใด ๆ

ในที่สุดระยะ:

การแยกตัวประกอบเฉพาะของตัวหารทศนิยมในที่สุดในรูปแบบที่ง่ายที่สุดนั้นมีอย่างน้อยหนึ่ง 2 หรือ 5 แต่ยังรวมถึงตัวเลขอื่น ๆ

ลีดเดอร์

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

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

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes



2
หากฉันคิดว่าจริง ๆ แล้วฉันจะลงคะแนนอย่างใกล้ชิด มีเหตุผลที่ฉันใช้คำว่า " เกือบ "
Peter Taylor

1
ได้รับส่วนในรูปแบบ / p คิวที่กำหนดวิธีการ? เราสามารถใช้ตัวเศษและส่วนเป็นอาร์กิวเมนต์ของฟังก์ชันแยกกันได้หรือไม่?
Dennis

2
เราสามารถส่งออกค่าคงที่ที่ไม่ตรงตามเงื่อนไขที่กำหนดเช่นอะไรที่ผิดพลาดในการยกเลิก 1 สำหรับระยะหมดจดและทุกอย่างที่มากกว่า 1 สำหรับระยะสุดท้าย?
ETHproductions

1
ไม่ 1/13 เป็นระยะอย่างหมดจดเพราะผู้ทำซ้ำคือ '076923' 0 ซ้ำกับผู้ทำซ้ำ
Oliver Ni

คำตอบ:


8

เยลลี่ 10 ไบต์

:gÆfḍ⁵ṢQ¬Ḅ

ยอมรับส่วนและตัวเศษ (ตามลำดับ) เป็นอาร์กิวเมนต์ ส่งคืน0สำหรับการยกเลิก1สำหรับการหมดจดเป็นระยะและ2ในที่สุดเป็นระยะ ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

:gÆfḍ⁵ṢQ¬Ḅ  Main link. Arguments: d (denominator), n (numerator)

 g          Compute the GCD of d and n.
:           Divide d by the GCD, yielding the denominator of the simplified form.
  Æf        Yield all prime factors of the previous result.
    ḍ⁵      Test 10 for divisibility by each prime factor.
            This yields 1 for 2 and 5, 0 for all other primes.
      Ṣ     Sort the resulting Booleans.
       Q    Unique; deduplicate the sorted Booleans.
        ¬   Logical NOT; replace 0 with 1 and vice versa to yield one of the
            following arrays.
              [    ]  <- no prime factors (denominator 1)
              [   0]  <- only 2 and 5
              [1   ]  <- neither 2 nor 5
              [1, 0]  <- mixed
         Ḅ  Unbinary; convert from base 2 to integer.
            This maps [] and [0] to 0, [1] to 1, and [1, 0] to 2.

11

JavaScript (ES6), 70 .. 68 53 ไบต์

f=(a,b,s=[],x)=>a?(s[a]^=a)?f(a*10%b,b,s,x||a):x==a:0

ส่งคืนค่า0สำหรับการยกเลิกค่าจริงสำหรับช่วงเวลาและเท็จในที่สุดเป็นระยะ

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

สิ่งที่เราทำที่นี่คือการจำลองการแบ่งด้วยมือ:

  1. a?...:0- 0หากเศษเป็นศูนย์ที่เราหยุดที่นี่และผลตอบแทน ลำดับเป็นที่ยุติ
  2. (s[a]^=a)?...:x==a- หากเราพบตัวเศษนี้มาก่อนแล้วนั่นหมายความว่าลำดับนั้นเป็นคาบและจะทำซ้ำอย่างถาวร เราหยุดที่นี่และกลับมาทั้งสองtrueถ้าaเท่ากับค่าแรกxของลำดับ ( หมดจดเป็นระยะ ) หรือfalseถ้ามันไม่ได้ ( เป็นระยะในที่สุด )
  3. f(a*10%b,b,s,x||a)- มิฉะนั้นเราจะคูณตัวเศษaด้วย 10 เราคำนวณเศษที่เหลือของตัวหารด้วยตัวbส่วน และเราทำซ้ำกระบวนการโดยใช้ส่วนที่เหลือนี้เป็นตัวเศษใหม่ (นอกจากนี้เรายังผ่านaเป็นค่าแรกของลำดับหากยังไม่ได้เก็บไว้x )

ตัวอย่าง

  • น้ำเงิน : ตัวเศษ = 1
  • เขียว : ตัวส่วน = 7
  • สีแดง : คูณด้วย 10
  • ดำ : ส่วนที่เหลือ
  • สีเทา : ตัวเลขหาร (เราไม่สนใจพวกเขาที่นี่จริง ๆ และโค้ดข้างต้นไม่ได้คำนวณเลย)

division


9

Python, 62 61 59 ไบต์

f=lambda n,d,r=[0,0]:(r[:3]+r).count(n)or f(10*n%d,d,r+[n])

พิมพ์1สำหรับเป็นระยะในที่สุด2สำหรับระยะหมดจดและ4สำหรับการยกเลิก

ตรวจสอบกรณีทดสอบทั้งหมดในrepl.it


ที่น่าสนใจ! อะไร*rทำอย่างไร
ETHproductions

มัน unpacks tuple R เทียบเท่ากับf(1, *(2, 3), 4) f(1, 2, 3, 4)
Dennis

ดังนั้นนี่จะเป็น 56 ไบต์ใน JS:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

แย่ขนาด 63 ไบต์ (ฉันลืมที่inทำหน้าที่แตกต่างกันมากใน JS มากกว่าใน Python):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

@ETHproductions เรียบร้อย ฉันคิดว่าf=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)จะทำงานได้เช่นกัน
Dennis

6

Perl, 49 46 45 ไบต์

รวมถึง +3 สำหรับ -p

ขึ้นอยู่กับ ความคิดที่สง่างามของเดนนิสแต่ถูกนำไปใช้อย่างพิถีพิถัน

ให้หมายเลขอินพุตใน STDIN

terminating.pl <<< "2 26"

termninating.pl:

#!/usr/bin/perl -p
/ /;1until$a{$_=$_*10%$' or$`}++;$_=$a{$`}

พิมพ์ 2 หากยกเลิก 1 ถ้าเป็นระยะและไม่มีอะไรในที่สุดถ้าเป็นระยะ


ตัวเลขทั้งหมดในกลุ่มหนึ่งต้องให้ค่าเดียวกัน
Oliver Ni

@OliverNi พวกเขาทำแล้วตอนนี้
Ton Hospel

3

แบตช์ 247 ไบต์

@set/af=%1,g=%2
:g
@if not %f%==0 set/ah=g,g=f,f=h%%g&goto g
@set/ae=d=%2/g
:l
@set/ag=-~!(d%%2)*(!(d%%5)*4+1)
@if not %g%==1 set/ad/=g&goto l
@if %d%==1 (echo Terminating)else if %d%==%e% (echo Purely Periodic)else echo Eventually Periodic

ใช้เคล็ดลับ gcd10 ของฉันได้อย่างรวดเร็วจากเศษส่วนให้เป็นทศนิยมที่แน่นอน เห็นได้ชัดว่าฉันสามารถบันทึกไบต์จำนวนมากโดยใช้รูปแบบผลลัพธ์ที่กำหนดเอง


ทำไมคุณไม่ทำ@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo Eเพื่อประหยัด 42 ไบต์?
ETHproductions

เห็นได้ชัดว่าฉันสามารถบันทึกไบต์จำนวนมากโดยใช้รูปแบบผลลัพธ์ที่กำหนดเอง
Oliver Ni

@ ETHproductions ฉันคิดว่าเขาไม่ต้องการโอลิเวอร์ได้สังเกตด้วยคำพูด
Erik the Outgolfer

3

JavaScript (ES6), 91 88 85 79 75 74 78 ไบต์

f=(n,d,g=(a,b)=>b?g(b,a%b):a,t=g(d/=c=g(n,d),10))=>n*~-d?t-1?f(n/c,d/t)/0:1:+f

เอาท์พุทNaNสำหรับการยกเลิก1เป็นระยะอย่างหมดจดและInfinityเป็นระยะในที่สุด

ตัวอย่างการทดสอบ

คำอธิบาย

อันดับแรกเราแบ่งทั้งnและdด้วยgcd (d, n)เพื่อลดเศษส่วนให้อยู่ในรูปแบบที่ง่ายที่สุด สิ่งนี้ช่วยให้เราหลีกเลี่ยงสถานการณ์เช่น2/6ซึ่งจะคำนวณผลลัพธ์เป็นระยะอย่างหมดจด นอกจากนี้เรายังกำหนดตัวแปรtเป็นgcd (d, 10) ; จะใช้ในภายหลัง

การตรวจสอบครั้งแรกไม่ว่าจะเป็นnเป็น0หรือdเป็น1 ถ้าn * (d-1)เป็น 0 เราจะคืนค่า+fหรือNaN : เศษส่วนกำลังจะสิ้นสุดยุติ

การตรวจสอบต่อไปไม่ว่าจะเป็นเสื้อเป็น1 ถ้าเป็นเช่นนั้นเราจะคืนค่า1 : เศษส่วนเป็นคาบอย่างหมดจดระยะอย่างหมดจด

หากทีเป็นไม่ได้ ที่ 1 , เราแบ่งวันโดยทีเรียกใช้ฟังก์ชั่นทั้งหมดอีกครั้งและหารด้วย 0 ถ้าn / (D / t)จะยุติผลตอบแทนนี้น่าน / 0 = น่าน : ส่วนคือยุติ มิฉะนั้นก็จะส่งกลับ1/0 = Infinity : ส่วนเป็นระยะ ๆ ในที่สุด


การลดลงของรูปแบบที่ง่ายที่สุดอยู่ที่ไหน
Ton Hospel

แก้ไข @TonHospel แล้ว
ETHproductions

@Arnauld ฉันไม่แน่ใจว่าคุณหมายถึงอะไร มันจะส่งกลับInfinityสำหรับค่าทั้งหมดเหล่านั้น
ETHproductions

@Annauld Aw, man, ฉันคิดว่าฉันสามารถออกไปได้โดยไม่ต้องปรับn... ขอบคุณที่ชี้ให้เห็น
ETHproductions

3

Mathematica, 41 ไบต์

Ordering@{d=Denominator@#,GCD[d,10^d],1}&

เอาท์พุท{3,1,2}ถ้าอินพุตมีการยุติทศนิยมการขยาย{2,3,1}ถ้าอินพุตมีการขยายทศนิยมเป็นระยะอย่างหมดจดและ{3,2,1}ถ้าการป้อนข้อมูลมีการขยายทศนิยมเป็นระยะในที่สุด

ขึ้นอยู่กับเคล็ดลับลับ ๆ ล่อ ๆ : ถ้าdเป็นตัวหารของเศษส่วนในแง่ต่ำสุดแล้วตัวหารร่วมมากที่สุดของdและ10^dเท่ากับdถ้าdมีเพียง 2s และ 5 วินาทีในการแยกตัวประกอบที่สำคัญของมัน; เท่ากับ1ถ้าdไม่มี 2s หรือ 5s ในการแยกตัวประกอบเฉพาะ และเท่ากับจำนวนเต็มบางส่วนในระหว่างถ้าdมี 2s / 5s และจำนวนเฉพาะอื่น ๆ

Orderingฟังก์ชั่นเพียงรายงานที่มีขนาดเล็กที่สุดเล็กที่สุดต่อไปและองค์ประกอบที่ใหญ่ที่สุดของสามจะมีความสัมพันธ์ที่หักจากซ้ายไปขวา

Flaw: ส่งคืนเอาต์พุตชุดตัวเลือก{1,2,3}แทน{3,1,2}ถ้าอินพุตเป็น 0

Mathematica ขนาด 46 ไบต์แบบวิปริต

b[a][[Log[d=Denominator@#,GCD[d,10^d]]]][[1]]&

ส่งคืนa[[1]]ถ้าอินพุตมีการยกเลิกทศนิยมการขยายb[[1]]ถ้าอินพุตมีการขยายทศนิยมเป็นระยะอย่างหมดจดและb[a]หากการป้อนข้อมูลมีการขยายทศนิยมเป็นระยะในที่สุด โยนข้อผิดพลาดในทุกกรณี!

ดังที่กล่าวไว้ข้างต้นเราต้องการทราบว่าตัวหารสามัญที่ยิ่งใหญ่ที่สุดมีค่าเท่ากับ 1, d หรือที่ใดที่หนึ่ง ลอการิทึมฐาน -d ของ gcd นั้นเท่ากับ 0, 1 หรือสิ่งที่อยู่ระหว่างนั้น

ตอนนี้เราเริ่มทรมาน Mathematica b[a][[n]]หมายถึงส่วนหนึ่งวันของการแสดงออกn b[a]ดังนั้นb[a][[1]]ผลตอบแทนa; b[a][[0]]ผลตอบแทนb; และb[a][[x]]ซึ่งxเป็นตัวเลขระหว่าง 0 ถึง 1 ทำให้ Mathematica โยนข้อผิดพลาด "ส่วน :: pkspec1: นิพจน์xไม่สามารถใช้เป็นข้อมูลจำเพาะของชิ้นส่วนได้" และผลตอบแทนb[a][[x]]ประเมิน

สิ่งนี้แยกความแตกต่างระหว่างสามกรณีอย่างเหมาะสมแล้วยกเว้นว่าผลลัพธ์สำหรับกรณีระยะสุดท้ายคือb[a][[x]]ซึ่งไม่คงที่เพราะxเป็นลอการิทึมจริงของบางสิ่ง ดังนั้นเราจึงนำ[[1]]ไปใช้กับผลลัพธ์ที่ได้อธิบายไปแล้ว เพราะวิธีการ Mathematica ภายในแสดงให้เห็นถึงb[a][[x]]ผลของการเป็นเพียงb[a][[x]][[1]] b[a]ในทางกลับกันการนำ[[1]]ไปใช้กับaผลลัพธ์ในข้อผิดพลาดที่แตกต่างกัน "Part :: partd: ข้อมูลจำเพาะของส่วน [[1]] มีความยาวเกินความลึกของวัตถุ" และส่งคืนค่าที่ไม่a[[1]]ประเมินค่า(และคล้ายกันb)

ข้อบกพร่อง: โกหกเกี่ยวกับการป้อนข้อมูล 0 กลับมาแทนb[a]a[[1]]


2

C 173 ไบต์

รับจำนวนเต็มสองจำนวนจาก stdin โดยพิมพ์ 1 เพื่อให้หมดจดเป็นงวด, -1 สำหรับเป็นระยะในที่สุดและเป็น 0 สำหรับการยกเลิก

int r;main(_,n,d){_-1?_-2?d-1?d%2&&d%5?r=1:d%2?main(3,n,d/5):main(3,n,d/2),r=r?-1:0:r=0:d?main(2,d,n%d):r=n:scanf("%d %d",&n,&d),main(2,n,d),main(3,n/r,d/r),printf("%d",r);}

Ungolfed:

// returns 1 for periodic, 0 for terminating, <0 for eventually periodic
int periodic(int num, int den) { // 3
    if (den == 1) return 0;
    if (den % 2 && den % 5) // pure periodic
        return 1;
    if (den % 2) return periodic(num,den/5) ? -1 : 0;
    return periodic(num,den/2) ? -1 : 0;
}

int gcd(int num, int den) { // 2
    if (den) 
        return gcd(den,num%den);
    return num;
}

int main(n,d) // 1
{
    scanf("%d %d",&n,&d);
    printf("%d",periodic(n/gcd(n,d),d/gcd(n,d)));
    return 0;
}   

ครึ่งแข็งแรงเล่นกอล์ฟ:

int r;main(_,n,d){
    _-1? 
    _-2?
    // periodic
    d-1?
        d%2&&d%5?
            r=1:
                d%2?
                    main(3,n,d/5): //periodic
                    main(3,n,d/2), //periodic
                        r=r?-1:0:
                r=0
    // gcd
    :d?main(2,d,n%d):r=n // gcd
    // main
    :scanf("%d %d",&n,&d),
     main(2,n,d), // gcd
     main(3,n/r,d/r), // periodic
     printf("%d",r);
}

2

ที่จริงแล้ว 15 ไบต์

นี้อยู่บนพื้นฐานของเดนนิสคำตอบวุ้น 0จะสิ้นสุดลง1เป็นระยะหมดจดและในที่สุดก็2เป็นระยะ ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

▼Ny9u♀%SR♂b╔2@¿

Ungolfing

      Implicit input [a, b].
▼     Divide a and b by gcd(a,b).
Ny    Get the unique prime divisors of the reduced denominator.
9u    Push 10.
♀%    10 mod every member of uniq_p_d.
SR    Sort the mods and reverse.
♂b    Logical buffer. Converts every (10 % p != 0) to 1, and everything else to 0.
        Meaning if 2 or 5 divided b, they are now 0, and every other prime is now 1.
╔     Uniquify the list.
        If terminating, return [0].
        If purely periodic, return [1].
        If eventually periodic, return [1, 0].
        Else, (if b was 1), return [].
2@¿   Convert from binary to decimal. Return 0, 1, or 2.
      Implicit return.

1

Mathematica ขนาด 44 ไบต์

If[ListQ@Last@#,Length@#==1]&@@RealDigits@#&

ผลตอบแทนNullสำหรับการยกเลิกTrueสำหรับหมดจดเป็นระยะและFalseในที่สุดเป็นระยะ

คำอธิบาย

RealDigits

ค้นหาการขยายทศนิยมของ N (ตัวเลขซ้ำ ๆ จะถูกล้อมรอบด้วยหัวพิเศษList {})

ListQ@Last@#

Listตรวจสอบว่าองค์ประกอบสุดท้ายของการขยายตัวทศนิยมเป็น

Length@#==1

หากเงื่อนไขข้างต้นTrueตรวจสอบว่าการขยายทศนิยมทั้งหมดประกอบด้วยสิ่งเดียวหรือไม่ ( Listนับเป็นหนึ่งเอนทิตี) (ส่งคืนTrueหรือFalse)

(หากเงื่อนไขเป็นFalseแล้วNullจะถูกส่งกลับเพราะไม่มีข้อโต้แย้งที่สามสำหรับIf)


1

Pyth , 31 27 ไบต์

AQ={P/HiGH?l@H=j25T?l-HT1Z2

อินพุต

4,12

คุณสามารถทดลองใช้งานได้ที่นี่ พิมพ์1สำหรับเป็นระยะในที่สุด2สำหรับระยะหมดจดและ 0สำหรับการยกเลิก นี่เป็นครั้งแรกที่ฉันตอบ codegolf ข้อเสนอแนะใด ๆ ยินดีต้อนรับ

คำอธิบาย

AQ                                              // 1st element to G and 2nd element to H
    ={P                                         // Assign unique prime factors to H
        /H                                      // Simplify denominator
            iGH                                 // Find GCD
                ?l                              // Check length of filtered H
                    @H                          // Filter H by Y
                        =j25T                   // Assign a set [2,5] to T
                                ?l-HT           // Check length of H - T
                                        1Z2     // Print result

โปรดทราบว่า [2,3] กรองโดย [2,5] = [2] แต่ [2,3,5] - [2,5] = [3]


1

PARI / GP, 64 ไบต์

f(x,y)=if(setminus(factor(y=y/gcd(x,y))[,1]~,[2,5]),gcd(y,10)>1)

ไม่มีผลใด ๆ สำหรับการยกเลิก 0 สำหรับหมดจดและ 1 เป็นระยะในที่สุด

ไม่แฟนซีมากฉันหวังว่าจะมีบางอย่างที่ดีขึ้นเมื่อฉันเริ่ม


1

05AB1E , 16 11 ไบต์

บันทึก 5 ไบต์ด้วย @Adnan!

¿²r/fTrÖbÙJ

พิมพ์ 0 สำหรับหมดจดเป็นระยะเวลา 1 เพื่อสิ้นสุดและ 10 สำหรับเป็นระยะ ๆ

คำอธิบาย:

                 # Implicit input
                 # Implicit input
  ¿              # Take GCD of numbers
   ²             # Push top value from input register
    r            # Reverse stack order
     /           # Divide (denominator by GCD)
      f          # Find unique prime factors
       TrÖ       # Test 10 for divisibility
          b      # Convert (True -> 1, False -> 0)
           Ù     # Deduplicate array
            J    # Join chars in array
                 # Implicit print

การป้อนข้อมูลจะมาเป็นหน้าขึ้นบรรทัดใหม่Q

ลองออนไลน์!


ยินดีที่ได้พบคุณใช้ 05AB1E :) Osabie ยังใช้อินพุตโดยปริยายซึ่งทำให้เราสามารถลบสองรายการแรกIได้ นอกจากนี้ค่าคงที่ที่กำหนดไว้ล่วงหน้าที่จะมี10 Tเหมือนกัน2Bซึ่งก็คือb:)
Adnan

คุณยังสามารถใช้การลงทะเบียนอินพุตซึ่งให้เรา¿²r/fTrÖbÙJเป็นรหัสสุดท้าย :)
Adnan

1

PHP, 126 ไบต์

$d=$argv[2];$a[]=$n=$argv[1];while($n%$d&&!$t){$n*=10;$t=in_array($n%=$d,$a);$a[]=$n;}if($a[1]&&$t)$t+=$a[0]!=end($a);echo+$t;

พิมพ์ 0 สำหรับสิ้นสุดและ 1 สำหรับหมดจดเป็นระยะ 2 สำหรับในที่สุด ให้ฉันอธิบายว่าตัวเศษเป็นสองเท่าในอาร์เรย์ที่นี่เริ่มเซสชันเป็นระยะถ้ามันถูกยกเลิกecho end($a);ค่าคือ0 ถ้าคุณไม่เชื่อใจฉัน$t=count($a)>$d?2:0;ในวง

ที่จะทำให้มันชัดเจนมากขึ้นโปรดเพิ่ม print_r($a);หรือvar_dump($a);หรือjson_encode($a);หลังจากห่วง

คุณสามารถเห็นตัวเศษหนึ่งตัวสองตัวหรือศูนย์ที่ท้ายอาร์เรย์ถ้าตัวนับเป็นตัวนับสองรายการระหว่างสองรายการและคุณจะได้ความยาวของคาบและคุณสามารถเห็นตำแหน่งโดยตัวแรกที่จุดเริ่มต้นเป็นระยะ

ดังนั้นหลังจากนั้นเราสามารถค้นหาตำแหน่งและความยาวของลำดับคาบด้วย if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

เห็นภาพเป็นระยะ

$d=$argv[2];
$a[]=$n=$argv[1]; #array numerator
$r[]=$n/$d^0; #array result of the division
$r[]=".";
while($n%$d&&!$t){
    $n*=10; 
    $n-=$d*$r[]=$n/$d^0;
    $t=in_array($n%=$d,$a); #stop if numerator is twice 
    $a[]=$n;
}
if($a[1]&&$t)$t+=$a[0]!=end($a); #periodic term starts directly?
if($t){
    echo $p=array_search(end($a),$a)."\n"; #output the beginning position of the periodic term
    echo $l=count($a)-$p-1; #output the length of the periodic term
    echo "\n";
    echo str_repeat(" ",2+$p).str_repeat("_",$l-1)."\n"; #visualize the periodic term
    #echo join(array_slice($r,0,1+$p)).join(array_slice($r,1+$p))."\n";# if you want only the periodic term 
    echo join($r); #result if the division
}
echo+$t; # 0 terminated 1+2 periodic 2 periodic start not directly

เอาท์พุทเห็นภาพระยะเวลา

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

วิธีอื่นที่มี 130 ไบต์

$r=bcdiv(($z=$argv)[1],$z[2],400);for($p=2;$i++<200;)if(substr($r,2,$i)==substr($r,2+$i,$i))$p=1;echo strlen(rtrim($r,0))<50?0:$p;

เวอร์ชันขยาย

$r=bcdiv(($z=$argv)[1],$z[2],400); # 100 is the maximal denominator 
# we need a string length with the double value of the sum the length from 1 until the denominator
for($p=2;$i++<200;)if(substr($r,2,$i)==substr($r,2+$i,$i))$p=1;
# all results begin with 0. 
#take two substrings with the same length after that and comparize both. 
#if we found 2 same substrings we have a periodic which starts at the first decimal place
echo strlen(rtrim($r,0))<50?0:$p; 
# if we can trim the length of the result we have a terminated result

ดูเพิ่มเติมเศษส่วนให้เป็นทศนิยมที่แน่นอน
Neil

@ คุณหมายความว่าฉันควรแก้ไขรหัสเพื่อตอบคำถามอื่นหรือไม่
JörgHülsermann

ฉันก็แค่คิดว่าคำถามอื่น ๆ ไม่มีคำตอบ PHP; บางทีคุณต้องการที่จะให้หนึ่ง
Neil

@RosLuP สำหรับตัวอย่าง 3/53 อาร์เรย์นี้จะถูกสร้างขึ้น[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
JörgHülsermann

3/103 = 0.0291262135922330097087378640776699029126213592233009708 ดังนั้นในช่วงเวลาเดียวกันจะปรากฏตัวเลขเดียวกัน (ตัวอย่างเช่นตัวเลข 7 ระหว่าง 00 ... 00 ด้านบน) แต่ถ้าอาร์เรย์ที่คุณพูดถึงไม่ใช่หนึ่งในหลัก แต่อาร์เรย์ของ {d = 10 * (d% b)} โดยที่หลักคือ d / c มากกว่าที่ฉันคิดว่ามันโอ
เคมี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.