Permutapalindromic数


18

N入力として整数が与えられた場合、Nth番目のpermutapalindromic数を出力します。

permutapalindromic番号は、パリンドローム(つまり、それ自体が逆の番号)をもたらす数字の置換が少なくとも1つあるような、厳密に正の整数です。

たとえば、117は、その数字が171回文であるに置換できるため、置換順配列数です。

このような10数字01 = 1は、回文ですが、permutapalindromicの数字ではないと考えています。パリンドローム順列の先頭にゼロを付けてはなりません(そのように、0それ自体はパーミュタパリンドロームではありません)。

すでにパリンドロームである数も、順列パリンドロームです。何も置換しないことが有効であるためです。

入力と出力

  • N0インデックスまたは1インデックスのいずれかです。回答でどちらを使用するかを指定してください。
  • 入力はSTDIN、を介して、関数の引数として、または選択した言語に類似したものとして取得できます。出力は、に書き込むことができSTDOUT、関数から返されるか、選択した言語に似たものであれば何でも返します。
  • 入力と出力は10進数でなければなりません。

テストケース

次のテストケースは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

得点

これはであるため、バイト単位の最短回答が優先されます。


それはすることは非常に不可能だない ... 1分で最後のテストケースを渡す
漏れ修道女

OEIS A084050(のような追加のケースを含む10
リーキー修道女

最大の入力は何ですか?
アダム

@Adámあなたのプログラムは、どんなに大きくても理論的にはどんな数でも動作するはずです。
致命的な

1
@Adámこれは、使用される言語に依存するかなり任意の制限です。あなたの言語がデフォルトで表現できる最大の整数に対して理論的に機能するはずだとしましょう(したがって、bignumsがあなたの言語のデフォルトである場合、すべての整数)。
16

回答:


8

05AB1E15 14 13バイト

エミグナのおかげでバイトを節約できました!コード:

µ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ありがとう!私はそれを考えていませんでした。
アドナン

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バイト

Fatalizeのおかげで1バイト。

Brachylogの課題を設計しましたか?

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

オンラインでお試しください!

ここでは270に約30分かかります。

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

Pyth、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は、ラウンド順列パリンドローム数です。
アダム

@Adám丸めではなく、少なくとも2つのゼロ以外の数字が含まれています。
ニール

@Neil:+2バイト- f=後でそれを参照するときにカウントする必要があります
チャーリー

@charlie申し訳ありませんが、私はいつもそれをするのを忘れています。
ニール

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セットのメンバーシップをチェックする関数、およびn番目のメンバーが見つかるまで増分するwhileループ。


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、繰り返し範囲をpermutapalindromic番号を含む配列を作成するためにループ[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×⍵}

{ ⍵が引数を表す関数

⍵⊃{ 引数を使用して、関数の結果から選択します

⍵/⍨{ 関数の結果で引数をフィルタリングする

(⍵≤9)∨ 引数が9以下、または

(1<≢c~'0')∧ ゼロを削除しても複数の数字が残るAND

1≥+/ 0または1は、

2| の奇妙さ

+⌿ の列合計の

c∘.=∪c比較表Cとのユニークな要素CC ...

←⍕⍵ 引数の文字列表現です

}¨⍵ 各引数に適用されます

}⍳5×⍵ {1、2、3、...、引数の5倍}に適用されます

} [機能の終了]

TryAPLですべてのテストケースを即座に終了します


それを証明できますa(n) <= 5nか?
リーキー修道女

2番目のソリューションでは、誤った結果が生成されます。
リーキー修道女

最初の解決策も誤った結果を生成します。
リーキー修道女

@LeakyNun間違っているのはどれですか?そして、5もし×...×9のためにそこのスペース、十分ではありません
アダム

@LeakyNunそう、許可されていない100などを含めます。
アダム

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」teration 、「a」累積配列)に基づいて、「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インデックス。システムによっては、最後のテストケースが許容される再帰の深さを超える場合があります。

順列を計算しません。代わりに、2つの文字列が並べ替えられたときに等しい場合、それらは順列であるという事実を使用します。数値が順変異型であるかどうかをテストするには、並べ替えられた数字が回文までの回文の並べ替えられた数字と等しいかどうかをチェックします。


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インデックス。システムによっては、最後のテストケースが許容される再帰の深さを超える場合があります。

これは順列を考慮せず、代わりに次の特性評価を使用します。

数は、正確に次の場合に順変異型です。

  • 最大でその数字の1つが奇数回出現し、かつ
  • 1つ以上のゼロを持つd00 ... 00の形式はありません。

これは、パリンドロームが中心となる可能性のある数字を除き、開始と終了の数字をペアにする必要があるためです。例外は、先頭の数字がゼロ以外である必要があるためです。したがって、数字が1桁でない限り、ゼロ以外の数字が2回現れる必要があります。


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));}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.