Найдите наименьшее число больше, чем вход, цифровая сумма которого является входом

28

«Цифровая сумма» относится к сумме всех цифр в числе.

Например, цифровая сумма 1324есть 10, потому что 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)

Спасибо Мартину Эндеру за фрагмент таблицы лидеров

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>

levanth
источник
11
Это название сделало мой мозг поврежденным.
Роковая

Ответы:

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

Попробуйте онлайн

Редактировать: 9 байтов сохранено благодаря @Adnan

Emigna
источник
4
SOэто более короткий способ получить сумму цифр (вместо J`)O). Также без присвоения переменной можно обойтись [>DSO¹Q#:).
Аднан
2
@Adnan. Ницца! Я полностью скучал по S. Должен был понять, что мне не нужны переменные.
Emigna
14

Python 2, 33 байта

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

Прямое выражение. Делает числовую строку с 9 в конце и остатком в начале. Кроме, для однозначного n, дает n+9.

Некоторые выходы имеют ведущие нули ( 099для 18).

XNOR
источник
7

Сетчатка , 39 31 байт

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

Принимает участие в одинарных .

Попробуйте онлайн! (Первые две строки позволяют запускать несколько тестовых случаев одновременно и для удобства преобразуют из десятичной в унарную.)

Это на самом деле не ищет результат линейно, но вычисляет его явно:

  • Если входное nзначение больше 9, мы заменим его на n % 9следующие n / 9девятки.
  • В противном случае мы заменим его на n + 9.

Используя !(или что-либо еще, что не является 1) в качестве унарной цифры, я могу сохранить еще один байт следующим способом:

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

Но я думаю, что этот формат ввода немного растянут.

Мартин Эндер
источник
Таким образом, Retina не позволяет вводить целочисленные значения или просто не может обрабатывать целочисленную арифметику?
levanth
@levanth В Retina вообще нет арифметики - весь язык основан на обработке строк с помощью регулярных выражений, поэтому вся арифметика обычно делается на унарных представлениях. Retina может принимать десятичные целочисленные входные данные и сначала преобразовывать их в унарный, но это стоит 6 дополнительных байтов, и наши правила допускают унарный ввод, если в задаче не указано десятичное число. (Если вы предпочитаете, чтобы все ответы принимались в десятичном виде, не стесняйтесь говорить об этом в спецификации, и я обновлю свой ответ.)
Мартин Эндер
нет нет, все в порядке ^^ Мне было просто любопытно узнать об
унарном
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 за напоминание, что я тупой;)

Geobits
источник
По крайней мере, вы переиграли SQL?
Rɪᴋᴇʀ
Мех, только в два раза больше, чем большинство ответов python / ruby, поэтому я не чувствую себя слишком плохо для Java прямо сейчас. Хотя было бы неплохо победить С: P
Geobits
: / Ой, получил это из моего класса блока. Я должен быть ржавым в этом.
Geobits
@Geobits Это, вероятно, победит C--.
gcampbell
@Fry Полностью забыл об этом трюке. Спасибо, что поставил меня впереди C, по крайней мере;)
Geobits
3

MATL , 10 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
@Suever Да, это привыкло довольно часто
Луис Мендо
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(не сохраняет байты, но вам не нужно печатать в самой функции). Вы все еще можете напечатать выходную функцию, возвращаемую с помощью, print(r(n))чтобы проверить свою функцию
Леван
1
Вы также можете удалить много новых строк; m=n+1;f=1иif s==n:f=0
Blue
1
При замене print на return вы можете сделать это непосредственно в операторе if и удалить f, а также оператор else.
Эминья
2
Вы все еще можете удалить f и просто использовать while 1: а также убрать пробел между int (c) и for
Emigna
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
Mego
источник
Этот ответ хорош, потому что он кокетливый ( ;))
Фонд Моника иск
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Функция просто вычисляет полномочия десяти, а Fмакрос использует тот же метод , как Решая этот рубин , и этот питон ответа. к сожалению, он длиннее, чем примерно такая же длина, как оба эти ответа вместе взятые. Но это первый ответ C.

(8 байтов, спасенных уловкой Линн удаления int).

MegaTom
источник
Вы можете отбросить оба случая 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 не сделает весь этот предикат истинным.

Fatalize
источник
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

Попробуйте онлайн!

t-clausen.dk
источник
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
Дрянная Монахиня
источник
Мне нравится способ, которым эта формулировка избегает ведущего нуля.
Нил
@Neil другой мог бы избежать этого, используяeval
Blue
1

PowerShell v2 +, 62 байта

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

Принимает ввод, $nзатем выполняет forцикл. Мы инициализируем цикл, устанавливая наше целевое число, которое $aдолжно быть на единицу больше $n(поскольку оно должно быть больше, плюс это обеспечивает 1..9правильную работу). Каждый цикл мы увеличиваем $a++. Ничего не происходит в собственном цикле, но условно, где происходит логика программы. Мы буквально принимаем целевое число в виде строки, приводим его к типу char-массив, -joinдобавляем массив в массив +и затем добавляем его в цепочку iex(аналогично eval). Мы проверяем, равно ли это нашему входному номеру или нет, и продолжаем цикл соответственно. После того, как мы вышли из цикла, мы достигли, где наше целевое число является цифрой-суммой, равной нашему входному номеру, поэтому $aпомещается в конвейер и вывод неявен.


Для справки, вот метод «построить строку с соответствующим числом 9», который сделали другие люди, на 67 байтов

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

или «чистый целочисленный арифметический» метод, который сделали другие люди, в 70 байтов

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

Ни один из которых не короче, но оба из которых являются более интересными.

AdmBorkBork
источник
Вы можете сохранить 3 байта:param($n)for($a=$n+1;([char[]]"$a"-join'+'|iex)-$n){$a++}$a
mazzy
1

Pyke, 9 8 7 байт, не конкурирует - использует более свежую версию

.fhsq)h

Попробуй это здесь!

.f      - first where true:
  h     - n+1
   sq    - digital_root(^) == input()
      h - that number +1
синий
источник
Проверено снова, ваше решение дает неправильный вывод для входов с 1 по 8
Леван
Я думаю, что сломал это ... Работает, кроме номера 1. Кстати, почему Missing arg to Equals, evaling inputподходит? Я имею в виду, я даю ему входной номер
Леван
@levanth Это происходит потому, что по умолчанию в веб-интерфейсе включены предупреждения. Я только что написал способ выключить это (как 10 минут назад). Что касается того, почему это не сработало для 1, я проверял, было ли число больше 10 и продолжалось ли это.
Blue
1

JavaScript (ES2015), 45 39 33 байта

Сохранено еще 6 байтов благодаря @Conor O'Brien и @Shaun H.
Думаю, я оставлю все как есть, потому что эта версия отличается от ответа @ Neil использованием String.repeat().

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

Предыдущая версия (сохранено 6 байт благодаря @Qwertiy):

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

Первая версия:

f=v=>+(v/9>1?v%9+'9'.repeat(~~(v/9)):'1'+v-1)
Leibrug
источник
1
~~(v/9)=> v/9|0, '1'+v-1=>v+9
Qwertiy
@Qwertiy Большое спасибо. Мне нужно больше узнать о побитовых операторах. Что касается второго изменения, похоже, я слишком усложнил дело v <= 9. Я подумаю, смогу ли я вернуть все числовые значения, которые могли бы быть другой заставкой байтов (без .repeat () и переносом возвращаемого значения в + ()).
Лейбрюг
Вам не нужно называть функцию в соответствии с нашими правилами
Конор О'Брайен
1
v>9на 2 байта короче, string.repeatбудет |0нужно
вводить
Также отличается от моего ответа, не используя, **конечно.
Нил
1

Луа, 52 байта

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

Предназначен для сохранения в файле и запуска с интерпретатором Lua, например lua <file> <input number>

Вы также можете попробовать это здесь: https://repl.it/CXom/1

(На repl.it вводимый номер жестко запрограммирован для удобства тестирования)

PiGuy
источник
Что делает "... + 0" ...? Приводит ли ввод к целому числу?
Yytsi
1
Да, к числу (Lua до 5.3 использовал только двойные числа, как JavaScript). Lua автоматически преобразует строки в числа в выражениях, но не в сравнениях. Таким образом, n>9чтобы работать должным образом, сначала нужно привести его к числу.
PiGuy
+1! Понимаю. Так ...+0>9будет работать?
Yytsi
1
Ага! Было бы :)
PiGuy
1

Ракетка 70 символов, 71 байт

Тот же алгоритм, что и у большинства других. Довольно печально, что по умолчанию нет% для modulo, ** для expt или для целочисленного деления, иначе это может быть намного короче, и я мог бы превзойти C и Java. Все еще люблю язык, хотя

(λ(x)(if(> x 9)(-(*(+(modulo x 9)1)(expt 10(floor(/ x 9))))1)(+ x 9)))
kronicmage
источник
1

Гексагония , 40 31 30 байт

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

Или, если вы предпочитаете, чтобы ваш код был немного менее линейным и немного более многоугольным:

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

Попробуйте онлайн!

Спасибо @FryAmTheEggman за некоторые идеи и вдохновение: о)

Предыдущая версия: <.:->+_.!(..'!.\><9!%>@.{.}|.?"

Предыдущая версия: <><.-_|@"'!{|(.9+!8=@>{/".'/:!?$.%\1$..\

Sok
источник
1
Это похоже на работу? По-прежнему выглядит гольфом.
FryAmTheEggman
@FryAmTheEggman Хорошая работа! Через 2 минуты после публикации я подумал о гораздо лучшем способе сделать, ну почти все. Туннельное зрение, наверное? Я работаю над пересмотренной версией.
Сок
Спасибо :) Просто FYI люди часто болтают о гексагонии в комнате эзотерических языков программирования . Присоединяйтесь, если хотите :)
FryAmTheEggman
1
Удалось смутить это немного больше: hexagony.tryitonline.net/…
FryAmTheEggman
1

Perl 6 ,  38   29 байт

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

(видимо прямой подход короче)

Объяснение:

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

Тест:

#! /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
Брэд Гилберт b2gills
источник
1

Java 10, 114 62 байта

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

Попробуйте онлайн.

РЕДАКТИРОВАТЬ: 130 73 байта без начальных нулей (благодаря @ levanth` ):

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

Попробуйте онлайн.

Объяснение:

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
Если кому-то интересно: исправление будет на семь байт длиннее, замените String c(int n){return""+(n>9?(n%9)+s(n):n+9);}наint c(int n){return Integer.parseInt((n>9?(n%9)+s(n):n+9));}
levanth
@levanth Я редактировал это в. Кстати, вы забыли ""+вint c(int n){return Integer.parseInt(""+(n>9?(n%9)+s(n):n+9));}
Кевин Круйссен
1

Рубин, 33 байта

Это int-арифметическая версия, которая просто совпадает с ответом xnor на python. Это анонимная функция, которая принимает и возвращает int.

->n{n<10?n+9:(1+n%9)*10**(n/9)-1}
MegaTom
источник
Я не так много знаю ruby, но является ли -> в начале анонимной функцией?
levanth
@levanth: да. Я
уточню
Не работает для n = 9
GB
@ GB Спасибо, что указали на это. Это сейчас исправлено.
MegaTom
1

MathGolf , 8 7 байт

Æ)_Σk=▼

Попробуйте онлайн!

Неявный ввод yay.

Объяснение:

          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
Джо Кинг
источник
Я знаю, что это более старый ответ, но теперь вы можете решить его за 7 байт с неявным вводом (просто пропустите первый k).
максимум
0

Рубин, 38 байт

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

Этот ответ возвращает строку или int в зависимости от размера ввода. Это рекурсивное решение, которое запрашивает решение на 9 меньше, а затем добавляет «9» в конец.


Рубин, 39 байт

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

Для еще одного байта этот ответ всегда возвращает int. тот же алгоритм, что и выше, но с числами.

MegaTom
источник
0

C, 80 байтов

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 попробуйте онлайн

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;
}
Khaled.K
источник
0

PHP, 77 символов

$n=$argv[1];$m=$n+1;while(1){if(array_sum(str_split($m))==$n)die("$m");$m++;}
kuldeep.kamboj
источник
0

Oracle SQL 11.2, 165 байт

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 байт

Принимает два одинаковых аргумента

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

то есть, чтобы вызвать его, вы бы использовали f (x, x)

Джордж
источник
0

Powershell, 54 байта

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

Тестовый скрипт:

$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"
}

Выход:

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

  • если [$_-gt9] возвращает первую цифру и хвост
    • первая цифра - это разница между $ _ и суммой 9 ($_%9 )
    • хвост несколько девяток - '9'*(($_-$_%9)/9))
    • наконец, преобразует строку результата в число, чтобы удалить начальный 0
  • еще возвращается ($_+9)
Mazzy
источник