终止,纯周期性还是最终周期性?


21

介绍

如果小数位数有限,则终止。例如对于0.4(2/5)终止,因为它有一个十进制数字。

如果十进制具有无限数量的十进制数字并且在其有效位之前没有十进制数字(重复的小数部分),则该纯十进制是周期性的。例如,0.142857142857142…(1/7)纯粹是周期性的,因为它具有重复性142857,小数点后立即开始重复。

如果十进制具有无限数量的十进制数字并且在其有效值之前(十进制的重复部分)之前具有有限数目的十进制数字,则它最终是周期性的。例如,0.166666666666666…(1/6)最终是周期性的,因为重复6在1之后开始重复。

你的任务

编写一个程序或函数,当给定数字pq(整数,0 <= p < q <= 100)时,将确定p / q的十进制表示形式是终止,纯周期性还是最终周期性。

你必须输出a,如果它的终止(即0.1),b如果是纯粹的周期性(即0.333 ...),或者c如果它终于周期(即0.166 ...),其中abc是你选择的任何不同,常量字符串。

测试用例

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个值,但是必须清楚地知道是哪个。

请记住,这是,所以字节数最少的代码将获胜。

提示

终止:

最简单形式的终止十进制分母的素数分解仅包含2s和5s。

纯周期:

最简单形式的纯周期十进制分母的素数分解不包括任何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
如果我认为那实际上是重复的话,那我将进行近距离投票。我使用“ 几乎 ” 这个词是有原因的。
彼得·泰勒

1
给定p / q形式的分数给定怎么做?我们可以将分子和分母作为单独的函数参数吗?
丹尼斯

2
我们是否可以输出满足特定条件的非常数值,例如对于终止而言是虚假的,对于纯周期性而言为1,对于最终周期性而言为大于1的任何值?
ETHproductions 2016年

1
不,1/13纯粹是周期性的,因为重复号为'076923'。0与上一个重复。
奥利弗·尼

Answers:


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表示终止,返回true表示纯周期性,返回false表示最终周期性。

怎么运行的

我们在这里实际上是在手动模拟除法:

  1. a?...:0-如果分子为零,我们在这里停止并返回0。该序列正在终止
  2. (s[a]^=a)?...:x==a-如果我们之前已经遇到过该分子,则意味着该序列是周期性的,并且将永远重复。我们在这里停下来,要么返回true如果a等于第一个值x序列(的纯粹的周期性),或者false如果它不是(终于周期)。
  3. f(a*10%b,b,s,x||a)-否则,我们将分子乘以a10。我们用分母计算除法的余数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

它打开元组r的包装。f(1, *(2, 3), 4)等同于f(1, 2, 3, 4)
丹尼斯

因此,这将是JS中的56个字节:f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
ETHproductions'Oct11''16

我的坏字节为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'Oct11

@ETHproductions整洁。我想f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)也可以。
丹尼斯

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,如果最终是周期性的则为空


特定组中的所有数字都必须赋予相同的值。
奥利弗·尼

@OliverNi他们现在正在做
Ton Hospel '16

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

显然,我可以使用自定义输出格式来节省大量字节。
奥利弗·尼

我认为他不想要@ETHproductions,就像奥利弗(Oliver)引述的那样。
暴民埃里克(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为最终的周期性。

测试片段

说明

首先,我们将nd除以gcd(d,n),以将分数减小为最简单的形式。这使我们避免了像2/6这样的情况,否则结果将被纯周期地计算。我们还将变量t定义为gcd(d,10);这将在以后使用。

首先检查n0还是d1。如果n *(d-1)为0,则返回+fNaN:分数正在终止

下一个检查是t是否为1。如果是这样,我们返回1:该分数是纯周期性的

如果 1,我们把d,再次运行整个功能,并除以0.如果N /(d / t)的被终止,这将返回的NaN / 0 = NaN的:该级分终止。否则,它返回1/0 = Infinity:小数最终周期性的


化简为最简单的形式在哪里?
Ton Hospel '16

@TonHospel固定。
ETHproductions

@Arnauld我不确定您的意思。它返回Infinity所有这些值。
ETHproductions 2016年

@Arnauld Aw,伙计,我以为我可以不做任何调整n……感谢您指出这一点。
ETHproductions '16

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和5s ,则等于。等于1如果d在其因式分解既不2S也不5S; 如果d有2s / 5s和其他质数,则等于两者之间的某个整数。

Ordering函数仅报告三元组中最小,下一个和最大元素的位置,并从左到右断开关系。

缺陷:返回变量输出,{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还是介于两者之间。该gcd的base-d对数等于0、1,或介于两者之间。

现在我们开始折磨Mathematica。b[a][[n]]表示n表达式的第th部分b[a]。因此b[a][[1]]回报a; b[a][[0]]回报b; 和b[a][[x]],其中x是0到1之间的数字,使Mathematica引发错误“ Part :: pkspec1:该表达式x不能用作零件说明。” 并返回b[a][[x]]未评估的值。

这已经适当地区分了三种情况,除了最终周期性情况的输出是b[a][[x]],这是非恒定的,因为它x是某物的实际对数。因此,我们将其应用于[[1]]已经描述的输出。由于Mathematica在内部的表示方式b[a][[x]],结果b[a][[x]][[1]]很简单b[a]。另一方面,应用于[[1]]a导致不同的错误“ Part :: partd:零件规格a [[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);}

取消高尔夫:

// 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个字节

这是基于Dennis的Jelly答案0终止,1纯粹是周期性的,2最终是周期性的。欢迎打高尔夫球。在线尝试!

▼Ny9u♀%SR♂b╔2@¿

开球

      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,请检查整个十进制扩展数是否由一件事组成。(A List计为一个实体)。(返回TrueFalse

(如果条件为False,则Null返回a ,因为没有的第三个参数If


1

Pyth31 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

05AB1E16 11字节

@Adnan节省了5个字节!

¿²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

输入作为p换行符q

在线尝试!


很高兴看到您使用05AB1E :)。Osabie还使用隐式输入,这使我们可以删除前两个I。此外,恒定的预定义为10T。与相同2B,即b:)。
阿德南

您还可以使用输入寄存器,这将使我们¿²r/fTrÖbÙJ成为最终代码:)。
阿德南

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您的意思是我应该修改代码以回答其他问题?
约尔格Hülsermann

好吧,我只是在想另一个问题没有PHP的答案。也许您想提供一个。
尼尔

@RosLuP对于示例3/53此阵列将是创建[3,30,35,32,2,20,41,39,19,31,45,26,48,3]
约克Hülsermann

3/103 = 0.0291262135922330097087378640776699029126213592592009009等等,因此在同一时期内可以出现相同的数字(例如,上面00 ... 00之间的数字7),但是如果您说的数组不是数字之一,而是{d的数组= 10 *(d%b)}数字为d / c比我认为还可以,每个周期只有一个值d_i ...
RosLuP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.