Champernowne 상수에서 숫자 찾기


35

소개

밑 10에서, Champernowne 상수는 연속 정수의 표현을 연결하여 정의됩니다. 기본 10에서 : 0.1234567891011121314151617...등등.

첫 번째 출현이 10 진수 로 15시작되는 것을 볼 수 있습니다 20th.

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

첫 번째 출현은 소수 45에서 시작합니다 4th.

  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가됩니다.
Morgan Thrapp

@MorganThrapp 아마도 범위의 정수를 테스트 할 것이지만 이론적 으로는 보다 높은 정수에서 작동 0 <= x <= 99해야합니다 . 99
Adnan

답변:



10

LabVIEW, 29 LabVIEW 프리미티브

이것은 현재 문자열을 사용합니다. 입력을 패턴으로 일치시키고 오프셋-(입력 길이 -1)을 출력합니다.


6

자바 스크립트, 57 바이트

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

Conor O'Brien 덕분에 1 바이트를 절약했습니다.


나는 당신이 y=부분을 y=b=" "; 공백을 증가시키는 것은 0을 증가시키는 것과 같습니다. ( a=prompt(y=b=" ");...)
코너 오브라이언

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ 좋은 발견.
SuperJedi224

4

하스켈, 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다음과 같은 경우 a의 접두어 b반환 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}/}

일치하는 항목이 색인되도록 시작 부분에 0을 포함하지만 \B일치 항목이 문자열의 시작 부분이 아니어야합니다.


4

apt, 11 바이트

이것은 원래 Pyth를 때리는 것이었지만 input에는 효과가 없었습니다 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

@Fatalize ¬는 바로 가기입니다 ( q다음 공간이 있음). 이것은 종종 혼란의 지점 인 것처럼 보이므로 짧은 버전을 전체 버전으로 정렬했습니다.
ETHproductions

3

루아, 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을 입력 +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

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

@David 이제 그렇습니다. 알아 주셔서 감사합니다! 그것은 단지 3 바이트 비용 :-)
Luis Mendo

이제 클립 보드 G에 입력 (및 암시 적 입력)이 포함되어 있기 때문에이 답변은 상당히 많이 단축 될 수 있으며 어쨌든 Ys변경해야 할 필요가 있다고 생각 V합니다. 나는 10+:"@Vv]!GVXf1)16 바이트를 생각해 냈습니다 .
Giuseppe

@Giuseppe 고마워요! 정당한 신용으로 업데이트 ( "언어 게시 날짜"라며; 나는 새로운 규칙 의 큰 팬이 아님)
Luis Mendo

나는 그 규칙을 너무 신경 쓰지 않는다 (하지만 플래그 는 나를 미치게한다). 최신 버전의 인터프리터에서 사용 Ys하도록 변경해야 한다는 사실을 알게되었으므로 대부분 여기에 의견을 제시했습니다 V. 언어가 얼마나 향상되었는지 항상 감동합니다!
Giuseppe

2

PowerShell, 54 50 바이트

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

루프를 루프 로 교체하는 아이디어에 대한 TessellatingHeckler 에게 감사합니다 .whilefor

for루프 를 통해 실행 합니다. 다른 언어와 마찬가지로 루프의 첫 번째 문은 변수와 대입을 구성 할 수 있으므로 이것은 $c빈 문자열 과 동일하게 시작 ''하여 챌린지의 10 진수 색인으로 정렬 된 문자열의 색인을 0으로 만듭니다. 그런 다음 $c입력 정수 ( $args)가 어딘가에 있는지 확인하는 루프에 있습니다 (즉, 문자열을 찾을 수 없으면 .IndexOf()반환 하므로 루프를 계속하기 -1위해 문자열이 아닌 ( 0)에 1을 추가 $TRUE합니다). 발견되지 않으면 사전 증분 $i카운터 변수를 추가 한 다음 문자열을 다시 확인하십시오. 문자열이 발견되면 .IndexOf()양수 값을 반환합니다.$FALSE루프에서 벗어납니다. 마지막으로 인덱스를로 출력합니다 $x.


클래식 for루프에 이상적이며 for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$x1 문자를 절약하십시오. 대부분의 IndexOf 호출은 -1을 반환하므로 하나를 추가하고 부울합니다! 더 짧은 테스트를 위해 캐스팅하십시오. 하지만 그렇게하려면 파 렌스가 필요합니다. 기존 parens 안에 $ c와 +1을 비우면 더 짧아집니다. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 바이트 (하지만 완전히 다른 접근 방식이므로 39 바이트를 자체 답변으로 게시했습니다 : P).
TessellatingHeckler

1
@TessellatingHeckler 루프를 다시 작성하는 좋은 방법-감사합니다! $c세미콜론을 골프로 연결하기 위해 연결을 루프 로 옮겼습니다 . 현재 50 세입니다.
AdmBorkBork

2

자바 스크립트 (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Σí

입력을 정수로 취합니다. 인쇄 할 수없는 것을 포함하므로 16 진 덤프 :

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

하스켈 , 82 73 55 바이트

복제본 에서 마이그레이션

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

온라인으로 사용해보십시오!

설명

먼저을 정의 !합니다. 의 첫 모양으로 x!b잘립니다 . ( )로 시작 하는지 확인 하고 그렇지 않으면 문자열 아래로 이동하여 시작합니다. 그런 다음 주요 기능을 정의합니다. 우리의 주요 기능은 점 (point-free) 기능으로 상수 ( ) 를 취하고 의 첫 모양으로 자릅니다 . 이것은 문자열로 사용됩니다.bxbxor$zipWith(==)x bxshow=<<[1..]xx



1

자바 스크립트 (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 문자를 요구 하면 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.