Yo boy, phải tổng hợp


67

Mỗi số nguyên dương có thể được biểu diễn dưới dạng tổng của nhiều nhất ba số nguyên dương palindromic trong bất kỳ cơ sở b 5.   Cilleruelo và cộng sự, 2017

Một số nguyên dương là palindromic trong một cơ sở nhất định nếu biểu diễn của nó trong cơ sở đó, không có các số 0 đứng đầu, đọc ngược lại. Sau đây, chỉ cơ sở b = 10 sẽ được xem xét.

Sự phân tách dưới dạng tổng của các số palindromic không phảiduy nhất . Ví dụ, 5có thể được biểu thị trực tiếp dưới dạng 5hoặc là tổng của 2, 3. Tương tự, 132có thể được phân tách thành 44, 44, 44hoặc như121, 11 .

Các thách thức

Cho một số nguyên dương, tạo ra phép phân tích tổng của nó thành ba hoặc ít hơn số nguyên dương có tính chất palindromic trong cơ sở 10.

Quy tắc bổ sung

  • Thuật toán được sử dụng phải hoạt động cho các đầu vào lớn tùy ý. Tuy nhiên, có thể chấp nhận được nếu chương trình bị giới hạn bởi các hạn chế về bộ nhớ, thời gian hoặc loại dữ liệu.

  • Đầu vào và đầu ra có thể được thực hiện bằng bất kỳ phương tiện hợp lý . Định dạng đầu vào và đầu ra linh hoạt như bình thường.

  • Bạn có thể chọn tạo một hoặc nhiều phân tách hợp lệ cho mỗi đầu vào, miễn là định dạng đầu ra không rõ ràng.

  • Các chương trình hoặc chức năng được cho phép, trong bất kỳ ngôn ngữ lập trình . Sơ hở tiêu chuẩn bị cấm.

  • Mã ngắn nhất trong byte thắng.

Ví dụ

Vì một đầu vào có thể có nhiều phân tách, đây là các ví dụ thay vì các trường hợp thử nghiệm. Mỗi phân tách được hiển thị trên một dòng khác nhau.

Input  ->  Output

5     ->   5
           2, 3

15    ->   1, 3, 11
           9, 6

21    ->   11, 9, 1
           7, 7, 7

42    ->   22, 11, 9
           2, 7, 33

132   ->   44, 44, 44
           121, 11

345   ->   202, 44, 99
           2, 343

1022  ->   989, 33
           999, 22, 1

9265  ->   9229, 33, 3
           8338, 828, 99

32
mmm, chơi chữ trong tiêu đề
Erik the Outgolfer 23/10/17

Tôi tự hỏi: có số nguyên nào phải được tạo thành hai palindromes không? Điều này sẽ làm cho một trường hợp thử nghiệm tốt đẹp (nếu không, hey, người chơi golf có thể sử dụng thực tế này và chỉ kiểm tra k=1k=3.)
Lynn

@Lynn Có vẻ "không thể", vì hóa ra có khá nhiều phân tách cho mỗi đầu vào. Nhưng như chúng ta đã biết, trực giác trong toán học có thể rất sai lệch ...
Luis Mendo

1
@Lynn Nếu bạn cho phép k=1(như trong số ban đầu đã là một bảng màu), điều đó có nghĩa là bạn giả sử 2 số kia đều bằng 0. Vì vậy, nếu 0 được chấp nhận là một trong các số, thì bất kỳ số nào cũng phải được thực hiện với k=2cũng sẽ hoạt động k=3nếu một trong ba số là 0.
Darrel Hoffman

Tôi không nghĩ có bất kỳ số nào CHỈ có thể được biểu thị bằng tổng 2. Vì vậy, bạn chỉ có thể bao gồm trường hợp 3 và 1 và bỏ qua 2.
Bạch tuộc ma thuật Urn

Câu trả lời:


19

Brachylog , 7 byte

~+ℕᵐ.↔ᵐ

Hãy thử trực tuyến!

Đáng ngạc nhiên là không chậm.

Giải trình

(?)~+  .          Output is equal to the Input when summed
     ℕᵐ.          Each element of the Output is a positive integer
       .↔ᵐ(.)     When reversing each element of the Output, we get the Output

2
Điều gì với sự ngẫu nhiên .trong lời giải thích và (.)? Đừng thực sự biết Brachylog.
Bạch tuộc ma thuật Urn

3
@MagicOctopusUrn .là biến đầu ra. ~+, ℕᵐ↔ᵐlà các vị từ có biến trái và phải. Sự trùng lặp của những cái đó .chỉ đơn giản chỉ ra rằng đầu ra được tham gia trực tiếp vào mỗi 3 cuộc gọi vị ngữ đó. Cuối cùng (.)là ở đây để hiển thị rằng biến đầu ra hoàn toàn là biến cuối cùng của chương trình. Do đó, mối quan hệ đã nêu cuối cùng thực sự .↔ᵐ.có nghĩa là "ánh xạ ngược trên kết quả đầu ra trong đầu ra" .
Gây tử vong vào

Rất tốt cuối cùng đầu vào có thể> 10000
RosLuP


8

Thạch , 12 10 9 8 byte

ŒṗDfU$ṪḌ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ŒṗDfU$ṪḌ  Main link. Argument: n (integer)

Œṗ        Find all integer partitions of n.
  D       Convert each integer in each partition to base 10.
     $    Combine the two links to the left into a chain.
    U     Upend; reverse all arrays of decimal digits.
   f      Filter the original array by the upended one.
      Ṫ   Take the last element of the filtered array.
          This selects  the lexicographically smallest decomposition of those with
          the minimal amount of palindromes.
       Ḍ  Undecimal; convert all arrays of decimal digits to integers.

5
Tôi chỉ muốn gửi một giải pháp với ~ 140 byte, sau đó tôi thấy 8 byte và tôi giống như: "Không, sẽ không đăng của tôi".
YU KHÔNG CÓ CÔNG VIỆC

15
So sánh điểm số giữa các ngôn ngữ là khá nhiều vô nghĩa. Tôi đã tự mình đăng một câu trả lời Python , không phải vì nó có cơ hội đánh bại câu trả lời này, mà bởi vì đó là câu trả lời Python ngắn nhất mà tôi có thể nghĩ ra.
Dennis

8

Python 2 , 117 byte

def f(n):p=[x for x in range(n+1)if`x`==`x`[::-1]];print[filter(None,[a,b,n-a-b])for a in p for b in p if n-a-b in p]

Hãy thử trực tuyến!

In một danh sách các danh sách, mỗi danh sách là một giải pháp. Thanh lưu 9 byte.


-9 byte chuyển sang chức năng, thay thế cbằng phép trừ và sử dụngfilter
Rod

1
@Rod Cảm ơn! filter(Nonecũng đánh tôi khi tôi đang làm bữa tối, haha. c → n-a-bthật tuyệt :)
Lynn

7

JavaScript (ES6), 115 ... 84 83 byte

Luôn trả về một mảng ba phần tử, trong đó các mục không sử dụng được đệm bằng số không.

f=(n,b=a=0)=>(r=[b,a%=n,n-a-b]).some(a=>a-[...a+''].reverse().join``)?f(n,b+!a++):r

Các trường hợp thử nghiệm


6

R, 126 byte 145 byte

Cảm ơn Giuseppe vì đã chơi golf 19 byte

function(n){a=paste(y<-0:n)
x=combn(c(0,y[a==Map(paste,Map(rev,strsplit(a,"")),collapse="")]),3)
unique(x[,colSums(x)==n],,2)}

Hãy thử trực tuyến!

Giải trình

R không có cách riêng để đảo ngược chuỗi và nhiều thao tác chuỗi mặc định không hoạt động trên các số. Vì vậy, trước tiên, chúng tôi chuyển đổi chuỗi số nguyên dương (cộng 0) thành ký tự.

Tiếp theo, chúng tôi tạo ra một vectơ 0 và tất cả các palindromes. Việc đảo ngược chuỗi yêu cầu chia từng số theo ký tự, đảo ngược thứ tự của vectơ và dán chúng lại với nhau không có khoảng cách.

Tiếp theo tôi muốn kiểm tra tất cả các nhóm ba (đây là số 0 quan trọng), may mắn thay R có một hàm kết hợp được xây dựng để trả về một ma trận, mỗi cột trong một kết hợp.

Tôi áp dụng colSums hàm cho ma trận và chỉ giữ lại các phần tử bằng với mục tiêu được cung cấp.

Cuối cùng, vì có hai số 0, nên bất kỳ tập hợp hai số nguyên dương nào cũng sẽ được nhân đôi nên tôi sử dụng một hàm duy nhất trên các cột.

Đầu ra là một ma trận trong đó mỗi cột là một tập hợp các số nguyên dương, pallindromic tổng hợp với giá trị đích. Nó lười biếng và trả về 0 khi sử dụng ít hơn 3 phần tử.


1
128 byte . +1, mặc dù, sử dụng tốt Mapđể tạo palindromes!
Giuseppe

Rất tiếc, đã tìm thấy một byter 126
Giuseppe

4

Thạch , 14 byte

L<4aŒḂ€Ạ
ŒṗÇÐf

Hãy thử trực tuyến!

Rất, rất không hiệu quả.


Có vẻ quá chậm, ngay cả khi mục tiêu là độ dài mã, đối với tôi nó không chỉ là độ dài
RosLuP

@RosLuP Ở đây bạn không nhằm mục đích giữ cho mã hiệu quả, ở đây bạn nhằm mục đích rút ngắn mã càng nhiều càng tốt. Nó có để làm việc về mặt lý thuyết , không nhất thiết trong thực tế, vì đây là một mã golf thách thức, không phải là một mã golf restricted-phức tạp hoặc mã sân bị hạn chế thời gian thử thách.
Erik the Outgolfer

4

Thạch , 17 byte

RŒḂÐfṗ3R¤YS⁼³$$Ðf

Hãy thử trực tuyến!

-6 byte nhờ HyperNeutrino.

Đầu ra tất cả các cách. Tuy nhiên, đầu ra bao gồm một số trùng lặp.


1
Có một is palindromelol tích hợp
HyperNeutrino

Ngoài ra, nếu bạn sử dụng phạm vi (tăng) bình thường, bạn có thể xóa 4 byte cuối cùng của mình
HyperNeutrino


@cairdcoinheringaahing Vẫn không thể đánh bại cả Dennis và Erik. Dù sao tôi sẽ giải mã cắt ngắn URL Base64 mã hóa Deflate nén?
dùng202729

@ user202729 Huh, không được sao chép liên kết chính xác. Mã làRŒḂÐfṗ3R¤YS⁼¥Ðf
caird coinheringaahing




3

Java (OpenJDK 8) , 185 byte

n->{for(int i=0,j=n,k;++i<=--j;)if(p(i))for(k=0;k<=j-k;k++)if(p(k)&p(j-k))return new int[]{j-k,k,i};return n;}
boolean p(int n){return(""+n).equals(""+new StringBuffer(""+n).reverse());}

Hãy thử trực tuyến!

Xóa 1 byte khỏi TIO để lấy số tiền chính xác vì nội dung gửi không chứa ;sau lambda.


Theo ý kiến ​​của tôi, nó tốt hơn tất cả một giải pháp khác được đăng cho đến bây giờ
RosLuP

@RosLuP Tại sao vậy, nếu tôi có thể hỏi?
Olivier Grégoire

Bởi vì cuối cùng hãy đưa ra câu trả lời cho đầu vào> 500000 (nếu tôi nhớ rõ)
RosLuP

Đề xuất i++<--jthay vì++i<=--j
trần

2

Proton , 117 byte

a=>filter(l=>all(p==p[by-1]for p:map(str,l)),(k=[[i,a-i]for i:1..a-1])+sum([[[i,q,j-q]for q:1..j-1]for i,j:k],[]))[0]

Hãy thử trực tuyến!

Đưa ra một giải pháp


920 là đầu vào không trả lại đầu ra sau 1 phút trong ... Tôi không nói về 364757698688 mà chỉ là 920
RosLuP

1
@RosLuP Điều đó không quan trọng. Hiệu quả không phải là một điều quan trọng trong môn đánh gôn. Về mặt lý thuyết nó sẽ hoạt động cho tất cả các kích cỡ đầu vào để không thành vấn đề; cho đủ thời gian, nó sẽ cung cấp đầu ra chính xác cho 920.
HyperNeutrino

2

Bình thường ,  16 12  10 byte

ef_I#`MT./

Hãy thử nó ở đây!

Làm thế nào nó hoạt động

ef_I # `MT. / ~ Chương trình đầy đủ.

        ./ ~ Phân vùng số nguyên.
 f ~ Bộ lọc có biến T.
     `MT ~ Ánh xạ từng phần tử của T thành một chuỗi đại diện.
    # ~ Bộ lọc.
  _I ~ Là màu nhạt? (tức là bất biến ngược?)
e ~ Lấy phần tử cuối cùng.


2

Tiên đề, 900 byte

R(x)==>return x;p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)
b:List INT:=[];o:INT:=0
f(a:NNI):List INT==(free b,o;o:=p(-1,o);w:=0;c:=#b;if c>0 then w:=b.1;e:=a-o;e>10000000=>R[];if w<e then repeat(w:=p(1,w);w>e=>break;b:=cons(w,b));g:List INT:=[];for i in #b..1 by-1 repeat(b.i>e=>break;g:=cons(b.i,g));if o>e then g:=cons(o,g);n:=#g;for i in 1..n repeat(x:=g.i;x=a=>R[x];3*x<a=>break;for j in i..n repeat(y:=g.j;t:=x+y;t>a=>iterate;t=a=>R[x,y];t+y<a=>break;for k in j..n repeat(z:=t+g.k;z=a=>R[x,y,g.k];z<a=>break)));[])
D(a:NNI):List INT==(free o;p(0,a)=1=>[a];o:=a;for j in 1..10 repeat(t:=f(a);#t>0=>R t);[])

mã kiểm tra

--Lista random di n elmenti, casuali compresi tra "a" e "b"
randList(n:PI,a:INT,b:INT):List INT==
    r:List INT:=[]
    a>b =>r
    d:=1+b-a
    for i in 1..n repeat
          r:=concat(r,a+random(d)$INT)
    r

test()==
   a:=randList(20,1,12345678901234)
   [[i,D(i)] for i in a]

Nếu mã này phải phân tách số X thành 1,2,3 palindrom, thì mã này làm gì, hãy thử gần palindrom N <X và phân tách XN trong 2 palindrom; nếu quá trình phân tách XN này thành công, trả về 3 palindrom được tìm thấy; nếu thất bại, nó thử dùng palindrom G <N <X và thử phân tách XG trong 2 palindrom, v.v. Mã Ungolf (nhưng có thể có một số lỗi)

 R(x)==>return x

-- se 'r'=0 ritorna 1 se 'a' e' palindrome altrimenti ritorna 0
-- se 'r'>0 ritorna la prossima palindrome >'a'
-- se 'r'<0 ritorna la prossima palindrome <'a'
p(r,a)==(n:=#(a::String);if r<0 then(a=0=>R a;n=1 or a=10^(n-1)=>R(a-1);a=10^(n-1)+1=>R(a-2));if r>0 then(n=1 and a<9=>R(a+1);a=10^n-1=>R(a+2));r=0 and n=1=>1;v:=a quo 10^(n quo 2);repeat(c:=v;w:=(n rem 2>0=>v quo 10;v);repeat(c:=10*c+w rem 10;w:=w quo 10;w=0=>break);r<0=>(c<a=>R c;v:=v-1);r>0=>(c>a=>R c;v:=v+1);R(c=a=>1;0));c)

b:List INT:=[]   -- the list of palindrome
o:INT:=0         -- the start value for search the first is a

--Decompose 'a' in 1 or 2 or 3 palindrome beginning with prev palindrome of o
--if error or fail return []
f(a:NNI):List INT==
    free b,o
    -- aggiustamento di o, come palindrome piu' piccola di o
    o:=p(-1,o)
    -- aggiustamento di b come l'insieme delle palindromi tra 1..a-o compresa
    w:=0;c:=#b
    if c>0 then w:=b.1 --in w la massima palindrome presente in b
    e:=a-o
    output["e=",e,"w=",w,"o=",o,"#b=",#b]
    e>10000000=>R[]   --impongo che la palindrome massima e' 10000000-1
    if w<e then       --se w<a-o aggiungere a b tutte le palindromi tra w+1..a-o
          repeat(w:=p(1,w);w>e=>break;b:=cons(w,b))
                      -- g e' l'insieme dei b palindromi tra 1..a-o,o
    g:List INT:=[];for i in #b..1 by-1 repeat(b.i>e=>break;g:=cons(b.i,g))
    if o>e then g:=cons(o,g)
    --output["g=",g,b]
    n:=#g
    for i in 1..n repeat
        x:=g.i
        x=a  =>R[x]
        3*x<a=>break
        for j in i..n repeat
           y:=g.j;t:=x+y
           t>a   =>iterate
           t=a   =>R[x,y]
           t+y<a =>break
           for k in j..n repeat
                z:=t+g.k
                z=a =>R[x,y,g.k]
                z<a =>break
    []

--Decompose 'a' in 1 or 2 or 3 palindrome
--if error or fail return []
dPal(a:NNI):List INT==
   free o
   p(0,a)=1=>[a]
   o:=a                  -- at start it is o=a
   for j in 1..10 repeat -- try 10 start values only
        t:=f(a)
        #t>0=>R t
   []

các kết quả:

(7) -> [[i,D(i)] for i in [5,15,21,42,132,345,1022,9265] ]
   (7)
   [[5,[5]], [15,[11,4]], [21,[11,9,1]], [42,[33,9]], [132,[131,1]],
    [345,[343,2]], [1022,[999,22,1]], [9265,[9229,33,3]]]
                                                      Type: List List Any
                                   Time: 0.02 (IN) + 0.02 (OT) = 0.03 sec
(8) -> test()
   (8)
   [[7497277417019,[7497276727947,624426,64646]],
    [11535896626131,[11535888853511,7738377,34243]],
    [2001104243257,[2001104011002,184481,47774]],
    [3218562606454,[3218561658123,927729,20602]],
    [6849377785598,[6849377739486,45254,858]],
    [375391595873,[375391193573,324423,77877]],
    [5358975936064,[5358975798535,136631,898]],
    [7167932760123,[7167932397617,324423,38083]],
    [11779002607051,[11779000097711,2420242,89098]],
    [320101573620,[320101101023,472274,323]],
    [5022244189542,[5022242422205,1766671,666]],
    [5182865851215,[5182864682815,1158511,9889]],
    [346627181013,[346626626643,485584,68786]],
    [9697093443342,[9697092907969,443344,92029]],
    [1885502599457,[1885502055881,542245,1331]], [10995589034484,[]],
    [1089930852241,[1089930399801,375573,76867]],
    [7614518487477,[7614518154167,246642,86668]],
    [11859876865045,[11859866895811,9968699,535]],
    [2309879870924,[2309879789032,81418,474]]]
                                                      Type: List List Any
      Time: 0.25 (IN) + 115.17 (EV) + 0.13 (OT) + 28.83 (GC) = 144.38 sec

1

Java (OpenJDK 8) , 605 byte

In bản sao nhưng chúng không bị cấm afaik

a->{int i=0,j,k,r[]=new int[a-1];for(;i<a-1;r[i]=++i);for(i=0;i<a-1;i++){if(r[i]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse()))System.out.println(r[i]);for(j=0;j<a-1;j++){if(r[i]+r[j]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse())&(""+r[j]).equals(""+new StringBuffer(""+r[j]).reverse()))System.out.println(r[i]+" "+r[j]);for(k=0;k<a-1;k++)if(r[i]+r[j]+r[k]==a&(""+r[i]).equals(""+new StringBuffer(""+r[i]).reverse())&(""+r[j]).equals(""+new StringBuffer(""+r[j]).reverse())&(""+r[k]).equals(""+new StringBuffer(""+r[k]).reverse()))System.out.println(r[i]+" "+r[j]+" "+r[k]);}}}

Hãy thử trực tuyến!



1

05AB1E , 8 byte

ÅœR.ΔDíQ

Hãy thử trực tuyến!

Giải trình:

Ŝ          # integer partitions of the input
  R         # reversed (puts the shortest ones first)
   .Δ       # find the first one that...
     D Q    # is equal to...
      í     # itself with each element reversed

1

Perl 6 , 51 byte

{first *.sum==$_,[X] 3 Rxx grep {$_ eq.flip},1..$_}

Hãy thử trực tuyến!

  • grep { $_ eq .flip }, 1 .. $_ tạo ra một danh sách tất cả các số palindromic từ 1 đến số đầu vào.
  • 3 Rxx nhân rộng danh sách đó ba lần.
  • [X]giảm danh sách danh sách đó với toán tử sản phẩm chéo X, dẫn đến danh sách tất cả 3 bộ số palindrominc từ 1 đến số đầu vào.
  • first *.sum == $_ tìm thấy 3-tuple đầu tiên tổng hợp với số đầu vào.

Bạn có thể lưu một byte bằng cách không đảo ngược xx 3.
Jo King

1

Python 3 , 106 byte

lambda n:[(a,b,n-a-b)for a in range(n)for b in range(n)if all(f'{x}'==f'{x}'[::-1]for x in(a,b,n-a-b))][0]

Hãy thử trực tuyến!

Trong liên kết TIO, tôi đã sử dụng một phiên bản nhanh hơn (nhưng dài hơn 1 byte), lấy kết quả hợp lệ đầu tiên làm trình tạo, thay vì xây dựng toàn bộ danh sách các kết hợp có thể và lấy đầu tiên.


0

Ruby , 84 byte

Xây dựng một danh sách tất cả các kết hợp có thể có của 3 palindrome từ 0 đến n, tìm ra kết hợp đầu tiên có tổng khớp, sau đó cắt các số 0.

->n{a=(0..n).select{|x|x.to_s==x.to_s.reverse};a.product(a,a).find{|x|x.sum==n}-[0]}

Hãy thử trực tuyến!


0

Thêm ++ , 62 byte

D,g,@,BDdbR=
D,l,@@,$b+=
D,k,@@*,
L,RÞgdVBcB]Gd‽kdG‽k€bF++A$Þl

Hãy thử trực tuyến!

~ 50 byte đánh gôn trong khi viết lên một lời giải thích. Xác định hàm lambda trả về danh sách các danh sách chứa các giải pháp.

Làm thế nào nó hoạt động

1,231viết sai rồiviết sai rồi .

1,2,...,viết sai rồigRÞggMột để xem sau.

Phần tiếp theo có thể được chia thành ba phần nữa:

BcB]
Gd‽k
dG‽k€bF

Một[1 2 3 4 ...][[1] [2] [3] [4] ... ]Một hai lần và chạy bảng nhanh qua chức năng k:

D,k,@@*,

Chức năng này về cơ bản không có gì. Nó nhận được hai đối số và kết thúc chúng trong một mảng. Tuy nhiên, bàn nhanh chóng, là trò ảo thuật ở đây. Nó nhận hai danh sách và tạo mọi cặp phần tử giữa hai danh sách đó. Vì vậy [1 2 3][4 5 6]tạo ra [[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]. Sau đó, nó lấy đối số chức năng của nó (trong trường hợp nàyk ) và chạy chức năng đó qua từng cặp, trong trường hợp này, chỉ cần trả về các cặp như hiện tại.

Một€bF qua danh sách làm phẳng từng danh sách con. Cuối cùng, chúng tôi ghép ba danh sách để tạo thành một danh sách tất cả các danh sách phụ cần thiết.

1,23viết sai rồilviết sai rồi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.