Chấm dứt, hoàn toàn định kỳ, hoặc cuối cùng định kỳ?


21

Giới thiệu

Một số thập phân sẽ chấm dứt nếu nó có số chữ số thập phân hữu hạn. Ví dụ: 0,4 (2/5) đang chấm dứt vì nó có một chữ số thập phân.

Số thập phân hoàn toàn là định kỳ nếu nó có số chữ số thập phân vô hạn và không có chữ số thập phân trước khi lặp lại (phần thập phân lặp lại.) Ví dụ: 0.142857142857142 cách (1/7) hoàn toàn là định kỳ vì nó có phần lặp lại 142857, bắt đầu lặp lại ngay sau dấu thập phân.

Cuối cùng, một số thập phân là định kỳ nếu nó có số chữ số thập phân vô hạn và có số chữ số thập phân hữu hạn trước khi lặp lại (phần thập phân lặp lại.) Ví dụ: 0.166666666666666 (1/6) cuối cùng là định kỳ vì lặp lại 6 bắt đầu lặp lại sau 1.

Nhiệm vụ của bạn

Viết chương trình hoặc hàm, khi cho các số pq (số nguyên, 0 <= p < q <= 100), sẽ xác định xem biểu diễn thập phân của p / q có chấm dứt, hoàn toàn định kỳ hoặc cuối cùng là định kỳ.

Bạn phải ra anếu nó Ngừng (tức là 0.1), bnếu nó thuần túy định kỳ (tức là 0,333 ...), hoặc cnếu đó là Cuối cùng kỳ (tức là 0,166 ...), nơi a, bcbất kỳ khác biệt, hằng xâu lựa chọn của bạn.

Các trường hợp thử nghiệm

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

Bạn có thể tìm thấy tất cả các trường hợp thử nghiệm ở đây .

Bạn được phép chọn 3 giá trị của riêng mình cho đầu ra, nhưng nó phải rõ ràng về giá trị của nó.

Hãy nhớ rằng, đây là , vì vậy mã có số byte nhỏ nhất sẽ thắng.

Gợi ý

Chấm dứt:

Hệ số nguyên tố của mẫu số thập phân kết thúc ở dạng đơn giản nhất chỉ bao gồm 2 giây và 5 giây.

Hoàn toàn định kỳ:

Hệ số nguyên tố của mẫu số thập phân hoàn toàn định kỳ ở dạng đơn giản nhất không bao gồm bất kỳ 2 giây hoặc 5 giây.

Cuối cùng định kỳ:

Hệ số nguyên tố của mẫu số thập phân định kỳ cuối cùng ở dạng đơn giản nhất bao gồm ít nhất một 2 hoặc 5, nhưng cũng bao gồm các số khác.

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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



2
Nếu tôi nghĩ rằng nó thực sự là một bản sao, tôi sẽ bỏ phiếu chặt chẽ. Có một lý do mà tôi đã sử dụng từ " gần như ".
Peter Taylor

1
cho một phần dưới dạng p / q Cho như thế nào? Chúng ta có thể lấy tử số và mẫu số làm đối số hàm riêng biệt không?
Dennis

2
Chúng ta có thể đưa ra một giá trị không cố định đáp ứng một điều kiện cụ thể, chẳng hạn như bất cứ điều gì sai lệch khi kết thúc, 1 cho hoàn toàn định kỳ và bất cứ điều gì lớn hơn 1 cho cuối cùng định kỳ không?
Sản phẩm điện tử

1
Không, 1/13 hoàn toàn là định kỳ vì sự lặp lại là '076923'. Số 0 lặp lại với sự lặp lại.
Oliver Ni

Câu trả lời:


8

Thạch , 10 byte

:gÆfḍ⁵ṢQ¬Ḅ

Chấp nhận mẫu số và tử số (theo thứ tự đó) làm đối số. Trả về 0 khi kết thúc, 1 cho hoàn toàn định kỳ và 2 cho cuối cùng định kỳ. Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

: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 byte

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

Trả về 0 khi kết thúc, đúng cho hoàn toàn định kỳ và sai cho cuối cùng định kỳ.

Làm thế nào nó hoạt động

Những gì chúng ta đang làm ở đây thực sự là mô phỏng một bộ phận bằng tay:

  1. a?...:0- Nếu tử số bằng 0, chúng ta dừng ở đây và quay lại 0. Trình tự kết thúc .
  2. (s[a]^=a)?...:x==a- Nếu chúng ta đã gặp tử số này trước đó, điều đó có nghĩa là chuỗi này là định kỳ và sẽ lặp lại mãi mãi. Chúng tôi dừng lại ở đây và trả về truenếu abằng với giá trị đầu tiên xcủa chuỗi ( hoàn toàn là định kỳ ) hoặc falsenếu không ( cuối cùng là định kỳ ).
  3. f(a*10%b,b,s,x||a)- Khác, chúng tôi nhân tử số avới 10. Chúng tôi tính phần còn lại của phép chia theo mẫu số b. Và chúng tôi lặp lại quá trình bằng cách sử dụng phần còn lại này làm tử số mới. (Chúng tôi cũng chuyển qua alàm giá trị đầu tiên của chuỗi nếu nó chưa được lưu trữ x.)

Thí dụ

  • Màu xanh : tử số = 1
  • Màu xanh lá cây : mẫu số = 7
  • Màu đỏ : nhân với 10
  • Đen : còn lại
  • Màu xám : chữ số thương (chúng tôi không thực sự quan tâm đến chúng ở đây và đoạn mã trên hoàn toàn không tính toán chúng)

bộ phận


9

Python, 62 61 59 byte

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

In 1 cho cuối cùng định kỳ, 2 cho hoàn toàn định kỳ và 4 cho chấm dứt.

Xác minh tất cả các trường hợp thử nghiệm trên repl.it .


Hấp dẫn! Không gì *rlàm gì?
Sản phẩm điện tử

Nó giải nén bộ dữ liệu r . f(1, *(2, 3), 4)tương đương với f(1, 2, 3, 4).
Dennis

Vì vậy, đây sẽ là 56 byte trong JS:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

Xấu của tôi, 63 byte (tôi quên rằng nó inphục vụ một mục đích rất khác trong JS so với Python):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions

@ETHproductions gọn gàng. Tôi đoán f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)sẽ làm việc như là tốt.
Dennis

6

Perl, 49 46 45 byte

Bao gồm +3 cho -p

Dựa trên ý tưởng tao nhã của Dennis nhưng được thực hiện theo cách hoàn hảo

Cung cấp số đầu vào trên STDIN

terminating.pl <<< "2 26"

termninating.pl:

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

In 2 nếu chấm dứt. 1 nếu định kỳ và không có gì nếu cuối cùng định kỳ


Tất cả các số trong một nhóm nhất định phải cho cùng một giá trị.
Oliver Ni

@OliverNi Họ làm ngay bây giờ
TonMedel

3

Hàng loạt, 247 byte

@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

Sử dụng thủ thuật gcd10 nhanh của tôi từ Phân số đến số thập phân chính xác . Rõ ràng tôi có thể lưu một loạt byte bằng cách sử dụng định dạng đầu ra tùy chỉnh.


Tại sao bạn không làm gì @if %d%==1 (echo T)else if %d%==%e% (echo P)else echo Eđể tiết kiệm 42 byte?
Sản xuất ETH

Rõ ràng tôi có thể lưu một loạt byte bằng cách sử dụng định dạng đầu ra tùy chỉnh.
Oliver Ni

@ETHproductions Tôi nghĩ rằng anh ấy không muốn, như Oliver đã lưu ý với một trích dẫn.
Erik the Outgolfer

3

JavaScript (ES6), 91 88 85 79 75 74 78 byte

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

Đầu ra NaNđể chấm dứt, 1hoàn toàn định kỳ và Infinitycuối cùng là định kỳ.

Kiểm tra đoạn

Giải trình

Đầu tiên, chúng ta chia cả nd cho gcd (d, n) , để giảm phân số về dạng đơn giản nhất của nó. Điều này cho phép chúng tôi tránh các tình huống như 2/6 trong đó kết quả sẽ được tính là hoàn toàn định kỳ. Chúng tôi cũng định nghĩa biến tgcd (d, 10) ; cái này sẽ được sử dụng sau

Kiểm tra đầu tiên là n0 hay d1 . Nếu n * (d-1) bằng 0, chúng tôi trả về +fhoặc NaN : phân số đang kết thúc .

Kiểm tra tiếp theo là liệu t1 . Nếu vậy, chúng tôi trả về 1 : phần hoàn toàn là định kỳ .

Nếu t không phải1 , chúng ta chia d cho t , chạy lại toàn bộ hàm và chia cho 0. Nếu n / (d / t) kết thúc, điều này trả về NaN / 0 = NaN : phân số kết thúc . Mặt khác, nó trả về 1/0 = Infinity : phân số cuối cùngđịnh kỳ .


Đâu là sự giảm xuống dạng đơn giản nhất?
TonMedel

@TonHeach Đã sửa.
Sản xuất ETH

@Arnauld Tôi không chắc ý của bạn là gì. Nó trả về Infinitycho tất cả các giá trị đó.
Sản xuất ETH

@Arnauld Aw, anh bạn, tôi nghĩ rằng tôi có thể thoát khỏi mà không bao giờ điều chỉnh n... Cảm ơn vì đã chỉ ra điều đó.
Sản phẩm điện tử

3

Toán học, 41 byte

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

Đầu ra {3,1,2}nếu đầu vào có mở rộng thập phân kết thúc, {2,3,1}nếu đầu vào có mở rộng thập phân hoàn toàn theo chu kỳ và {3,2,1}nếu đầu vào có mở rộng thập phân cuối cùng định kỳ.

Dựa trên mánh khóe lén lút: nếu dlà mẫu số của một phân số ở mức thấp nhất, thì ước số chung lớn nhất d10^dbằng dnếu dchỉ có 2s và 5s trong hệ số nguyên tố của nó; bằng 1nếu dkhông có 2s hay 5s trong hệ số nguyên tố của nó; và bằng một số nguyên ở giữa nếu dcó 2s / 5s và các số nguyên tố khác.

Các Orderingchức năng chỉ báo cáo nơi những yếu tố nhỏ nhất, bên cạnh nhỏ nhất, và lớn nhất của ba là, có quan hệ broken từ trái sang phải.

Lỗ hổng: trả về đầu ra biến thể {1,2,3}thay vì {3,1,2}nếu đầu vào bằng 0.

Mathicala, 46 byte, đồi trụy

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

Trả về a[[1]]nếu đầu vào có mở rộng thập phân kết thúc, b[[1]]nếu đầu vào có mở rộng thập phân hoàn toàn định kỳ và b[a]nếu đầu vào có mở rộng thập phân cuối cùng định kỳ. Ném một lỗi trong tất cả các trường hợp!

Như trên, chúng tôi muốn biết liệu ước số chung lớn nhất đó có bằng 1, d hoặc ở đâu đó ở giữa không. Logarit cơ sở của gcd đó bằng 0, 1 hoặc một cái gì đó ở giữa.

Bây giờ chúng ta bắt đầu tra tấn Mathicala. b[a][[n]]biểu thị phần nthứ của biểu thức b[a]. Vì vậy, b[a][[1]]trả lại a; b[a][[0]]trả lại b; và b[a][[x]], trong đó xcó một số từ 0 đến 1, làm cho Mathicala đưa ra lỗi "Phần :: pkspec1: Biểu thức xkhông thể được sử dụng làm thông số kỹ thuật của phần." và trả lại không b[a][[x]]đánh giá.

Điều này đã phân biệt ba trường hợp một cách thích hợp, ngoại trừ đầu ra cho trường hợp định kỳ cuối cùng là b[a][[x]], không phải là hằng số vì xlà logarit thực tế của một cái gì đó. Vì vậy, sau đó chúng tôi áp dụng [[1]]cho các đầu ra đã được mô tả. Bởi vì cách Mathicala thể hiện trong nội bộ b[a][[x]], kết quả của b[a][[x]][[1]]chỉ đơn giản là b[a]. Mặt khác, áp dụng [[1]]cho các akết quả trong một lỗi khác "Phần :: partd: Đặc tả phần một [[1]] dài hơn độ sâu của đối tượng." và trả về không a[[1]]đánh giá (và tương tự cho b).

Lỗ hổng: nói dối về đầu vào 0, trả về b[a]thay vì a[[1]].


2

C byte byte

Lấy hai số nguyên từ stdin, in 1 cho hoàn toàn định kỳ, -1 cho cuối cùng định kỳ và 0 để kết thúc.

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

Ung dung:

// 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;
}   

Nửa gôn:

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

Trên thực tế , 15 byte

Điều này dựa trên câu trả lời của Dennis 'Jelly . 0 là chấm dứt, 1 là hoàn toàn định kỳ và 2 cuối cùng là định kỳ. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

▼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

Toán học, 44 byte

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

Trả về Nullcho Chấm dứt, Truehoàn toàn theo định kỳ và Falsecuối cùng là định kỳ.

Giải trình

RealDigits

Tìm phần mở rộng thập phân của N. (các chữ số lặp lại được bao quanh bởi một đầu phụ List {}).

ListQ@Last@#

Kiểm tra xem phần tử cuối cùng của khai triển thập phân là a List.

Length@#==1

Nếu điều kiện trên là True, kiểm tra xem toàn bộ phần mở rộng thập phân có bao gồm một thứ không. (A Listđược tính là một thực thể). (trả lại Truehoặc False)

(Nếu điều kiện là False, thì a Nullđược trả về vì không có đối số thứ ba cho If)


1

Bình thường , 31 27 byte

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

Đầu vào

4,12

Bạn có thể thử nó ở đây . In 1 cho cuối cùng định kỳ, 2 cho hoàn toàn định kỳ và 0 cho chấm dứt. Đây là lần đầu tiên tôi trả lời bằng codegolf. Mọi góp ý đều được chào đón.

Giải trình

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

Lưu ý rằng [2,3] được lọc bởi [2,5] = [2] nhưng [2,3,5] - [2,5] = [3].


1

PARI / GP, 64 byte

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

Đầu ra không có gì để kết thúc, 0 cho hoàn toàn và 1 cho cuối cùng định kỳ.

Không ưa thích lắm, tôi hy vọng điều gì đó tốt hơn khi tôi bắt đầu.


1

05AB1E , 16 11 byte

Đã lưu 5 byte nhờ @Adnan!

¿²r/fTrÖbÙJ

In 0 cho Hoàn toàn định kỳ, 1 cho Chấm dứt và 10 cho Định kỳ cuối cùng.

Giải trình:

                 # 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

Đầu vào được lấy dưới dạng p dòng mới q .

Hãy thử trực tuyến!


Rất vui khi thấy bạn sử dụng 05AB1E :). Osabie cũng sử dụng đầu vào ngầm cho phép chúng tôi loại bỏ hai đầu tiên I. Hơn nữa, một hằng số được xác định trước 10T. Tương tự cho 2B, đó là b:).
Ad Nam

Bạn cũng có thể sử dụng các thanh ghi đầu vào, cung cấp cho chúng tôi ¿²r/fTrÖbÙJlàm mã cuối cùng :).
Ad Nam

1

PHP, 126 byte

$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;

In 0 cho chấm dứt và 1 cho hoàn toàn 2 định kỳ cuối cùng. Hãy để tôi giải thích nếu một tử số là hai lần trong mảng ở đây bắt đầu phiên định kỳ nếu nó bị chấm dứt echo end($a);giá trị là 0 Nếu bạn không tin tưởng tôi đặt $t=count($a)>$d?2:0;vào vòng lặp

Để làm cho nó rõ ràng hơn xin vui lòng thêm print_r($a);hoặc var_dump($a);hoặc json_encode($a);sau vòng lặp

bạn có thể thấy một tử số hai lần hoặc một số 0 ở cuối mảng nếu tử số là hai lần đếm các mục giữa hai mục và bạn có thể nhận được độ dài của định kỳ và bạn có thể thấy vị trí của tử số đầu tiên nơi bắt đầu định kỳ

Vì vậy, sau đó chúng ta có thể tìm thấy vị trí và độ dài của chuỗi tuần hoàn với if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}

Hình dung định kỳ

$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

Đầu ra trực quan hóa thuật ngữ định kỳ

1/18
   _
0.05

1/12
    _
0.083

1/13
  ______
0.076923

1/14
   ______
0.0714285

Một cách khác với 130 byte

$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;

Phiên bản mở rộng

$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 bạn có nghĩa là tôi nên sửa đổi mã để trả lời câu hỏi khác?
Jörg Hülsermann

Chà, tôi chỉ nghĩ câu hỏi kia không có câu trả lời PHP; có lẽ bạn muốn cung cấp một.
Neil

@RosLuP Ví dụ 3/53 mảng này sẽ được tạo[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
Jörg Hülsermann

3/103 = 0,0291262135922330097087378640776699029126213592233009708 và do đó trong cùng thời gian có thể xuất hiện cùng một chữ số (ví dụ: chữ số 7 trong khoảng 00 ... 00 ở trên) Nhưng nếu mảng bạn nói không phải là một chữ số mà là mảng của {d = 10 * (d% b)} trong đó chữ số là d / c hơn tôi nghĩ là ổn, chỉ có một giá trị d_i cho mỗi giai đoạn ...
RosLuP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.