Nomor permutapalindromic


18

Diberikan bilangan bulat Nsebagai input, mengeluarkan Nnomor permutapalindromic.

Bilangan permutapalindromic adalah bilangan bulat yang benar-benar positif sehingga setidaknya ada satu permutasi dari digitnya yang menghasilkan palindrom (yaitu bilangan yang merupakan kebalikannya sendiri).

Sebagai contoh, 117adalah angka permutapalindromic karena digitnya dapat di permutasi menjadi 171, yang merupakan palindrome.

Kami menganggap bahwa bilangan seperti 10bukan bilangan permutapalindromic, meskipun 01 = 1merupakan palindrom. Kami memaksakan bahwa permutasi palindrom tidak boleh memiliki nol di depan (dengan demikian, 0itu sendiri bukan permutapalindromik).

Angka yang sudah palindrom juga permutapalindromic, karena permutasi tidak ada yang valid.

Masukan dan keluaran

  • Ndapat berupa 0-diindeks atau 1-diindeks. Harap tunjukkan yang mana dari kedua jawaban yang Anda gunakan.
  • Input dapat diambil melalui STDIN, sebagai argumen fungsi, atau apa pun yang serupa dalam bahasa pilihan Anda. Keluaran dapat ditulis STDOUT, dikembalikan dari fungsi, atau apa pun yang serupa dalam bahasa pilihan Anda.
  • Input dan output harus dalam basis desimal.

Uji kasus

Kasus uji berikut ini diindeks 1. Program Anda harus dapat lulus dari semua kasus uji yang disajikan di sini paling lama 1 menit.

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

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.


Sangat tidak mungkin untuk tidak melewati ruang tes terakhir dalam satu menit ...
Leaky Nun

OEIS A084050 (berisi kasus-kasus tambahan seperti 10)
Leaky Nun

Apa input terbesar?
Adám

@ Adám Program Anda secara teoritis harus bekerja untuk nomor berapa pun, tidak peduli seberapa besar
Fatalkan

1
@ Adám Ini adalah batas yang cukup arbitrer yang tergantung pada bahasa yang digunakan. Katakanlah itu seharusnya berfungsi secara teoritis untuk bilangan bulat terbesar yang dapat diwakili oleh bahasa Anda secara default (jadi semua bilangan bulat jika bignum adalah default dalam bahasa Anda).
Fatalkan

Jawaban:


8

05AB1E , 15 14 13 byte

Menyimpan satu byte berkat Emigna ! Kode:

µNœvyJÂïÊP}_½

Penjelasan:

µ               # 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.

Menggunakan pengkodean CP-1252 . Cobalah online! .


1
µNœvyJÂïQ}O__½untuk 14.
Emigna

@Emigna Terima kasih! Saya tidak memikirkan itu.
Adnan

7

Brachylog, 19 byte

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

Cobalah online!

Membutuhkan waktu sekitar 17 detik untuk N = 270.

Penjelasan

  • Predikat utama:

    ~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.
    
  • Predikat 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 byte

1 byte berkat Fatalize.

Apakah Anda merancang tantangan untuk Brachylog?

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

Cobalah online!

270 butuh sekitar setengah menit di sini.

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

Exit code:     0

Predikat 0 (predikat utama)

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

Predikat 1 (predikat bantu)

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`

Coba di sini atau jalankan Test Suite

Ekspansi:

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 byte

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

Penjelasan:

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 adalah angka bulat permutapalindromic.
Adám

@ Adám Ini bukan bulat, mengandung setidaknya dua digit bukan nol.
Neil

@Neil: +2 byte - Anda benar-benar harus menghitung f=ketika Anda merujuknya nanti
charlie

@ charlie Maaf, saya selalu lupa melakukan itu.
Neil

4

R, 145 byte

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}

ungolfed

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
}

Pada dasarnya - fungsi memeriksa keanggotaan dalam set permutapalindromic, dan loop sementara bertambah hingga menemukan anggota ke-n.


3

Python 2.7, 163 154 byte:

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]

Cukup sederhana. Pada dasarnya menggunakan whileloop untuk berulang kali membuat array yang berisi angka permutapalindromic rentang [1,Q)hingga Qcukup besar sehingga array berisi Inputjumlah item. Kemudian output elemen terakhir dalam array itu.

Cobalah secara Online! (Ideone)


2

Perl 6 , 66 byte

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

0 berbasis

Penjelasan:

# 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
  )[$_]
}

Uji:

#! /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 byte

Diindeks satu.

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

{ fungsi di mana ⍵ mewakili argumen

⍵⊃{ gunakan argumen untuk memilih dari hasil fungsi

⍵/⍨{ filter argumen dengan hasil fungsi

(⍵≤9)∨ argumennya kurang atau sama dengan 9, OR

(1<≢c~'0')∧ masih ada lebih dari satu digit ketika nol dihapus DAN

1≥+/ 0 atau 1 adalah jumlah dari

2| keanehan dari

+⌿ dari jumlah kolom

c∘.=∪ctabel perbandingan c dan elemen unik c , di mana c ...

←⍕⍵ adalah representasi string argumen

}¨⍵ diterapkan pada masing-masing argumen

}⍳5×⍵ diterapkan pada {1, 2, 3, ..., 5 kali argumen}

} [akhir fungsi]

Selesaikan semua test case secara instan di TryAPL


Bisakah Anda membuktikannya a(n) <= 5n?
Leaky Nun

Solusi kedua menghasilkan hasil yang salah.
Leaky Nun

Solusi pertama juga menghasilkan hasil yang salah.
Leaky Nun

@ LeakyNun Yang mana yang salah? Dan jika 5 × tidak cukup, ada ruang untuk 9 × ...
Adám

@ LeakyNun Benar, saya menyertakan 100 dll yang tidak diizinkan.
Adám

2

JavaScript (ES6), 92

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

Kurang golf

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

Uji

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 (menggunakan perpustakaan eksternal - Dihitung) (142 byte)

   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()

Tautan ke lib: https://github.com/mvegh1/Enumerable/

Penjelasan kode: _.Sequence membuat enumerable untuk hitungan elemen "n", berdasarkan predikat tanda tangan ("i" teration , "a" array yang diakumulasikan ). Keluarkan iterasi saat ini ke string, dan buat enumerable dari semua permutasi dari itu. Uji apakah ada permutasi yang memenuhi tes tidak dimulai dengan "0" dan bahwa pembalikan permutasi sama dengan permutasi. Kembalikan elemen terakhir dalam urutan karena itu adalah output yang diinginkan sesuai OP

masukkan deskripsi gambar di sini


1

Python 2, 93 byte

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-diindeks. Tergantung pada sistem Anda, kotak uji terakhir mungkin melebihi kedalaman rekursi yang diizinkan.

Tidak menghitung permutasi. Sebagai gantinya, gunakan fakta bahwa dua string adalah permutasi jika mereka sama ketika diurutkan. Untuk menguji apakah suatu angka permutapalindromic, periksa apakah angka yang diurutkan sama dengan angka yang diurutkan dari setiap palindrom hingga batas.


96 byte:

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-diindeks. Tergantung pada sistem Anda, kotak uji terakhir mungkin melebihi kedalaman rekursi yang diizinkan.

Ini tidak melihat permutasi dan sebagai gantinya menggunakan karakterisasi berikut:

Suatu angka adalah permutapalindromic kapan tepatnya

  • Paling banyak salah satu dari digitnya muncul beberapa kali, dan
  • Tidak memiliki bentuk d00 ... 00 dengan satu atau lebih nol.

Ini benar karena palindrome harus memasangkan digit dari awal dan akhir, kecuali untuk kemungkinan digit tengah. Pengecualian berasal dari persyaratan bahwa digit terdepan adalah bukan nol, dan beberapa digit bukan nol harus muncul dua kali kecuali jumlahnya satu digit.


1

Haskell, 89 87 byte

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

0

C, 254 byte

#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));}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.