负阶整数挑战,但这是黄金时间!


12

我在谈论这个问题,如果您有点困惑,请看一下。

主要任务

您的任务是按降序输出级联整数,但每次击中时都增加最大整数1 (对于此问题,1将被视为质数)。尽管这听起来与第一个问题没有什么不同,但棘手的是:所有输出的数字可能只是质数。将这些字符串串在一起,没有空格或换行符。您的输入也将是质数

例:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

输入值

您的代码只能输入一个:要打印的最高质数。此输入可以来自任何地方(图形,STDIN)。您可以确保输入的是质数。

输出量

您将必须输出结果编号。您可以通过递减计数来获得该数字,仅当其为质数时才计算该数字,然后将所有结果连接到一个数字上。最后一个数字“行”(例如7, 5, 3, 2, 1)必须完整打印。只要可读,输出就可以是任何东西(数字,字符串,图形)。适用于检查测试用例的相同Regex模式:

^(\D*(\d)+\D*|)$

如果您的输出与此模式不匹配,则您的代码无效。

规则

  • 除非您希望/需要输入,否则请确保输入是素数,不包括错误处理。
  • 输出可能只是一个全连接的数字,因此不会被任何东西分割,甚至不会换行。
  • 您的算法不应检查N出现的第一个实例(例如17in 1175321),而应检查的第一个实例N作为实际数字。
  • 确保您的输入是肯定的,除非您需要/不要添加处理。

测试用例

Input: -2, 0
Output: Any, or none (number isn't positive)

Input: 9
Output: Any, or none (number isn't prime)

Input: 1
Output: 1

Input: 7
Output: 121321532175321

Input: 23
Output: 1213215321753211175321131175321171311753211917131175321231917131175321

优胜者

这是,因此长度最小(以字节为单位)的代码作者胜出!


8
我不建议改变挑战,但从1定义上讲,我认为这不是首要的。
暴民埃里克(Erik the Outgolfer)

3
1.拥有一个测试用例1直接与规范相矛盾,该规范“ 确保 ”输入数字将是素数。2.输出规范似乎包含多个矛盾和歧义。“ 最后一个数字“行”(例如7、5、3、2、1)必须完整打印 ”-这样其他人就不用了吗?“ 适用于检查您的测试用例的同一个Regex模式 ”,但是“ 输出只能是一个全连接的数字,因此不能被任何东西分割 ”与regex矛盾。但是正则表达式显然是狡猾的,因为它允许使用空字符串,并且没有任何输入可以给出正则表达式。
彼得·泰勒,

1
1.“ 允许使用单个尾随换行符。 ”是多余的/与允许任意数量尾随字符的正则表达式模式不一致。2.引言“ 您的任务是输出整数 ”的句子具有误导性,因为您稍后要求输出单个数字。3.关于序列和输出的完整说明令人困惑-人们基本上必须通过研究示例(序列表和测试用例)来对您的意思进行逆向工程。最后一个挑战也遇到了这些问题,我在那里的建议编辑中解决了这些问题,但您拒绝了... :(
smls

5
任意设定1为质数有什么意义?
Xanderhall '16

1
负阶整数挑战,但每当它是质数时,它就会变得更快;)
SplittyDev 16/12/21

Answers:


5

果冻,9字节

ÆR1;;\UFV

在线尝试!

怎么运行的

ÆR1;;\UFV  Main link. Argument: n

ÆR         Prime range; yield all primes up to n.
  1;       Prepend the "prime" 1.
    ;\     Cumulative concatenation; yield all prefixes of the prime range.
      U    Upend; reverse each prefix.
       F   Flatten the resulting 2D array.
        V  Eval. This casts the integer array to string first, thus concatenating
           the integers.

我知道当我阅读果冻以了解问题而不是反过来时,我对高尔夫球运动的学习太深了。(实际上,这确实是一个易于阅读的Jelly程序;对我而言,唯一令人困惑的点V是列表上的怪异特殊情况。)

5

处理中,161字节

int p(int n){for(int k=1;++k<=sqrt(n);)if(n%k<1)return 0;return 1;}void t(int n){for(int i=1,j;i<=n;i++){if(p(i)<1)continue;for(j=i;j>0;j--)print(p(j)<1?"":j);}}

一个功能执行素数检查,另一个功能执行打印。打电话给t(7)

不打高尔夫球

第一个功能执行素数检查。它返回一个int而不是,boolean因为这样可以节省更多的字节。(int代替boolean0代替false1代替true

int Q103891p(int n){
  for(int k=1;++k<=sqrt(n);)
    if(n%k<1)return 0;
  return 1;
}

第二个函数打印出字符串。它遍历每个数字,如果不是素数,则跳到下一个迭代。如果是素数,它将继续进行到另一个for-loop 内的打印。同样,如果数字是素数,则我们将其打印出来,否则就不会打印。

void Q103891(int n){
  for(int i=1,j;i<=n;i++){
    if(p(i)<1)continue;
    for(j=i;j>0;j--)
      print(p(j)<1?"":j);
  }
}

5

果冻,12字节

ÆR;@1
ÇÇ€UVV

在线尝试!

如果根本没有使用1s,那么我的代码将只ÆRÆRUVV使用7个字节。

增强说明:

ÇÇ€UVV Main link. Arguments: z.
Ç      Run link1 on z.
 ǀ    Run link1 on z's elements.
   U   Reverse z's elements.
    V  Flatten z.
     V Concatenate z's elements.

ÆR;@1 Link 1. Arguments: z.
ÆR    Range of primes [2..z].
    1 Integer: 1.
  ;@  Concatenate x to y.

那个爱尔兰人(叫丹尼斯?)以某种方式超过了我,哈哈。


4

05AB1E,19个字节

LDpÏX¸ì€Lí˜ÐXQsp+ÏJ

在线尝试!

说明

L                     # range [1 ... input]
 DpÏ                  # keep only primes
    X¸ì               # prepend a 1
       €L             # map: range [1 ... n]
         í            # reverse each sublist
          ˜           # flatten list to 1D
           Ð          # triplicate
            XQ        # check elements in one copy for equality with 1
              sp      # check elements in one copy for primality
                +     # add the above lists giving a list with true values at indices
                      # comtaining 1 or a prime
                 Ï    # keep only those elements of the unmodified copy of the list
                  J   # join

对此DpÏ声明感到惊讶。干得好!
devRicher

2

Brachylog,17个字节

y:{e1|e#p}f@[rcw\

在线尝试!

似乎不会比这更短...

说明

y                      The list [0, ..., Input]
 :{      }f            Find all...
   e1                     ...elements that are 1 (there is 1)...
     |                    ...or...
      e#p                 ...elements that are prime...
           @[          Take a prefix of the result
             rc        Reverse it and concatenate it into a number
               w       Write to STDOUT
                  \    Backtrack: try another prefix

2

GameMaker语言,169字节

主要功能(68字节)

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(p(c--))}return b

功能p(46字节)

for(a=0;a<argument0;a++)while q(++b){}return b

功能q(55字节)

n=argument0 for(i=2;i<n;i++)if!(n mod i)p=1return p|n=1

好的,使用GML的人
FireCubez

@FireCubez谢谢:)我以前经常使用它。实际上,这是我学到的第一门编程语言。
Timtech,

1

MATL,15字节

Zq"1@ZqP]1v!VXz

在线尝试!

Zq      % Implicit input. Push array of primes up to that value
"       % For each prime in that array
  1     %   Push 1
  @     %   Push current prime
  Zq    %   Push array of primes up to that
  P     %   Reverse
]       % End
1       % Push 1
&h      % Concatenate all stack horizontally
V       % Convert to string
Xz      % Remove spaces. Implicit display

1

Perl 6,41个字节

{[~] flat [\R,] 1,|grep *.is-prime,2..$_}

在线尝试。

说明:

  • 1, |grep(*.is-prime, 2..$_):1和质数的序列... (1 2 3 5)
  • [,] ...:通过逗号运算符减少(“倍数”)... (1 2 3 5)
  • [\,] ...:中间结果(三角形缩小)...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...:将反向元运算符应用于逗号...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...:删除列表嵌套,并折叠字符串concat运算符... 1213215321

(这是基于我对上一个挑战的回答。)


1

Mathematica,61个字节

ToString/@(1<>Prime@Range[Range@PrimePi@#,0,-1]/.Prime@0->1)&

未命名函数,采用整数参数并返回字符串。(如果输入不是素数,则将其“四舍五入”为最接近的素数;如果输入为非正数,则将其假装为1。)

此实现使用Martin Ender回答以前类似挑战(谁说这只老狗不能学习新技巧?)的讨厌技巧:滥用<>以展平嵌套的整数列表。

有问题的嵌套列表首先从生成与该答案中类似的嵌套列表开始,并具有适当的长度(由给出PrimePi@#,直到并包括输入的素数个数);然后Prime应用于每个元素。例如,对于5第三个素数的输入,由于第一,第二和第三个素数分别为2、3和5,因此代码会Range[Range@PrimePi@#,0,-1]产生{{1,0},{2,1,0},{3,2,1,0}},并且将代码应用于Prime每个元素的产生{{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}}。我为自己在Martin Ender的方法中添加更多错误而感到骄傲,因为Mathematica每次编写时都会抱怨Prime[0]

Prime[0]没什么,但这没关系:/.Prime@0->1将它们全部变成1s。而且我们也希望1在前面,所以我们将""Martin Ender的答案替换为simple 1,实际上节省了一个字节。


0

PHP,72字节

for(;$n<$argv[1];print$s=$n.$s)for($i=2;$i>1;)for($i=++$n;--$i&&$n%$i;);

机智 -r

分解

for(;$n<$argv[1];               // loop $n up to argument:
    print$s=$n.$s)                  // 2. prepend $n to $s, print $s
    for($i=2;$i>1;)                 // 1. find next prime: break if $i<2
        for($i=++$n;--$i&&$n%$i;);      // if $n is prime, $i is 1 after loop (0 for $n=1)

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.