在Champernowne常数中找到数字


35

介绍

在基数10中,通过串联连续整数的表示来定义Champernowne常数。以10为底:0.1234567891011121314151617...依此类推。

您可以看到首次出现是1520th小数点开始的:

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

第一次出现是454th小数点开始:

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

因此,任务很容易。给定一个非负整数,输出该整数在Champernowne常数中的位置。

规则

  • 您可以提供功能或程序
  • 这是,因此以最少的字节提交为准!

测试用例

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
阿德南(Adnan)2015年

Answers:



10

LabVIEW,29个LabVIEW原语

现在使用字符串。它将输入作为模式进行匹配,并输出偏移量-(输入长度​​-1)。


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 2015年

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发现的位置ab:如果a是的前缀b回报1,否则加1用递归调用a # tail b。pointfree函数(#(show=<<[1..])).show需要一个(未命名的)参数n并调用show n # show=<<[1..]

该函数subIndex也可以完成的工作#,但是所需的import Data.List.Utils还没有付清。


我认为您不需要.show
Wheat

和一些友好的竞争。尽管晚了两年。
小麦巫师

4

红宝石,28岁

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

在开头包含0,以便对匹配项进行1索引,但用于\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在代码中包含而不是逻辑否定符号¬
致命

@Fatalize ¬q以下空格的)快捷方式。这似乎常常让人感到困惑,因此我将较短的版本与完整的版本对齐。
ETHproductions 2015年

3

Lua,54个字节

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

注意:当前,此程序同时打印字符串的第一个字符的第一个匹配项和结束点。如果不允许这样做,将花费更多字节。我想申请奖金,因为我的程序会打印出输入数字的第一个位置和最后一个位置。


1
您是指数字的第一个出现的开始索引和结束索引吗?因为从理论上讲,该数目将存在无数次。
Rɪᴋᴇʀ

是的,第一次出现的开始和结束。
Nikolai97 2015年

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,现在是44字节]

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]类型,因此尝试使用来保存两个字符.IndexOf($i)将在字符串中搜索整数,而一无所获。这就是为什么我使用字符串插值"$i"


1
聪明的方法。令人沮丧的是,.IndexOf()与一元-join强制使用括号和引号相比,显然具有更高的操作偏好。:-/
AdmBorkBork 2015年

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包含输入(和隐式输入),我想这个答案可以大大缩短,并且无论如何都Ys需要更改V;我想出了10+:"@Vv]!GVXf1)16个字节。
朱塞佩

@Giuseppe感谢您的注意!已更新,带有应有的信誉(并带有“语言postdates挑战”注释;我不是新规则的忠实
拥护者

我不介意那么多规则(不过,一个标志使我发疯);我在这里主要是在评论,因为我注意到Ys需要更改为V在最新版本的解释器中使用。语言的进步给我留下了深刻的印象!
朱塞佩

2

PowerShell,54 50字节

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

感谢TessellatingHeckler提供了将while循环替换为循环的想法for

通过for循环执行。与其他语言一样,循环中的第一条语句可以构造变量和赋值,因此它以$c等于空字符串开始,''因此我们将字符串的零索引与质询的十进制索引对齐。然后,我们进入一个循环,检查是否$c在其中包含输入整数($args)(即,如果未找到该字符串,则.IndexOf()返回-1,因此我们在该(0)上添加一个,而不是($TRUE)继续循环)。如果找不到,我们添加预先增加的$i计数器变量,然后重新检查字符串。找到字符串后,.IndexOf()将返回一个正值,而不是$FALSE,打破循环。最后,我们使用输出索引$x


经典for循环的理想选择... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$x并保存1个字符。由于大多数IndexOf调用将返回-1,因此将其添加一个并布尔!投放它,以进行更短的测试。但是您需要parens来做到这一点。在现有的括号内清空$ c并+1,这是较短的奖励。for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51个字节 (但我将自己的39个字节作为自己的答案发布,因为这是一种完全不同的方法:P)。
TessellatingHeckler,2015年

1
@TessellatingHeckler重写循环的好方法-谢谢!我将$c串联移动到循环中以打分号。现在,在50
AdmBorkBork

2

JavaScript(ES6),40个字节

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

使用递归函数f来避免循环。该搜索方法的工作原理相同,indexOf不同的是它需要一个正则表达式作为参数,这是无关这一挑战。

" "n=0案例添加一个(在JS中,零是虚假的)会强制该+字符串执行字符串连接而不是加法,并纠正基于零的索引。



1

CJam,11个字节

r_i),s\#Be|

在这里测试。

我正在查找N字符串中的位置01234...N以说明基于1的索引。最后,我0通过对11应用逻辑或来解决。


1

严重的是13个字节

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

将输入作为整数。包含不可打印的内容,因此十六进制转储:

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,转换为基于一个的索引,返回第一个匹配项。

检查测试用例:

  &/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截断b为的首次出现x。它通过检查是否bxor$zipWith(==)x b)开头是否返回(x否则返回)并将其向下移动到字符串来实现。然后定义主要功能。我们的主要函数是一个无点函数,该函数采用常数(show=<<[1..])并将其截断为的第一个出现x。这x作为字符串。



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}

用一个输入($ ^ a)定义一个函数。因此致电:

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

Appending $,一个匿名变量,递增$++直到$^a找到输入,然后对它前面的字符数进行计数。在.+正则表达式中至少需要1个char才能有效地排除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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.