nで終わり、nで割り切れる桁の合計がnになる最小の正の整数を見つける


33

それはすべてタイトルにあります...

入力として正の整数n>=12を取り、...タイトルが言うことをします。

はい、これはOEIS A187924にあります。

いくつかのテストケース

12 -> 912  
13 -> 11713  
14 -> 6314  
15 -> 915  
16 -> 3616  
17 -> 15317  
18 -> 918  
19 -> 17119 
20 -> 9920  
40 -> 1999840   
100-> 99999999999100

これはです。バイト単位の最短コードが勝ちです!


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
マーティンエンダー

回答:


19

Befunge、81バイト

&>00p0v<!%g0<
v%"d":_>1+:0^
>00g->#^_:0v
0g10g-#^_.@1>
>0p:55+/\:v>
^1+g01%+55_$^

オンラインでお試しください!

少なくとも最大n = 70を処理できます。その後、ほとんどの実装で一部の値がスタックセルサイズをオーバーフローし始めます。

これらの制約を考えると、99を超えるnの値を処理しようとすることすらありません。つまり、100を法とする値をnと比較するだけで、値がnで終わるかどうかをより簡単にテストできます。

以下は、コードの詳細な内訳です​​。

Source code with execution paths highlighted

*標準入力からnを読み取り、メモリに保存します。
*試験値の初期化Vを 0にし、主ループを開始し、インクリメントVフロントアップ。
*をテストしv%n == 0、そうでない場合はメインループの先頭に戻ります。
*をテストしv%100 == n、そうでない場合はメインループの先頭に戻ります。
*合計の桁V繰り返し添加することにより、Vのモジュロ10と分割Vを 10により
*和に等しいかどうかをテストnは、メインループの開始に戻らない場合。
*それ以外の場合は、vを出力して終了します。


12

05AB1E、14バイト

[NI«ÐIÖsSOIQ*#

オンラインでお試しください!

説明

TIOで大きなプレフィックスを必要とするソリューションがタイムアウトする

[                # start a loop
 NI«             # append input to current iteration number
    Ð            # triplicate
     IÖ          # is the first copy evenly divisible by input?
       sSOIQ     # is the digit sum of the second copy equal to the input?
            *    # multiply
             #   # if true, break loop
                 # output the third copy

05AB1Eが不正行為をしているように感じる場合、それは非常に優れているからです。これを1マイル弱くする唯一の方法は、過去の言語を参照するプログラミング「圧縮」言語を作成することです。ans = dic [1] lolを送信します
Pathfinder

@Pathfinder:常に05AB1Eに勝てる言語がいくつかありますので、もっと短いものを期待できます:)
Emigna

12

JavaScript(ES6)、55 54バイト

f=(s,p=0,a=p+s)=>a%s|eval([...a].join`+`)-s?f(s,p+1):a
<input type=number min=12 oninput=o.textContent=f(this.value)><pre id=o>

入力を文字列として受け取ります。より大きな結果を得るには、末尾再帰をサポートするブラウザーが必要です。編集:@Arnauldのおかげで1バイト保存されました。


eval([s,...a].join`-`)?動作しますが、短くはありませんが
...-ETHproductions

@Arnauldいいえ、それができることを忘れました||
ニール

8

Brachylogの V2、12の 10バイト

a₁.;A×?≜ẹ+

オンラインでお試しください!

これは、経由.で入力を受け取り、経由で出力を生成する関数サブミッションです?(通常の表記法の反対です。すべてのBrachylog関数には、入力引数または出力引数の2つの引数がありますが、言語は特定の引数の使用を強制しません)。私たちは通常、引数の使用のための規則はPPCGに関連があると考えていません

説明

このソリューションの以前のバージョンにはḊ|、1桁の特殊なケース(つまり、「文字通りの数字を返す」)がありましたが、質問では、それを確認する必要はないと述べています(これをキャッチして@DLoscに感謝します)。それ。(Brachylogは無限ループを防ぐために乗算で未知数の可能性として1を考慮しないため、記述されたソリューションは1桁では機能しません。その乗算は任意のアリティです。)

したがって、この答えは、仕様のほとんど直接的な翻訳に当てはまります。始まる?(出力/数は、我々は見つけるためにしようとしている。Brachylog述語は、常に暗黙的に開始します?)私たちが使用するa₁.、それが持っていると主張する.接尾辞として(入力)。次に、結果に何か()を;A×?掛けて(×;A生成?(出力)できることを意味します。最後に、の数字()をẹ+合計(+)し、デフォルトで最終結果が生成するすべてのBrachylogプログラムの最後に暗黙のアサーションがあります。換言すれば、このプログラムは、「あるのサフィックスれ、何かを乗じて、の桁の和であります?..?.?.?「これは、元のプログラムの文字通りの翻訳に非常に近いものです。

これは、桁合計要件を実施するために必要です。私は何かが未知のものを好まないと思うので、Brachylogは代数ではなくプログラムのその部分にブルートフォースアプローチを使用するように指示します。



6

アリス、35バイト

/o
\i@/!w?+.?~\ & /-$K..?\ L z $ /K

オンラインでお試しください!

説明

このプログラムには、Cardinal(整数処理)モードとOrdinal(文字列処理)モードの間の素晴らしい混合と相互作用があります。

主にカーディナルモードで動作する10進数のI / Oによるチャレンジの通常のフレームワーク:

/o 
\i@/...

そして実際のプログラム:

!     Store the input N on the tape.
      We'll use an implicit zero on top of the stack as our iterator variable X,
      which searches for the first valid result.
w     Store the current IP position on the return address stack. This marks
      the beginning of the main search loop. We can avoid the divisibility
      test by going up in increments of N. To check the other two 
      conditions, we'll use individual conditional loop ends that skip to 
      the next iteration. Only if both checks pass and all loop ends are 
      skipped will the search terminate.

  ?+    Increment the iterator X by N.
  .     Duplicate X.
  ?~    Put a copy of N underneath.
  \     Switch to Ordinal mode.
  &     Implicitly convert X to a string, then fold the next command over its
        characters, i.e. its digits. Here, "fold" means that each character
        is pushed to the stack in turn, followed by one execution of that
        next command.
  /     Switch back to Cardinal mode (this is not a command).
  -     Fold subtraction over the digits. This implicitly converts each 
        digit back to its numerical value and subtracts it from N. If the
        digit sum of X is equal to N, this will result in 0.
  $K    Jump back to the w if the digit sum of X isn't N.
  ..    Duplicate X twice.
  ?     Get a copy of N.
  \     Switch to Ordinal mode.
  L     Shortest common superstring. Implicitly converts X and N to strings
        and gives the shortest string that starts with X and ends with N. 
        This will be equal to X iff X already ends with N. Call this Y.
  z     Drop. If X contains Y, this deletes everything up to and including
        Y from X. This can only happen if they are equal, i.e. if X ended
        with N. Otherwise X remains unchanged.
  $     Skip the next command if the string is empty, i.e. if X ended with N.
  /     Switch back to Cardinal mode.
  K     Jump back to w if X didn't end with N.

5

Java(OpenJDK 8)136 110 103 92バイト

-26 JollyJokerに感謝

-7ジョリージョーカーのおかげで再び

-11 OliverGrégoireに感謝

a->{for(int i=a;!(""+a).endsWith(""+i)|i!=(""+a).chars().map(x->x-48).sum();a+=i);return a;}

オンラインでお試しください!

Javaが大好き!私は非効率的なアプローチを使用している可能性がありますが、組み込みのチェックサム関数と文字列への二重変換がなく、数の終わりがバイトかどうかをチェックしています...

ゴルフをしていない:

  a->{                                                       //input n (as integer)
      for (int i = a;                                        //initiate loop
           !("" + a).endsWith("" + i)                        //check if the calculated number ends with the input
           | i != ("" + a).chars().map(x -> x - 48).sum();   //check if the checksum is equal to the input
           a += i)                                           //for every iteration, increase i by the input to save checking for divisibility
        ;                                                    //empty loop body, as everything is calculated in the header
    return a;                                                //return number
}

1
(""+i).endsWith(""+a)動作するはずです。
ジョリージョーカー

@JollyJoker華麗な、私は愚かな感じさせることに感謝:P
ルカH

1
へえ。n/=10代わりにn=n/10。また、i+=aforループでは、分割可能性チェックをスキップできます。
ジョリージョーカー

@JollyJokerうわー、私は合計のためにそれをしましたが、部門のためではありません...ありがとう、私はそれをまもなく追加します
ルカH

1
APIを使用して、自分で計算するよりも短い92バイト。また、有効なラムダをメソッド引数として指定できるため、セミコロンはバイトカウントの一部ではありません。その場合、セミコロンは不要です。
オリビエグレゴワール

4

Mathematica、72バイト

(t=#;While[Mod[t,10^IntegerLength@#]!=#||Tr@IntegerDigits@t!=#,t+=#];t)&  

@MartinEnderから-18バイト

オンラインでお試しください!

ここでマーティン・エンダーから別のバージョンである
。このアプローチは、最大行くことができるがn=40(41はデフォルトの繰り返し回数の制限を超えています)

Mathematica、65バイト

#//.t_/;Mod[t,10^IntegerLength@#]!=#||Tr@IntegerDigits@t!=#:>t+#&

オンラインでお試しください!


3

Python 2、74バイト

このソリューションはそれを仮定していn <= sys.maxintます。

n=x=input()
while sum(map(int,str(x)))-n*str(x).endswith(`n`):x+=n
print x

オンラインでお試しください!


6バイトを節約するために、逆ティックで2回置換str(x)xます(逆ティック内の逆ティックをどのようにエスケープしますか?)。
チャスブラウン

`バックティック内の@ChasBrown バックスラッシュティック。
wvxvw

@ChasBrownいいえ、Lアルゴリズムを台無しにする可能性のある長い整数を追加します
FlipTack

3

C(gcc) 71 69バイト、100で失敗

私は長いと%1000で試しましたが、タイムアウトしました

steadyboxのおかげで-2バイト

s,i,j;f(n){for(j=0;s^n|j%100!=n;)for(s=0,i=j+=n;i;i/=10)s+=i%10;j=j;}

オンラインで試す


今日j * = 1 == return jトリックで新しいトリックを学びました。素敵なコード。
マイケルドーガン

stackoverflow.com/questions/2598084/… (最後の数学が返されます。)
マイケルドーガン


@Steadyboxありがとう、それをやる
PrincePolka


2

C#(.NET Core)90 84 83 + 18 = 101バイト

using System.Linq;
n=>{for(int i=n;!(""+n).EndsWith(""+i)|n%i>0|(""+n).Sum(c=>c-48)!=i;n++);return n;}

オンラインでお試しください!

  • Emignaと、(""+n)ある場所やn.ToString()他の場所で書くことができる私の不思議な能力のおかげで、6バイト節約されました。

n=>{for(int i=n;n%100!=i|n%i>0|(""+n).Sum(c=>c-'0')!=i;n++);return n;}20バイト節約します。
エミグナ

@Emignaなんでn%100?もしもしn>100
チャーリー

そうそう、その部分は無視してください。これは、2桁の入力でのテストによるものです。modは10 ^ len(input)でなければなりません。おそらくそれだけの価値はありません。
エミグナ




1

JavaScript REPL(ES5)、60 59バイト

for(n=prompt(i=0);eval([].join.call(t=++i+n,'+'))-n|t%n;);t

@totallyhuman修正済み
l4m2

コンソールではalert()なしで出力されるので、
l4m2

0

Haskell、75バイト

f n=[x|x<-[0,n..],sum[read[d]|d<-show x]==n,mod x(10^length(show n))==n]!!0

オンラインでお試しください!

説明:

f n=[x|                                      ]!!0 -- Given input n, take the first x
       x<-[0,n..],                                -- which is a multiple of n,
                  sum[read[d]|d<-show x]==n,      -- has a digital sum of n
                  mod x(10^length(show n))==n     -- and ends in n.

「で終わるn」部分を短縮できるかどうか疑問に思います。私も試しましたがshow n`elem`scanr(:)""(show x)、もっと長くなりました。





0

PowerShell、84バイト

for($n=$i=$args[0];$i%$n-or$i-notmatch"$n$"-or([char[]]"$i"-join'+'|iex)-$n){$i++}$i

オンラインでお試しください!

シンプルな構造ですが、コマンドが長くなります。のTIOでタイムアウトしますn=100が、明示的iに近くに設定すると、正しく出力されます

これはfor、いずれかの条件が真である限り継続する単純なループです。3つの条件は1)$i%$n、つまり残りがあります。2)$i-notmatch"$n$"、つまり、最後の数桁に正規表現が一致しません。および3)([char[]]"$i"-join'+'|iex)-$n、つまり、合計された数字が等しくない$n(ここでは単純な減算によってチェックされます。非ゼロの値は真実であるためです)。ループ内では、単にインクリメントしています$i

したがって、剰余がなく、正規表現が一致し、数値が等しい場合、3つの条件はすべて一致し、$falseループを終了します。その結果、$iパイプラインにそのまま残すことができ、出力は暗黙的です。


0

PHP、73 + 1バイト

while(array_sum(str_split($i+=$n=$argn))-$n|$i%10**strlen($n)-$n);echo$i;

でパイプとして実行し-Rます。

until およびfalsyの$i倍数をループします。次に印刷します。<input>sum_of_digits-<input>tail_of_i-$ni


0

m4、210バイト

define(d,define)d(i,ifelse)d(s,`i($1,,0,`eval(substr($1,0,1)+s(substr($1,1)))')')d(k,`r($1,eval($2+1))')d(r,`i(s($2),$1,i(regexp($2,$1$),-1,`k($1,$2)',i(eval($2%$1),0,$2,`k($1,$2)')),`k($1,$2)')')d(f,`r($1,1)')

f答えを計算するマクロを定義します。それは少し遅いです-あまりにもそうではありません-しかし、私はそれが機能すると約束します。

m4はデフォルトで整数を文字列として扱うため、m4がいいと思いましたが、これはかなり悪いです。


0

Scala、120バイト

def a(n:Int)={val b=math.pow(10,math.ceil(math.log10(n))).##;var c=b+n;while(c%n!=0||(0/:c.toString)(_+_-'0')!=n)c+=b;c}

これはまでn = 70有効で、その後整数がオーバーフローします。1つの余分な文字については、Intに変更することができるLongとの値を許可しますn > 100計算。

以下は、わずかに長いバージョンです。

def golfSourceLong(n: Long): Long = {
  val delta = math.pow(10, math.ceil(math.log10(n))).toInt
  var current = delta + n
  while (current % n != 0 || current.toString.foldLeft(0)(_ + _ - '0') != n) {
    current += delta
  }
  current
}

0

R、115バイト

function(n,d=nchar(n):1){while(sum(D<-F%/%10^((k=nchar(F)):1-1)%%10)-n|any(D[k-d+1]-n%/%10^(d-1)%%10)|F%%n)F=F+n
F}

オンラインでお試しください!

ひどいR関数。インクリメントF(開始時刻0により)n値が見つかるまで満たす必要な特性、すなわちそれは、次に戻ります。式でanyonを使用するとdouble、ループの反復ごとに警告が送信されますが、正確性には影響しません。

十分な大きさの入力(n = 55以上)でTIOがタイムアウトしますが、十分な時間/スペースが与えられれば、ソリューションを正しく計算する必要があります。



0

ゼリー22 21バイト

DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#

オンラインでお試しください!

編集:1行に圧縮

説明

DS=³a³ḍaDṫ³DLC¤Ḍ=³ø1#
                  ø1#  Evaluate the condition before this and increment a counter until it is met then output the counter                     
D                      Digits of incremented variable as a list
 S                     Sum
  =³                   Equals argument of program?
    a                  Logical and
     ³ḍ                Does arg divide incremented variable?
       a               Logical and
        Dṫ     Ḍ       Last n digits of inc. var. where n is number of digits in program input
          ³DLC         1 - (number of digits of program input)
              ¤        Book ends above nilad
                =³     Equals program input?

私はゼリーを学んでいるので、これを書くのに何時間もかかりましたが、今では私はとても満足しています。長い間、私はそれが必要であることに気づか¤ず、それを機能させることができなかった。[this] [1]をよく説明したコードを見て、契約を結びました。PPCGの他の多くのゼリーの回答も私を導きました。


0

Javascript、224バイト function getNumber(x){if(x<12){return!1};const sumDigits=(x)=>x.toString().split('').map(Number).reduce((a,b)=>a+b,0);for(let i=2;i<9999;i++){if((x*i-x)%(Math.pow(10,x.toString().length))==0&&sumDigits(x*i)==x){return x*i}}} Un-golf:

function getNumber(x){
	if (x<12) {return false};
	const sumDigits = (x) => x.toString().split('').map(Number).reduce((a,b)=>a+b, 0);
	for (let i=2; i<9999; i++){
		if((x*i-x)%(Math.pow(10, x.toString().length))==0 && sumDigits(x*i)==x){
			return x*i;
}
}
}

使用法:1. getNumber(12)2. getNumber(13)3. ....


Javascriptのゴルフについてはあまり知りませんが、名前getNumberまたはを短縮する必要があると確信していますsumDigits
Ørjanヨハンセン

ただ、この課題に取得したい、どうもありがとう、私はここで勝つために行くわけではない:笑顔:
NTCG

0

J37 33バイト

+^:(((=1#."."0)*:(e.".\.))":)^:_~

オンラインでお試しください!

                                ~    A = N
+^:                          ^:_     while(...)A+=N; return A
   (                      ":)        A to string
   (((    "."0)          )  )        digits of A
   ((( 1#.    )          )  )        sum
   (((=       )          )  )        equals N
   ((            (e.".\.))  )        N is one of the suffixes of A-string
   ((          *:        )  )        not AND

反復カウンターの前に追加すると、最大5倍高速になりますが、5バイト長くなります。

(]+[((=1#.,.&.":)<:|),~&.":)^:_&1,&":]

オンラインでお試しください!

100、27 バイトのインクリメント:

(]+100*(=1#.,.&.":)<:|)^:_~

オンラインでお試しください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.