Znajdź powtórzenie reprezentacji dziesiętnej!

12

W tym wyzwaniu 2 lata temu znaleźliśmy okres ułamka jednostkowego ( 1/n where n is a natural number).

Teraz Twoim zadaniem jest napisanie programu / funkcji, aby znaleźć powtórzenie ułamka jednostkowego.

Repetend jest częścią ekspansji dziesiętną, która powtarza się w nieskończoność, takich jak:

  • Dziesiętna reprezentacja 1/6to 0.16666..., a następnie powtórzenie jest 6.
  • Dziesiętna reprezentacja 1/11to 0.090909..., a następnie powtórzenie jest 09.
  • Dziesiętna reprezentacja 1/28to 0.0357142857142857142857..., a następnie powtórzenie jest 571428.

Okular

  • Wprowadź w dowolnym rozsądnym formacie.
  • Wypisuje powtórzenie w postaci dziesiętnej, ciągu lub listy .
  • W przypadku 1/7( 0.142857142857...) musisz wyprowadzać dane 142857zamiast 428571.
  • W przypadku 1/13( 0.076923076923076923...) musisz wyprowadzać dane 076923zamiast 76923.
  • Proszę nie brutalnej siły.

Przypadki testowe

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

Punktacja

To jest . Najkrótsze rozwiązanie w bajtach wygrywa.

Odpowiedź nie zostanie zaakceptowana, ponieważ celem nie jest znalezienie języka zdolnego do wytworzenia najkrótszego rozwiązania, ale najkrótsze rozwiązanie w każdym języku.

Tabela liderów

Leaky Nun
źródło
Daj nam kontynuować tę dyskusję w czacie .
Rɪᴋᴇʀ
1
Jak zdecydujesz, że powtórzenie dla 13 to 076923, a nie 769230?
Aditsu zakończyło się, ponieważ SE to EVIL
@aditsu Ponieważ nie 1/13jest0.076923076923...0.769230769230...
Leaky Nun
3
Otwarte stwierdzenie, że nigdy nie zaakceptujesz odpowiedzi, czyni z tego katalogu. Po prostu nic nie mów i nigdy nie przyjmuj odpowiedzi.
Dennis
1
Możesz dodać fragment stosu, aby pokazać najkrótsze rozwiązanie dla każdego języka.
Aditsu zostało zakończone, ponieważ SE ma wartość EVIL

Odpowiedzi:

5

Java, 150 bajtów:

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

Dodano białe znaki:

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

Niegolfowany, pełny program:

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));
    }
}
Leaky Nun
źródło
for(;;)byłoby mniej bajtów niż while(2<3)będąc jednocześnie nieskończoną pętlą! (i mniej bajtów niż while(1)również @Maltysen)
Marv
@Marv Jak mogłem to zapomnieć? Dzięki!
Leaky Nun
Umieść deklaracje dla ai rw pętli for. Oszczędza bajty!
CalculatorFeline
1
@CatsAreFluffy To uczyniłoby ich niedostępnymi ...
Leaky Nun
3

CJam, 26

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

Wypróbuj online

Wyjaśnienie:

Program buduje szereg dywidend zaangażowanych w obliczanie rozwinięcia dziesiętnego, dopóki nie znajdzie dywidendy, którą widział wcześniej. Następnie bierze wszystkie dywidendy, zaczynając od tego, i dzieli je przez n, aby uzyskać cyfry powtórzenia.

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
aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
3

Python 3.5, 79 74 73 70 bajtów

f=lambda n,t=1,q=[],*d:q[(*d,t).index(t):]or f(n,t%n*10,q+[t//n],*d,t)

Zaoszczędziłem 3 bajty, śledząc dywidendy, pomysł, który wziąłem z odpowiedzi CJam @ aditsu .

Przetestować go na repl.it .

Dennis
źródło
2

Galaretka , 12 10 bajtów

%³×⁵
1ÇÐḶ:

Zaoszczędziłem 2 bajty, śledząc dywidendy, pomysł, który wziąłem z odpowiedzi CJam @ aditsu .

Wypróbuj online!

Jak to działa

%³×⁵     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.
Dennis
źródło
1

GameMaker Language, 152 bajty

Na podstawie odpowiedzi Kenny'ego

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}
Timtech
źródło
Właśnie znalazłem błąd w moim podejściu i naprawiłem go, więc być może trzeba by to również zaktualizować.
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;}

Podobne do mojego rozwiązania CJam.

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
1

Perl 6 , 37 bajtów

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

Jeśli nie obchodzi Cię, że będzie działać tylko z mianownikami pasującymi do 64-bitowej liczby całkowitej, możesz usunąć wywołanie metody do .FatRat.

Wyjaśnienie:

# 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]

Test:

#! /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
Brad Gilbert b2gills
źródło
0

PHP, 169 bajtów

$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));
Jörg Hülsermann
źródło