Permutapalindromic 숫자


18

N입력 으로 정수가 주어지면, Npermutapalindromic 수를 출력하십시오 .

permutapalindromic number는 엄격하게 양의 정수로, 회문을 초래하는 숫자의 적어도 하나의 순열이 있습니다 (즉, 자체 역수).

예를 들어, 117숫자는 회 문인로 치환 될 수 있기 때문에 순열 171회문 번호입니다.

우리 는 회문 (palindrome) 10임에도 불구하고 같은 숫자 는 순열 통증 식 숫자가 아니라고 생각한다 01 = 1. 우리는 회 문장 순열 0이 앞에 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 분 안에 마지막 테스트 케이스를 통과 하지 못하는 것은 불가능합니다 .
Leaky Nun

OEIS A084050 (과 같은 추가 사례 포함 10)
Leaky Nun

가장 큰 입력은 무엇입니까?
Adám

@ Adám 프로그램은 아무리 클지라도 이론적으로 어떤 숫자에서도 작동해야합니다.
페이탈 라이즈

1
@ Adám 이것은 사용되는 언어에 따라 상당히 임의적 인 한계입니다. 언어가 기본적으로 표현할 수있는 가장 큰 정수에 대해 이론적으로 작동해야한다고 가정합니다 (따라서 bignums가 언어의 기본값 인 경우 모든 정수).
페이탈 라이즈

답변:


8

05AB1E , 15 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__½
Emigna

@Emigna 감사합니다! 나는 그것을 생각하지 않았다.
Adnan

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

Brachylog , 21 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

피스, 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

@ Adám 반올림하지 않으며 0이 아닌 두 자리 이상의 숫자를 포함합니다.
Neil

@Neil : +2 바이트- f=나중에 참조 할 때 시간을 세 어야합니다.
Charlie Charlie

@charlie 미안, 나는 항상 그렇게하는 것을 잊었다.
Neil

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, 163154 바이트 :

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)때까지 범위 내에서 permutapalindromic 숫자를 포함하는 배열을 반복적으로 만듭니다.QInput 의 항목 수를 수 . 그런 다음 해당 배열의 마지막 요소를 출력합니다.

온라인으로 사용해보십시오! (아이디어)


2

펄 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')∧ 0을 제거해도 두 자리 이상이 남아 있습니다.

1≥+/ 0 또는 1은

2| 의 이상

+⌿ 열 합계

c∘.=∪c비교 테이블 C 와의 고유 요소 C , C ...

←⍕⍵ 인수의 문자열 표현입니다

}¨⍵ 각각의 주장에 적용

}⍳5×⍵ {1, 2, 3, ..., 5 배 인수}에 적용

} [기능 종료]

TryAPL 에서 모든 테스트 사례를 즉시 완료


증명할 수 a(n) <= 5n있습니까?
Leaky Nun

두 번째 솔루션은 잘못된 결과를 생성합니다.
Leaky Nun

첫 번째 솔루션은 잘못된 결과도 생성합니다.
Leaky Nun

@LeakyNun 어느 것이 잘못 되었습니까? 그리고 5
배가

@LeakyNun 맞습니다, 나는 100 등을 포함하지 않습니다.
Adám

2

자바 스크립트 (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

자바 스크립트 (외부 라이브러리 사용-열거 가능) (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"ccumulated array )를 기반으로 "n"개의 요소에 대해 열거 가능한 열거 형을 만듭니다 . 현재 반복을 문자열로 캐스트하고 문자열에서 모든 순열을 열거 할 수있는 목록을 만듭니다. 순열 중 하나가 "0"으로 시작하지 않는 테스트를 만족하고 순열의 반전이 순열과 같은지 테스트합니다. 시퀀스에서 마지막 요소를 반환합니다. OP에 따라 원하는 출력이기 때문입니다.

여기에 이미지 설명을 입력하십시오


1

파이썬 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- 색인. 시스템에 따라 마지막 테스트 사례가 허용되는 재귀 수준을 초과 할 수 있습니다.

순열을 계산하지 않습니다. 대신 정렬 할 때 두 문자열이 같으면 두 문자열이 순열이라는 사실을 사용합니다. 숫자가 permutapalindromic인지 테스트하려면 정렬 된 숫자가 회 문의 정렬 된 숫자와 최대 한도까지 같은지 확인합니다.


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입니다

  • 최대 하나의 숫자가 홀수로 나타나고
  • 하나 이상의 0이있는 d00 ... 00 형식이 아닙니다.

회문은 가능한 중심 숫자를 제외하고 시작과 끝에서 숫자를 쌍으로 묶어야하기 때문에 사실입니다. 선행 자릿수가 0이 아니어야한다는 요구 사항에서 예외이므로 숫자가 한 자릿수가 아니면 0이 아닌 숫자가 두 번 나타나야합니다.


1

하스켈, 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.