排列异常数


18

给定一个整数N作为输入,输出Nth的排列变数。

排列错误的数字是严格的正整数,因此其数字至少有一个排列会导致回文(即,一个本身相反的数字)。

例如,117是一个排列错误的数字,因为它的数字可以排列成171回文,即回文。

我们认为10,即使01 = 1是回文,类似的数字也不是排列变态数字。我们强加回文排列必须不带前导零(因此,0它本身不是变排列林)。

已经排列为回文的数字也属于排列变幻无常,因为排列无意义。

输入和输出

  • N可以是0索引或1索引。请指出您的答案使用的是哪两个。
  • 输入可以通过STDIN,作为函数参数或使用您选择的语言中的任何类似内容进行。可以将输出写入STDOUT函数,从函数返回或使用您选择的语言进行的任何类似操作。
  • 输入和输出必须以十进制为基础。

测试用例

以下测试用例是1索引的。您的程序必须最多能够在1分钟内通过此处介绍的任何测试用例。

N      Output

1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
10     11
42     181
100    404
128    511
256    994
270    1166

计分

这是,因此最短的答案以字节为单位。


一分钟之内通过最后一个测试用例是完全不可能的……
Leaky Nun

OEIS A084050(包含类似的额外情况10
Leaky Nun

最大的投入是多少?
2013年

@Adám理论上,无论程序有多大,您的程序都可以工作。
致命

1
@Adám这是一个相当随意的限制,具体取决于所使用的语言。假设从理论上讲,它应该适用于您的语言默认可以表示的最大整数(因此,如果bignums是您的语言的默认值,则为所有整数)。
致命

Answers:


8

05AB1E15 14 13字节

感谢Emigna节省了一个字节!码:

µNœvyJÂïÊP}_½

说明:

µ               # c = 0, when c is equal to the input, print N.
 N              # Push N, the iteration variable.
  œ             # Push all permutations of N.
   vyJ    }     # For each permutation...
      Â         #   Bifurcate, which is short for duplicate and reverse.
       ï        #   Convert the seconds one to int, removing leading zeros.
        Q       #   Check if they are not equal.
         P      #   Product of the stack.
           _    # Logical not.
            ½   # Pop a value, if 1 then increase c by 1.

使用CP-1252编码。在线尝试!


1
µNœvyJÂïQ}O__½14
Emigna '16

@Emigna谢谢!我没想到。
阿德南

7

Brachylog,19个字节

~l<:1at.
.=pPrPl~l?

在线尝试!

大约需要17秒N = 270

说明

  • 主要谓词:

    ~l            Create a list whose length is Input.
      <           The list is strictly increasing.
       :1a        Apply predicate 1 to each element of the list.
          t.      Output is the last element of the list.
    
  • 谓词1:

    .=            Input = Output = an integer
      pPrP        A permutation P of the Output is its own reverse
          l~l?    The length of P is equal to the length of the Input
    

5

Brachylog21 20字节

1个字节,感谢Fatalize。

您是否为Brachylog设计了挑战?

:1yt.
0<.={@epcPrP!}

在线尝试!

270大约需要半分钟。

Z = 1166
real    0m27.066s
user    0m26.983s
sys     0m0.030s

Exit code:     0

谓词0(主谓词)

:1yt.
:1y    find the first Input solutions to predicate 1
   t.  unify the output with the last element

谓词1(辅助谓词)

0<.={@epcPrP!}
0<.              0 < Output
  .=             Assign a value to Output (choice point)
    {        }   Inline predicate:
     @e              Digits of the Output
       p             A permutation (choice point)
        c            Concatenate (fails if leading zero present)
         P           store as P
          rP         assert that P reversed is still P
            !        remove the choice point in this predicate, so
                     that it will not return twice for the same number.

5

珀斯,14岁

e.ff&_ITshT.p`

在这里尝试或运行测试套件

扩张:

e.ff&_ITshT.p`ZQ   # Auto-fill variables
 .f            Q   # Find the first input number of numbers that give truthy on ...
           .p`Z    # Take all the permutations of the current number
   f&              # Keep those that give a truthy value for both:
     _IT           # Invariance on reversing (is a palindrome)
        shT        # The integer value of the first digit (doesn't start with zero)
                   # A list with any values in it it truthy, so if any permutation matches
                   # these conditions, the number was a permutapalindrome
e                  # Take only the last number

5

JavaScript(ES6),99个字节

f=(n,i=1)=>(n-=/^.0+$/.test(i)</^((.),\2,)*(.)(,\3)?(,(.),\6)*$/.test([...i+''].sort()))?f(n,i+1):i

说明:

f=(n,i=1)=>             look for n numbers starting at 1
 (n-=                   test whether current guess is
  /^.0+$/.test(i)<      not a round number and
  /^((.),\2,)*          pairs of comma-separated digits
   (.)(,\3)?            possible single digit
   (,(.),\6)*$/         pairs of comma-separated digits
   .test(               matches the comma-joined
    [...i+''].sort()))  digits in ascending order
 ?f(n,i+1)              if not n numbers found try next number
 :i                     found it!

1100是一个轮回排列变数。
2013年

@Adám不是圆的,它至少包含两个非零数字。
尼尔

@Neil:+2个字节- f=稍后引用它时,您真的应该算作
charlie

@charlie抱歉,我总是忘记这样做。
尼尔,2016年

4

R,145字节

g=function(n){d=b=0 
while(d<n){b=b+1
if(sum(a<-table(strsplit(n<-as.character(b),""))%%2)==nchar(n)%%2&(!names(a)[1]==0|a[1]|sum(!a)>1))d=d+1}
b}

不打高尔夫球

f=function(b){
    a<-table(strsplit(n<-as.character(b),""))%%2
    sum(a)==nchar(n)%%2&(!names(a)[1]==0|a[1]|sum(!a)>1)
}
g=function(n){
    d=b=0
    while(d<n){
         b=b+a
         if(f(b)) d=d+1
    }
    b
}

从本质上讲-一个检查permutapalindromic集的成员资格的函数,而while循环递增直到找到第n个成员。


3

Python 2.7版,163个 154字节:

from itertools import*;I,F,Q=input(),[],2
while len(F)<I:F=[g for g in range(1,Q)if any(i==i[::-1]*(i[0]>'0')for i in permutations(`g`))];Q+=1
print F[-1]

很简单。基本上是使用while循环来重复创建包含排列变数的数字的数组,该数组的范围[1,Q)一直到Q足够大,以使该数组包含Input多个项目。然后,它输出该数组中的最后一个元素。

在线尝试!(爱迪生)


2

Perl 6,66个字节

{(1..*).grep(*.comb.permutations.grep({+.join.flip eq.join}))[$_]}

从0开始

说明:

# bare block lambda which takes an implicit parameter 「$_」
{
  # all numbers greater than 0
  (1..*)\

  # remove any which aren't permutapalindromic
  .grep(

    # 「*」 here starts a Whatever lambda
    *\
    # split into list of digits
    .comb\
    # get all of the permutations of the digits
    .permutations\
    # find out if there are any palindromes
    .grep(

      # another bare block lambda taking 「$_」 as implicit parameter
      {
        # compare the current permutation with its reverse stringwise
        # numify only one side to get rid of leading 「0」
        +$_.join.flip eq $_.join
      }
    )

  # get the value at the index
  )[$_]
}

测试:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &permutapalindromic = {(1..*).grep(*.comb.permutations.grep({+.join.flip eq.join}))[$_]}

my @tests = (
  1   => 1,
  2   => 2,
  3   => 3,
  4   => 4,
  5   => 5,
  6   => 6,
  7   => 7,
  8   => 8,
  9   => 9,
  10  => 11,
  42  => 181,
  100 => 404,
  128 => 511,
  256 => 994,
  270 => 1166,
);

plan +@tests + 1;

my $start-time = now;
for @tests -> $_ ( :key($input), :value($expected) ) {
  # zero based instead of one based, so subtract 1
  is-deeply permutapalindromic( $input - 1 ), $expected, .gist;
}
my $finish-time = now;

my $total-time = $finish-time - $start-time;

cmp-ok $total-time, &[<], 60, 'Less than 60 seconds for the tests';
diag "$total-time seconds";

2

Dyalog APL,51 字节

一索引。

{⍵⊃{⍵/⍨{(⍵≤9)∨(1<≢c~'0')∧1≥+/2|+⌿c∘.=∪c←⍕⍵}¨⍵}⍳5×⍵}

{ 一个where代表参数的函数

⍵⊃{ 使用参数从函数的结果中选择

⍵/⍨{ 使用函数的结果过滤参数

(⍵≤9)∨ 参数小于或等于9,或

(1<≢c~'0')∧ 删除零后,剩余的位数仍超过一位,并且

1≥+/ 0或1是以下各项的总和

2| 的奇怪之处

+⌿ 的列总和中

c∘.=∪c的比较表Ç和独特元素Ç,其中ç ...

←⍕⍵ 是参数的字符串表示形式

}¨⍵ 适用于每个参数

}⍳5×⍵ 应用于{1,2,3,...,5倍自变量}

} [功能结束]

立即在TryAPL上完成所有测试用例


你能证明a(n) <= 5n吗?
Leaky Nun

第二种解决方案产生不正确的结果。
Leaky Nun

第一种解决方案还会产生不正确的结果。
Leaky Nun

@LeakyNun哪个不正确?如果5×是不够的,有空间9×...
亚当

@LeakyNun对,我包括100个等,这是不允许的。
2013年

2

JavaScript(ES6),92

n=>eval("for(a=0;n-=(a++<9||(b=[...a+``].sort().join``)>9&!b.replace(/(.)\\1/g,``)[1]););a")

少打高尔夫球

n=>{
  for( a = 0;
       n -= // decrement n (and exit when 0) if the check below is true == a is permutapalindromic
            (a ++ < 9 // single digit (meanwhile, increment a)
             || // or...
             ( b=[...a+``].sort().join`` )// build a string with the digits sorted
               > 9 // required at least 2 non zero digits
             & ! b.replace(/(.)\1/g,``)[1] // removed all digits pair, there must be just 1 or no single digits remaining
            );
     );
   return a;
}

测试

f=n=>eval("for(a=0;n-=(a++<9||(b=[...a+``].sort().join``)>9&!b.replace(/(.)\\1/g,``)[1]););a")

function update() {
  O.textContent=f(+I.value)
}

update()
<input id=I oninput=update() type=number value=100>
<pre id=O></pre>


1

Javascript(使用外部库-可枚举)(142字节)

   n=>_.Sequence(n,i=>{l=i+"";p=_.Permutations(_.From(l),l.length).Any(y=>y.First()!="0"&&y.SequenceEqual(y.Reverse()));if(p){return i;}}).Last()

链接到lib:https : //github.com/mvegh1/Enumerable/

代码说明:_.Sequence基于签名谓词(“ i ”终止,“累积数组”)为“ n”个元素的数量创建一个可枚举。将当前迭代转换为字符串,并从中创建所有排列的枚举。测试是否有任何排列满足不以“ 0”开头的排列,并且排列的反向等于排列。返回序列中的最后一个元素,因为这是根据OP的期望输出

在此处输入图片说明


1

Python 2,93字节

S=sorted
f=lambda n,i=1:n and-~f(n-(S(`i`)in[S(`k`)for k in range(9*i)if`k`==`k`[::-1]]),i+1)

1个索引。根据您的系统,最后一个测试用例可能会超出允许的递归深度。

不计算排列。取而代之的是,如果两个字符串在排序时相等,则它们是排列的事实。要测试数字是否为排列变态数,请检查其排序的数字是否等于任何回文直至界限的排序数字。


96个字节:

f=lambda n,i=1:n and-~f(n-(sum(`i`.count(`d`)%2for d in range(10))<2*(set(`i`[1:])!={'0'})),i+1)

1个索引。根据您的系统,最后一个测试用例可能会超出允许的递归深度。

它不考虑排列,而是使用以下特征:

一个数字是permutapalindromic什么时候

  • 最多一位数字出现奇数次,并且
  • 它的形式不为带有一个或多个零的d00 ... 00。

这是正确的,因为回文必须将开头和结尾的数字配对,但可能的中心数字除外。例外是由于要求前导数字必须为非零,因此,除非数字为一位,否则某些非零数字必须出现两次。


1

Haskell,89 87字节

import Data.List
(filter(any(show.floor.read.reverse>>=(==)).permutations.show)[0..]!!)

0

C,254字节

#define W while
#define R return
f(j){int c=0,a[16]={0};do++a[j%10],++c;W(j/=10);if(c>1&&a[0]>=c-1)R 0;c%=2;W(j<10)if(a[j++]%2&&(!c||++c>2))R 0;R 1;}g(n){int k=0,i=1;W(k<n)if(f(i++))++k;R i-1;}main(a){printf("N>");scanf("%d",&a);printf("%d\n",g(a));}
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.