Hey oğlum, toplamalısın


67

Her pozitif tamsayı, herhangi bir b b5 bazında en fazla üç palindromik pozitif tamsayıların toplamı olarak ifade edilebilir .   Cilleruelo ve diğ., 2017

Pozitif bir tamsayı, belirli bir bazda palindromiktir , eğer bu tabandaki baştaki sıfır olmadan temsili aynı şekilde geri okunursa. Aşağıda sadece b = 10 baz alınacaktır.

Palindromik sayıların toplamı olarak ayrıştırma benzersiz değildir . Örneğin, 5doğrudan olarak 5veya toplamı olarak ifade edilebilir 2, 3. Benzer şekilde, veya gibi 132ayrıştırılabilir .44, 44, 44121, 11

Meydan okuma

Olumlu bir tamsayı verildiğinde, toplam ayrışmasını, 10 bazında palindromik olan üç veya daha az pozitif tamsayı haline getirin.

Ek kurallar

  • Kullanılan algoritma keyfi büyük girdiler için çalışmalıdır. Ancak, programın bellek, zaman veya veri türü kısıtlamaları ile sınırlandırılması kabul edilebilir.

  • Giriş ve çıkış herhangi bir makul yoldan alınabilir . Giriş ve çıkış formatları her zamanki gibi esnektir.

  • Çıktı formatı belirsiz olduğu sürece her giriş için bir veya daha fazla geçerli ayrıştırma üretmeyi seçebilirsiniz.

  • Herhangi bir programlama dilinde programlara veya fonksiyonlara izin verilir . Standart boşluklar yasaktır.

  • Bayt cinsinden en kısa kod kazanır.

Örnekler

Bir girdi birçok ayrışmaya sahip olabileceğinden, bunlar test senaryoları yerine örneklerdir. Her ayrışma farklı bir çizgide gösterilmiştir.

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, başlıkta pun
Outgolfer Erik

Merak ediyorum: İki palindromdan oluşması gereken herhangi bir tam sayı var mı? Bu (değilse, hey, golfçüler bu gerçeği kullanın ve sadece kontrol edebilirsiniz güzel bir test vakası olur k=1ve k=3.)
Lynn

@Lynn Her giriş için epeyce ayrışma olduğu ortaya çıktığından "olası" gibi görünüyor. Ama bildiğimiz gibi, matematikteki sezgi çok yanıltıcı olabilir ...
Luis Mendo

1
@Lynn İzin veriyorsanız k=1(orijinal numarada zaten bir palindrome olduğu gibi), bu diğer 2 sayının ikisinin de 0 olduğunu varsaydığınız anlamına gelir. Yani, 0 sayılardan biri olarak kabul edilebilirse, yapılması gereken herhangi bir sayı üç sayıdan birinin 0 olması durumunda k=2da bununla çalışacaktırk=3
Darrel Hoffman

SADECE 2 toplamı olarak ifade edilebilecek herhangi bir sayı olduğunu sanmıyorum. Bu nedenle, sadece 3 ve 1 vakasını kapatabilir ve 2'yi görmezden gelebilirsiniz.
Magic Octopus Urn

Yanıtlar:


19

Brachylog , 7 bayt

~+ℕᵐ.↔ᵐ

Çevrimiçi deneyin!

Şaşırtıcı bir şekilde o kadar yavaş değil.

açıklama

(?)~+  .          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
.Açıklamasındaki rastgele neyin nesi (.)? Brachylog'u gerçekten tanımıyorum.
Magic Octopus Urn

3
@ MagicOctopusUrn .çıkış değişkenidir. ~+, ℕᵐve ↔ᵐbir sol ve sağ değişken olan tahminlerdir. Bunların kopyalanması ., çıktının doğrudan bu 3 yüklemeli çağrıya dahil edildiğini gösterir. Nihai (.)çıkış değişkeni metotunun programın son değişken olduğunu göstermek için burada. Bu nedenle, belirtilen son ilişki gerçekten "çıktıdaki çıktının üzerinde haritalama".↔ᵐ. anlamına gelir .
Fatalize

Çok iyi geçen giriş> 10000 olabilir
RosLuP


8

Jöle , 12 10 9 8 bayt

ŒṗDfU$ṪḌ

Çevrimiçi deneyin!

Nasıl çalışır

Œṗ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
Sadece ~ 140 baytlık bir çözüm göndermek istedim, sonra 8 bayt görüyorum ve "Hayır, benimkini göndermeyeceğim" gibiyim.
YU NO WORK

15
Diller arasında puanları karşılaştırmak oldukça anlamsızdır. Kendime bir Python cevabı gönderdim , bu cevabı geçme şansı olmadığı için değil, düşünebildiğim en kısa Python cevabı olduğu için.
Dennis,

8

Python 2 , 117 bayt

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]

Çevrimiçi deneyin!

Her biri çözüm olan bir liste listesi yazdırır. Çubuk 9 bayt kurtardı.


-9 bayt , fonksiyon değiştirme c, çıkarma ile değiştirme ve kullanmafilter
Rod

1
@Rod Teşekkürler! filter(NoneBen yemek yaparken de bana vurdu, haha. c → n-a-bhavalı :)
Lynn

7

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

Kullanılmayan girişlerin sıfırlarla doldurulduğu her zaman üç öğeli bir dizi döndürür.

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

Test durumları


6

R, 126 bayt 145 bayt

19 baytlık golf için Giuseppe'e teşekkürler

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

Çevrimiçi deneyin!

açıklama

R, dizeleri ters çevirmek için yerel bir yol kullanmaz ve birçok varsayılan dize işlemi sayılar üzerinde çalışmaz. İlk önce pozitif tamsayı serisini (artı 0) karakterlere dönüştürelim.

Daha sonra 0 vektörü ve tüm palindromları üretiyoruz. Dizge tersine çevrilmesi, her sayıyı karakterlere bölmeyi, vektör sırasını ters çevirmeyi ve boşluk bırakmadan geri yapıştırmayı gerektirir.

Daha sonra, üç grubun tümünü kontrol etmek istiyorum (burada 0'ların önemli olduğu yer), Neyse ki R, her sütun bir kombinasyon halinde bir matris döndüren yerleşik bir kombinasyon işlevine sahiptir.

colSumsFonksiyonu matrise uygularım ve sadece tedarik edilen hedefe eşit elemanları tutarım.

Son olarak, iki 0 olduğundan, iki pozitif tamsayı kümesi çoğaltılacaktır, bu yüzden sütunlarda benzersiz bir işlev kullanıyorum.

Çıktı, her bir sütunun, hedef değeri toplayan bir pozitif, pallindromik tam sayı kümesi olduğu bir matristir. Tembeldir ve 3'ten az eleman kullanıldığında 0 değerini döndürür.


1
128 bayt . +1, olsa da, Mappalindrom üretmek için güzel bir kullanım !
Giuseppe


4

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Çok, çok verimsiz.


Hedef kod uzunluğu benim için yalnızca uzunluk değil, olsa bile çok fazla yavaş görünüyor
RosLuP

@RosLuP Burada kodu verimli tutmayı amaçlamıyorsunuz, burada kodu mümkün olduğunca kısaltmayı amaçlıyorsunuz. Teoride çalışmak zorundadır , pratikte zorunlu değildir, çünkü bu bir kod golf mücadelesidir, kod golf kısıtlı karmaşıklığı veya kod golf kısıtlı zaman mücadelesi değildir.
Outgolfer Erik,

4

Jöle , 17 bayt

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

Çevrimiçi deneyin!

HyperNeutrino sayesinde -6 bayt.

Her yolu çıkarır. Ancak çıktı bazı kopyalardan oluşuyor.


1
Bir is palindromeyerleşik lol var
HyperNeutrino 23:17

Ayrıca, normal (yükseltilmiş) aralık kullanıyorsanız, son 4
baytınızı


@cairdcoinheringaahing Hala ne Dennis ne de Erik'i yenemez. Neyse kesilmiş Deflate sıkıştırılmış Base64 kodlu URL'nin şifresini çözeceğim?
user202729

@ user202729 Huh, bağlantıyı doğru kopyalamamış olmalı. Kod şuyduRŒḂÐfṗ3R¤YS⁼¥Ðf
caird coinheringaahing




3

Java (OpenJDK 8) , 185 bayt

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

Çevrimiçi deneyin!

Gönderim ;lambda sonrası içermediğinden doğru miktarı almak için TIO'dan 1 byte çıkarın .


Bu bence şu ana kadar yayınlanan tüm diğer bir çözümü daha iyidir
RosLuP

@RosLuP Neden sorabilirsem?
Olivier Grégoire

Çünkü sonunda> 500000 girişi için cevaplar verin (eğer iyi hatırlarsam)
RosLuP

Öner i++<--jyerine++i<=--j
ceilingcat

2

Proton , 117 bayt

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]

Çevrimiçi deneyin!

Bir çözüm çıktılar


Giriş ... TiO 1 dk içinde çıktı döndürmez ben 364757698688 söz ama sadece 920 olarak 920
RosLuP

1
@RosLuP Bu önemli değil. Kod golfte verimlilik önemli bir şey değildir. Teorik olarak bütün girdi büyüklükleri için çalışacaktır, böylece önemi yoktur; yeterli zaman verilmiş, bu 920 için doğru çıktı verecektir
HyperNeutrino

2

Pyth ,  16 12  10 bayt

ef_I#`MT./

Burada dene!

Nasıl çalışır

ef_I # `MT. / ~ Tam program.

        ./ ~ Tamsayı Bölümleri.
 f ~ T değişkeni ile filtre
     `MT ~ T'nin her bir elemanını bir dize gösterimi ile eşler.
    # ~ Filtre.
  Palindrom mu? (yani ters üzerinden değişmez?)
e ~ Son elemanı al.

2

05AB1E , 17 bayt

LʒÂQ}U4GXNãDO¹QÏ=

Çevrimiçi deneyin!


Sonuçları aşağıdaki şekilde üç listede verir:

  • Palindromik uzunluk 1 listeler (orijinal sayı IFF palindromiktir).

  • Palindromik uzunluk listeleri 2.

  • Palindromik uzunluk listeleri 3.


2

Aksiyom, 900 bayt

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);[])

test kodu

--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]

Bu kodun X sayısını 1,2,3 palindromda ayrıştırması gerekiyorsa, bu kodun yaptığı, N <X palindromunun yanında denenir ve 2 palindromda XN'nin ayrıştırılması; eğer bu XN'nin ayrışması başarılı olursa, 3 palindrom bulundu; başarısız olursa, prev palindrome G <N <X'i deneyin ve XG'yi 2 palindrome vb'de ayrıştırmayı deneyin. Ungolf kodu (ancak bu bir hata olabilir)

 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
   []

Sonuçlar:

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

Dupes yazdırır, ancak yasaklanmadı.

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

Çevrimiçi deneyin!



1

05AB1E , 8 bayt

ÅœR.ΔDíQ

Çevrimiçi deneyin!

Açıklama:

Ŝ          # 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 bayt

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

Çevrimiçi deneyin!

  • grep { $_ eq .flip }, 1 .. $_ 1'den giriş numarasına kadar tüm palindromik numaraların bir listesini üretir.
  • 3 Rxx bu listeyi üç kez çoğaltır.
  • [X]Çapraz ürün işletmecisi ile bu listelerin listesini azaltır X, sonuçta 1'den giriş palindrominc sayılarının tüm 3-tiftiklerinin bir listesini oluşturur.
  • first *.sum == $_ giriş numarasına toplanan ilk 3 tuple'ı bulur.

Şunları yapabilirsiniz Bir byte kaydetmek ters vermeyerek xx 3.
Jo King,

1

Python 3 , 106 bayt

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]

Çevrimiçi deneyin!

TIO bağlantısında, tüm olası kombinasyonların listesini oluşturmak ve birincisini almak yerine, ilk geçerli sonucu jeneratör olarak alan daha hızlı (ancak 1 byte uzun versiyon) kullandım.


0

Ruby , 84 bayt

0'dan n'ye kadar olan 3 palindromun olası tüm kombinasyonlarının bir listesini oluşturur, toplamı eşleşen olanı bulur, ardından sıfırları kuru tutar.

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

Çevrimiçi deneyin!


0

++ , 62 bayt ekle

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

Çevrimiçi deneyin!

Bir açıklama yazarken ~ 50 byte golf oynadı. Çözümleri içeren listelerin bir listesini döndüren bir lambda işlevini tanımlar.

Nasıl çalışır

1,231nn

1,2,...,ngRÞggA

Bir sonraki bölüm üç bölüme ayrılabilir:

BcB]
Gd‽k
dG‽k€bF

A[1 2 3 4 ...][[1] [2] [3] [4] ... ]Ak

D,k,@@*,

Bu işlev temelde hiçbir şey yapmaz. İki argüman alır ve bunları bir diziye sarar. Ancak, masa hızlı, burada sihir numarasıdır. İki liste alır ve bu iki liste arasındaki her bir öğe çiftini oluşturur. Böylece [1 2 3]ve [4 5 6]üretir [[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]. Daha sonra işlevsel argümanını alır (bu durumda k) ve bu işlevi her çift üzerinde çalıştırır; bu durumda çiftleri olduğu gibi döndürür.

A€bF

1,23nln

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.