この構成された番号のスターターは何ですか?


14

多くのプログラミング言語は、数字を既存の数字の末尾に「連結」することで大きな整数を構成します。たとえば、LabyrinthまたはAdaptです。数字を最後に連結すると、既存の数字が45で数字が7場合、結果の数字は45745×10+7

構築数が1桁の数の倍数を使用することにより、この方法で構築することができる数である:123456789、これらの9つの配列の一つの要素別名:

112123123412345
224246246824690
336369370237035
448492493649380
560615617061725
672738740474070
784861863886415
896984987298760
9108110711106111105

シーケンスの構築方法の例を提供するためにa=3シーケンスの構築方法を以下に示します。

u1=a=3=3u2=10×u1+2×a=30+6=36u3=10×u2+3×a=360+9=369u4=10×u3+4×a=3690+12=3702u5=10×u4+5×a=37020+15=37035u6=10×u5+6×a=370350+18=370368
u33=10×u32+33×a=37260+99=37359あなたは34=10×あなたは33+34×a=37359+102=373692

あなたは33あなたは34場合実証するために含まれるn×a100多くの桁はスペースのために点在しました。

これらのシーケンスがどのように構築されるかはまだ明確ではないかもしれません。そこで、それらを理解する2つの異なる方法があります:

  • 各シーケンスは1桁から始まります。次の用語は、その桁の次の倍数を取得し、前の用語に10を掛けて、その倍数を加算することで見つかります。順番に:

    あなたはn=10×あなたはn1+n×aあなたは1=a

    ここで、一桁である(1スルー9a19


  • 9シーケンス内の任意の点における要素(とるn=3インスタンスのための)の倍数である123から1まで9123によって構成されているあなたはn+1=10×あなたはn+n 112123123456789123456790012345679011

    最初の値はように1×12389秒であり、12×12389、第123×12389など

あなたの仕事は、構成された数字を入力として受け取り、それを構成するために使用される最初の数字を出力することです。入力は常に構成された数値であり、0より大きいと仮定できます。1桁の数字である場合があり、それはそれ自体にマップされます。

数字のリスト、文字列などを含む、合理的な方法で入力を受け取ることができます。単項式または他の任意のベースで入力することは受け入れられます(推奨されません)。

これはので、最短のコードが勝ちです!

テストケース

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

または2つのリストとして:

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

このチャレンジを投稿したとき、Grimyの答えで使用された方法によってそれほど単純化できるとは思わなかったので、「数字」ではなく、これを解決するためのより数学的なアプローチを取る答えに非常に興味がありますトリック(明らかに、すべての有効な答えは等しく有効であり、私が見たいものです)。


サンドボックスポスト。誰もがそれに挑戦したい場合、私はゼリーに9バイトのソリューションを持っています。
ケアニコインヘリンガー

回答:


26

05AB1E7 5 4バイト

>9*н

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

>            # input + 1
 9*          # * 9
   н         # take the first digit

6
それは簡単に簡素化することができるならばうーん、それはこの挑戦のためによく前兆はありません
coinheringaahing caird

9
800バイトのチャレンジの説明には、約1バイトのコードがあります。:p
アーナルド

1
解決策をどのように思いつき、それが正しいのですか?
ジョエル

7
@Joelは、aで始まるシーケンスの(n-1)番目の項ですa * (((10**n - 1) / 9 - n) / 9)。それに9を掛けて、を追加するa*na * ((10**n - 1) / 9)、別名の数字がn回繰り返されます。a*nn = 1の場合は機能する代わりに9を追加します。nが大きい場合、指数関数的成長の横で一定の差は無視できます。
グリムミー

3
@Grimy説明してくれてありがとう。たぶんあなたはあなたの投稿にそれを置くことができます。
ジョエル





2

、7バイト

§I×⁹⊕N⁰

オンラインでお試しください!リンクは、コードの詳細バージョンです。@Grimyの方法はもちろんです。27バイトの数学的なアプローチを次に示します。

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。無効な入力でクラッシュします。説明:

Nθ

構成された番号を入力します。

W¬№Eχ×κ↨υχθ

リストを10を底とする数として解釈し、から0までのすべての数を掛け9、構築された数が現れるかどうかを確認します。

⊞υLυ

リストの長さをそれ自体にプッシュします。したがって、リストは次の形式になり[0, 1, 2, ..., n]ます。

I⌕Eχ×ι↨υχθ

構成された番号を再作成しますが、今回は入力番号が出現したインデックスを見つけて出力します。



2

空白、108バイト

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

@Grimyの05AB1E回答のポート。ただし、最初の桁を取得するためがないことを除きます。;)

オンラインで試す(未加工のスペース、タブ、改行のみ)。

擬似コードの説明:

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT

2

Python 3、22バイト

lambda i:str(-~i*9)[0]

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

Port of Grimy05AB1E回答


Python 3、74バイト

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

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

説明

再帰関数。lから始まる各桁のシーケンスを反復処理し1ます。入力iが現在の反復と等しい場合、j対応する数字lが返されます。それ以外の場合、jシーケンス内の現在の値が入力値を超えるiと、数字が増加してl最初からやり直します。引数kは、乗算係数を増分するために使用されます。


1

JavaScript(ES6)、 16  15バイト

以前のバージョンで32ビットの制約を解除してくれた@Grimyに感謝します。

Grimyの魔法の呪文を使用する。入力を文字列として受け取ります。

n=>(n*9+9+n)[0]

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


JavaScript(ES6)、53バイト

素朴なブルートフォースアプローチ。

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

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


-~n*9n*9+9は、同じバイト数ですが、正しく理解できれば32ビットの制限を取り除くことができます。
グリムミー

ブルート力は次のように、> = 10のために働く14808
ナウエルFouilleul

1
@NahuelFouilleul a> = 10と考えると、答えは一意ではなくなります(14808はa = 12の4番目の項、またはa = 14808の最初の項のいずれかになります)。これらのいずれかの出力が許可されている場合n=>n、すべての入力に対して機能します。
グリムミー

1

Java 8、23バイト

n->(n*9+9+"").charAt(0)

@Grimyの05AB1E回答のポートので、必ず彼にしてください!

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

しかし、私はちょっと@cairdCoinheringaahingに気分が悪いので、少し余裕のあるブルートフォースアプローチ(83バイト):

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

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

説明:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result


0

ゼリー、8バイト

RRḌ÷@fⱮ9

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

整数を取り、開始桁を出力する完全なプログラム。Grimyの賢い方法を使用しないでください!より大きな入力に対しては非常に非効率的です。次のバージョンはすべてのテストケースを処理しますが、1バイト長くなります。

ゼリー、9バイト

DJRḌ÷@fⱮ9

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



0

-rr、4バイト

⑨9*÷

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

もちろん、05AB1Eの回答と同じアプローチを使用します。また、新しい-rr(リバースおよび生の印刷)フラグも使用します。

トランスパイル:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)

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