"Suma digital" se refiere a la suma de todos los dígitos de un número.
Por ejemplo, la suma digital de 1324
es 10
, porque 1+3+2+4 = 10
.
El desafío es escribir un programa / función para calcular el número más pequeño más grande que la entrada cuya suma digital es la entrada.
Ejemplo con tutorial
Como ejemplo, tome el 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
La salida válida sería el número más pequeño anterior, que es 18
.
Especificaciones
Tenga en cuenta que 9
este resultado no es válido para este ejemplo, porque el número invertido debe ser mayor que el número original.
Tenga en cuenta que la entrada será positiva.
Casos de prueba:
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)
Referencias
Este es OEIS A161561 .
Editar: se agregó un caso de prueba adicional (18)
Gracias a Martin Ender por el fragmento de la tabla de posiciones
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
fuente
fuente
Respuestas:
05AB1E,
19178 bytesCódigo:
Explicado:
Pruébalo en línea
Editar: guardado 9 bytes gracias a @Adnan
fuente
SO
es una forma más corta de obtener la suma de dígitos (en lugar deJ`)O
). Además, sin asignación variable, puedes hacer[>DSO¹Q#
:).Python 2, 33 bytes
Una expresión directa Crea una cadena de números con 9 al final y el resto al principio. Excepto, para un solo dígito
n
, dan+9
.Algunas salidas tienen ceros a la izquierda (
099
para18
).fuente
Retina ,
3931 bytesToma entrada en unario .
Pruébalo en línea! (Las dos primeras líneas permiten ejecutar varios casos de prueba a la vez y se convierten de decimal a unario por conveniencia).
En realidad, esto no busca el resultado linealmente, sino que lo calcula explícitamente:
n
es mayor que 9, la reemplazamos con nuevesn % 9
seguidos porn / 9
(pisos).n + 9
.Usando
!
(o cualquier otra cosa que no sea1
) como dígito unario, puedo guardar un byte más con el siguiente enfoque:Pero este formato de entrada es un poco exagerado, creo.
fuente
Pyth , 8 bytes
Banco de pruebas.
fuente
Java 7,
6861 bytesHace aproximadamente lo mismo que muchas de las otras respuestas aquí. Quería mostrar el enfoque de Java sin utilizar la manipulación de cadenas y bucles.
Gracias a FryAmTheEggman por recordarme que soy tonto;)
fuente
MATL ,
109 bytesPruébalo en línea!
Explicación
fuente
V!U
+1 de mi parte. Eso debería ir en nuestra lista de expresiones idiomáticas de MATL.JavaScript (ES7), 32 bytes
38 bytes como ES6:
fuente
Python 3,
128948474 BytesSin salida, enfoque directo, codegolfer principiante;)
fuente
print(m)
conreturn m
(no guarda ningún byte pero no tiene que imprimir en la función en sí). Todavía puede imprimir el retorno de la función de salida conprint(r(n))
para probar su funciónm=n+1;f=1
yif s==n:f=0
En realidad, 17 bytes
Pruébalo en línea!
Explicación:
fuente
;)
)C
7365 bytesUna macro con una función auxiliar.
La
e
función solo calcula potencias de diez, y laF
macro usa el mismo método de resolución que este rubí y esta respuesta de Python . lamentablemente, esmás largo queaproximadamente la misma longitud que ambas respuestas juntas. Pero es la primera respuesta de C.(8 bytes guardados por el truco de eliminación de Lynn
int
).fuente
int
, ahorrando 8 bytes.Brachylog , 8 bytes (no competidor)
=
se modificó después de que se publicó este desafío, por lo que ahora funciona en dominios posiblemente infinitos, que es el caso aquí.Explicación
Esto retrocederá
=
hasta que el valor de Salida haga que todo este predicado sea verdadero.fuente
TSQL (sqlserver 2012),
10799 bytesPruébalo en línea!
fuente
Python 2, 39 bytes
Aritmética entera pura.
Programa completo con salida
Salida:
fuente
eval
PowerShell v2 +, 62 bytes
Toma entrada y
$n
luego ejecuta unfor
bucle. Inicializamos el ciclo configurando nuestro número objetivo$a
, para que sea uno más grande que$n
(ya que tiene que ser más grande, además de que esto garantiza que1..9
funcione correctamente). Cada ciclo que incrementamos$a++
. Nada sucede en el bucle propiamente dicho, pero el condicional es donde ocurre la lógica del programa. Literalmente estamos tomando el número objetivo como una cadena, convirtiéndolo como una matriz de caracteres,-join
agregando la matriz+
y luego canalizándola aiex
(similar aeval
). Probamos si es igual a nuestro número de entrada o no, y continuamos haciendo el bucle correspondiente. Una vez que hemos salido del ciclo, hemos llegado a donde nuestro número objetivo es la suma de dígitos igual a nuestro número de entrada, por lo que$a
se coloca en la tubería y la salida es implícita.Como referencia, aquí está el método de "construir una cadena con el número apropiado de 9" que otras personas han hecho, a 67 bytes
o el método de "aritmética de enteros puros" que otras personas han hecho, a 70 bytes
Ninguno de los dos es más corto, pero los dos son más interesantes.
fuente
param($n)for($a=$n+1;([char[]]"$a"-join'+'|iex)-$n){$a++}$a
Pyke,
987 bytes, no competidor - usa una versión más recientePruébalo aquí!
fuente
1
. Por cierto, ¿por qué surgeMissing arg to Equals, evaling input
? Quiero decir que le doy un número de entradaJavaScript (ES2015),
453933 bytesAhorré otros 6 bytes gracias a @Conor O'Brien y @Shaun H.
Creo que lo dejaré como está, porque esta versión difiere de la respuesta de @ Neil al usar
String.repeat()
.Versión anterior (guardado 6 bytes gracias a @Qwertiy):
Primera versión:
fuente
~~(v/9)
=>v/9|0
,'1'+v-1
=>v+9
v <= 9
. Pensaré si puedo devolver todos los valores numéricos, que podrían ser otro byte-saver (no .repeat () y envolviendo el valor de retorno en + ()).v>9
es 2 bytes más corto, elstring.repeat
piso será un valor decimal no|0
necesario**
por supuesto.Lua, 52 bytes
Se debe guardar en un archivo y ejecutar con el intérprete de Lua, p. Ej.
lua <file> <input number>
También puedes probarlo aquí: https://repl.it/CXom/1
(En la respuesta, el número de entrada está codificado para facilitar la prueba)
fuente
n>9
que funcione correctamente, primero debe ser forzado a un número....+0>9
funcionaría?Raqueta 70 caracteres, 71 bytes
El mismo algoritmo que la mayoría de los demás. Bastante triste por no tener% para módulo, o ** para expt, o división entera por defecto, de lo contrario, esto podría ser mucho más corto y podría haber superado a C y Java. Aunque todavía amo el idioma
fuente
Hexagonía ,
40 3130 bytesO, si prefiere que su código sea un poco menos lineal y un poco más poligonal:
Pruébalo en línea!
Gracias a @FryAmTheEggman por algunas ideas e inspiración: o)
Versión previa:
<.:->+_.!(..'!.\><9!%>@.{.}|.?"
Versión anterior:
<><.-_|@"'!{|(.9+!8=@>{/".'/:!?$.%\1$..\
fuente
Perl 6 ,
3829 bytes(aparentemente el enfoque directo es más corto)
Explicación:
Prueba:
fuente
Java 10,
11462 bytesPruébalo en línea.
EDITAR:
13073 bytes sin ceros a la izquierda (Gracias a @ levanth` ):Pruébalo en línea.
Explicación:
fuente
String c(int n){return""+(n>9?(n%9)+s(n):n+9);}
conint c(int n){return Integer.parseInt((n>9?(n%9)+s(n):n+9));}
""+
inint c(int n){return Integer.parseInt(""+(n>9?(n%9)+s(n):n+9));}
Rubí, 33 bytes
Esta es una versión aritmética int que resulta ser la misma que la respuesta python de xnor. Es una función anónima que toma y devuelve un int.
fuente
MathGolf ,
87 bytesPruébalo en línea!
Entrada implícita yay.
Explicación:
fuente
k
).Rubí, 38 bytes.
Esta respuesta devuelve una cadena o int dependiendo del tamaño de entrada. Es una solución recursiva que pide una solución por 9 menos y luego agrega un "9" al final.
Ruby, 39 bytes
Para un byte más, esta respuesta siempre devuelve un int. mismo algoritmo que el anterior pero con números.
fuente
C, 80 bytes
Intente sin golf en línea
fuente
PHP, 77 caracteres
fuente
Oracle SQL 11.2,
165bytesSin golf
fuente
Python 3 55 Bytes
Toma dos argumentos que son iguales
es decir, para llamarlo usarías f (x, x)
fuente
Japt , 9 bytes
Intentalo
fuente
Powershell, 54 bytes
Script de prueba:
Salida:
Expansión
[$_-gt9]
devuelve un primer dígito y una cola$_%9
)'9'*(($_-$_%9)/9))
($_+9)
fuente