Найти ответвление десятичного представления!

12

В этом вызове 2 года назад мы нашли период доли единицы ( 1/n where n is a natural number).

Теперь ваша задача - написать программу / функцию, чтобы найти повторяемую дробь единицы.

Рефрен является частью расширения десятичного повторяющим бесконечно, как:

  • Десятичное представление 1/6IS 0.16666..., то рефрен есть 6.
  • Десятичное представление 1/11есть 0.090909..., тогда репетент 09.
  • Десятичное представление 1/28есть 0.0357142857142857142857..., тогда репетент 571428.

Спекуляции

  • Ввод в любом разумном формате.
  • Выведите репетент в десятичном виде, строке или списке .
  • Для 1/7( 0.142857142857...) вы должны вывести 142857вместо 428571.
  • Для 1/13( 0.076923076923076923...) вы должны вывести 076923вместо 76923.
  • Нет грубой силы, пожалуйста.

Testcases

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

счет

Это . Самое короткое решение в байтах побеждает.

Ответ не будет принят, потому что цель состоит не в том, чтобы найти язык, способный дать самое короткое решение, а самое короткое решение для каждого языка.

Leaderboard

Дрянная Монахиня
источник
1
Как вы решаете, что репетент для 13 - это 076923, а не 769230?
Адицу ушел, потому что SE ЗЛО
@aditsu Потому 1/13что 0.076923076923...нет0.769230769230...
Leaky Nun
3
Открытое заявление о том, что вы никогда не примете ответ, делает этот каталог каталогом. Просто ничего не говори и никогда не принимай ответ.
Деннис
1
Вы можете добавить фрагмент стека, чтобы показать самое короткое решение для каждого языка.
Адицу ушел, потому что SE ЗЛО

Ответы:

5

Java, 150 байт:

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

Добавлены пробелы:

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, полная программа:

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(;;)будет меньше байтов, чем в while(2<3)то же время, будучи бесконечным циклом! (и меньше байт , чем while(1)также @Maltysen)
Марв
@Marv Как я мог забыть это? Благодарность!
Утренняя монахиня
Поместите объявления для циклов for aи rfor. Сохраняет байты!
CalculatorFeline
1
@CatsAreFluffy Это сделало бы их недоступными ...
Лаки Монахиня
3

CJam, 26

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

Попробуйте онлайн

Объяснение:

Программа строит серию дивидендов, участвующих в вычислении десятичного расширения, пока не найдет дивиденд, который она видела ранее. Затем он берет все дивиденды, начиная с этого, и делит их на n, чтобы получить цифры репетида.

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
уйти, потому что SE это зло
источник
3

Python 3.5, 79 74 73 70 байт

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

Сохраняя 3 байта, отслеживая дивиденды, идея, которую я взял из ответа CJam @ aditsu .

Проверьте это на repl.it .

Деннис
источник
2

Желе , 12 10 байт

%³×⁵
1ÇÐḶ:

Сохраняя 2 байта, отслеживая дивиденды, идея, которую я взял из ответа CJam @ aditsu .

Попробуйте онлайн!

Как это устроено

%³×⁵     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

Язык GameMaker, 152 байта

На основании ответа Кенни

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
источник
Я только что нашел ошибку в своем подходе и исправил ее, так что, возможно, вам придется обновить и ее.
Утренняя монахиня
1

Ява, 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;}

Подобно моему решению CJam.

уйти, потому что SE это зло
источник
1

Perl 6 , 37 байт

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

Если вам все равно, что он будет работать только со знаменателями, которые вписываются в 64-битное целое число, вы можете удалить вызов метода .FatRat.

Объяснение:

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

Тестовое задание:

#! /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
Брэд Гилберт b2gills
источник
0

PHP, 169 байт

$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));
Йорг Хюльсерманн
источник