Temukan angka terkecil lebih besar dari input yang jumlah digitalnya adalah input


28

"Jumlah digital" mengacu pada jumlah semua digit dalam suatu angka.

Sebagai contoh, jumlah digitalnya 1324adalah 10, karena 1+3+2+4 = 10.

Tantangannya adalah untuk menulis program / fungsi untuk menghitung angka terkecil yang lebih besar dari input yang jumlah digitalnya adalah input.

Contoh dengan walkthrough

Sebagai contoh, ambil nomor 9sebagai input:

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

Output yang valid akan menjadi angka terkecil di atas, yaitu 18.

Spesifikasi

Perhatikan bahwa 9ini bukan output yang valid untuk contoh ini, karena angka yang dibalik harus lebih besar dari angka aslinya.

Perhatikan bahwa input akan positif.

Kasus-Uji:

 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)

Referensi:

Ini adalah OEIS A161561 .

Sunting: Menambahkan Testcase tambahan (18)

Terima kasih kepada Martin Ender untuk Cuplikan Leaderboard

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
Gelar ini membuat otak saya sakit.
Fatalkan tanggal

Jawaban:


4

05AB1E, 19 17 8 byte

Kode:

[>DSO¹Q#

Dijelaskan:

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

Cobalah online

Sunting: Disimpan 9 byte berkat @Adnan


4
SOadalah cara yang lebih pendek untuk mendapatkan jumlah digit (bukan J`)O). Juga, tanpa penugasan variabel, Anda dapat melakukan [>DSO¹Q#:).
Adnan

2
@Adnan. Bagus! Saya benar-benar merindukan S. Seharusnya menyadari saya tidak perlu variabel.
Emigna

14

Python 2, 33 byte

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

Ekspresi langsung. Membuat string angka dengan 9 di akhir dan sisanya di awal. Kecuali, untuk satu digit n, beri n+9.

Beberapa output memiliki angka nol terdepan ( 099untuk 18).


7

Retina , 39 31 byte

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

Mengambil input di unary .

Cobalah online! (Dua baris pertama memungkinkan menjalankan beberapa test case sekaligus dan mengkonversi dari desimal ke unary untuk kenyamanan.)

Ini sebenarnya tidak mencari hasil secara linear, tetapi menghitungnya secara eksplisit:

  • Jika input nlebih besar dari 9, kami menggantinya dengan n % 9diikuti oleh n / 9sembilan (lantai).
  • Kalau tidak, kami menggantinya dengan n + 9.

Dengan menggunakan !(atau hal lain yang bukan 1) sebagai digit unary, saya dapat menyimpan satu byte lagi dengan pendekatan berikut:

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

Tapi format input ini agak sulit, saya pikir.


Jadi Retina tidak akan mengizinkan input Integer atau tidak bisa menangani aritmatika Integer?
levanth

@levanth Tidak ada aritmatika sama sekali di Retina - seluruh bahasa didasarkan pada pemrosesan string melalui ekspresi reguler, jadi semua aritmatika biasanya dilakukan pada representasi unary. Retina dapat mengambil input bilangan bulat desimal dan mengonversinya menjadi unary terlebih dahulu, tetapi harganya 6 byte tambahan, dan kebijakan kami mengizinkan input unary kecuali jika tantangannya menentukan desimal. (Jika Anda lebih suka meminta semua jawaban untuk mengambil input desimal, jangan ragu untuk mengatakannya dalam spesifikasi dan saya akan memperbarui jawaban saya.)
Martin Ender

tidak, tidak apa-apa ^^ Saya hanya ingin tahu tentang input yang tidak
disadari

6

Pyth , 8 byte

fqQsjT;h

Suite uji.

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;}

Apakah kira-kira hal yang sama dengan banyak jawaban lain di sini. Ingin menunjukkan pendekatan Java tanpa menggunakan manipulasi string dan loop.

Terima kasih kepada FryAmTheEggman untuk mengingatkan saya bahwa saya bodoh;)


Setidaknya Anda mengungguli SQL?
Rɪᴋᴇʀ

Meh, hanya dua kali lebih besar dari kebanyakan jawaban python / ruby ​​di sini, jadi saya tidak merasa terlalu buruk untuk Java saat ini. Akan lebih baik untuk mengalahkan C: P
Geobits

: / Ups, dapatkan itu dari blok kelas saya. Saya harus berkarat dalam hal ini.
Geobits

@ Geobits Mungkin akan mengalahkan C--.
gcampbell

@ Goreng Benar-benar lupa tentang trik itu. Terima kasih, itu menempatkan saya di depan C setidaknya;)
Geobits

3

MATL , 10 9 byte

`QtV!UsG-

Cobalah online!

Penjelasan

`        % 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
Penggunaan V!U+1 secara cerdas dari saya. Itu harus masuk dalam daftar idiom MATL kami.
Suever

@Suever Ya, itu cukup sering digunakan
Luis Mendo

3

JavaScript (ES7), 32 byte

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

38 byte sebagai ES6:

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

3

Python 3, 128 94 84 74 Bytes

Tanpa output, pendekatan langsung, codegolfer pemula;)

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

1
Sebagai permulaan, ada banyak ruang yang bisa dihilangkan. Sebelum / sesudah = + () misalnya.
Emigna

1
Anda juga dapat mengganti print(m)dengan return m(tidak menyimpan byte tetapi Anda tidak harus mencetak dalam fungsi itu sendiri). Anda masih dapat mencetak pengembalian fungsi keluaran dengan print(r(n))untuk menguji fungsi Anda
levanth

1
Anda juga dapat menghapus banyak baris baru; m=n+1;f=1danif s==n:f=0
Biru

1
Saat mengganti cetak dengan pengembalian, Anda dapat melakukannya secara langsung dalam if-statement dan menghapus f serta statement-else.
Emigna

2
Anda masih dapat menghapus f dan hanya menggunakan saat 1: dan juga menghapus spasi antara int (c) dan untuk
Emigna

2

Sebenarnya, 17 byte

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

Cobalah online!

Penjelasan:

╗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

Jawaban ini sangat bagus karena genit ( ;))
Gugatan Dana Monica

2

C 73 65 byte

Makro dengan fungsi pembantu.

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

The eFungsi hanya menghitung kekuatan sepuluh, dan Fmakro menggunakan metode pemecahan yang sama seperti ruby ini , dan python ini jawabannya. Sayangnya, ini lebih panjang dari panjang yang sama dengan kedua jawaban itu disatukan. Tetapi ini adalah jawaban C pertama.

(8 byte disimpan oleh trik Lynn untuk menghapus int.)


Anda dapat menjatuhkan kedua kejadian int, menghemat 8 byte.
Lynn

2

Brachylog , 8 byte (Tidak bersaing)

<.=:ef+?

= telah dimodifikasi setelah tantangan ini diposting, sehingga sekarang berfungsi pada domain yang mungkin tidak terbatas, yang merupakan kasus di sini.

Penjelasan

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

Ini akan mundur =hingga nilai Output membuat seluruh predikat ini menjadi kenyataan.


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

Cobalah online!


1
Wow! Saya tidak mengharapkan itu!
levanth

1

Python 2, 39 byte

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

Aritmatika integer murni.

Program penuh dengan output

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

Keluaran:

11
17
39
79
89
99
699
5999

Saya suka cara formulasi ini menghindari nol di depan.
Neil

@Neil yang lain bisa menghindarinya dengan menggunakaneval
Blue

1

PowerShell v2 +, 62 byte

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

Mengambil input $nlalu menjalankan satu forloop. Kami menginisialisasi loop dengan menetapkan nomor target kami $a,, menjadi satu lebih besar dari $n(karena itu harus lebih besar, ditambah ini memastikan 1..9bekerja dengan benar). Setiap loop kami bertambah $a++. Tidak ada yang terjadi di loop yang tepat, tetapi kondisional adalah tempat logika program terjadi. Kami benar-benar mengambil nomor target sebagai string, melemparkannya sebagai array char, -joinmemasukkan array dengan +dan kemudian memipangnya ke iex(mirip dengan eval). Kami menguji apakah itu sama dengan nomor input kami atau tidak, dan melanjutkan pengulangan sesuai. Setelah kami keluar dari loop, kami telah mencapai di mana nomor target kami adalah digit-jumlah sama dengan nomor input kami, jadi $aditempatkan pada pipa dan output tersirat.


Untuk referensi, inilah metode "buat string dengan jumlah 9 yang tepat" yang telah dilakukan orang lain, sebesar 67 byte

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

atau metode "bilangan bulat murni" metode yang telah dilakukan orang lain, pada 70 byte

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

Tak satu pun dari yang lebih pendek, tetapi keduanya lebih menarik.


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

1

Pyke, 9 8 7 byte, tidak bersaing - menggunakan versi yang lebih baru

.fhsq)h

Coba di sini!

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

Diuji lagi, solusi Anda tidak memberikan output yang benar untuk input 1 hingga 8
levanth

Saya pikir saya memecahkannya ... Bekerja kecuali untuk nomornya 1. Btw mengapa tidak Missing arg to Equals, evaling inputmuncul? Maksud saya, saya memberikan nomor input
levanth

@levanth Itu terjadi karena secara default antarmuka web memiliki peringatan yang dihidupkan. Saya baru saja memberi kode cara untuk mematikannya (seperti 10 menit yang lalu). Adapun mengapa itu tidak berhasil untuk 1, saya memeriksa untuk melihat apakah jumlahnya lebih besar dari 10 dan jika demikian terus.
Biru

1

JavaScript (ES2015), 45 39 33 byte

Menyimpan 6 byte lagi berkat @Conor O'Brien dan @Shaun H.
Saya pikir saya akan membiarkannya apa adanya, karena versi ini berbeda dari jawaban @ Neil dengan menggunakan String.repeat().

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

Versi sebelumnya (disimpan 6 byte berkat @Qwertiy):

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

Versi pertama:

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 Terima kasih banyak. Saya perlu mempelajari lebih lanjut tentang operator bitwise. Tentang perubahan kedua, sepertinya saya terlalu rumit untuk kasus ini v <= 9. Saya akan berpikir jika saya bisa mengembalikan semua nilai numerik, yang bisa berupa byte-saver (no .repeat () dan membungkus nilai pengembalian dalam + ()).
Leibrug

Anda tidak perlu menyebutkan fungsinya sesuai aturan kami
Conor O'Brien

1
v>9lebih pendek 2 byte, string.repeatakan menurunkan nilai desimal tidak |0diperlukan
Shaun H

Juga berbeda dari jawaban saya dengan tidak menggunakan **tentu saja.
Neil

1

Lua, 52 byte

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

Dimaksudkan untuk disimpan dalam file dan dijalankan dengan penerjemah Lua, mis lua <file> <input number>

Anda juga dapat mencobanya di sini: https://repl.it/CXom/1

(Pada repl.it nomor input berupa kode keras untuk kemudahan pengujian)


Apa yang dilakukan '... + 0' ...? Apakah itu memasukkan input ke integer?
Yytsi

1
Yap, ke nomor (Lua sebelum 5.3 hanya digunakan ganda, seperti JavaScript). Lua akan secara otomatis mengonversi string menjadi angka dalam ekspresi, tetapi bukan perbandingan. Jadi agar n>9dapat bekerja dengan baik, perlu dipaksa ke nomor terlebih dahulu.
PiGuy

+1! Saya melihat. Jadi ...+0>9apakah akan berhasil?
Yytsi

1
Ya! Itu akan :)
PiGuy

1

Racket 70 karakter, 71 byte

Algoritma yang sama seperti kebanyakan yang lain cukup banyak. Cukup sedih karena tidak memiliki% untuk modulo, atau ** untuk expt, atau pembagian integer secara default, jika tidak, ini bisa menjadi jauh lebih pendek dan saya bisa mengalahkan C dan Java. Masih suka bahasa

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

1

Hexagony , 40 31 30 byte

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

Atau, jika Anda lebih suka kode Anda sedikit lebih linier dan sedikit lebih poligonal:

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

Cobalah online!

Terima kasih kepada @FryAmTheEggman untuk beberapa ide dan inspirasi: o)

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

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


1
Ini sepertinya berhasil? Masih terlihat golf.
FryAmTheEggman

@FryAmTheEggman Kerja bagus! 2 menit setelah memposting ini saya memikirkan cara yang lebih baik untuk dilakukan, well, hampir semuanya. Visi terowongan, mungkin? Saya sedang mengerjakan versi revisi.
Sok

Terima kasih :) Hanya orang FYI yang sering mengobrol tentang Hexagony di ruang bahasa pemrograman esoterik . Bergabunglah jika Anda mau :)
FryAmTheEggman

1
Berhasil menghancurkannya sedikit lebih banyak: hexagony.tryitonline.net/...
FryAmTheEggman

1

Perl 6 ,  38   29 byte

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

(tampaknya pendekatan langsung lebih pendek)

Penjelasan:

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

Uji:

#! /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;}

Cobalah online.

EDIT: 130 73 byte tanpa nol di depan (Terima kasih kepada @ levanth` ):

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

Cobalah online.

Penjelasan:

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
Jika ada yang tertarik: Perbaikan akan tujuh byte lebih lama, ganti String c(int n){return""+(n>9?(n%9)+s(n):n+9);}denganint c(int n){return Integer.parseInt((n>9?(n%9)+s(n):n+9));}
levanth

@levanth Saya sudah mengeditnya. Btw, Anda lupa ""+diint c(int n){return Integer.parseInt(""+(n>9?(n%9)+s(n):n+9));}
Kevin Cruijssen

1

Ruby, 33 byte

Ini adalah versi aritmatika int yang kebetulan sama dengan jawaban python xnor. Ini adalah fungsi anonim yang mengambil dan mengembalikan int.

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

Saya tidak tahu banyak ruby ​​tetapi apakah -> pada awalnya fungsi anonim?
levanth

@ Levant: ya. Saya akan mengklarifikasi di atas
MegaTom

Tidak bekerja untuk n = 9
GB

@ GB terima kasih telah menunjukkannya. Sekarang sudah diperbaiki.
MegaTom

1

MathGolf , 8 7 byte

Æ)_Σk=▼

Cobalah online!

Masukan implisit yay.

Penjelasan:

          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

Saya tahu ini adalah jawaban yang lebih lama, tetapi Anda dapat menyelesaikannya dalam 7 byte sekarang dengan input implisit (lewati saja dulu k).
maks.

0

Ruby, 38 byte

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

Jawaban ini mengembalikan string atau int tergantung pada ukuran input. Ini adalah solusi rekursif yang meminta solusi untuk kurang dari 9 kemudian menambahkan "9" di akhir.


Ruby, 39 byte

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

Untuk satu byte lagi, jawaban ini selalu mengembalikan int. algoritma yang sama seperti di atas tetapi dengan angka.


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;}

Tidak dicoba coba 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 karakter

$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;

Tidak bermain golf

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

Membawa dua argumen yang sama

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

yaitu untuk menyebutnya Anda akan menggunakan f (x, x)



0

Powershell, 54 byte

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

Skrip uji:

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

Keluaran:

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

Ekspansi

  • jika [$_-gt9]mengembalikan digit pertama dan ekor
    • digit pertama adalah perbedaan antara $ _ dan jumlah 9 ( $_%9)
    • Ekor adalah beberapa sembilan - '9'*(($_-$_%9)/9))
    • akhirnya, ubah string hasil menjadi angka untuk menghapus 0 yang memimpin
  • lain kembali ($_+9)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.