ตัวเลข Permutapalindromic


18

กำหนดจำนวนเต็มNเป็นอินพุตเอาต์พุตNจำนวน permutapalindromic ที่

จำนวน permutapalindromic เป็นจำนวนเต็มบวกอย่างเคร่งครัดเช่นที่มีอย่างน้อยหนึ่งการเปลี่ยนแปลงของตัวเลขที่ส่งผลให้ palindrome (เช่นจำนวนที่เป็นของตัวเองกลับ)

ตัวอย่างเช่น117เป็นจำนวน permutapalindromic เนื่องจากตัวเลขสามารถเปลี่ยนเป็นตัวเลข171ซึ่งเป็น palindrome

เราพิจารณาว่าตัวเลขเช่น10นี้ไม่ใช่ตัวเลข permutapalindromic แม้ว่าจะ01 = 1เป็นแบบ palindrome เรากำหนดว่าการเปลี่ยนรูปแบบ palindromic จะต้องไม่มีศูนย์นำหน้า (เช่น0นั้นเองไม่ได้เป็น permutapalindromic)

ตัวเลขที่มี palindromes แล้วยัง permutapalindromic เนื่องจากอนุญาตให้ไม่มีอะไรถูกต้อง

อินพุตและเอาต์พุต

  • 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 สุดท้ายในหนึ่งนาที ...
รั่วนูน

OEIS A084050 (มีกรณีพิเศษ10)
Nun

อินพุตที่ใหญ่ที่สุดคืออะไร?
อดัม

@ 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__½for 14.
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 ไบต์

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

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มันไม่กลมมันมีตัวเลขที่ไม่ใช่ศูนย์อย่างน้อยสองหลัก
Neil

@Neil: +2 ไบต์ - คุณควรนับf=เมื่อคุณอ้างถึงในภายหลัง
ชาร์ลี

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

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
}

เป็นหลัก - ฟังก์ชันการตรวจสอบความเป็นสมาชิกในชุด permutapalindromic และ a while loop จะเพิ่มขึ้นเรื่อย ๆ จนกว่าจะพบสมาชิกที่ 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วนซ้ำเพื่อสร้างอาร์เรย์ที่มีหมายเลข permutapalindromic ในช่วง[1,Q)จนกระทั่งQมีขนาดใหญ่พอที่อาร์เรย์จะมีInputจำนวนรายการ จากนั้นจะแสดงองค์ประกอบสุดท้ายในอาร์เรย์นั้น

ลองออนไลน์! (Ideone)


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')∧ ยังคงมีมากกว่าหนึ่งหลักเมื่อเลขศูนย์ถูกลบและ

1≥+/ 0 หรือ 1 คือผลรวมของ

2| ความแปลกประหลาดของ

+⌿ ของผลรวมคอลัมน์ของ

c∘.=∪cตารางเปรียบเทียบและองค์ประกอบที่ไม่ซ้ำกันของที่ ...

←⍕⍵ เป็นการแทนค่าสตริงของอาร์กิวเมนต์

}¨⍵ นำไปใช้กับแต่ละข้อโต้แย้ง

}⍳5×⍵ ใช้กับ {1, 2, 3, ... , 5 เท่าของอาร์กิวเมนต์}

} [สิ้นสุดฟังก์ชั่น]

เสร็จสิ้นทุกกรณีทดสอบทันทีที่TryAPL


คุณพิสูจน์ได้a(n) <= 5nไหม
แม่ชีที่รั่ว

โซลูชันที่สองสร้างผลลัพธ์ที่ไม่ถูกต้อง
Leun Nun

โซลูชันแรกสร้างผลลัพธ์ที่ไม่ถูกต้องเช่นกัน
แม่ชีที่รั่ว

@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")

น้อย golfed

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" อาร์เรย์แบบ ccumulated ) ส่งการวนซ้ำปัจจุบันไปยังสตริงและสร้างการเรียงสับเปลี่ยนทั้งหมดจากมัน ทดสอบว่าการเรียงสับเปลี่ยนใด ๆ เป็นไปตามการทดสอบที่ไม่ได้เริ่มต้นด้วย "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 การจัดทำดัชนี กรณีทดสอบล่าสุดอาจเกินความลึกในการเรียกซ้ำที่อนุญาตทั้งนี้ขึ้นอยู่กับระบบของคุณ

ไม่คำนวณการเรียงสับเปลี่ยน ให้ใช้ความจริงที่ว่าสองสายเป็นการเปลี่ยนลำดับหากพวกเขาเท่ากันเมื่อเรียงลำดับ ในการทดสอบว่าจำนวนนั้นเป็น permutapalindromic หรือไม่ให้ตรวจสอบว่าตัวเลขที่จัดเรียงนั้นมีค่าเท่ากับตัวเลขที่จัดเรียงของ palindrome ใด ๆ จนถึงขอบเขตหรือไม่


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 ที่มีศูนย์ตั้งแต่หนึ่งศูนย์ขึ้นไป

สิ่งนี้เป็นจริงเนื่องจาก palindrome ต้องจับคู่หลักจากจุดเริ่มต้นและจุดสิ้นสุดยกเว้นหลักกลางที่เป็นไปได้ ข้อยกเว้นมาจากข้อกำหนดที่ว่าเลขนำหน้าเป็นไม่ใช่ศูนย์และดังนั้นบางหลักที่ไม่ใช่ศูนย์ต้องปรากฏสองครั้งเว้นแต่ว่าตัวเลขจะเป็นตัวเลขหลักเดียว



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.