"Soma digital" refere-se à soma de todos os dígitos de um número.
Por exemplo, a soma digital de 1324
é 10
, porque 1+3+2+4 = 10
.
O desafio é escrever um programa / função para calcular o menor número maior que a entrada cuja soma digital é a entrada.
Exemplo com explicação passo a passo
Como exemplo, considere o número 9
como entrada:
9 = 1+8 -> 18
9 = 2+7 -> 27
9 = 3+6 -> 36
...
9 = 8+1 -> 81
9 = 9+0 -> 90
A saída válida seria o menor número acima, que é 18
.
Especificações
Observe que 9
não é a saída válida para este exemplo, porque o número revertido deve ser maior que o número original.
Observe que a entrada será positiva.
Casos de teste:
2 => 11 (2 = 1 + 1)
8 => 17 (8 = 1 + 7)
12 => 39 (12 = 3 + 9)
16 => 79 (16 = 7 + 9)
18 => 99 (18 = 9 + 9)
24 => 699 (24 = 6 + 9 + 9)
32 => 5999 (32 = 5 + 9 + 9 + 9)
Referências:
Este é o OEIS A161561 .
Editar: adicionada uma caixa de teste adicional (18)
Agradecimentos a Martin Ender pelo snippet da tabela de classificação
var QUESTION_ID=81047,OVERRIDE_USER=31373;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
code-golf
arithmetic
levanth
fonte
fonte
Respostas:
05AB1E,
19178 bytesCódigo:
Explicado:
Experimente online
Editar: salvou 9 bytes graças a @Adnan
fonte
SO
é uma maneira mais curta de obter a soma dos dígitos (em vez deJ`)O
). Além disso, sem atribuição de variável, você pode fazer[>DSO¹Q#
:).Python 2, 33 bytes
Uma expressão direta. Cria uma sequência numérica com 9 no final e o restante no início. Exceto, para um dígito
n
, dán+9
.Algumas saídas têm zeros à esquerda (
099
para18
).fonte
Retina ,
3931 bytesRecebe entrada em unário .
Experimente online! (As duas primeiras linhas permitem executar vários casos de teste ao mesmo tempo e converte de decimal em unário por conveniência.)
Na verdade, isso não procura o resultado linearmente, mas o calcula explicitamente:
n
for maior que 9, substituí-la porn % 9
seguida porn / 9
nove (no chão).n + 9
.Usando
!
(ou qualquer outra coisa que não seja1
) como o dígito unário, posso salvar mais um byte com a seguinte abordagem:Mas esse formato de entrada é um pouco exagerado, eu acho.
fonte
Pitão , 8 bytes
Suíte de teste.
fonte
Java 7,
6861 bytesFaz aproximadamente a mesma coisa que muitas das outras respostas aqui. Queria mostrar a abordagem Java sem usar manipulação e loops de string.
Agradeço a FryAmTheEggman por me lembrar que sou burra;)
fonte
MATL ,
109 bytesExperimente online!
Explicação
fonte
V!U
+1 de mim. Isso deve constar em nossa lista de idiomas MATL.JavaScript (ES7), 32 bytes
38 bytes como ES6:
fonte
Python 3,
128948474 bytesSem saída, abordagem direta, codegolfer iniciante;)
fonte
print(m)
porreturn m
(não salva bytes, mas não precisa imprimir na própria função). Você ainda pode imprimir a função de retorno de saída comprint(r(n))
a testar a sua funçãom=n+1;f=1
eif s==n:f=0
Na verdade, 17 bytes
Experimente online!
Explicação:
fonte
;)
)C
7365 bytesUma macro com uma função auxiliar.
A
e
função apenas calcula potências de dez, e aF
macro usa o mesmo método de solução que esse ruby e essa resposta python . infelizmente, émais longo queo mesmo comprimento das duas respostas. Mas é a primeira resposta C.(8 bytes salvos pelo truque de remoção de Lynn
int
.)fonte
int
, economizando 8 bytes.Brachylog , 8 bytes (Não concorrente)
=
foi modificado após o lançamento deste desafio, para que agora funcione em domínios possivelmente infinitos, como é o caso aqui.Explicação
Isso voltará
=
até que o valor de Output torne todo esse predicado verdadeiro.fonte
TSQL (sqlserver 2012),
10799 bytesExperimente online!
fonte
Python 2, 39 bytes
Aritmético inteiro puro.
Programa completo com saída
Saída:
fonte
eval
PowerShell v2 +, 62 bytes
Recebe entrada
$n
e executa umfor
loop. Inicializamos o loop definindo nosso número de destino,,$a
para ser um número maior que$n
(já que ele precisa ser maior, além disso, garante que1..9
funcione corretamente). Cada loop incrementamos$a++
. Nada acontece no loop adequadamente, mas o condicional é o local onde a lógica do programa acontece. Estamos literalmente pegando o número de destino como uma string, lançando-o como um array de caracteres,-join
inserindo o array em um+
pipelineiex
(semelhante aeval
). Testamos se é igual ao nosso número de entrada ou não e continuamos fazendo o loop de acordo. Depois que saímos do loop, chegamos ao ponto em que nosso número de destino é soma de dígitos igual ao nosso número de entrada, então$a
é colocado no pipeline e a saída é implícita.Para referência, aqui está o método "construir uma string com o número apropriado de 9" que outras pessoas fizeram, em 67 bytes
ou o método "aritmética de número inteiro puro" que outras pessoas fizeram, a 70 bytes
Nenhum dos quais é mais curto, mas ambos são mais interessantes.
fonte
param($n)for($a=$n+1;([char[]]"$a"-join'+'|iex)-$n){$a++}$a
Pyke,
987 bytes, não concorrente - usa a versão mais recenteExperimente aqui!
fonte
1
. Btw por queMissing arg to Equals, evaling input
surge? Quero dizer, dou-lhe um número de entradaJavaScript (ES2015),
4539.33 bytesSalvou outros 6 bytes graças a @Conor O'Brien e @Shaun H.
Acho que vou deixar como está, porque esta versão difere da resposta de @ Neil usando
String.repeat()
.Versão anterior (salva 6 bytes graças a @Qwertiy):
Primeira versão:
fonte
~~(v/9)
=>v/9|0
,'1'+v-1
=>v+9
v <= 9
. Penso que se eu puder retornar todos os valores numéricos, que poderiam ser outro economizador de bytes (sem .repeat () e agrupar o valor de retorno em + ()).v>9
2 bytes é mais curto,string.repeat
andar vontade um valor decimal não|0
necessário**
claro.Lua, 52 bytes
Era para ser salvo em um arquivo e executado com o intérprete Lua, por exemplo
lua <file> <input number>
Você também pode tentar aqui: https://repl.it/CXom/1
(No repl.it, o número de entrada é codificado para facilitar o teste)
fonte
n>9
funcionar corretamente, ele precisa ser coagido a um número primeiro....+0>9
funcionaria?Raquete 70 caracteres, 71 bytes
Mesmo algoritmo que a maioria dos outros. Muito triste por não ter% para módulo, ou ** para expt, ou divisão inteira por padrão, caso contrário, isso poderia ser muito mais curto e eu poderia ter superado C e Java. Ainda amo o idioma
fonte
Hexagonia ,
40 3130 bytesOu, se você preferir que seu código seja um pouco menos linear e um pouco mais poligonal:
Experimente online!
Obrigado a @FryAmTheEggman por algumas idéias e inspiração: o)
Versão anterior:
<.:->+_.!(..'!.\><9!%>@.{.}|.?"
Versão anterior:
<><.-_|@"'!{|(.9+!8=@>{/".'/:!?$.%\1$..\
fonte
Perl 6 ,
3829 bytes(aparentemente a abordagem direta é mais curta)
Explicação:
Teste:
fonte
Java 10,
11462 bytesExperimente online.
EDIT:
13073 bytes sem zeros à esquerda (Graças a @ levanth` ):Experimente online.
Explicação:
fonte
String c(int n){return""+(n>9?(n%9)+s(n):n+9);}
comint c(int n){return Integer.parseInt((n>9?(n%9)+s(n):n+9));}
""+
emint c(int n){return Integer.parseInt(""+(n>9?(n%9)+s(n):n+9));}
Ruby, 33 bytes
Esta é uma versão aritmética int que, por acaso, é igual à resposta python do xnor. É uma função anônima que recebe e retorna um int.
fonte
MathGolf ,
87 bytesExperimente online!
Entrada implícita yay.
Explicação:
fonte
k
).Ruby, 38 bytes
Esta resposta retorna uma string ou int, dependendo do tamanho da entrada. É uma solução recursiva que pede uma solução para menos 9 e depois adiciona um "9" ao final.
Ruby, 39 bytes
Para mais um byte, essa resposta sempre retorna um int. mesmo algoritmo acima, mas com números.
fonte
C, 80 bytes
Tentativa sem golfe online
fonte
PHP, 77 caracteres
fonte
Oracle SQL 11.2,
165bytesSem golfe
fonte
Python 3 55 bytes
Toma dois argumentos que são iguais
ou seja, para chamá-lo, você usaria f (x, x)
fonte
Japonês , 9 bytes
Tente
fonte
Powershell, 54 bytes
Script de teste:
Saída:
Expalantion
[$_-gt9]
retorna um primeiro dígito e uma cauda$_%9
)'9'*(($_-$_%9)/9))
($_+9)
fonte