回文残留


25

我写这篇文章的今天是3月31日。在美国,这是3/31。我正在331和一个数字玩耍以提出挑战,结果发现它的残基(模数小)是回文的。331%2=1, 331%3=1, 331%4=3, 331%5=1, 331%6=111311)。

您面临的挑战是,给定一个整数时n > 2,输出n取模余数时具有回文残差的第一个正数[2,n]

例如,对于输入7,输出应为1, 42, 43, 140, 182, 420, 421。这是解释这种情况的图表:

        mod
num | 2 3 4 5 6 7
-----------------
  1 | 1 1 1 1 1 1
 42 | 0 0 2 2 0 0
 43 | 1 1 3 3 1 1
140 | 0 2 0 0 2 0
182 | 0 2 2 2 2 0
420 | 0 0 0 0 0 0
421 | 1 1 1 1 1 1

输入项

n具有n > 2 任何方便格式的单个正整数。

输出量

如上所述的所得的第一n回文残基的阵列/列表。同样,以任何合适的格式。

规则

  • 对于n > 10,请先检查残基列表是否变平,然后再检查是否为回文。也就是说,[1, 10, 11]是回文,但[1, 10, 1]不是。
  • 完整的程序或功能都是可以接受的。如果是函数,则可以返回输出而不是打印输出。
  • 如果可能,请提供一个在线测试环境的链接,以便其他人可以尝试您的代码!
  • 禁止出现标准漏洞
  • 这是因此所有常见的高​​尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

例子

[input]
[output]

3
[1, 6, 7]

4
[1, 4, 5, 8]

5
[1, 50, 60, 61, 110]

6
[1, 30, 31, 60, 61, 90]

7
[1, 42, 43, 140, 182, 420, 421]

8
[1, 168, 169, 336, 337, 504, 505, 672]

9
[1, 2520, 2521, 5040, 5041, 7560, 7561, 10080, 10081]

10
[1, 280, 281, 560, 1611, 1890, 1891, 2170, 2171, 2241]

11
[1, 22682, 27720, 27721, 50402, 55440, 55441, 78122, 83160, 83161, 105842]

是否应该订购输出?
Arnauld

@Arnauld不一定要是,只要它仅包含第一个n元素。
AdmBorkBork,2017年

2
没错...您的挑战=您的规则,但是“ [1, 10, 11]回文,但[1, 10, 1]不是”在数学上似乎是错误的。
格雷格·马丁

1
@GregMartin弦回文,而不是数学回文。;-)
AdmBorkBork

1
grr。在某些语言中,整个严谨而不是数学回文使这变得困难一千倍。那好吧。
MildlyMilquetoast

Answers:


9

Haskell,57个字节

f n=take n[x|x<-[1..],(==)=<<reverse$show.mod x=<<[2..n]]

用法示例:f 4-> [1,4,5,8]在线尝试!

第一个=<<在函数上下文中转换为lambda \x -> reverse x == x,第二个=<<在列表上下文中并等效于concatMap,即map-andflatten-one-list-level。


5

05AB1E,12个字节

µN2¹Ÿ%JÂQD½–

在线尝试!

说明

µ              # until counter equals input do:
 N             # push current iterations number
     %         # modulus each in
  2¹Ÿ          # range [2 ... input]
      J        # joined to string
       ÂQ      # equals it's reverse
         D     # duplicate
          ½    # if true, increase counter
           –   # if true print iteration number

您是否通过手机发布了05AB1E答案?因为你做这些快速大声笑。
魔术八达通Ur

@carusocomputing:很少,因为cp-1252中的许多字符都讨厌在电话上键入/复制粘贴。这顿饭在我晚饭后检查电脑之前弹出,所以我的时机还不错:)
Emigna

4

Mathematica,79个字节

NestList[#+1//.x_/;!PalindromeQ[ToString/@Mod[x,Range@n+1]<>""]:>x+1&,1,n=#-1]&

4

JavaScript(ES6),104个字节

f=(n,x=(k=--n,2))=>k?([...Array(n)].map(_=>(r=x%++i+r,x%i),i=1,r='').join``==r?k--&&x+' ':'')+f(n,x+1):1

演示版

注意:由于存在大量递归调用,因此在Firefox上n> 8或在Chrome 上n> 10会导致崩溃。



3

MATL,19个字节

感谢@AdmBorkBork指出早期版本的代码中的一个错误,现已更正

`@Gq:Q\VXztP=?@]NG<

在线尝试!

说明

`        % Do...while
  @      %   Push iteration index, starting at 1
  Gq:Q   %   Push [2 3 ... n], where n is the input
  \      %   Modulo, element-wise
  V      %   Convert to string. Numbers are separated by spaces
  Xz     %   Remove spaces
  tP     %   Duplicate, flip
  =      %   Equal? (element-wise)
  ?      %   If all results were true
    @    %     Push current iteration index. It is one of the sought numbers
  ]      %   End
  N      %   Push number of elements in stack
  G      %   Push input n
  <      %   Less than? This is the loop condition
         % End (implicit). Display (implicit)

3

Scala,90 86 82字节

(n:Int)=>Stream.from(1)filter{i=>val d=(2 to n)map(i%)mkString;d.reverse==d}take(n)

说明

Stream.from(1)                              // From an infinite Stream starting from 1,
    filter ( i => {                         // keep only elements matching the next condition :
        val d=(2 to n)map(i%)mkString;      // Generate residues and convert to String,
        d.reverse==d                        // return true if palindrom, false otherwise
    })take(n)                               // Finally, take the n first elements matching the condition

测试用例

val f = (n:Int)=>...    // assign function
(3 to 11).foreach { i =>
    println(i + "\n" + f(i).mkString(", ") + "\n")
}

结果

3
1, 6, 7

4
1, 4, 5, 8

5
1, 50, 60, 61, 110

6
1, 30, 31, 60, 61, 90

7
1, 42, 43, 140, 182, 420, 421

8
1, 168, 169, 336, 337, 504, 505, 672

9
1, 2520, 2521, 5040, 5041, 7560, 7561, 10080, 10081

10
1, 280, 281, 560, 1611, 1890, 1891, 2170, 2171, 2241

11
1, 22682, 27720, 27721, 50402, 55440, 55441, 78122, 83160, 83161, 105842

编辑

#1(90 => 86)

  • 匿名功能

#2(86 => 82)

  • 删除括号或方括号后的无用点字符(例如:(2 to n).map(%i)=>(2 to n)map(%i)

1
欢迎来到PPCG!
Martin Ender

谢谢!我想知道是否可以更改def f(n:Int)=(n:Int)=>,因为它还定义了一个函数(但没有名称)。它节省了4个字节!
norbjd

是的,如果您不需要递归调用之类的名称,则允许使用未命名的函数
Martin Ender'4

很棒,已编辑:)
norbjd

2

果冻,12 字节

%ЀḊDFŒḂ
1ç#

怎么样?

1ç# - Main link: n
1   - initialise "i" at 1
  # - increment i and yield a list of the first n truthful results of:
 ç  -     last link (1) as a dyad

%ЀḊDFŒḂ - Link 1, test a value "i" for mod [2,n] being palindromic: i, n
 Ѐ      - for each, mapped over the right argument, i.e. for j = 1 to n:
%        -     i modulo j
   Ḋ     - dequeue, i.e. discard the modulo 1 result
    D    - convert to decimal list (vectorises)
     F   - flatten into one list
      ŒḂ - is palindromic?

在线尝试!


1

CJam,28个字节

0ri:N{{)_N),2>f%s_W%#}g_p}*;

在线尝试!

说明

0          e# Push 0, the value we'll repeatedly increment to search for valid outputs.
ri:N       e# Read input, convert to integer, store in N.
{          e# Run this block N times...
  {        e#   Run this block until the condition is true, which will find the next
           e#   number with palindromic residues...
    )_     e#     Increment and duplicate.
    N),2>  e#     Push [2 3 ... N].
    f%     e#     Take the current value modulo each of these.
    s      e#     Flatten them into a single string.
    _W%    e#     Duplicate and reverse.
    #      e#     Try to find the reverse in the original. A common way to compute
           e#     "not equal" for strings of the same length.
  }g
  _p       e#   Print a copy of the result.
}*
;          e# Discard the final result to prevent printing it twice.

1

PHP,93字节

for(;$x<$a=$argn;$s="")for($i=1,++$n;$i++<$a;)if($i==$a&strrev($s.=$n%$i)==$s)echo$n._.!++$x;

在线版本2将输出作为字符串循环

展开式

for(;$x<$a=$argn;$s="") 
for($i=1,++$n;$i++<$a;)
    if($i==$a&strrev($s.=$n%$i)==$s)echo$n._.!++$x; 

PHP 130字节

for(;count($r)<$a=$argn;$s=[])for($i=1,++$n;$i++<$a;){$s[]=$n%$i;if(count($s)==$a-1&strrev($j=join($s))==$j)$r[]=$n; }print_r($r);

在线版本2循环

展开式

for(;count($r)<$a=$argn;$s=[])
for($i=1,++$n;$i++<$a;){
    $s[]=$n%$i;
    if(count($s)==$a-1&strrev($j=join($s))==$j)$r[]=$n; 
}
print_r($r);

PHP,139字节带1个循环

for($i=$n=1;count($r)<($a=$argn)&$i++<$a;){$s[]=$n%$i;if(count($s)==$a-1){if(strrev($j=join($s))==$j)$r[]=$n;$n++;$s=[];$i=1;}}print_r($r);

在线版本1循环

与运行

echo '<string>' | php -nR '<code>'

展开式

for($i=$n=1;count($r)<($a=$argn)&$i++<$a;){
    $s[]=$n%$i;
    if(count($s)==$a-1){
        if(strrev($j=join($s))==$j)$r[]=$n;
        $n++;
        $s=[];
        $i=1;
    }
}
print_r($r);

1

QBIC,48个字节

:{A=G[2,a|A=A+!q%b$]~A=_fA||h=h+1?q]q=q+1~h=a|_X

击败Mathematica!样品运行:

Command line: 10
 1 
 280 
 281 
 560 
 1611 
 1890 
 1891 
 2170 
 2171 
 2241 

说明:

:{          Get 'a' from the command line, start an inf. loop
A=G         Clear out whatever's in A$
[2,a|       For each of the numbers we want to modulo
A=A+        Add to A$ 
     q%b       our current number MODULO te loop iterator
    !   $      cast to string
]           NEXT
~A=_fA|     If the string of remainders is a palindrome (_f ... | is Reverse())
|h=h+1      THEN h=h+1 (h starts at 0) - this counts how many hits we've had
 ?q            also, print the number with the palindromic remainder
]           END IF
q=q+1       Test the next number
~h=a|_X     If we've had 'a' hits, quit.
            The last IF and the infinite loop are closed implicitly.

1

Japt,26个字节

L³o fR{C=Uò2@R%Xì ¥CwÃj1U

在线尝试!所有输入需要花费几秒钟,所以请耐心等待。

如果有一个内置函数来获得满足某些条件的前N个数字,则这将大大缩短(并且更快):

R{C=Uò2@R%Xì ¥Cw}aU
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.