Tìm sự lặp lại của biểu diễn thập phân!


12

Trong thử thách này 2 năm trước, chúng tôi đã tìm thấy khoảng thời gian của một phần đơn vị ( 1/n where n is a natural number).

Bây giờ, nhiệm vụ của bạn là viết một chương trình / hàm để tìm sự lặp lại của một phần đơn vị.

Phần lặp lại là một phần của phần mở rộng thập phân lặp lại vô hạn, như:

  • Biểu diễn thập phân của 1/60.16666..., sau đó lặp lại6.
  • Biểu diễn thập phân của 1/110.090909..., sau đó lặp lại là 09.
  • Biểu diễn thập phân của 1/280.0357142857142857142857..., sau đó lặp lại là 571428.

Thông số kỹ thuật

  • Đầu vào trong bất kỳ định dạng hợp lý.
  • Xuất ra sự lặp lại trong thập phân, chuỗi hoặc danh sách .
  • Đối với 1/7( 0.142857142857...), bạn phải xuất ra 142857thay vì 428571.
  • Đối với 1/13( 0.076923076923076923...), bạn phải xuất ra 076923thay vì 76923.
  • Không có lực lượng vũ phu, xin vui lòng.

Tủ thử

Input    Output
1        0
2        0
3        3
7        142857
13       076923
17       0588235294117647
28       571428
70       142857
98       102040816326530612244897959183673469387755
9899     000101020305081321345590463683200323264976260228305889483786241034447924032730578846348115971310233356904737852308313971108192746742095161127386604707546216789574704515607637135064147893726639054449944438832205273259925244974239822204263056874431760783917567431053641781998181634508536215779371653702394181230427315890493989291847661379937367410849580765733912516415799575714718658450348520052530558642287099707041115264168097787655318719062531568845337912920497019901

Chấm điểm

Đây là . Giải pháp ngắn nhất trong byte thắng.

Không có câu trả lời nào được chấp nhận, vì mục tiêu không phải là tìm ngôn ngữ có khả năng tạo ra giải pháp ngắn nhất, mà là giải pháp ngắn nhất trong mỗi ngôn ngữ.

Bảng xếp hạng



1
Làm thế nào để bạn quyết định rằng số lần lặp lại cho 13 là 076923 chứ không phải 769230?
aditsu nghỉ việc vì SE là EVIL

@aditsu Vì 1/130.076923076923...không0.769230769230...
Leaky Nun

3
Công khai rằng bạn sẽ không bao giờ chấp nhận một câu trả lời khá nhiều làm cho đây là một danh mục. Chỉ cần không nói bất cứ điều gì và không bao giờ chấp nhận một câu trả lời.
Dennis

1
Bạn có thể thêm một đoạn ngăn xếp để hiển thị giải pháp ngắn nhất cho mỗi ngôn ngữ.
aditsu nghỉ việc vì SE là EVIL

Câu trả lời:


5

Java, 150 byte:

String p(int n){int a=1,p;String r="";for(;n%10<1;n/=10);for(;n%2<1;n/=2)a*=5;for(;n%5<1;n/=5)a*=2;for(p=a%=n;;){p*=10;r+=p/n;if(a==(p%=n))return r;}}

Đã thêm khoảng trắng:

String p(int n){
    int a=1,p;
    String r="";
    for(;n%10<1;n/=10);
    for(;n%2<1;n/=2)
        a*=5;
    for(;n%5<1;n/=5)
        a*=2;
    for(p=a%=n;;){
        p*=10;
        r+=p/n;
        if(a==(p%=n))
            return r;
    }
}

Ungolfed, chương trình đầy đủ:

import java.util.Scanner;

public class A036275 {
    public static String period(int a,int n){
        if(n%10==0) return period(a,n/10);
        if(n%2==0) return period(a*5,n/2);
        if(n%5==0) return period(a*2,n/5);
        a %= n;
        int pow = a;
        String period = "";
        while(true){
            pow *= 10;
            period += pow/n;
            pow %= n;
            if(pow == a){
                return period;
            }
        }
    }
    public static String period(int n){
        return period(1,n);
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        System.out.println(period(n));
    }
}

for(;;)sẽ ít byte hơn while(2<3)mặc dù cũng là một vòng lặp vô hạn! (và ít byte hơn while(1)cả @Maltysen)
Marv

@Marv Làm sao tôi có thể quên điều đó? Cảm ơn!
Leaky Nun

Đặt các khai báo cho artrong các vòng lặp cho. Tiết kiệm byte!
Máy

1
@CatsAreFluffy Nó sẽ khiến họ không thể truy cập ...
Leaky Nun

3

CJam, 26

riL{_XW$%A*:X|X@-}g_X#>\f/

Dùng thử trực tuyến

Giải trình:

Chương trình xây dựng một loạt các khoản cổ tức liên quan đến việc tính toán mở rộng thập phân, cho đến khi tìm thấy cổ tức mà nó đã thấy trước đó. Sau đó, tất cả các khoản cổ tức bắt đầu bằng số đó và chia chúng cho n để có được các chữ số của sự lặp lại.

ri       read the input and convert to integer (n)
L        push an empty array (will add the dividends to it)
{…}g     do … while
  _      copy the current array of dividends
  X      push the latest dividend (initially 1 by default)
  W$     copy n from the bottom of the stack
  %A*    calculate X mod n and multiply by 10
  :X     store in X (this is the next dividend)
  |      perform set union with the array of dividends
  X@     push X and bring the old array to the top
  -      set difference; it is empty iff the old array already contained X
          this becomes the do-while loop condition
_X#      duplicate the array of dividends and find the position of X
>        take all dividends from that position
\f/      swap the array with n and divide all dividends by n


2

Thạch , 12 10 byte

%³×⁵
1ÇÐḶ:

Đã lưu 2 byte bằng cách theo dõi cổ tức, một ý tưởng tôi lấy từ câu trả lời CJam của @ aditsu .

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

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

%³×⁵     Helper link. Argument: d (dividend)

%³       Yield the remainder of the division of d by n.
  ×⁵     Multiply by 10.


1ÇÐḶ:    Main link. Argument: n

1        Yield 1 (initial dividend).
 ÇÐḶ     Apply the helper link until its results are no longer unique.
         Yield the loop, i.e., everything from the first repeated result
         up to and including the last unique one.
    :    Divide each dividend by n.

1

Ngôn ngữ GameMaker, 152 byte

Dựa trên câu trả lời của Kenny

n=argument0;a=1r=0while(n mod 2<1){a*=5n/=2}while(n mod 5<1){a*=2n/=5}a=a mod n;p=a;while(1){p*=10r=r*10+p/n;r=r mod $5f5e107;p=p mod n;if(a=p)return r}

Tôi chỉ tìm thấy một lỗi trong cách tiếp cận của mình và sửa nó, vì vậy có lẽ bạn cũng cần phải cập nhật nó.
Leaky Nun

1

Java, 122

String f(int n){String r="";int x=1,a[]=new
int[n*10];while(a[x]++<1)x=x%n*10;do{r+=x/n;x=x%n*10;}while(a[x]<2);return r;}

Tương tự như giải pháp CJam của tôi.


1

Perl 6 , 37 byte

{(1.FatRat/$_).base-repeating[1]||~0}
~0 max (1.FatRat/*).base-repeating[1]

Nếu bạn không quan tâm rằng nó sẽ chỉ hoạt động với mẫu số phù hợp với số nguyên 64 bit, bạn có thể xóa cuộc gọi phương thức .FatRat.

Giải trình:

# return 「"0"」 if 「.base-repeating」 would return 「""」
~0

# 「&infix<max>」 returns the numerically largest value
# or it's first value if they are numerically equal
max

(
  # turn 1 into a FatRat so it will work
  # with denominators of arbitrary size
  1.FatRat

  # divided by
  /

  # the input
  *

# get the second value from calling the
# method 「.base-repeating」
).base-repeating[1]

Kiểm tra:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &code = ~0 max (1.FatRat/*).base-repeating[1];
# stupid highlighter */
# Perl has never had // or /* */ comments

my @tests = (
  1    => '0',
  2    => '0',
  3    => '3',
  6    => '6',
  7    => '142857',
  11   => '09',
  13   => '076923',
  17   => '0588235294117647',
  28   => '571428',
  70   => '142857',
  98   => '102040816326530612244897959183673469387755',
  9899 => '000101020305081321345590463683200323264976260228305889483786241034447924032730578846348115971310233356904737852308313971108192746742095161127386604707546216789574704515607637135064147893726639054449944438832205273259925244974239822204263056874431760783917567431053641781998181634508536215779371653702394181230427315890493989291847661379937367410849580765733912516415799575714718658450348520052530558642287099707041115264168097787655318719062531568845337912920497019901',
);

plan +@tests;

for @tests -> $_ ( :key($input), :value($expected) ) {
  is code($input), $expected, "1/$input";
}
1..12
ok 1 - 1/1
ok 2 - 1/2
ok 3 - 1/3
ok 4 - 1/6
ok 5 - 1/7
ok 6 - 1/11
ok 7 - 1/13
ok 8 - 1/17
ok 9 - 1/28
ok 10 - 1/70
ok 11 - 1/98
ok 12 - 1/9899


0

PHP, 169 byte

$d=$argv[2];$a[]=$n=$argv[1];while($n%$d&&!$t){$n*=10;$r[]=$n/$d^0;$t=in_array($n%=$d,$a);$a[]=$n;}if($t)echo join(array_slice($r,array_search(end($a),$a),count($a)-1));
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.