Champernowne定数で数値を見つける


35

前書き

10を基数とする場合、Champernowne定数は、連続する整数の表現を連結することによって定義されます。ベース10:0.1234567891011121314151617...など。

の最初の出現は小数で15始まることがわかり20thます。

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
                     ^
0.1234567891011121314151617181920212223242526272829303132333435363738...
                     ^^
                     15 = position 20

の最初の出現は小数で45始まり4thます:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
     ^               
0.1234567891011121314151617181920212223242526272829303132333435363738...
     ^^
     45 = position 4

そのため、タスクは簡単です。負でない整数を指定すると、シャンパーノーン定数の整数の位置を出力します。

ルール

  • 機能またはプログラムを提供できます
  • これはであるため、バイト数が最小の提出が勝ちです!

テストケース

Input: 20
Output: 30

Input: 333
Output: 56

Input: 0
Output: 11 (note that the 0 before the decimal point is ignored)

Input: 2930
Output: 48

私たちが働く必要がある最高の地位は何ですか?例えば、数はこれまでに987654321123456877654234354675.になります
モルガンThrapp

@MorganThrappおそらく範囲内の整数をテストしますが、理論的にはより大きい整数で動作0 <= x <= 99するはずです。99
アドナン

回答:




6

Javascript、57バイト

a=prompt();for(y=b=" ";y<a+11;)b+=++y;alert(b.indexOf(a))

Conor O'Brienのおかげで1バイト節約されました。


y=部品をy=b=" ";に移動できると思います。スペースを増やすことは、ゼロを増やすことに似ています。(a=prompt(y=b=" ");...
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴ素敵な発見。
SuperJedi224

4

Haskell、62バイト

a#b|and$zipWith(==)a b=1|1<2=1+a#tail b 
(#(show=<<[1..])).show

使用例:(#(show=<<[1..])).show $ 2930-> 48

仕組み:内a # bの位置を見つけaますb:if abreturnの接頭辞である場合1、そうでない場合は1再帰呼び出しにを追加しa # tail bます。pointfree関数(#(show=<<[1..])).showは(名前のない)引数nを予期し、を呼び出しますshow n # show=<<[1..]

関数subIndexはの仕事もします#が、必要なimport Data.List.Utilsものは報われません。


私はあなたが必要とは思わない.show
小麦ウィザード


4

ルビー、28

->n{[*0..n+10]*''=~/\B#{n}/}

一致に1のインデックスが付けられるように、先頭に0を含めます\Bが、文字列の先頭に一致しないことを要求するために使用します。


4

Japt、11バイト

これはもともとPythを破っていましたが、どうやら入力に対しては機能しなかったようです0

1+1oU+B ¬bU

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

使い方

1+1oU+B ¬ bU
1+1oU+B q bU  // Implicit: U = input integer
  1oU+B       // Generate the range [0, U+11).
        q bU  // Join and take the index of U.
1+            // Add one to get the correct result.
              // Implicit: output last expression

「仕組み」セクションにq、論理否定記号ではなくコードが含まれているのはなぜ¬ですか?
15

@Fatalize ¬q次のスペースがある)のショートカットです。これはしばしば混乱のポイントと思われるので、短いバージョンと完全なバージョンを並べました。
ETHproductions

3

Lua、54バイト

s=""for i=1,1e4 do s=s..i end print(s:find(io.read()))

注:現在、このプログラムは、文字列の最初の文字の最初の出現と、それが終了するポイントの両方を出力します。これが許可されない場合、さらに数バイトかかります。私のプログラムは入力番号の最​​初の位置と最後の位置の両方を印刷するため、ボーナスを請願したいと思います。


1
番号の最初の出現の開始インデックスと終了インデックスを意味しますか?理論的にはその数は無限にあるからです。
Rɪᴋᴇʀ

ええ、最初の出現の開始と終了。
Nikolai97

3

MATL、22バイト

it10+:Yst' '=~)wYsXf1)

入力(i)を取得し、ベクトル1をinput + 10(10+:)にし、ベクトルを文字列(Ys)に変換し、スペースを削除します。これは苦痛です(t' '=~))。次に、入力を文字列に変換し(Ys)、入力文字列が数字の文字列のどこにあるかを見つけ()、Xf最初の場所を取得します(1))。tさんとwの(それぞれ、重複及びスワップ)スタックを操作しています。


3

PowerShell、39 44バイト

[編集:私の仮定は成り立たず、1-0から配列を構築しても11で0は見つかりません。代わりに、1-x + 10から構築して0も処理します。

param($i)(1..($i+10)-join'').IndexOf("$i")+1

最後にxを追加すると、最新の時点でChampernowne定数の文字列を作成するときに常にxが見つかるので、1-xの配列には常に答えがあります。質問は、「それより早く発生しますか?」になります。。このコード

param($i)(1..$i-join'').IndexOf("$i")+1

e.g.

PS C:\Temp> .\Champer.ps1 20
30

数値の範囲を生成し、それを文字列にキャストし、その中のパラメーターを検索します。PowerShellはオブジェクト指向のシェルであるため、パラメーターは実際には[int]型であるため、2文字を保存しようとすると.IndexOf($i)、文字列で整数を検索しても何も見つかりません。それが、文字列補間を使用する理由"$i"です。


1
それを行う賢い方法。単刀直入に括弧や引用符を強制する.IndexOf()よりも明らかに動作の優先度が高いことに不満を感じ-joinます。:-/
AdmBorkBork

3

MATL(リリース1.0.1)、22バイト

iXK10+:"@Ys]N$hKYsXf1)

>> matl iXK10+:"@Ys]N$hKYsXf1)
> 333
56

説明

i       % Input
XK      % Copy to clipboard K            
10+     % Add 10. This is needed in case input is 0
:       % Vector of equally spaced values, starting from 1
"       % For each
  @Ys   %   For loop variable as a string
]       % End                            
N$h     % Horizontal concatenation of all stack contents
KYs     % Paste from clipboard K (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

MATL(リリース20.8.0)、16バイト(言語のポストデートチャレンジ)

このバージョンのプログラム(わずかに変更)について@Giuseppeの功績

10+:"@V]&hGVXf1)

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

説明

10+     % Implicit Input. Add 10. This is needed in case input is 0 
:       % Vector of equally spaced values, starting from 1
"       % For each
  @V    %   For loop variable as a string 
]       % End
&h      % Horizontal concatenation of all stack contents
GV      % Paste from automatic clipboard G (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

私はこのハンドルにはないと思う0 :(
デヴィッド

@David今ではありません。気づいてくれてありがとう!費用はわずか3バイトです:-)
ルイスメンドー

クリップボードGに入力(および暗黙的な入力)が含まれるようになったので、この答えはかなり短縮できYsVとにかく変更する必要があると思います。10+:"@Vv]!GVXf1)16バイトを思いついた。
ジュゼッペ

@Giuseppeヘッズアップをありがとう!更新され、正当なクレジット(および「言語のポストデートチャレンジ」のメモ。新しいルールの大ファンではない)
ルイスメンドー

私はそのルールをあまり気にしません(ただし、フラグが私を狂わせます)。通訳の最新バージョンで使用するYsために変更する必要があることに気付いたので、ほとんどここでコメントしVていました。私はいつも言語がどれほど改善されたかに感銘を受けています!
ジュゼッペ

2

PowerShell、54 50バイト

for($c='';!($x=$c.IndexOf("$args")+1)){$c+=++$i}$x

ループをループに交換するアイデアを提供してくれたTessellatingHecklerに感謝します。whilefor

forループを介して実行します。他の言語と同様に、ループの最初のステートメントは変数と割り当てを構成できるため、これ$cは空の文字列と等しいだけで始まる''ため、チャレンジの10進数のインデックス付けに合わせて文字列のゼロインデックス付けが行われます。次に$c、入力整数($args)がその中のどこかにあるかどうかをチェックするループにいます(つまり、文字列が見つからない場合に.IndexOf()戻るため、ループを続行するために()ではなく-10)に1を追加$TRUEします)。見つからない場合は、事前にインクリメントされた$iカウンター変数を追加して、文字列を再確認します。文字列が見つかる.IndexOf()と、正の値を返しますが、その値は$FALSE、ループから抜け出します。最後に、でインデックスを出力します$x


古典的なforループに最適です... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xそして1文字を保存します。IndexOf呼び出しのほとんどは-1を返すため、それに1を追加し、ブール値を返します!短いテストのためにキャストしてください。しかし、それを行うには括弧が必要です。既存の括弧内で$ cを空にして+1すると、ボーナスが短くなります。for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51バイト。(しかし、39バイトの1つを独自の回答として投稿しました。これはまったく異なるアプローチだからです:P)
TessellatingHeckler

1
@TessellatingHecklerループを書き換える素敵な方法-ありがとう!$cセミコロンをゴルフするために、連結をループに移動しました。今50で。
AdmBorkBork15年

2

JavaScript(ES6)、40バイト

x=>(f=n=>n?f(n-1)+n:" ")(x+11).search(x)

再帰関数fを使用してループを回避します。検索方法はと同じように動作しindexOf、それはこの挑戦には無関係であるパラメータとして正規表現を取ることを除いて。

添加" "のためにn=0(ゼロJSでfalsyある)場合は強制変換+の代わりに添加する文字列の連結を行うために、ゼロベースのインデックスを修正します。




1

真剣に、13バイト

;≈9u+R`$`MΣí

入力を整数として受け取ります。印刷できないものが含まれているので、hexdump:

0c3bf739752b526024604de4a1

オンラインで試す

説明:

;≈9u+R`$`MΣí
<form feed>   push str(input)
;≈9u+R        dupe, push [1,...,input+10]
      `$`MΣ   string concatenation of list
           í  get index of input


1

k4、21バイト

{*1+(,/$1+!10+x)ss$x}

他のすべての人と同じアルゴリズム。[1..10+x]文字列として連結し、文字列としてxを検索し、1ベースのインデックスに変換し、最初のヒットを返します。

テストケースの確認:

  &/20 4 30 56 11 48={*1+(,/$1+!10+x)ss$x}'15 45 20 333 0 2930
1b

1

Mathematica、101バイト

(If[#==0,11,m=Min@SequencePosition[s=Flatten[(K=IntegerDigits)/@Range[0,#]],K@#];Length@s[[;;m-1]]])&

1

Haskell82 73 55バイト

複製から移行

x!b|or$zipWith(==)x b=0
x!(_:b)=1+x!b
(!(show=<<[1..]))

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

説明

最初に定義します!。 の最初の表示にx!b切り捨てられます。これは、()で始まるかどうかをチェックすることで行われます。次に、メイン関数を定義します。私たちの主な関数は、定数()を取り、の最初の出現まで切り捨てる無点関数です。これは文字列として取ります。bxbxor$zipWith(==)x bxshow=<<[1..]xx



1

JavaScript(ES6)、50 39 38バイト

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)

それを試してみてください

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)
o.innerText=f(i.value=15);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o></pre>





0

Perl 5、42 + 1(-p)= 43バイト

(join'',0..$_+10)=~/^(0.*?)$_/;$_=length$1

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

説明

(join'',0..$_+10)   #concatenate all of the numbers from 0 to 10 over the input
=~/^(0.*?)$_/;      #skip the first 0, then find the input
$_=length$1         #the length of the string preceding the input is the answer

0

Perl 6 / Rakudo 29バイト

{$_~=$++until /(.+)$^a/;$0.chars}

1つの入力($ ^ a)を持つ関数を定義します。このように呼び出します:

say {$_~=$++until /(.+)$^a/;$0.chars}(333)
> 56

$匿名変数であるAppendingを追加し、$++入力$^aが見つかるまでインクリメントしてから、その前の文字数をカウントします。.+正規表現の前に少なくとも1文字が必要な場合、0-> 0のケースが除外されます。


0

J、30バイト

{.I.(":E.[:}.' '-.~":@i.@+&11)

特に、最初のn + 10の整数を連結することで、もう少しゴルフダウンできます。

説明:

{.I.(":E.[:}.' '-.~":@i.@+&11)
                      i.@+&11   | Integers 0 to n+10
                   ":@          | Format list to string
             ' '-.~             | Strip spaces
           }.                   | Behead (remove leading 0)
         [:                     | Cap (previous verbs executed in order, not as a fork)
     ":E.                       | Find matches to the string n (returns a boolean vector)
  I.                            | Indexes of 1s
{.                              | Take only the first

これは0から始まることに注意してください。例:

    {.I.(":E.[:}.' '-.~":@i.@+&11) 1
0
    {.I.(":E.[:}.' '-.~":@i.@+&11) 0
10
    {.I.(":E.[:}.' '-.~":@i.@+&11) 333
55

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