Dijital toplamı giriş olan girişten daha küçük olan sayıyı bulun


28

"Dijital toplam", bir sayıdaki tüm rakamların toplamını ifade eder.

Örneğin, dijital toplam 1324olduğu 10için, 1+3+2+4 = 10.

Buradaki zorluk, dijital toplamı girdi olan girişten daha küçük olan sayıyı hesaplamak için bir program / işlev yazmaktır.

Örneklerle Örnek

Örnek olarak, sayıyı 9giriş olarak alın:

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

Geçerli çıktı, yukarıdaki en küçük sayı olacaktır 18.

gözlük

Bunun 9tersine çevrilen sayının orijinal sayısından büyük olması gerektiğinden, bu örnek için geçerli çıktı olmadığına dikkat edin.

Girişin pozitif olacağını unutmayın.

Test-Durumları:

 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)

Referanslar:

Bu OEIS A161561 .

Düzenleme: Ek bir Test çantası (18) eklendi

Sayesinde Martin Ender için Afiş Snippet'ine

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
Bu başlık beynimi incitti.
16'da 12

Yanıtlar:


4

05AB1E, 19 17 8 bayt

Kod:

[>DSO¹Q#

Açıklaması:

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

Çevrimiçi deneyin

Düzenleme: @Adnan sayesinde 9 bayt kaydedildi


4
SOrakamların toplamını (bunun yerine J`)O) almak için daha kısa bir yoldur . Ayrıca, değişken atama olmadan, yapabilirsiniz [>DSO¹Q#:).
Adnan

2
@Adnan. Güzel! S.'i tamamen özledim. Değişkenlere ihtiyacım olmadığının farkına varmalıydım.
Emigna

14

Python 2,33 bayt

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

Doğrudan bir ifade. Sonunda 9'lu, geri kalanını başlangıçta bir sayı dizesi yapar. Bunun dışında tek basamaklı nverir n+9.

Bazı çıkışlarda önde gelen sıfırlar var ( 099için 18).


7

Retina , 39 31 bayt

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

Girişi Alır tekli içinde .

Çevrimiçi deneyin! (İlk iki satır aynı anda birkaç test senaryosunun çalıştırılmasına izin verir ve kolaylık sağlamak için ondalıktan birime dönüştürür.)

Bu aslında sonucu doğrusal olarak aramaz, ancak açıkça hesaplar:

  • Giriş durumunda n, 9 daha büyük olduğu için, ile değiştirin n % 9ve ardından n / 9(katlı) dokuzluk.
  • Aksi takdirde, onunla değiştiririz n + 9.

Kullanılması !(veya değil başka bir şey 1) tekli basamak olarak, şu yaklaşım ile bir byte daha kaydedebilirsiniz:

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

Fakat bu giriş formatı biraz gergin, sanırım.


Yani Retina tamsayı girişine izin vermiyor veya tamsayı aritmetik işleyemiyor mu?
levanth

@levanth Retina'da hiçbir aritmetik yoktur - tüm dil düzenli ifadeler ile dize işlemine dayanır, bu nedenle tüm aritmetik genellikle tekdüze gösterimler üzerinde yapılır. Retina olabilir ondalık tamsayı girdi almak ve tekli birinci dönüştürmek, ancak maliyetler o 6 ek bayt ve bizim politikalarına karşı çıkmak belirtir ondalık sürece tekli girilmesine izin verir. (Tüm cevapların ondalık girdi almasını istiyorsanız, belirtimde belirtmekten çekinmeyin ve cevabımı güncelleyeceğim.)
Martin Ender

Hayır, hayır, tamam ^ ^ Sadece sıradan girdiyi merak ediyordum
levanth


6

Java 7, 68 61 bayt

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

Buradaki diğer cevapların çoğu ile kabaca aynı şeyi yapar. Dize manipülasyonu ve döngüler kullanmadan Java yaklaşımını göstermek istedi.

Bana aptal olduğumu hatırlattığı için FryAmTheEggman'a teşekkürler;)


En azından SQL'i aştın mı?
Rɪᴋᴇʀ

Meh, buradaki çoğu python / ruby'nin verdiği cevapların sadece iki katı büyüklüğünde, Java için şu anda kendimi kötü hissetmiyorum. Yine de C'yi yenmek güzel olurdu: P
Geobits

: / Oops, bunu sınıf blokumdan aldım. Bu konuda paslanmış olmalıyım.
Geobits

@Geobits Muhtemelen C-- 'yi yenerdi.
gcampbell

@Fry Bu numarayı tamamen unuttum. Teşekkürler, bu beni en azından C'nin önüne geçirdi;)
Geobits

3

MATL , 10 9 bayt

`QtV!UsG-

Çevrimiçi deneyin!

açıklama

`        % 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!UBenden +1 akıllıca kullanın . MATL deyimleri listemize girmeli.
Suever

@Suever Evet, bu oldukça sık kullanılmaya başlıyor
Luis Mendo

3

JavaScript (ES7), 32 bayt

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

ES6 olarak 38 bayt:

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

3

Python 3, 128 94 84 74 Bayt

Çıktı olmadan, doğrudan yaklaşım, acemi codegolfer;)

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

1
Yeni başlayanlar için kaldırılabilecek çok fazla alan var. Örneğin önce / sonra = + ().
Emigna

1
Ayrıca print(m)ile değiştirebilirsiniz return m(herhangi bir bayt kaydetmez, ancak fonksiyonun kendisinde yazdırmanız gerekmez). İşlevinizi print(r(n))sınamak için çıktı işlev dönüşünü yine de yazdırabilirsiniz
levanth

1
Ayrıca çok sayıda yeni satırı kaldırabilirsiniz; m=n+1;f=1veif s==n:f=0
Blue

1
Yazdırmayı return ile değiştirirken, bunu doğrudan if ifadesinde yapabilir ve f ile else ifadesini kaldırabilirsiniz.
Emigna

2
F 'yi kaldırabilir ve sadece 1:' i kullanırken kullanabilir ve int (c) ile for arasındaki boşluğu kaldırabilirsiniz
Emigna

2

Aslında, 17 bayt

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

Çevrimiçi deneyin!

Açıklama:

╗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

Bu cevap harika çünkü flört ediyor ( ;))
Fund Monica Davası

2

C 73 65 bayt

Yardımcı işlevi olan bir makro.

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

eFonksiyon sadece on güçlerini hesaplar ve Fmakro aynı çözme yöntemini kullanan bu yakut ve bu piton cevap. Ne yazık ki, bu iki cevap da bir araya getirilenlerle aynı uzunluktan daha uzun . Ama bu ilk C cevabı.

(Lynn'in çıkarma hilesiyle kaydedilen 8 bayt int.)


Her iki oluşumunu da int8 bayt tasarrufu yaparak bırakabilirsiniz .
Lynn,

2

Brachylog , 8 bayt ( Yarışmıyor )

<.=:ef+?

= Bu zorluk gönderildikten sonra değiştirildi, böylece şimdi burada olduğu gibi muhtemelen sınırsız alanlarda çalışıyor.

açıklama

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

Bu, Çıktı'nın =değeri, tüm bu öngörüyü doğru hale getirene kadar tekrar izleyecektir .



1

Python 2,39 bayt

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

Saf tamsayılı aritmetik.

Çıktı ile tam program

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

Çıktı:

11
17
39
79
89
99
699
5999

Bu formülasyonun baştaki sıfırdan kaçınma şeklini seviyorum.
Neil

@Neil diğeri kullanarak bunu engelleyebilireval
Blue

1

PowerShell v2 +, 62 bayt

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

Girdi alır, $nsonra bir fordöngü yürütür . Hedef numaramızı ayarlayarak döngüyü başlatırız, $abundan daha büyük $n(daha büyük olması gerektiğinden artı bunun 1..9düzgün çalışmasını sağlar). Her döngü artmaktadır $a++. Döngüde hiçbir şey uygun olmaz, ancak koşullu program mantığının gerçekleştiği yerdir. Kelimenin tam anlamıyla hedef sayıyı bir dizge olarak alıyoruz, karakter dizisi olarak -joinyayınlıyoruz, diziyi +hazırlıyoruz ve sonra ona yönlendiriyoruz iex(benzereval ) . Bunun bizim giriş numaramıza eşit olup olmadığını test ediyoruz ve buna göre döngüye devam ediyoruz. Döngüden çıktıktan sonra, hedef numaramızın giriş numaramıza eşit rakam toplamı $aolduğu, boru hattına yerleştirildiği ve çıktının kapalı olduğu noktalara ulaştık .


Başvuru için, burada "uygun sayıda 9'lu bir dize oluşturma" yöntemi, diğer kişilerin 67 baytta yaptığı yöntemdir.

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

veya diğer insanların 70 byte'ta yaptığı "saf tamsayı aritmetik" yöntemini veya

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

İkisi de kısa değil, ikisi de daha ilginç.


3 bayttan tasarruf edebilirsiniz:param($n)for($a=$n+1;([char[]]"$a"-join'+'|iex)-$n){$a++}$a
mazzy

1

Pyke, 9 8 7 bayt, rakipsiz - daha yeni bir versiyon kullanıyor

.fhsq)h

Burada dene!

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

Tekrar test edildiğinde, çözümünüz 1 - 8 arasındaki girişler için doğru çıktı
vermez

Sanırım kırdım ... Sayı dışında çalışıyor 1. BT neden Missing arg to Equals, evaling inputortaya çıkıyor? Yani ben bir giriş numarası
veriyorum

@ levanth Bu, varsayılan olarak web arayüzünün uyarıları açık olduğu için olur. Sadece bunu kapatmak için bir yol kodladım (10 dakika önce gibi). Neden 1 için çalışmadığını, sayının 10'dan büyük olup olmadığını ve devam edip etmediğini kontrol ediyordum.
Mavi

1

JavaScript (ES2015), 45 39 33 bayt

@Conor O'Brien ve @Shaun H sayesinde 6 bayt daha kaydedildi.
Sanırım, olduğu gibi bırakacağım çünkü bu sürüm @ Neil'in kullandığı cevaptan farklı String.repeat().

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

Önceki sürüm (@Qwertiy sayesinde 6 bayt kaydedildi):

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

İlk versiyon:

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 Çok teşekkür ederim. Bitsel operatörler hakkında daha fazla şey öğrenmem gerekiyor. İkinci değişiklik hakkında, davayı aşırı karmaşık hale getirdiğime benziyor v <= 9. Başka bir bayt koruyucu (no .repeat () ve sarma dönüş değerini + () olarak sarabilecek tüm sayısal değerleri döndürürsem düşünürüm.
Leibrug

İşlevi kurallarımıza göre adlandırmanız gerekmez
Conor O'Brien

1
v>92 bayt daha kısa, gerekli string.repeatolmayan bir ondalık değer |0
Shaun H

Ayrıca **tabiki kullanmayarak cevabımdan farklı .
Neil

1

Lua, 52 bayt

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

Bir dosyaya kaydedilmek ve Lua tercüman ile çalıştırmak, örneğin lua <file> <input number>

Ayrıca burada deneyebilirsiniz: https://repl.it/CXom/1

(Tekrar girildiğinde, giriş numarası test kolaylığı için kodlanmıştır)


'... + 0' ne yapar? Girişi bir tamsayıya mı aktarıyor?
Yytsi

1
Evet, bir sayıya kadar (yalnızca 5.3'ten önce kullanılan Lua, JavaScript gibi iki katına çıktı). Lua ifadeleri otomatik olarak dizeleri sayılara dönüştürür, ancak karşılaştırma yapmaz. Bu yüzden n>9düzgün çalışması için önce bir numaraya zorlanması gerekir.
PiGuy

1! Anlıyorum. Yani ...+0>9işe yarar mı?
Yytsi

1
Evet! Olabilir :)
PiGuy

1

Raket 70 karakter, 71 bayt

Diğerlerinin çoğunda olduğu gibi aynı algoritma. Modulo için% veya ** expt veya tamsayı bölme için varsayılan olarak olmadığına çok üzüldüm, aksi halde bu çok daha kısa olabilir ve C ve Java'yı geçebilirdim. Yine de dili seviyorum

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

1

Altıgen , 40 31 30 bayt

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

Veya, kodunuzun biraz daha az doğrusal ve biraz daha çokgen olmasını tercih ediyorsanız:

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

Çevrimiçi deneyin!

Bazı fikirler ve ilham için @FryAmTheEggman'a teşekkürler: o)

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

Önceki sürüm: <><.-_|@"'!{|(.9+!8=@>{/".'/:!?$.%\1$..\


1
Bu iş gibi görünüyor? Hala golf oynayabilir.
FryAmTheEggman

@FryAmTheEggman Güzel iş! Bunu gönderdikten 2 dakika sonra, hemen hemen her şeyi yapmanın daha iyi bir yolunu düşündüm. Tünel vizyonu muhtemelen? Gözden geçirilmiş bir sürüm üzerinde çalışıyorum.
Sok

Teşekkürler :) Sadece bir FYI insanlar ezoterik programlama dilleri odasında Hexagony hakkında sık sık sohbet ederler . İstersen katıl :)
FryAmTheEggman


1

Perl 6 ,  38   29 bayt

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

(görünüşe göre doğrudan yaklaşım daha kısadır)

Açıklama:

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

Ölçek:

#! /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 bayt

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

Çevrimiçi deneyin.

EDIT: Baştaki sıfırları olmayan 130 73 bayt ( @ levanth` sayesinde ):

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

Çevrimiçi deneyin.

Açıklama:

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
Herkes ilgi ise: düzeltme yedi bayt uzun olur, yerini String c(int n){return""+(n>9?(n%9)+s(n):n+9);}ileint c(int n){return Integer.parseInt((n>9?(n%9)+s(n):n+9));}
levanth

@levanth ben bunu düzenledikten Btw, unuttun. ""+içindeint c(int n){return Integer.parseInt(""+(n>9?(n%9)+s(n):n+9));}
Kevin Cruijssen

1

Ruby, 33 bayt

Bu sadece xnor'ın python cevabı ile aynı olan bir int aritmetik versiyonudur. Bir int alır ve döndürür anonim bir işlevdir.

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

Ruby'yi o kadar fazla bilmiyorum ama başlangıçta -> isimsiz bir işlev mi?
levanth

@ levanth: evet. Yukarıda
netleşeceğim

N = 9 için çalışmıyor
TR

@GB bunu belirttiğiniz için teşekkür ederiz. Şimdi düzeltildi.
MegaTom 20:18

1

MathGolf , 8 7 bayt

Æ)_Σk=▼

Çevrimiçi deneyin!

Örtük girdi yayı.

Açıklama:

          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

Bunun daha eski bir cevap olduğunu biliyorum, ancak şimdiye kadar 7 girdiyle örtük girdiyle çözebilirsiniz (yalnızca ilkini atlayın k).
maksimum

0

Ruby, 38 bayt

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

Bu cevap, giriş boyutuna bağlı olarak bir dize veya int döndürür. Daha az 9 için bir çözüm isteyen, daha sonra sonuna "9" ekleyen özyinelemeli bir çözümdür.


Ruby, 39 bayt

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

Bir bayt için bu cevap her zaman bir int döndürür. Yukarıdaki ile aynı algoritma ancak sayılarla.


0

C, 80 bayt

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 çevrimiçi deneyin

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 bayt

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 Bayt

Aynı olan iki argüman alır

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

yani onu çağırmak için f (x, x) kullanırsınız



0

Powershell, 54 bayt

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

Test komut dosyası:

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

Çıktı:

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

  • eğer [$_-gt9]bir ilk rakam ve bir kuyruk döndürürse
    • ilk basamak, $ _ ile 9 arasındaki toplamdır ($_%9 )
    • bir kuyruk birkaç tane '9'*(($_-$_%9)/9))
    • Sonunda, bir sonuç dizesini baştaki 0'ı kaldırmak için bir sayıya dönüştürür
  • başka döner ($_+9)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.