查找大于数字输入为输入的输入的最小数字


28

“数字总和”是指一个数字中所有数字的总和。

例如,的数字总和132410,因为1+3+2+4 = 10

面临的挑战是编写一个程序/函数来计算比数字总和为输入的输入大的最小数字。

演练示例

例如,以数字9作为输入:

9 = 1+8 -> 18
9 = 2+7 -> 27
9 = 3+6 -> 36
...
9 = 8+1 -> 81
9 = 9+0 -> 90

有效输出将是上面的最小数字,即18

眼镜

请注意,这9不是此示例的有效输出,因为反转的数字必须大于原始数字。

请注意,输入将为正。

测试用例:

 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)

参考文献:

这是OEIS A161561

编辑:添加了一个额外的测试用例(18)

感谢Martin Ender提供的排行榜摘要

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>


11
这个头衔使我的大脑受伤。
致命

Answers:


4

05AB1E,19 17 8字节

码:

[>DSO¹Q#

解释:

[            # start infinite loop
 >           # increase loop variable, will initially be input
  DSO        # make a copy and sum the digits
     ¹Q#     # if it equals the input, break
             # else return to start of loop
             # implicitly print

在线尝试

编辑:由于@Adnan,节省了9个字节


4
SO是获得数字总和(而不是J`)O)的较短方法。另外,无需变量分配,您可以执行[>DSO¹Q#:)。
阿德南

2
@Adnan。真好!我完全想念S。应该意识到我不需要变量。
Emigna '16

14

Python 2,33个字节

lambda n:[n+9,`n%9`+n/9*'9'][n>9]

直接表达。生成一个数字字符串,该数字字符串的末尾有9,其余部分在开始。除了,对于一位数n,给出n+9

一些输出有前导零(09918)。


7

视网膜39 31字节

r`1{1,9}
$.&
T`d`_d`^.$
^.$
1$&

接受一元输入。

在线尝试!(前两行允许一次运行多个测试用例,并为方便起见从十进制转换为一进制。)

这实际上不是线性搜索结果,而是显式计算结果:

  • 如果输入n大于9,我们将其替换为(n % 9后跟n / 9)(加水的)9。
  • 否则,我们将其替换为n + 9

使用!(或其他任何非1)作为一进制数字,我可以使用以下方法再保存一个字节:

^!(?!!{9})
1
r`!{0,9}
$.&
0\B

但是,我认为这种输入格式有点麻烦。


那么Retina不允许整数输入还是不能处理整数算术?
levanth'6

@levanth Retina根本没有算术-整个语言都是基于通过正则表达式进行的字符串处理,因此所有算术通常都是在一元表示形式上完成的。Retina 可以接受十进制整数输入,然后先将其转换为一进制,但这会增加6个字节,并且我们的策略允许一元输入,除非质询指定了十进制。(如果您宁愿要求所有答案都采用小数输入,请在规范中随意声明,我​​将更新我的答案。)
Martin Ender

不,不,还好吧^^我只是对一元输入感到好奇
levanth,2016年

6

Pyth,8个字节

fqQsjT;h

测试套件。

fqQsjT;h

f      h first number T from (input+1) onward where:
 qQ          the input is equal to
   s         the sum of
    jT;      the base-10 representation of T

6

Java 7,68 61字节

int f(int n){return n>9?-~(n%9)*(int)Math.pow(10,n/9)-1:n+9;}

与这里的许多其他答案大致相同。想要展示Java方法而不使用字符串操作和循环。

感谢FryAmTheEggman提醒我我很傻;)


至少您超越了SQL?
Rɪᴋᴇʀ

嗯,这里的答案只有大多数python / ruby​​回答的两倍,所以对于Java来说我现在还不错。击败C真是太好了:P
Geobits '16

:/糟糕,是从我的课堂上得到的。我对此很生疏。
Geobits,2016年

@Geobits可能会击败C--。
gcampbell '16

@Fry完全忘了那个把戏。谢谢,这使我至少比C领先;)
Geobits,2016年

3

MATL10 9字节

`QtV!UsG-

在线尝试!

说明

`        % Do...while
  Q      %   Add 1. Takes input implicitly the first time
  t      %   Duplicate
  V!Us   %   To string, transpose, to number, sum. Gives sum of digits
  G-     %   Subtract input. If 0, the loop ends and the stack is implicitly displayed

1
巧妙地使用V!U+1。那应该列入我们的MATL习语列表中。
Suever,2016年

@Suever是的,被经常使用
路易斯Mendo

3

JavaScript(ES7),32个字节

n=>(n%9+1)*10**(n/9|0)-(n>9||-8)

38字节作为ES6:

n=>parseFloat(n%9+1+'e'+n/9)-(n>9||-8)

3

Python 3,128 94 84 74字节

没有输出,直接处理,初学者;)

def r(n):
 m=n
 while 1:
  m+=1
  if sum(map(int,str(m)))==n:return(m)

1
对于初学者来说,有很多空间可以删除。例如,在= +()之前/之后。
Emigna

1
您也可以替换print(m)return m(不保存任何字节,但不必在函数本身中打印)。您仍然可以打印输出函数return print(r(n))以测试您的功能
levanth

1
您还可以删除许多换行符;m=n+1;f=1if s==n:f=0
Blue

1
当用return替换print时,可以直接在if语句中执行操作,并删除f以及else语句。
Emigna '16

2
您仍然可以删除f并仅使用1时使用:,还可以删除int(c)与for之间的空格
Emigna '16

2

其实是17个位元组

╗1`;$♂≈Σ╜;)=)>*`╓

在线尝试!

说明:

╗1`;$♂≈Σ╜;)=)>*`╓
╗                  save input to reg0
 1`;$♂≈Σ╜;)=)>*`╓  first integer n (>= 0) where:
   ;$♂≈Σ╜;)=         the base-10 digital sum equals the input and
            )>*      is greater than the input

这个答案很好,因为它很轻浮(;)
Fund Monica的诉讼

2

C 73 65字节

具有辅助功能的宏。

e(y){return y?10*e(y-1):1;}
#define F(n) n<9?n+9:(1+n%9)*e(n/9)-1

e函数仅计算10的幂,并且F宏使用与此ruby此python答案相同的求解方法。可悲的是,它的长度大于这两个答案的总和。但这是第一个C答案。

(Lynn的删除技巧节省了8个字节int。)


您可以删除这两个事件int,节省8个字节。
林恩

2

Brachylog,8个字节(不竞争)

<.=:ef+?

= 在发布此挑战后进行了修改,因此它现在可以在可能无限的域上工作,在这种情况下就是这样。

说明

<.       Output > Input
  =      Label the Output (i.e. unify it with an integer)
   :ef   Get the list of digits of the Output
      +? Input is the sum of all those digits

这将=一直追溯到Output的值使整个谓词为true为止。


2

TSQL(sqlserver 2012),107 99字节

DECLARE @ INT = 32

,@2 char(99)WHILE @>0SELECT
@2=concat(x,@2),@-=x FROM(SELECT IIF(@>9,9,IIF(@2>0,@,@-1))x)y PRINT @2

在线尝试!


1
哇!没想到!
levanth

1

Python 2,39个字节

lambda n:[n+9,(1+n%9)*10**(n/9)-1][n>9]

纯整数运算。

带输出的完整程序

f=lambda n:[n+9,(1+n%9)*10**(n/9)-1][n>9]

print(f(2))
print(f(8))
print(f(12))
print(f(16))
print(f(17))
print(f(18))
print(f(24))
print(f(32))

输出:

11
17
39
79
89
99
699
5999

I like the way that this formulation avoids the leading zero.
Neil

@Neil the other one could avoid it by using eval
Blue

1

PowerShell v2+, 62 bytes

param($n)for($a=$n+1;([char[]]"$a"-join'+'|iex)-ne$n;$a++){}$a

Takes input $n then executes a for loop. We initialize the loop by setting our target number, $a, to be one larger than $n (since it has to be bigger, plus this ensures 1..9 work correctly). Each loop we increment $a++. Nothing happens in the loop proper, but the conditional is where the program logic happens. We're literally taking the target number as a string, casting it as a char-array, -joining the array with + and then piping it to iex (similar to eval). We test whether that's equal to our input number or not, and continue looping accordingly. Once we've exited the loop, we've reached where our target number is digit-sum equal to our input number, so $a is placed on the pipeline and output is implicit.


For reference, here's the "construct a string with the appropriate number of 9's" method that other folks have done, at 67 bytes

param($n)(($n+9),(+(""+($n%9)+'9'*(($n/9)-replace'\..*'))))[$n-gt9]

or the "pure integer arithmetic" method that other folks have done, at 70 bytes

param($n)(($n+9),("(1+$n%9)*1e$(($n/9)-replace'\..*')-1"|iex))[$n-gt9]

Neither of which are shorter, but both of which are more interesting.


You can save 3 bytes: param($n)for($a=$n+1;([char[]]"$a"-join'+'|iex)-$n){$a++}$a
mazzy

1

Pyke, 9 8 7 bytes, non-competing - uses more recent version

.fhsq)h

Try it here!

.f      - first where true:
  h     - n+1
   sq    - digital_root(^) == input()
      h - that number +1

Tested again, your solution gives not the correct output for the inputs 1 to 8
levanth

I think I broke it... Works except for the number 1. Btw why does Missing arg to Equals, evaling input come up? I mean I give it an input number
levanth

@levanth That happens because by default the web interface has warnings turned on. I've just coded a way to turn that off (like 10 mins ago). As for why it didn't work for 1, I was checking to see if the number was bigger than 10 and if so continuing.
Blue

1

JavaScript (ES2015), 45 39 33 bytes

Saved another 6 bytes thanks to @Conor O'Brien and @Shaun H.
I think I'll leave it as is, because this version differs from @Neil's answer by using String.repeat().

v=>+(v>9?v%9+'9'.repeat(v/9):v+9)

Previous version (saved 6 bytes thanks to @Qwertiy):

f=v=>+(v/9>1?v%9+'9'.repeat(v/9|0):v+9)

First version:

f=v=>+(v/9>1?v%9+'9'.repeat(~~(v/9)):'1'+v-1)

1
~~(v/9) => v/9|0, '1'+v-1 => v+9
Qwertiy

@Qwertiy Thank you very much. I need to learn more about bitwise operators. About the second change, it looks like I overcomplicated the case for v <= 9. I'll think if I can return all numeric values, which could be another byte-saver (no .repeat() and wrapping return value in +()).
Leibrug

You don't need to name the function as per our rules
Conor O'Brien

1
v>9 is 2 bytes shorter, string.repeat will floor a decimal value no |0 needed
Shaun H

Also differs from my answer by not using ** of course.
Neil

1

Lua, 52 bytes

n=...+0
print(n>9 and(n%9)..string.rep(9,n/9)or n+9)

Meant to be saved in a file and run with the Lua interpreter, e.g. lua <file> <input number>

You can also try it here: https://repl.it/CXom/1

(On repl.it the input number is hard-coded for ease of testing)


What does the '...+0' do...? Does it cast the input to an integer?
Yytsi

1
Yep, to a number (Lua before 5.3 only used doubles, like JavaScript). Lua will automatically convert strings to numbers in expressions, but not comparisons. So in order for n>9 to work properly it needs to be coerced to a number first.
PiGuy

+1! I see. So ...+0>9 would work?
Yytsi

1
Yep! It would :)
PiGuy

1

Racket 70 characters, 71 bytes

Same algorithm as most of the others pretty much. Pretty sad about not having % for modulo, or ** for expt, or integer division by default, otherwise this could be a lot shorter and I could've outgolfed C and Java. Still love the language though

(λ(x)(if(> x 9)(-(*(+(modulo x 9)1)(expt 10(floor(/ x 9))))1)(+ x 9)))

1

Hexagony, 40 31 30 bytes

<_:->.(.+><.'!.\@"9!%>!/{.}|.?

Or, if you prefer your code to be a little less linear and a little more polygonal:

    < _ : -
   > . ( . +
  > < . ' ! .
 \ @ " 9 ! % >
  ! / { . } |
   . ? . . .
    . . . .

Try it online!

Thanks to @FryAmTheEggman for some ideas and inspiration :o)

Previous version: <.:->+_.!(..'!.\><9!%>@.{.}|.?"

Previouser version: <><.-_|@"'!{|(.9+!8=@>{/".'/:!?$.%\1$..\


1
This seems to work? Still looks golfable.
FryAmTheEggman

@FryAmTheEggman Nice work! 2 minutes after posting this I thought of a much better way to do, well, pretty much everything. Tunnel vision, probably? I'm working on a revised version.
Sok

Thanks :) Just an FYI people often chat about Hexagony in the esoteric programming languages room. Join in if you want :)
FryAmTheEggman

1
Managed to smoosh it in a bit more: hexagony.tryitonline.net/…
FryAmTheEggman

1

Perl 6,  38  29 bytes

{$_>9??(1+$_%9)*10**Int($_/9)-1!!$_+9}
{first *.comb.sum==$_,$_^..*}

( apparently the direct approach is shorter )

Explanation:

{
  first
    *.comb.sum == $_, # lambda that does the check
    $_ ^.. *          # Range.new: $_, Inf, :excludes-min
}

Test:

#! /usr/bin/env perl6

use v6.c;
use Test;

my @tests = (
   2 => 11,
   8 => 17,
   9 => 18,
  12 => 39,
  16 => 79,
  18 => 99,
  24 => 699,
  32 => 5999,
);

plan +@tests;

my &next-digital-sum = {first *.comb.sum==$_,$_^..*}

for @tests -> $_ ( :key($input), :value($expected) ) {
  is next-digital-sum($input), $expected, .gist;
}
1..8
ok 1 - 2 => 11
ok 2 - 8 => 17
ok 3 - 9 => 18
ok 4 - 12 => 39
ok 5 - 16 => 79
ok 6 - 18 => 99
ok 7 - 24 => 699
ok 8 - 32 => 5999

1

Java 10, 114 62 bytes

n->{var r="";for(int i=0;i++<n/9;r+=9);return(n>9?n%9:n+9)+r;}

Try it online.

EDIT: 130 73 bytes without leading zeros (Thanks to @levanth`):

n->{var r="";for(int i=0;i++<n/9;r+=9);return new Long((n>9?n%9:n+9)+r);}

Try it online.

Explanation:

n->                           // Method with integer parameter and long return-type
  var r="";                   //  Result-String, starting empty
  for(int i=0;i++<n/9;r+=9);  //  Append `n` integer-divided by 9 amount of 9's to `r`
  return new Long(            //  Cast String to number to remove any leading zeroes:
    (n>9?                     //   If the input `n` is 10 or larger
      n%9                     //    Use `n` modulo-9
     :                        //   Else (`n` is smaller than 10):
      n+9)                    //    Use `n+9`
    +r);}                     //   And append `r`

1
If anyone is interested: The fix would be seven bytes longer, replace String c(int n){return""+(n>9?(n%9)+s(n):n+9);} with int c(int n){return Integer.parseInt((n>9?(n%9)+s(n):n+9));}
levanth

@levanth I've edited it in. Btw, you forgot the ""+ in int c(int n){return Integer.parseInt(""+(n>9?(n%9)+s(n):n+9));}
Kevin Cruijssen

1

Ruby, 33 bytes

This is a int arithmetic version that just happens to be the same as xnor's python answer. It is an anonymous function that takes and returns an int.

->n{n<10?n+9:(1+n%9)*10**(n/9)-1}

I don't know ruby that much but is the -> at the start an anonymous function?
levanth

@levanth: yes. I will clarify above
MegaTom

Does not work for n=9
G B

@GB thank you for pointing that out. It is now fixed.
MegaTom

1

MathGolf, 8 7 bytes

Æ)_Σk=▼

Try it online!

Implicit input yay.

Explanation:

          Implicit input
 Æ     ▼  Do while false loop that pops the condition
  )       Increment top of stack
   _      Duplicate
    Σ     Get the digit sum
     k    Get input
      =   Is equal?
          Implicit output

I know this is an older answer, but you can solve it in 7 bytes now with implicit input (just skip the first k).
maxb

0

Ruby, 38 bytes

f=->n{n<11?n+9:"#{n<19?n-9:f.(n-9)}9"}

This answer returns a string or int depending on input size. It is a recursive solution that asks for a solution for 9 less then adds a "9" to the end.


Ruby, 39 bytes

f=->n{n<11?n+9:(n<19?n-9:f.(n-9))*10+9}

For one more byte, this answer always returns an int. same algorithm as above but with numbers.


0

C, 80 bytes

i;s;g(j){s=0;for(;j;j/=10)s+=j%10;return s;}f(n){i=n;while(n-g(i))i++;return i;}

Ungolfed try online

int g(int j)
{
    int s=0;
    for(;j;j/=10) s += j%10;
    return s;
}

int f(int n)
{
    int i=n;
    for(;n-g(i);i++);
    return i;
}

0

PHP, 77 characters

$n=$argv[1];$m=$n+1;while(1){if(array_sum(str_split($m))==$n)die("$m");$m++;}

0

Oracle SQL 11.2, 165 bytes

SELECT l FROM(SELECT LEVEL l,TO_NUMBER(XMLQUERY(REGEXP_REPLACE(LEVEL,'(\d)','+\1')RETURNING CONTENT)) s FROM DUAL CONNECT BY 1=1)WHERE s=:1 AND l!=s AND rownum=1;

Un-golfed

SELECT l   
FROM   (
         SELECT LEVEL l, -- Number to evaluate
                XMLQUERY( 
                          REGEXP_REPLACE(LEVEL,'(\d)','+\1')  -- Add a + in front of each digit 
                          RETURNING CONTENT
                        ).GETNUMBERVAL()s                     -- Evaluate le expression generated by the added + 
                FROM DUAL 
                CONNECT BY 1=1 -- Run forever            
       )
WHERE s=:1      -- The sum must be equal to the input
  AND l!=s      -- The sum must not be the input 
  AND rownum=1  -- Keep only the first result

0

Python 3 55 Bytes

Takes two arguments that are the same

f=lambda a,b:a if sum(map(int,str(a)))==b else f(-~a,b)

i.e. to call it you would use f(x,x)



0

Powershell, 54 bytes

$args|%{(($_+9),+(''+$_%9+'9'*(($_-$_%9)/9)))[$_-gt9]}

Test script:

$f = {

$args|%{(($_+9),+(''+$_%9+'9'*(($_-$_%9)/9)))[$_-gt9]}

}

@(
    ,(  1,  10   )
    ,(  2 , 11   )
    ,(  8 , 17   )
    ,(  9 , 18   )
    ,( 10,  19   )
    ,( 11,  29   )
    ,( 12 , 39   )
    ,( 16 , 79   )
    ,( 18 , 99   )
    ,( 19 , 199  )
    ,( 24 , 699  )
    ,( 27 , 999  )
    ,( 32 , 5999 )
    ,( 52 , 799999 )
    ,( 128, 299999999999999 )
) | % {
    $a,$e = $_
    $r = &$f $a
    "$($r-eq$e): $r"
}

Output:

True: 1 : 10
True: 2 : 11
True: 8 : 17
True: 9 : 18
True: 10 : 19
True: 11 : 29
True: 12 : 39
True: 16 : 79
True: 18 : 99
True: 19 : 199
True: 24 : 699
True: 27 : 999
True: 32 : 5999
True: 52 : 799999
True: 128 : 299999999999999

Expalantion

  • if [$_-gt9] returns a first digit and a tail
    • a first digit is the difference between $_ and the sum of 9 ($_%9)
    • a tail is a few nines - '9'*(($_-$_%9)/9))
    • finally, converts a result string into a number to remove the leading 0
  • else returns ($_+9)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.