Yo garoto, deve somar


67

Todo número inteiro positivo pode ser expresso como a soma de no máximo três números inteiros positivos palindrômicos em qualquer base b ≥5.   Cilleruelo et al., 2017

Um número inteiro positivo é palíndrico em uma determinada base se sua representação nessa base, sem zeros à esquerda, lê o mesmo para trás. A seguir, apenas a base b = 10 será considerada.

A decomposição como uma soma dos números palindrômicos não é única . Por exemplo, 5pode ser expresso diretamente como 5, ou como a soma de 2, 3. Da mesma forma, 132pode ser decomposto como 44, 44, 44ou como 121, 11.

O desafio

Dado um número inteiro positivo, produza sua decomposição de soma em três ou menos números inteiros positivos que são palíndricos na base 10.

Regras adicionais

  • O algoritmo usado deve funcionar para entradas arbitrariamente grandes. No entanto, é aceitável se o programa estiver limitado por restrições de memória, hora ou tipo de dados.

  • A entrada e a saída podem ser obtidas por qualquer meio razoável . O formato de entrada e saída é flexível, como de costume.

  • Você pode optar por produzir uma ou mais decomposições válidas para cada entrada, desde que o formato de saída seja inequívoco.

  • Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.

  • O menor código em bytes vence.

Exemplos

Como uma entrada pode ter muitas decomposições, esses são exemplos e não casos de teste. Cada decomposição é mostrada em uma linha diferente.

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, trocadilho no título
Erik the Outgolfer 23/10

Eu me pergunto: existe algum número inteiro que deve ser composto em dois palíndromos? Isto faria um caso de teste bom (se não, hey, os golfistas podem usar este fato e só verificar k=1e k=3.)
Lynn

@ Lynn Parece "improvável", pois existem algumas decomposições para cada entrada. Mas, como sabemos, a intuição em matemática pode ser tão enganosa ...
Luis Mendo

11
@ Lynn Se você está permitindo k=1(como no número original já é um palíndromo), isso significa que você está assumindo que os outros 2 números são ambos 0. Portanto, se 0 é aceitável como um dos números, qualquer número que deve ser feito com k=2também iria trabalhar para k=3se um dos três números é 0.
Darrel Hoffman

Eu não acho que há qualquer número que só pode ser expresso como uma soma de 2. Portanto, você pode apenas cobrir o caso 3 e 1 e ignorar 2.
Magia Octopus Urna

Respostas:


19

Braquilog , 7 bytes

~+ℕᵐ.↔ᵐ

Experimente online!

Surpreendentemente, não é tão lento.

Explicação

(?)~+  .          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 que há com os aleatórios .na explicação e com o (.)? Realmente não conheço Brachylog.
Magic Octopus Urn

3
@MagicOctopusUrn .é a variável de saída. ~+, ℕᵐE ↔ᵐsão predicados que têm uma variável esquerda e direita. A duplicação desses .simplesmente indica que a saída está envolvida diretamente em cada uma dessas três chamadas predicadas. A final (.)está aqui para mostrar que a variável de saída é implicitamente a última variável do programa. Portanto, o último relacionamento declarado é realmente o .↔ᵐ.que significa "mapear inversamente os resultados da saída na saída" .
Fatalize 25/10

Finalmente, muito bom, a entrada pode ser> 10000
RosLuP 20/11


8

Gelatina , 12 10 9 8 bytes

ŒṗDfU$ṪḌ

Experimente online!

Como funciona

Œṗ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
Eu só queria enviar uma solução com ~ 140 bytes, vejo 8 bytes e fico tipo: "Não, não vou postar o meu".
YU NO WORK

15
Comparar pontuações entre idiomas é praticamente sem sentido. Eu mesmo publiquei uma resposta em Python , não porque ela tenha uma chance de superar essa resposta, mas porque é a resposta mais curta em Python que consigo pensar.
Dennis #

8

Python 2 , 117 bytes

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]

Experimente online!

Imprime uma lista de listas, cada uma das quais é uma solução. Rod salvou 9 bytes.


-9 bytes de comutação de função, que substitui ccom subtracções e utilizandofilter
Haste

11
@ Rod Obrigado! filter(Noneme bateu também enquanto eu estava fazendo o jantar, haha. c → n-a-bé legal :)
Lynn

7

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

Sempre retorna uma matriz de três elementos, na qual entradas não utilizadas são preenchidas com zeros.

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

Casos de teste


6

R, 126 bytes 145 bytes

Agradecimentos a Giuseppe por jogar fora 19 bytes

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

Experimente online!

Explicação

R não possui uma maneira nativa de reverter seqüências de caracteres e muitas operações de sequência padrão não funcionam com números. Então, primeiro convertemos a série de números inteiros positivos (mais 0) em caracteres.

Em seguida, produzimos um vetor 0 e todos os palíndromos. A reversão de string requer dividir cada número por caracteres, revertendo a ordem do vetor e colando-os novamente sem espaços.

Em seguida, quero verificar todos os grupos de três (aqui é onde os 0s são importantes). Felizmente, R possui uma função de combinação integrada que retorna uma matriz, cada coluna em uma combinação.

Aplico a colSumsfunção à matriz e mantenho apenas os elementos que são iguais ao alvo fornecido.

Finalmente, como existem dois 0s, qualquer conjunto de dois números inteiros positivos será duplicado, então eu uso uma função exclusiva nas colunas.

A saída é uma matriz em que cada coluna é um conjunto de números inteiros palindrômicos positivos que somam ao valor alvo. É lento e retorna 0 quando menos de 3 elementos são usados.


11
128 bytes . +1, no entanto, bom uso de Mappara gerar palíndromos!
Giuseppe

oops, encontrou uma 126 Byter
Giuseppe

4

Gelatina , 14 bytes

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

Experimente online!

Muito, muito ineficiente.


Parece muito lento, mesmo se o alvo é o comprimento de código, para mim não é apenas o comprimento
RosLuP

@RosLuP Aqui você não pretende manter o código eficiente, aqui você deseja encurtar o código o máximo possível. Ele tem que trabalhar em teoria , não necessariamente na prática, uma vez que este é um código-golf desafio, não um código-golf com restrição de complexidade ou código-golf em tempo restrito desafio.
Erik o Outgolfer

4

Gelatina , 17 bytes

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

Experimente online!

-6 bytes graças ao HyperNeutrino.

Produz todas as formas. No entanto, a saída consiste em algumas duplicatas.


11
Há um is palindromelol
embutido

Além disso, se você usar gama normal (elevado), você pode remover os últimos 4 bytes
HyperNeutrino


@cairdcoinheringaahing Ainda não pode vencer nem Dennis nem Erik. De qualquer forma, eu vou descriptografar o URL codificado em Base64 compactado com deflação truncado ?
user202729

@ user202729 Ah, não deve ter copiado o link corretamente. O código eraRŒḂÐfṗ3R¤YS⁼¥Ðf
caird coinheringaahing


4

Mathematica, 49 bytes

#~IntegerPartitions~3~Select~AllTrue@PalindromeQ&

Experimente online!

retorna todas as soluções

-2 ~ MartinEnder ~ bytes


#~IntegerPartitions~3~Select~AllTrue@PalindromeQ&, Eu acho que?
Martin Ender


3

Java (OpenJDK 8) , 185 bytes

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

Experimente online!

Remova 1 byte do TIO para obter a quantia correta, pois o envio não contém o ;após o lambda.


Isso na minha opinião, é melhor do que tudo uma outra solução postada até agora
RosLuP

@RosLuP Por que isso, se posso perguntar?
Olivier Grégoire

Porque finalmente dar respostas para entrada> 500000 (se bem me lembro)
RosLuP

Sugerir em i++<--jvez de++i<=--j
ceilingcat

2

Próton , 117 bytes

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]

Experimente online!

Produz uma solução


920 como entrada, não retorne a saída em 1 minuto em tio ... Eu não falo de 364757698688, mas apenas 920
RosLuP:

11
@RosLuP Isso não importa. Eficiência não é uma coisa importante no código-golfe. Teoricamente, funcionará para todos os tamanhos de entrada, para que não importe; dado tempo suficiente, ele vai te dar a saída correta para 920.
HyperNeutrino

2

Pitão ,  16 12  10 bytes

ef_I#`MT./

Experimente aqui!

Como funciona

ef_I # `MT. / ~ Programa completo.

        ./ ~ Partições Inteiras.
 f ~ Filtre com uma variável T.
     `MT ~ Mapeie cada elemento de T para uma representação de string.
    # ~ Filtro.
  _I ~ É palíndromo? (ie Invariante ao contrário?)
e ~ Obtenha o último elemento.

2

05AB1E , 17 bytes

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

Experimente online!


Produz o resultado em três listas da seguinte maneira:

  • Listas palindrômicas de comprimento 1 (o número original IFF é palindrômico).

  • Listas palindrômicas de comprimento 2.

  • Listas palindrômicas de comprimento 3.


2

Axioma, 900 bytes

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

código de teste

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

Se esse código precisar decompor o número X no palíndromo 1,2,3, o que esse código faz, tente próximo ao palíndromo N <X e decomponha XN no palíndromo 2; se esta decomposição de XN tiver sucesso, retorne 3 palíndromo encontrado; se falhar, tente o palíndromo anterior G <N <X e tente decompor o XG em 2 palíndromo etc. Código Ungolf (mas é possível que haja algum bug)

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

resultados:

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

Imprime enganos, mas eles não são proibidos

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

Experimente online!



1

05AB1E , 8 bytes

ÅœR.ΔDíQ

Experimente online!

Explicação:

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

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

Experimente online!

  • grep { $_ eq .flip }, 1 .. $_ produz uma lista de todos os números palíndricos de 1 ao número de entrada.
  • 3 Rxx replica essa lista três vezes.
  • [X]reduz essa lista de listas com o operador de produtos cruzados X, resultando em uma lista de todas as três tuplas de números de palindrominco de 1 para o número de entrada.
  • first *.sum == $_ localiza a primeira dessas três tuplas que soma ao número de entrada.

Você pode salvar um byte não revertendo o xx 3.
Jo King

1

Python 3 , 106 bytes

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]

Experimente online!

No link TIO, usei uma versão mais rápida (mas com 1 byte de comprimento) que leva o primeiro resultado válido como gerador, em vez de criar a lista inteira de combinações possíveis e pegar a primeira.


0

Ruby , 84 bytes

Constrói uma lista de todas as combinações possíveis de 3 palíndromos de 0 a n, localiza o primeiro cuja soma corresponde e apaga os zeros.

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

Experimente online!


0

Adicionar ++ , 62 bytes

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

Experimente online!

~ 50 bytes jogavam golfe enquanto escrevia uma explicação. Define uma função lambda que retorna uma lista de listas contendo as soluções.

Como funciona

1,231nn

1,2,...,ngRÞggA

A próxima seção pode ser dividida em mais três partes:

BcB]
Gd‽k
dG‽k€bF

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

D,k,@@*,

Esta função basicamente não faz nada. Ele recebe dois argumentos e os agrupa em uma matriz. No entanto, a mesa rápida, é o truque de mágica aqui. É preciso duas listas e gera cada par de elementos entre essas duas listas. Então [1 2 3]e [4 5 6]gera [[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]. Ele pega seu argumento funcional (nesse caso k) e executa essa função sobre cada par, que, nesse caso, simplesmente retorna os pares como estão.

A€bF

1,23nln

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.