Cześć chłopcze, musi to sumować


67

Każda dodatnia liczba całkowita może być wyrażona jako suma co najwyżej trzech palindromicznych dodatnich liczb całkowitych w dowolnej zasadzie b ≥5.   Cilleruelo i in., 2017

Dodatnia liczba całkowita jest palindromiczna w danej bazie, jeśli jej reprezentacja w tej bazie bez zer wiodących odczytuje to samo wstecz. Poniżej rozważana będzie tylko podstawa b = 10.

Rozkład jako suma liczb palindromicznych nie jest unikalny . Na przykład 5można wyrazić bezpośrednio jako 5lub jako sumę 2, 3. Podobnie 132może być rozkładany jako 44, 44, 44lub jako 121, 11.

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą, uzyskaj jej sumaryczny rozkład na trzy lub mniej dodatnich liczb całkowitych, które są palindromiczne w podstawie 10.

Dodatkowe zasady

  • Zastosowany algorytm powinien działać dla dowolnie dużych danych wejściowych. Jest jednak dopuszczalne, jeśli program jest ograniczony ograniczeniami pamięci, czasu lub typu danych.

  • Dane wejściowe i wyjściowe można przyjmować dowolnymi rozsądnymi środkami . Format wejściowy i wyjściowy jest elastyczny jak zwykle.

  • Możesz wybrać tworzenie jednego lub więcej prawidłowych rozkładów dla każdego wejścia, o ile format wyjściowy jest jednoznaczny.

  • Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.

  • Najkrótszy kod w bajtach wygrywa.

Przykłady

Ponieważ dane wejściowe mogą mieć wiele rozkładów, są to raczej przykłady niż przypadki testowe. Każdy rozkład jest pokazany w innym wierszu.

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, kalambur w tytule
Erik the Outgolfer

Zastanawiam się: czy jest jakaś liczba całkowita, która musi być złożona w dwie palindromy? Byłby to dobry przypadek testowy (jeśli nie, hej, golfiści mogą skorzystać z tego faktu i tylko sprawdzić k=1i k=3.)
Lynn

@ Lynn Wydaje się „mało prawdopodobne”, ponieważ dla każdego wejścia okazuje się całkiem sporo rozkładów. Ale jak wiemy intuicja w matematyce może być tak myląca ...
Luis Mendo

1
@Lynn Jeśli zezwalasz k=1(tak jak w pierwotnym numerze jest już palindromem), oznacza to, że zakładasz , że pozostałe 2 liczby to 0. Więc jeśli 0 jest dopuszczalne jako jedna z liczb, dowolna liczba, która musi zostać wykonana z k=2zadziałałoby również, k=3jeśli jedna z trzech liczb to 0.
Darrel Hoffman

Nie sądzę, aby były jakieś liczby, które można wyrazić WYŁĄCZNIE jako sumę 2. Dlatego możesz po prostu zakryć przypadek 3 i 1 i zignorować 2.
Magic Octopus Urn

Odpowiedzi:


19

Brachylog , 7 bajtów

~+ℕᵐ.↔ᵐ

Wypróbuj online!

Zaskakująco nie tak wolno.

Wyjaśnienie

(?)~+  .          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
O co chodzi z przypadkami .w wyjaśnieniu i (.)? Naprawdę nie wiem Brachylog.
Magic Octopus Urn

3
@MagicOctopusUrn .jest zmienną wyjściową. ~+, ℕᵐi ↔ᵐsą predykatami, które mają zmienną lewą i prawą. Ich duplikacja .po prostu wskazuje, że dane wyjściowe są zaangażowane bezpośrednio w każde z tych 3 predykatów. Końcowy (.)jest tutaj, aby pokazać, że zmienna wyjściowa jest domyślnie ostatnią zmienną programu. Dlatego ostatnia podana relacja jest naprawdę, .↔ᵐ.co oznacza „odwrotne odwzorowanie na wyjściu daje w wyniku” .
Fatalize

Nareszcie bardzo dobry wkład może wynosić> 10000
RosLuP,


8

Galaretka , 12 10 9 8 bajtów

ŒṗDfU$ṪḌ

Wypróbuj online!

Jak to działa

Œṗ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
Chciałem tylko przesłać rozwiązanie z ~ 140 bajtami, potem widzę 8 bajtów i mówię: „Nie, nie opublikuję mojego”.
YU NO WORK

15
Porównywanie wyników w różnych językach jest praktycznie bez znaczenia. Sam opublikowałem odpowiedź w języku Python , nie dlatego, że ma szansę ją pokonać, ale dlatego, że jest to najkrótsza odpowiedź w języku Python, jaką mogę wymyślić.
Dennis

8

Python 2 , 117 bajtów

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]

Wypróbuj online!

Drukuje listę list, z których każda jest rozwiązaniem. Rod zaoszczędził 9 bajtów.


-9 bajtów przełącza się na funkcję, zastępuje codejmowaniem i używafilter
Rod

1
@Rod Thanks! filter(Noneuderzyło mnie również podczas przygotowywania obiadu, haha. c → n-a-bjest super :)
Lynn

7

JavaScript (ES6), 115 ... 84 83 bajtów

Zawsze zwraca tablicę trzyelementową, w której nieużywane wpisy są uzupełniane zerami.

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

Przypadki testowe


6

R, 126 bajtów 145 bajtów

Dzięki Giuseppe za grę w golfa z 19 bajtów

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

Wypróbuj online!

Wyjaśnienie

R nie ma natywnego sposobu odwracania łańcuchów i wiele domyślnych operacji na łańcuchach nie działa na liczbach. Najpierw konwertujemy ciąg dodatnich liczb całkowitych (plus 0) na znaki.

Następnie tworzymy wektor 0 i wszystkie palindromy. Odwrócenie ciągu wymaga podzielenia każdej liczby na znaki, odwrócenia kolejności wektora i wklejenia ich z powrotem bez odstępu.

Następnie chcę sprawdzić wszystkie trzy grupy (tutaj ważne są zera), na szczęście R ma wbudowaną funkcję kombinacji, która zwraca macierz, każda kolumna w kombinacji.

Stosuję tę colSumsfunkcję do macierzy i zachowuję tylko te elementy, które są równe podanemu celowi.

Wreszcie, ponieważ istnieją dwa zera, każdy zestaw dwóch dodatnich liczb całkowitych zostanie zduplikowany, więc używam unikalnej funkcji w kolumnach.

Dane wyjściowe to macierz, w której każda kolumna jest zbiorem dodatnich liczb całkowitych pallindromicznych, które sumują się do wartości docelowej. Jest leniwy i zwraca 0, gdy używanych jest mniej niż 3 elementy.


1
128 bajtów . +1, jednak fajne zastosowanie Mapdo generowania palindromów!
Giuseppe,

oops, znaleziono 126 bajtów
Giuseppe,

4

Galaretka , 14 bajtów

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

Wypróbuj online!

Bardzo, bardzo nieefektywny.


Wydaje się zbyt powolny, nawet jeśli celem jest długość kodu, dla mnie to nie tylko długość
RosLuP

@RosLuP Tutaj nie masz na celu utrzymania wydajności kodu, tutaj starasz się maksymalnie go skrócić. To musi działać w teorii , niekoniecznie w praktyce, ponieważ jest to kod-golf wyzwaniem, a nie kod-golf ograniczonego złożoność lub code-golf ograniczonego czasu wyzwaniem.
Erik the Outgolfer,

4

Galaretka , 17 bajtów

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

Wypróbuj online!

-6 bajtów dzięki HyperNeutrino.

Wysyła wszystkie sposoby. Jednak wynik składa się z niektórych duplikatów.


1
Jest is palindromewbudowany lol
HyperNeutrino

Ponadto, jeśli używasz normalnego (podwyższonego) zakresu, możesz usunąć ostatnie 4 bajty
HyperNeutrino


@cairdcoinheringaahing Nadal nie pokonuje ani Dennisa, ani Erika. W każdym razie, czy zamierzam odszyfrować obcięty adres URL zakodowany w formacie Deflate w formacie Base64?
user202729,

@ user202729 Huh, nie można poprawnie skopiować linku. Kod byłRŒḂÐfṗ3R¤YS⁼¥Ðf
Caird coinheringaahing




3

Java (OpenJDK 8) , 185 bajtów

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

Wypróbuj online!

Usuń 1 bajt z TIO, aby uzyskać prawidłową kwotę, ponieważ przesłanie nie zawiera ;po lambda.


Moim zdaniem jest to lepsze niż wszystkie inne dotychczas opublikowane rozwiązania
RosLuP,

@RosLuP Dlaczego tak jest, jeśli mogę zapytać?
Olivier Grégoire,

Ponieważ w końcu podaj odpowiedzi na dane wejściowe> 500000 (o ile dobrze pamiętam)
RosLuP,

Zaproponuj i++<--jzamiast++i<=--j
ceilingcat

2

Proton , 117 bajtów

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]

Wypróbuj online!

Wyprowadza rozwiązanie


920 jako wejście nie zwraca wyniku w ciągu 1 minuty in tio ... Nie mówię o 364757698688, ale tylko 920
RosLuP

1
@RosLuP To nie ma znaczenia. Wydajność nie jest ważna w golfie kodowym. Teoretycznie będzie działać dla wszystkich rozmiarów danych wejściowych, więc to nie ma znaczenia; biorąc pod uwagę wystarczającą ilość czasu, da poprawne wyjście dla 920.
HyperNeutrino,

2

Pyt ,  16 12  10 bajtów

ef_I#`MT./

Wypróbuj tutaj!

Jak to działa

ef_I # `MT. / ~ Pełny program.

        ./ ~ Partycje całkowite.
 f ~ Filtruj ze zmienną T.
     `MT ~ Odwzoruj każdy element T na ciąg znaków.
    # ~ Filtruj.
  _I ~ Czy palindrom? (tzn. niezmiennik w stosunku do rewersu?)
e ~ Zdobądź ostatni element.

2

05AB1E , 17 bajtów

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

Wypróbuj online!


Powoduje wyświetlenie wyniku w trzech listach w następujący sposób:

  • Listy palindromiczne o długości 1 (oryginalny numer IFF to palindromiczny).

  • Listy palindromiczne o długości 2.

  • Listy palindromiczne o długości 3.


2

Aksjomat, 900 bajtów

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

kod testowy

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

Jeśli ten kod musi rozkładać liczbę X na 1,2,3 palindromie, co robi ten kod, próbuje spróbować w pobliżu palindromu N <X i rozkłada XN na 2 palindromie; jeśli ten rozkład XN zakończy się sukcesem, zwróć 3 palindrom; jeśli się nie powiedzie, wypróbuj poprzedni palindrom G <N <X i spróbuj rozłożyć XG na 2 palindrom itp. Kod Ungolfa (ale możliwe, że jest jakiś błąd)

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

wyniki:

(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 bajtów

Drukuje kopie, ale nie są zbanowani 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]);}}}

Wypróbuj online!



1

05AB1E , 8 bajtów

ÅœR.ΔDíQ

Wypróbuj online!

Wyjaśnienie:

Ŝ          # 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 bajtów

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

Wypróbuj online!

  • grep { $_ eq .flip }, 1 .. $_ tworzy listę wszystkich liczb palindromowych od 1 do liczby wejściowej.
  • 3 Rxx replikuje tę listę trzy razy.
  • [X]zmniejsza tę listę list za pomocą operatora krzyżowego produktu X, w wyniku czego powstaje lista wszystkich 3-krotek liczb palindrominc od 1 do liczby wejściowej.
  • first *.sum == $_ znajduje pierwszą taką trójkę, która sumuje się do liczby wejściowej.

Możesz zapisać bajt , nie cofając xx 3.
Jo King

1

Python 3 , 106 bajtów

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]

Wypróbuj online!

W linku TIO użyłem szybszej (ale o 1 bajt dłuższej wersji), która bierze pierwszy poprawny wynik jako generator, zamiast budować całą listę możliwych kombinacji i brać pierwszą.


0

Rubinowy , 84 bajtów

Tworzy listę wszystkich możliwych kombinacji 3 palindromów od 0 do n, znajduje pierwszą, której suma pasuje, a następnie przycina zera.

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

Wypróbuj online!


0

Dodaj ++ , 62 bajty

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

Wypróbuj online!

~ 50 bajtów gry w golfa podczas pisania wyjaśnienia. Definiuje funkcję lambda, która zwraca listę list zawierających rozwiązania.

Jak to działa

1,2)3)1nn

1,2),...,ngRÞggZA na później.

Kolejną sekcję można podzielić na trzy dalsze części:

BcB]
Gd‽k
dG‽k€bF

ZA[1 2 3 4 ...][[1] [2] [3] [4] ... ]ZAk

D,k,@@*,

Ta funkcja w zasadzie nic nie robi. Otrzymuje dwa argumenty i zawija je w tablicę. Jednak szybki stół to magiczna sztuczka. Pobiera dwie listy i generuje każdą parę elementów między tymi dwiema listami. Tak [1 2 3]i [4 5 6]generuje [[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]. Następnie przyjmuje argument funkcjonalny (w tym przypadkuk ) i uruchamia tę funkcję nad każdą parą, która w tym przypadku po prostu zwraca pary w niezmienionej postaci.

ZA€bF

1,2)3)nln

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.