Trova il numero più piccolo più grande dell'input la cui somma digitale è l'input


28

"Somma digitale" si riferisce alla somma di tutte le cifre in un numero.

Ad esempio, la somma digitale di 1324è 10, perché 1+3+2+4 = 10.

La sfida è scrivere un programma / funzione per calcolare il numero più piccolo più grande dell'input la cui somma digitale è l'input.

Esempio con procedura dettagliata

Ad esempio, prendi il numero 9come input:

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

L'output valido sarebbe il numero più piccolo sopra, che è 18.

Specifiche

Si noti che 9non è l'output valido per questo esempio, poiché il numero invertito deve essere maggiore del numero originale.

Si noti che l'ingresso sarà positivo.

Casi test:

 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)

Riferimenti:

Questo è OEIS A161561 .

Modifica: aggiunta una Testcase aggiuntiva (18)

Grazie a Martin Ender per il frammento della classifica

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
Questo titolo mi ha fatto male al cervello.
Fatalizza il

Risposte:


4

05AB1E, 19 17 8 byte

Codice:

[>DSO¹Q#

Ha spiegato:

[            # 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

Provalo online

Modifica: salvato 9 byte grazie a @Adnan


4
SOè un modo più breve per ottenere la somma delle cifre (anziché J`)O). Inoltre, senza assegnazione variabile, puoi fare [>DSO¹Q#:).
Adnan,

2
@Adnan. Bello! Mi mancava totalmente S. Avrei dovuto capire che non avevo bisogno delle variabili.
Emigna,

14

Python 2, 33 byte

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

Un'espressione diretta. Crea una stringa numerica con 9 alla fine e il resto all'inizio. Tranne, per cifra singola n, dà n+9.

Alcune uscite hanno zeri iniziali ( 099per 18).


7

Retina , 39 31 byte

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

Riceve input in unario .

Provalo online! (Le prime due righe consentono di eseguire contemporaneamente più casi di test e per comodità vengono convertiti da decimali a unari.)

Questo in realtà non cerca il risultato in modo lineare, ma lo calcola esplicitamente:

  • Se l'input nè maggiore di 9, lo sostituiamo con n % 9seguito da n / 9(nove).
  • Altrimenti, lo sostituiamo con n + 9.

Usando !(o qualsiasi altra cosa che non lo sia 1) come cifra unaria, posso salvare un altro byte con il seguente approccio:

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

Ma questo formato di input è un po 'allungato, credo.


Quindi Retina non consentirà l'input di Integer o non riuscirà a gestire l'aritmetica di Integer?
levanth,

@levanth Non esiste alcuna aritmetica in Retina: l'intero linguaggio si basa sull'elaborazione di stringhe tramite espressioni regolari, quindi tutta l'aritmetica viene solitamente eseguita su rappresentazioni unarie. Retina potrebbe prendere l'input intero decimale e convertirlo prima in unario, ma questo costa 6 byte aggiuntivi e le nostre politiche consentono l'input unario a meno che la sfida non specifichi il decimale. (Se preferisci che tutte le risposte ricevano un input decimale, sentiti libero di dirlo nelle specifiche e aggiornerò la mia risposta.)
Martin Ender,

no no va bene ^^ Ero solo curioso dell'ingresso unario
levanth

6

Pyth , 8 byte

fqQsjT;h

Suite di test.

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 byte

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

Fa più o meno la stessa cosa di molte altre risposte qui. Volevo mostrare l'approccio Java senza usare la manipolazione di stringhe e loop.

Grazie a FryAmTheEggman per avermi ricordato che sono stupido;)


Almeno hai superato SQL?
Rɪᴋᴇʀ

Meh, solo il doppio della maggior parte delle risposte di pitone / rubino qui, quindi non mi sento male per Java in questo momento. Sarebbe stato bello battere C però: P
Geobits

: / Oops, l'ho preso dal mio blocco di classe. Devo essere arrugginito per questo.
Geobits,

@Geobits Probabilmente avrebbe battuto C--.
gcampbell,

@Fry Dimenticato completamente quel trucco. Grazie, questo mi ha messo almeno davanti a C;)
Geobits il

3

MATL , 10 9 byte

`QtV!UsG-

Provalo online!

Spiegazione

`        % 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
Uso intelligente di V!U+1 da parte mia. Questo dovrebbe andare nel nostro elenco di idiomi MATL.
Suever,

@Suever Sì, che si abitua abbastanza spesso
Luis Mendo il

3

JavaScript (ES7), 32 byte

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

38 byte come ES6:

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

3

Python 3, 128 94 84 74 byte

Senza output, approccio diretto, codegolfer per principianti;)

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

1
Per cominciare, ci sono molti spazi che possono essere rimossi. Prima / dopo = + () ad esempio.
Emigna,

1
Inoltre è possibile sostituire print(m)con return m(non salva alcun byte ma non è necessario stampare nella funzione stessa). Puoi ancora stampare il ritorno della funzione di output con print(r(n))per testare la tua funzione
levanth

1
Puoi anche rimuovere molte nuove righe; m=n+1;f=1eif s==n:f=0
Blue

1
Quando si sostituisce print con return, è possibile farlo direttamente nell'istruzione if e rimuovere f nonché l'istruzione else.
Emigna,

2
Puoi ancora rimuovere f e usare solo mentre 1: e anche rimuovere lo spazio tra int (c) e for
Emigna

2

In realtà, 17 byte

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

Provalo online!

Spiegazione:

╗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

Questa risposta è fantastica perché è innamorata ( ;))
Fund Monica's Lawsuit

2

C 73 65 byte

Una macro con una funzione di aiuto.

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

La efunzione calcola solo i poteri di dieci e la Fmacro usa lo stesso metodo di risoluzione di questo rubino e questa risposta di Python . purtroppo, è più lungo della stessa lunghezza di entrambe le risposte messe insieme. Ma è la prima risposta in C.

(8 byte salvati dal trucco di Lynn di rimozione int.)


È possibile eliminare entrambe le occorrenze di int, salvando 8 byte.
Lynn,

2

Brachylog , 8 byte (non concorrenti)

<.=:ef+?

= è stato modificato dopo che questa sfida è stata pubblicata, quindi ora funziona su domini forse infiniti, come è il caso qui.

Spiegazione

<.       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

Questo tornerà indietro =fino a quando il valore di Output non renderà vero l'intero predicato.


2

TSQL (sqlserver 2012), 107 99 byte

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

Provalo online!


1
Wow! Non me l'aspettavo!
levanth,

1

Python 2, 39 byte

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

Aritmetica intera pura.

Programma completo con uscita

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))

Produzione:

11
17
39
79
89
99
699
5999

Mi piace il modo in cui questa formulazione evita lo zero iniziale.
Neil,

@Neil l'altro potrebbe evitarlo usandoeval
Blue

1

PowerShell v2 +, 62 byte

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

Accetta input $nquindi esegue un forloop. Inizializziamo il loop impostando il nostro numero di destinazione $a, in modo che sia uno maggiore di $n(poiché deve essere più grande, in più questo assicura che 1..9funzioni correttamente). Ogni ciclo che incrementiamo $a++. Non succede nulla nel loop corretto, ma il condizionale è dove accade la logica del programma. Stiamo letteralmente prendendo il numero di destinazione come stringa, lanciandolo come char-array, -joininging l'array con +e quindi reindirizzandolo iex(simile a eval). Testiamo se è uguale al nostro numero di input o meno e continuiamo ad eseguire il loop di conseguenza. Una volta usciti dal ciclo, abbiamo raggiunto il punto in cui il nostro numero target è la somma delle cifre pari al nostro numero di input, quindi $aviene inserito nella pipeline e l'output è implicito.


Per riferimento, ecco il metodo "costruisci una stringa con il numero appropriato di 9" che altre persone hanno fatto, a 67 byte

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

o il metodo "aritmetico intero puro" che altri hanno fatto, a 70 byte

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

Nessuno dei due sono più brevi, ma entrambi sono più interessanti.


È possibile salvare 3 byte:param($n)for($a=$n+1;([char[]]"$a"-join'+'|iex)-$n){$a++}$a
mazzy

1

Pyke, 9 8 7 byte, non competitivo - utilizza una versione più recente

.fhsq)h

Provalo qui!

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

Testata di nuovo, la tua soluzione non fornisce l'output corretto per gli input da 1 a 8
levanth

Penso di averlo rotto ... Funziona tranne il numero 1. A proposito perché Missing arg to Equals, evaling inputviene fuori? Voglio dire, gli do un numero di input
levanth,

@levanth Ciò accade perché per impostazione predefinita l'interfaccia Web ha gli avvisi attivati. Ho appena programmato un modo per disattivarlo (come 10 minuti fa). Per quanto riguarda il motivo per cui non ha funzionato per 1, stavo controllando per vedere se il numero era maggiore di 10 e se continua così.
Blue

1

JavaScript (ES2015), 45 39 33 byte


Ho salvato altri 6 byte grazie a @Conor O'Brien e @Shaun H. Penso che lo lascerò così com'è, perché questa versione differisce dalla risposta di @ Neil usando String.repeat().

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

Versione precedente (salvata 6 byte grazie a @Qwertiy):

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

Prima versione:

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 Grazie mille. Ho bisogno di saperne di più sugli operatori bit a bit. Per quanto riguarda la seconda modifica, sembra che abbia complicato troppo il caso v <= 9. Penserò se posso restituire tutti i valori numerici, che potrebbero essere un altro byte-saver (no .repeat () e racchiudere il valore restituito in + ()).
Leibrug,

Non è necessario nominare la funzione secondo le nostre regole
Conor O'Brien,

1
v>9è più corto di 2 byte, string.repeatcalcolerà un valore decimale non |0necessario
Shaun H

Differisce anche dalla mia risposta non usando **ovviamente.
Neil,

1

Lua, 52 byte

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

Voleva essere salvato in un file ed eseguito con l'interprete Lua, ad es lua <file> <input number>

Puoi anche provarlo qui: https://repl.it/CXom/1

(Su repl.it il numero di input è hardcoded per facilitare i test)


Cosa fa "... + 0" ...? Trasmette l'input a un numero intero?
Yytsi,

1
Sì, ad un numero (Lua prima del 5.3 usava solo i doppi, come JavaScript). Lua convertirà automaticamente le stringhe in numeri nelle espressioni, ma non nei confronti. Quindi per n>9funzionare correttamente deve prima essere costretto a un numero.
PiGuy,

+1! Vedo. Quindi ...+0>9funzionerebbe?
Yytsi,

1
Sì! Sarebbe :)
PiGuy

1

Racchetta 70 caratteri, 71 byte

Stesso algoritmo della maggior parte degli altri praticamente. Abbastanza triste per non avere% per modulo, o ** per expt, o divisione intera per impostazione predefinita, altrimenti questo potrebbe essere molto più breve e avrei potuto superare C e Java. Adoro comunque la lingua

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

1

Esagonia , 40 31 30 byte

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

Oppure, se preferisci che il tuo codice sia un po 'meno lineare e un po' più poligonale:

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

Provalo online!

Grazie a @FryAmTheEggman per alcune idee e ispirazioni: o)

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

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


1
Questo sembra funzionare? Sembra ancora golfabile.
FryAmTheEggman,

@FryAmTheEggman Bel lavoro! 2 minuti dopo aver postato questo ho pensato a un modo molto migliore di fare, beh, praticamente tutto. Visione in galleria, probabilmente? Sto lavorando a una versione rivista.
Ho

Grazie :) Solo un FYI parla spesso di esagonia nella sala dei linguaggi di programmazione esoterica . Partecipa se vuoi :)
FryAmTheEggman,

1
Riuscito a smorzarlo un po 'di più: hexagony.tryitonline.net/…
FryAmTheEggman

1

Perl 6 ,  38   29 byte

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

(apparentemente l'approccio diretto è più breve)

Spiegazione:

{
  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 byte

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

Provalo online.

EDIT: 130 73 byte senza zeri iniziali (grazie a @ levanth` ):

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

Provalo online.

Spiegazione:

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
Se qualcuno è interessato: la correzione sarebbe più lunga di sette byte, sostituirla 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));}
levanth

@levanth L'ho modificato in. Btw, hai dimenticato il ""+inint c(int n){return Integer.parseInt(""+(n>9?(n%9)+s(n):n+9));}
Kevin Cruijssen

1

Rubino, 33 byte

Questa è una versione aritmetica int che sembra essere la stessa della risposta python di xnor. È una funzione anonima che accetta e restituisce un int.

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

Non conosco molto il rubino ma il -> all'inizio è una funzione anonima?
levanth,

@levanth: si.
Chiarirò

Non funziona per n = 9
GB

@GB grazie per averlo sottolineato. Ora è stato risolto.
MegaTom,

1

MathGolf , 8 7 byte

Æ)_Σk=▼

Provalo online!

Ingresso implicito yay.

Spiegazione:

          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

So che questa è una risposta più vecchia, ma ora puoi risolverla in 7 byte con input implicito (salta la prima k).
maxb

0

Rubino, 38 byte

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

Questa risposta restituisce una stringa o int a seconda della dimensione di input. È una soluzione ricorsiva che richiede una soluzione per 9 in meno, quindi aggiunge un "9" alla fine.


Rubino, 39 byte

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

Per un altro byte, questa risposta restituisce sempre un int. stesso algoritmo come sopra ma con numeri.


0

C, 80 byte

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 prova 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 caratteri

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

0

Oracle SQL 11.2, 165 byte

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 byte

Accetta due argomenti uguali

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

cioè per chiamarlo useresti f (x, x)



0

Powershell, 54 byte

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

Script di prova:

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

Produzione:

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

  • se [$_-gt9]restituisce una prima cifra e una coda
    • una prima cifra è la differenza tra $ _ e la somma di 9 ( $_%9)
    • una coda è un paio di nove - '9'*(($_-$_%9)/9))
    • infine, converte una stringa di risultato in un numero per rimuovere lo 0 iniziale
  • altrimenti ritorna ($_+9)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.