Пермутапаліндромні числа


18

Враховуючи ціле число Nв якості введення, виведіть Nперметапаліндромне число.

Пермутапаліндромне число є цілком позитивним цілим числом, таким чином, що існує хоча б одна перестановка його цифр, що призводить до паліндрому (тобто число, яке є його зворотним).

Наприклад, 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

Оцінка балів

Це , тому найкоротша відповідь у байтах виграє.


Це абсолютно неможливо НЕ пройти останню TestCase в одну хвилину ...
Дірявий Nun

OEIS A084050 (містить додаткові випадки на кшталт 10)
Leaky Nun

Який найбільший внесок?
Adám

@ Adám Теоретично ваша програма повинна працювати для будь-якої кількості, незалежно від великої кількості.
Фаталізувати

1
@ Adám Це досить довільна межа, яка залежить від мови, що використовується. Скажімо, що теоретично він повинен працювати для найбільшого цілого числа, яке ваша мова може представляти за замовчуванням (тому всі цілі числа, якщо bignums є типовим для вашої мови).
Фаталізувати

Відповіді:


8

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

Брахілог, 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

Брахілог , 21 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 - кругле пермутапаліндромне число.
Адама

@ Adám Вона не кругла, вона містить щонайменше дві ненулі цифри.
Ніл

@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
}

По суті - функція, що перевіряє членство в пермутапаліндромному наборі, і цикл, який збільшується деякий час, поки не знайде 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

Діалог APL , 51 байт

Одноіндексовані.

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

{ функція, де ⍵ являє аргумент

⍵⊃{ використовуйте аргумент для вибору з результату функції

⍵/⍨{ фільтруємо аргумент за результатом функції

(⍵≤9)∨ аргумент менше або дорівнює 9, АБО

(1<≢c~'0')∧ при видаленні нулів І більше, ніж одна цифра

1≥+/ 0 або 1 - сума

2| дивацтва

+⌿ сум стовпців

c∘.=∪cтаблиця порівняння c та унікальних елементів c , де c ...

←⍕⍵ - це рядкове подання аргументу

}¨⍵ застосовано до кожного з аргументів

}⍳5×⍵ застосовується до {1, 2, 3, ..., 5 разів більше аргументу}

} [кінець функції]

Усі тестові випадки миттєво закінчуємо на TryAPL


Ви можете це довести a(n) <= 5n?
Leaky Nun

Друге рішення дає невірні результати.
Leaky Nun

Перше рішення також дає невірні результати.
Лина монашка

@LeakyNun Які з них неправильні? А якщо 5 × недостатньо, є місце для 9 × ...
Adám

@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 створює безліч для кількості "n" елементів на основі предиката підпису ("i" teration , "a" накопичений масив ). Закиньте поточну ітерацію в рядок і створіть з неї безліч усіх перестановок. Перевірте, чи будь-яка перестановка задовольняє тесту, що не починається з "0", і чи повернення перестановки дорівнює перестановці. Поверніть останній елемент у послідовності, оскільки це бажаний вихід відповідно до ОП

введіть тут опис зображення


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-індексований. Залежно від вашої системи, останній тестовий випадок може перевищувати дозволену глибину рекурсії.

Це не розглядає перестановки, а натомість використовує таку характеристику:

Число є пермутапаліндромним саме тоді

  • Щонайбільше одна його цифра з’являється непарною кількістю разів, і
  • Він не має форми 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));}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.