Somando os dígitos e os dígitos invertidos


26

Dado um número> 0, imprima a soma com todos os dígitos (1 .. n) concatenados e revertidos e adicione-os. Por exemplo, com n = 6:

Os números 1 a 6 concatenaram:

123456

Invertida:

654321

Somando-os juntos, resultará em: 777777. Outro exemplo é n = 11:

1 2 3 4 5 6 7 8 9 10 11 > 1234567891011

e

11 10 9 8 7 6 5 4 3 2 1 > 1110987654321

Adicioná-los juntos resultará em 2345555545332. Isso também é conhecido como A078262 .

O menor código vence!



Existe um limite para n, ou temos que suportar números inteiros arbitrariamente grandes?
LegionMammal978

Eu acho que o padrão é "delimitado por max(256,yourlanguagesdefaultintegertypelimit)". Mas isso deve ser especificado.
CalculatorFeline

@ LegionMammal978 Tão alto quanto o seu idioma suporta.
Lamaro 22/02

Caso de teste importante:, o 10que deve dar 23333333231.
Adnan

Respostas:


9

05AB1E, 7 bytes

LDRJsJ+

Experimente online.

Explicação

LDRJsJ+

L        range from 1 .. input
 D       duplicate
  R      reverse
   JsJ   convert both arrays to strings
      +  add (coerces both strings to ints)

Sinto-me muito confuso com a opção de design que leva a +listas a fazer uma adição aninhada, enquanto que para seqüências de caracteres converte em ints e depois adiciona. Mas acho que deu certo aqui! : P
FryAmTheEggman 22/02

@FryAmTheEggman No entanto, vou remover a adição aninhada. Nunca foi útil desde o momento o tiver implementado ...
Adnan

3
Caramba, deixo o PPCG por duas horas e você se renome do Aqua Tart enquanto eu estiver fora ... Oh, a vida de um usuário do PPCG.
ETHproductions



4

Pitão, 12 10 bytes

ssMjLk_BSQ

Obrigado a @FryAmTheEggman por 2 bytes!

Qé a entrada, Stransforma-o em [1, 2, ..., input()], _Bbifurca-a sobre _(reverso) para criar [rng, rev(rng)], jLkmapeia-lo ao longo joinde k(que é a variável "vazio string"), sMmapeia intsobre esta matriz resultante, e s, finalmente, calcula a soma.


4

JavaScript (ES6), 70 67 64 bytes

a=>(z=[...Array(a)].map((b,c)=>c+1)).join``- -z.reverse().join``

Corrigido para atender aos requisitos, pois o código antigo foi criado com o entendimento incorreto da entrada.


@TimmyD Adicionada uma explicação.
Mwr247

@TimmyD OH! > _ <Meu mal-entendido do desafio é como ... Sim, vou ter que consertar isso.
Mwr247

@ TimmyD Demorei bastante para voltar a ficar online. Está consertado agora, e obrigado por entender isso.
Mwr247

Como observado em outra resposta, isso só funciona se o parâmetro a é entre 1 e 12, que é realmente muito pouco
edc65

@ edc65 Pelo comentário do OP , isso é grande o suficiente.
Mwr247

3

Python 3, 74

Economizou 6 bytes graças ao DSM.

Nada muito emocionante, junte-se aos intervalos e depois converta para ints e adicione-os.

lambda x:sum(int(''.join(list(map(str,range(1,x+1)))[::i]))for i in(1,-1))

3

Retina , 71

Porque é descaradamente a ferramenta errada para o trabalho.

.+
$*a:$&$*
+`^(a+)a\b(.*)\b1(1+)$
$1 $& $3
 ?(\w)+ ?
$#1
\d+:?
$&$*c
c

Experimente online.

Funciona para entradas de até 6, mas o intérprete on-line atinge o tempo limite depois disso.


1
Você pode reduzi-lo para 74 removendo a última linha e alterando (c)+para c.
Daavko

@daavko sim, claro, obrigado!
Digital Trauma

Além disso, $&$*c-> $*ce \d+:?-> \d+e é 70. E por alguma razão ele continua trabalhando ...
daavko


3

JavaScript (ES6), 67 66 bytes

n=>(a=[...Array(n+1).keys()].slice(1)).join``- -a.reverse().join``

Sim, isso é um espaço. Ugh. Pelo menos, o @Downgoat me ajudou a salvar um byte.


1
Você pode remover o primeiro +e criar o + +-> - -para salvar um byte
Downgoat

n => (a = [... Matriz (n)]. map (_ => n -)). join- -a.reverse().join
edc65 23/02

Nota: usando aritmética js simples, isso é limitado aos valores 1 .. 12
edc65 23/02

2

Sério, 12 bytes

,R;Rεj≈@εj≈+

Experimente online!

Explicação:

,R;Rεj≈@εj≈+
,R;           push two copies of range(1, input()+1)
   R          reverse one copy
    εj≈@εj≈   concatenate both and cast both to ints
           +  add

2

PowerShell, 35 bytes

param($a)+-join(1..$a)+-join($a..1)

Converte a entrada em faixas com .., então -joinas junta e as adiciona.

Trabalhará para números de entrada de até 138, while 139dará Infinitye 140e acima exibirá um erro de conversão incrivelmente detalhado:

Cannot convert value "12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413
5136137138139140" to type "System.Int32". Error: "Value was either too large or too small for an Int32."


2

JavaScript (ES6), 99

Isso adiciona dígito por dígito, para que ele possa manipular números bem acima dos 53 bits de precisão do javascript

n=>eval("for(a=b=c=r='';n;a+=n--)b=n+b;for(i=a.length;i--;r=c%10+r)c=(c>9)-(-a[i]-b[i]);c>9?1+r:r")

Teste

f=n=>eval("for(a=b=c=r='';n;a+=n--)b=n+b;for(i=a.length;i--;r=c%10+r)c=(c>9)-(-a[i]-b[i]);c>9?1+r:r")

// Less golfed
U=n=>{
  for(a=b=c=r=''; n; --n)
      b=n+b, a+=n;
  for(i=a.length; i--; r = c%10+r) 
      c=(c>9)-(-a[i]-b[i]);
  return c>9? 1+r : r;
}

function test() {
  var n=+I.value
  R.textContent=f(n)
}  

test()
N: <input id=I value=11 oninput="test()"> -> <span id=R></span>


Parece não funcionar para 9. Além disso, por que não inicializar ccom as outras variáveis?
Neil

Você tem o meu voto.
Neil


2

MATL , 13 bytes

:tP2:"wVXvU]+

EDIT (20 de maio de 2016) O código no link usa, em Xzvez de Xv, devido a alterações recentes no idioma.

Experimente online!

:                % range [1,2,...,n], where n is input
 tP              % duplicate and flip
   2:"     ]     % do this twice
      w          % swap
       V         % convert array of numbers to string with numbers and spaces
        Xv       % remove spaces
          U      % convert to number
            +    % add the two numbers

Não funciona para 11 ou 10. (Dica: gama inversa antes de converter a string.)
Mama Fun Rolo

@ Obrigado! Corrigido
Luis Mendo

Ótimo! Tenha um voto positivo.
Mama Fun Roll

2

05AB1E , 5 bytes

LJDR+

Explicação:

L     # Pushes an array containing 1 .. [implicit] input
 J    # Join the array to a string (eg. [1, 2, 3] -> 123)
  D   # Duplicate the array
   R  # Reverse the duplicate
    + # Add them together

Experimente online!


1

Bash + coreutils, 39

eval echo {1..$1} + {$1..1}|tr -d \ |bc

Ou:

bc<<<`eval printf %s {1..$1} + {$1..1}`

Ideone.


1

Perl 6 , 25 bytes

{([~] @_=1..$^n)+[R~] @_}
{
  (
    [~]           # reduce with the string concatenation infix op:
    @_ = 1 .. $^n # the range 1 to input ( also stored in @_ )
  )
  +               # add that to
  [R~] @_         # @_ reduced in reverse
}

Uso:

for 6, 11, 12 -> $n {
  say {([~] @_=1..$^n)+[R~] @_}( $n )
}
777777
2345555545332
244567776755433

Eu acho que você pode fazer com em $nvez de$^n
andlrc

@ dev-null Não se eu quiser que seja uma entrada para o bloco. o -> $n {é diferente $^n.
Brad Gilbert b2gills

1

R, 34 60 64 bytes

f=pryr::f;g=f(as.numeric(paste(x,collapse='')));f(g(1:n)+g(n:1))

Assume que o pryrpacote está instalado. isso fornece fuma abreviação para criar funções.

Editar adicionou 26 bytes, mas retorna uma função que funciona, não algo totalmente errado.

O Edit adicionou outros 4 bytes para lidar com casos acima de n = 10 em que strtoi (usado anteriormente) estava retornando NA


1

Lua, 57

a=''b=''for i=1,...do a=a..i b=b.. ...-i+1 end return a+b

1

Lua, 53 bytes

Este programa usa ncomo argumento da linha de comando.

s=""r=s for i=1,arg[1]do r,s=i..r,s..i end print(s+r)

Eu assumi que a saída de um número com uma parte decimal de 0 era boa (no formulário, 777777.0porque esta é a maneira padrão de gerar um número em lua (não há distinção entre número inteiro e número flutuante)


Não é a própria string que está invertida, mas os dígitos. Seu código falha em n> = 10.
Moop

@Moop Corrigido ao preço de 1 byte ^^ '. Obrigado pelo comentário ^^ '
Katenkyo 23/02

Você pode economizar mais 3 usando ... em vez de arg [1] bom trabalho no concat reverso para r, não pensei nisso na minha resposta. +1
Moop

@Moop Eu vi seu post, bom uso dele, eu nem sabia que você poderia usar ...assim! Vou mantê-lo assim por enquanto, porque não posso usar nada além do compilador on-line e ele não pode lidar com isso (eu gostaria de testá-lo e brincar com ele um pouco antes de colocá-lo em um resposta :))
Katenkyo

1

Perl 5, 37 bytes

25 bytes, mais 1 para -pe 11 para-MList::Gen

$_=<[.]1..$_>+<[R.]1..$_>

Solução anterior, 40 bytes: 39, mais um para -p

@a=reverse@_=1..$_;$"=$\;$_="@a"+"@_"

1

Perl, 36 bytes

Inclui +1 para -p

Executar com STDIN

perl -p reverse.pl <<< 6

reverse.pl

$_=eval join"",map{abs||"+"}-$_..$_

1

Dyalog APL , 17 bytes

+/⍎¨∊¨⍕¨¨x(⌽x←⍳⎕)

prompt para entrada
'enumerar até que a entrada
x←lista loja em x
x reverter
x(... )preceder lista revertida com lista original
⍕¨¨converter cada número de cada lista em cadeia de caracteres
∊¨fazer com que cada lista de cadeias de caracteres em cadeias de caracteres individuais
⍎¨converter cada cadeia de caracteres em um número
+/soma dos dois números .


0

Mathematica, 64 bytes

Plus@@FromDigits/@#&[""<>ToString/@#&/@{#,Reverse@#}&[Range@#]]&

0

Retina, 80 bytes (codificação ISO 8859-1)

'+
$0¶$0
+`^(('+)')
$2 $1
+`('('+))$
$1 $2
(')+( |$)?
$#1
(\d+)¶(\d+)
$1$*'$2$*'

IO é unário com 'o caractere de contagem. Em teoria, suporta qualquer número inteiro que você lançar, na prática ... o intérprete on-line se recusa a processar qualquer coisa maior que 6 (unário '''''').

Experimente online!
Experimente online! (IO decimal - 91 bytes)


0

, 12 caracteres / 15 bytes

⨭⟮⩤⁽1ï⟯⨝,Ⅰᴚ⨝

Try it here (Firefox only).

Meh.

Explicação

Toma um intervalo [1,input], junta-se a ele; pega o mesmo intervalo, inverte-o e depois junta-se a ele; a soma de ambos os intervalos é o resultado.


0

Ruby, 40 caracteres

->n{eval (l=[*1..n])*''+?++l.reverse*''}

Exemplo de execução:

irb(main):001:0> ->n{eval (l=[*1..n])*''+?++l.reverse*''}[11]
=> 2345555545332

irb(main):002:0> ->n{eval (l=[*1..n])*''+?++l.reverse*''}[6]
=> 777777

0

C #, 126 bytes

using System.Linq;a=>{var b=Enumerable.Range(1,a);return long.Parse(string.Concat(b))+long.Parse(string.Concat(b.Reverse()));}

Possivelmente poderia ser jogado ainda mais. Não tenho certeza.


0

Groovy, 42 39 caracteres

{[1..it,it..1]*.join()*.toLong().sum()}

Exemplo de execução:

groovy:000> ({[1..it,it..1]*.join()*.toLong().sum()})(11)
===> 2345555545332

groovy:000> ({[1..it,it..1]*.join()*.toLong().sum()})(6)
===> 777777
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.