疯狂的图书馆员有趣的素置换索引号生成器


13

您用主序列码保存了这一天,而数学老师则喜欢它。如此之多,以至于对馆员(a / k / a,您的老板)提出了新的挑战。恭喜,您可以对解决方案进行编码,以便管理员可以再次打动数学老师。

从以10为底的N的自然数序列开始

0、1、2、3、4、5、6 ...

排除01,此序列中的每个数字均为素数,P

2、3、5、7、11、13 ...

或复合,C

4、6、8、9、10、12、14、15、16、18、20 ...

反映如何图书馆管理员思想插入的整数位数成从一个数的小数膨胀P,数学老师代替创建的函数G(X,Y) ,需要一个数xÑ1 <= x <= 9和一个数yÇ并插入xy每个位置的小数点扩展,按从左到右的顺序,仅选择唯一的数字。

例如,G(3,14)314, 134, 143。但是,G(1,14)是唯一的114, 141,因为不管你前面加上或插入114,相同的编号114被生成。

数学老师想知道,如果您按递增顺序进行运算,那么在获得P之前,必须进行多少次排列x。数学老师将此称为数字的复合素索引,并将其写为CPI(y)

例如,4只需执行两次:14, 41,因为41是质数,所以CPI(4)2。但是,在作为素数达到之前,8需要完成6次,因此CPI(8)为。18, 81, 28, 82, 38, 83836

给定输入数字,您的任务是编写将输出此Composite-Prime索引的代码。

输入值

  • 一个整数y,使得yÇ,通过函数的参数,STDIN或等效输入。
  • 为了进行计算,您可以假设y将适合通常的整数范围(例如,假设2 31 -1为上限)。
  • y不在C中的行为是不确定的。

输出量

将所得复合总理指数,如上所述计算,输出到STDOUT或等效,但有两个例外:

  • 如果最后一个排列(即附加9y)是导致质数的排列,则输出-1。下面扩展了一个示例y=14
  • 如果没有置换(即G(x,y)是所有C的子集1 <= x <= 9),则输出0。下面扩展了一个示例y=20

例子

 y -> operations             : output
 4 -> 14, 41                 : 2
 6 -> 16, 61                 : 2
 8 -> 18, 81, 28, 82, 38, 83 : 6
 9 -> 19                     : 1
10 -> 110, 101               : 2
12 -> 112, 121, 212, 122, 312, 132, 123, 412, 142, 124, 512, 152, 125, 612, 162, 126, 712, 172, 127 : 19
14 -> 114, 141, 214, 124, 142, 314, 134, 143, 414, 144, 514, 154, 145, 614, 164, 146, 714, 174, 147, 814, 184, 148, 914, 194, 149 : -1
15 -> 115, 151               : 2
16 -> 116, 161, 216, 126, 162, 316, 136, 163 : 8
18 -> 118, 181               : 2
20 -> 120, 210, 201, 220, 202, 320, 230, 203, 420, 240, 204, 520, 250, 205, 620, 260, 206, 720, 270, 207, 820, 280, 208, 920, 290, 209 : 0

限制条件

  • 这是代码高尔夫,因为您需要将其转录为索引卡,以便图书馆员可以向数学老师展示,并且您的手容易抽筋。
  • 适用标准漏洞限制。图书管理员不容忍作弊者。

排行榜


因为9 19是质数,所以输出不应该是1吗?
isaacg 2015年

哇,很酷的答案图!
级联样式

1
@ cascading-style如果您指的是排行榜,那主要是马丁的作品
AdmBorkBork

Answers:



2

Haskell,166161字节

p n=mod(product[1..n-1]^2)n>0
q=p.read
n#c=[h++c:t|i<-[0..length n],(h,t)<-[splitAt i n]]
[y]%i|q y= -1|1<2=0
(y:z)%i|q y=i|1<2=z%(i+1)
f n=((n#)=<<['1'..'9'])%1 

用法示例:f "8"-> 6f "14"-> -1f "20"-> 0

工作原理:p是素数测试(在另一个挑战中从@Mauris的答案中窃取)。q用于p将类型从字符串转换为整数的包装器。n # c插入c中的每个位置n%接受一个数字列表和一个索引i。当列表的第一个元素为质数时,返回i,否则返回列表末尾的i+1。当剩下一个元素时停止,然后返回-1素数,0否则返回。


1

Minkolang 0.11,85字节

n1(l*$d`)d9[i3G(0c2c$%$r2c*l*2c3c1+*++2gl:d2G)2gx1c2G3gx]r3XS(2M4&I)N.ikI1-4&1~N.1+N.

在这里尝试。

说明(即将推出)

n            Take integer from input (say, n)
1(           Calculate smallest power of 10 greater than n (say, a)
  l*         Multiply by 10
    $d`      Duplicate stack and push n>a
       )     Close while loop (ends when n<=a)
        d    Duplicates a (let's call it b)

9[                                                 For loop that runs 9 times 
  i1+                                              Loop counter + 1 (say, i)
     3G                                            Puts the loop counter in position 3
       (                                           Opens while loop
        0c2c$%                                     Copies n and b and pushes n//b, n%b
              $r                                   Swaps top two elements of stack
                2c*l*                              Copies b and multiplies by 10
                     2c3c*                         Copies b and i and multiplies them
                          ++                       Adds it all together (inserts i)
                            2gl:                   Gets b and divides by 10
                                d2G                Duplicates and puts one copy back
                                   )               Closes while loop (breaks when b=0)
                                    2gx            Gets and dumps b
                                       1c2G        Copies a and puts it in b's place
                                           3gx     Get and dumps i
                                              ]    Close for loop

r       Reverses stack
 3X     Dumps the top three elements (namely, n, a, and b)
   S    Removes duplicates

(                           Opens while loop
 2M                         Pushes 1 if top of stack is prime, 0 otherwise
   4&                       Jump four spaces if prime
     I)N.                   If the loop actually finishes, then all were composite,
                             so output 0 and stop.
         ik                 Pushes loop counter and breaks
           I1-              Pushes length of stack minus 1 (0 if last one was prime)
              4&1~N.        If this is 0, pushes -1, outputs as integer, and stops.
                    1+N.    Adds 1, outputs as integer, and stops.

1

Javascript,324个字节

y=>(p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,u=a=>a.filter((c,i)=>a.indexOf(c)==i),g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),console.log(p(y,2)||y<2?'':i==h(1,y).length?-1:i))

如果y不在C中,则STDOUT输出为空。

说明

y=>(
    //Prime Test function
    p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,

    //Unique function
    u=a=>a.filter((c,i)=>a.indexOf(c)==i),

    //Generates numbers from a couple x and y
    g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),

    //Generates all possible numbers from y using recusion
    h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),

    //Check if any prime in the generated numbers
    i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),

    console.log(
        //Is Y in C ?
        p(y,2)||y<2?
            ''
            :
            // Check if the answer is not the last one
            i==h(1,y).length?-1:i)
    )

评论此评论可能为时已晚,但是您不能通过替换n%c!=0为来节省一些字节吗n%cc>=n-1c>n-2; 并x==9x-9
扎卡里
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.