임의의 숫자를 파이에 매핑


27

소수의 배정도 표현은 소수점 이하 15 자리의 정확도 만 보장 할 수 있으므로 pi는 다음과 같습니다.

3.141592653589793

숫자 3가 위치 1, 10, 16에 있고 숫자 1가 위치 2, 4등에 있음을 알 수 있습니다.

도전

당신의 임무는 0과 1 사이의 임의의 이중 숫자를 생성하고 그 숫자의 값을 pi의 값에 매핑하는 프로그램이나 함수를 만드는 것입니다. 숫자가 pi에있는 위치에 임의의 숫자로 다른 숫자를 배치하여이를 수행합니다. pi에서 숫자를 찾을 수 없으면 생략하고 pi에서 임의의 숫자가 아닌 모든 숫자는로 표시됩니다 x. 각 값은 왼쪽부터 한 번만 사용할 수 있습니다.

몇 가지 예는 아마도 이것을 더 명확하게 할 것입니다. 다음 예에서 첫 번째 숫자는 pi이고 두 번째 숫자는 난수이며 마지막 숫자는 원하는 출력입니다.

3.141592653589793
0.111111111111111
x.1x1xxxxxxxxxxxx

3.141592653589793
0.531000000000000
3.1xx5xxxxxxxxxxx

3.141592653589793
0.123456789123456
3.141592653x8x7xx

3.141592653589793
0.967552381459391
3.14159265358979x

규칙 :

  • 이 함수는 입력을 받아서는 안됩니다 (가능한 예외는 글 머리표 3에 설명되어 있습니다)
  • 출력은 선택적인 줄 바꿈과 함께 출력 문자열로만 구성되어야합니다 (단일 후행 공간도 허용됨)
  • 프로그램에 내장 Pi- 값 및 / 또는 RNG가없는 경우 Pi를 하드 코딩하고 난수를 입력으로 사용할 수 있습니다. 난수를 하드 코딩하거나 Pi를 입력으로 사용할 수 없습니다.
  • Pi의 하드 코딩 된 값과 15 개의 임의의 숫자 ( 0.0과 1 사이임을 알 수 있으므로 건너 뛸 수 있음)가 바이트 수에 포함됩니다.
  • 언어에 필요한 정밀도가 없으면 다음 제한에 따라 정밀도를 떨어 뜨릴 수 있습니다
    • Pi의 자릿수는 보유한 정밀도까지 정확해야합니다.
    • 정확한 값보다 더 많은 값을 출력 할 수 없습니다. 즉, 정밀도에 8 자리의 정확한 소수만 허용하면 15 자리를 출력 할 수 없습니다.
    • 프로그램이 8 자리 만 지원하더라도 Pi의 하드 코드 된 값은 16 바이트 (소수점 필요 없음)로 계산됩니다.
    • 난수 입력 값은 15 바이트로 계산됩니다 (필요하지 않음) 0.. 정밀도가 낮은 언어는 부당한 이점이 없어야하기 때문입니다.
    • 프로그램은 소수점 이하 5 자릿수 (최소한)를 지원해야합니다.
    • 편집 : 답변의 유효성을 검사하려면 : 난수를 어떻게 든 인쇄해야하지만이 작업을 바이트 수에 포함시킬 필요는 없습니다. 예를 들어 print r스크립트 끝에 a를 삽입 할 수 있으면 해당 부분이 점수를 높이 지 않습니다.
    • 다른 필요한 작업의 일부인 경우 바이트를 뺄 수 없습니다. 즉, 코드가 있으면 print pi, r빼기 만 가능합니다 , r.
    • : 당신이 코드에서 부품을 여러 장소를 삽입해야하는 경우, 인쇄 임의의 숫자와 주석과 같은하지 않는 한 것으로 두 버전 (사람을 포함하십시오 _p하고 _oNo. 임의의 숫자를 인쇄 할 필요가 _pXXX을 수행하고 _oNo수행 YYY. _p그리고 _oNo바이트 수에 포함되지 않습니다.

바이트 단위의 최단 코드가 이깁니다.


리더 보드

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신은 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

## Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

## Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


2
내장 난수를 사용하는 경우 15 자리 숫자 이상을 포함해야합니까? 또한 난수를 출력하기위한 요구 사항이 있습니까? 그렇지 않으면 답변을 확인하기가 조금 더 어려워집니다.
user81655

아아, 그게 좋은 지적이야! 난수는 15 자리를 초과 할 수 있습니다. 난수로 무엇을하는지 설명하는 편집을하겠습니다. 댓글 주셔서 감사합니다!
Stewie Griffin

" 0과 1 사이의 임의의" 0 < random < 1 또는 0 <= random <= 1?
Chris Degnen

@StewieGriffin 혼란 스러워요. 이것은 우리가 15 자리의 pi와 16/17 자리의 난수를 사용할 수 있다는 것을 의미합니까?
Jakube

@Jakube, 솔직히 : 나는 질문을 조금 잘못 읽었으므로 더 많은 자릿수를 가질 수 있다고 대답 했으므로 귀하의 질문에 대한 대답은 예입니다. 대부분의 답변이 임의의 자릿수를 제한하지 않았으므로 지금 답변으로 돌아 가기가 너무 늦습니다. 그래도 17로 제한하십시오.
Stewie Griffin

답변:


5

Pyth, 25 바이트

 u&p?}HGH\x.-GH`.n0<`O017

온라인 시도 : 난수를 보여주는 데모 또는 테스트

설명:

 u&p?}HGH\x.-GH`.n0<`O017  
                .n0         the constant pi
               `            convert it into a string
                     O0     random number in the range [0.0, 1.0)
                    `       convert to string
                   <   17   only use the first 17 chars (zero, point and 15 digits)
 u                          for each char H in the pi-string:
    ?}HGH\x                    if H in G (the random number string) then H else "x"
   p                           print this char without newline
  &                            and
           .-GH                remove the digit H once from G
<space>                     suppress the output (u returns the unused digits in G)

14

LabVIEW, 53 LabVIEW 기본 요소

문자열을 일치시키고 숫자를 "빈"x.xxx 문자열에 넣고 pi에서 숫자를 제거하면 다시 표시되지 않습니다.

여기 난수와 단일 문자가 보이는데, 녹화를 다시해야합니까?


약간의 문자가보기가 어려워도 분명히 일을하고 있으므로 아무것도 다시 할 필요가 없습니다 ... 좋은 대답! =)
Stewie Griffin

6

Mathematica, 105 또는 147 자

" 0과 1 사이의 임의의 숫자" 0 <= random <= 1가를 의미하는 경우 , 즉 0과 1을 포함합니다.

StringReplace[ToString@InputForm@N@Pi,
Thread[ToString/@Complement[Range@9,RandomInteger[{0,9},15]]->"x"]]

(105 자)

그렇지 않으면, 0과 1 사이의 임의의 숫자 를 사용하여0 < random < 1 합니다.

모두 0이 아닌 15 개의 임의의 정수를 얻기 위해 반복합니다. 0에서 9까지의 범위, 즉 임의 목록에없는 0에서 9 사이의 보수를 선택하십시오. 정수를 문자열로 변환하고 pi 문자열에서 일치하는 문자를 바꿉니다.

(147 자)

While[True,r=RandomInteger[{0,9},15];
If[Union@r!={0},Break[]]];
StringReplace[ToString@InputForm@N@Pi,
Thread[ToString/@Complement[Range@9,r]->"x"]]

3.1x15x265358x7x3

임의의 숫자 :-

FromDigits[r]

820307536180783


끝난. 가독성을 위해서만 줄 바꿈이 포함되었습니다.
Chris Degnen

2
여전히 149 바이트로 나옵니다 (줄 바꿈, 146 제외). 골프 버전과 골프 버전을 모두 추가해도 아무런 문제가 없습니다. 일부 골프 팁 : True1>0, RandomInteger접두사 표기법을 사용할 수 있습니다 {0,9}~RandomInteger~15. r값 을 제공 하고 실제로 While대신 사용 조건을 사용하여 일부 바이트를 저장할 수 있습니다. Break.그러면 For다른 바이트를 저장할 수 있습니다 While. range 대신 임의의 숫자를 가정하면 왜 루프가 필요한지 알지 못합니다 [0,1).
Martin Ender

@ MartinBüttner I 같은 1>0:-)
크리스 Degnen

나는 일반적으로 0과 1 사이의 임의의 숫자를 읽어 0 <random <1을 의미합니다.
Chris Degnen

5

자바 스크립트 (ES6), 89 87 바이트

_=>(r=[...Math.random()+""],Math.PI+"").replace(/./g,d=>(r[i=r.indexOf(d)]=_,~i?d:"x"))

설명

편집하다: 포스터에서 명확하게 무작위 문자열이 잘리지 않습니다.

pi의 각 숫자를 반복하고 임의의 숫자를 찾은 경우 난수에서 숫자를 제거합니다. 그렇지 않으면 pi의 숫자를로 바꿉니다 x.

_=>(
    r=[...Math.random()+""],      // r = array of 15 digit random number chars
    Math.PI+"").replace(/./g,d=>( // for each digit d of pi, includes "." which is always
                                  //     in the random number
      r[i=r.indexOf(d)]=_,        // i = position of d within r, remove digit from r
                                  // "_" is the unused function argument (equals undefined)
      ~i?d:"x"                    // if found, leave the digit, else replace with x
    ))

테스트

테스트는 난수도 출력합니다.


random ()은 0.000 ... 또는 1.000 ...에 해당하는 15 개의 0을 생성 할 수 없습니다. 하지 1. 0과 즉
크리스 Degnen

@ChrisDegnen는 Math.random()범위의 숫자 생산 [0,1)이 수 있도록 0하지만 결코를 1. OP는 범위가 포함 또는 독점인지 여부를 구체적으로 명시하지 않았으므로 합리적인 것이 무엇이든지 괜찮다고 가정했습니다. 이것은 또한 다른 답변이 사용하는 범위입니다. 그러나 당신은 그것이 정확하다면 in pi가 일치하지 않고 0실패하기 때문에 실패 한다는 것을 알게했습니다 . 이것은 2 ^ 53의 확률로 1이 발생하지만 어쨌든 수정하기로 결정했습니다. .x
user81655

:-) 죄송합니다.
Chris Degnen

랜덤 더블에 대해 정확히 0 또는 1을 칠 가능성은 무시할 수 있으므로,이 챌린지를 위해 범위 [0,1]는 괜찮습니다 (그렇습니다 (0,1)).
Stewie Griffin

좋은. 더 짧은 변형을 제안합니다.
MST

3

CJam, 48 46 42 38 36 바이트

P`'xf+1dmr`{1$f#:!1a/0=:)W+H<.%}/1f=

여기에서 테스트하십시오.

그리고 다음은 π와 난수를 모두 인쇄하는 버전입니다.

P_p`'xf+1dmr`_oNo{1$f#:!1a/0=:)W+H<.%}/1f=

여기에서 테스트하십시오.

의견에서 OP에 의해 분명한 것처럼 난수를 소수점 이하 15 자리로 자르지 않습니다.

설명

아이디어는 π의 문자열 표현에서 각 문자를 해당 문자와의 쌍으로 바꾸는 것 x입니다. 난수의 각 문자마다 해당 문자로 시작하는 첫 번째 쌍을 바꿉니다. 마지막으로 각 쌍의 두 번째 문자를 출력합니다.

P`      e# Get string representation of π.
'xf+    e# Append "x" to each character.
1dmr`   e# Get string representation of random number in [0,1).
{       e# For each character in that string...
  1$    e#   Copy the list of pairs.
  f#    e#   For each pair, find the index of the current character. If the character is
        e#   not in the pair, we get -1 (truthy). If it is the first character of the pair,
        e#   we get 0 (falsy). If it is the second character, we get 1 (truthy).
  :!    e#   Logical NOT for each of the results. We get a 1 for every pair we could
        e#   potentially swap.
  1a/   e#   Split around those 1s.
  0=    e#   Keep only the first chunk.
  :)    e#   Turn all the 0s into that chunk into 1s.
  W+    e#   Append a -1.
  H<    e#   Truncate to 17 elements (the number of pairs).
  .%    e#   Apply % pairwise. This reverses the element at the position of the -1.
}/
1f=     e# Select the second character from each pair.

2

루아, 231230 바이트

m,s=math,""p,r=m.pi..s,s..m.random()p=p:sub(1,#p-1)p:gsub(".",function(c)s=s..(47>c:byte()and c or"x")end)r:gsub("[^%.]",function(c)l=p:find(c)if l then p,s=p:sub(1,l-1).."x"..p:sub(l+1),s:sub(1,l-1)..c..s:sub(l+1)end end)print(s)

설명

function f()
  m,s=math,""
  p,r=m.pi..s,s..m.random()
  p=p:sub(1,#p-1)                       -- remove the last digit of math.pi

  p:gsub(".",function(c)
    s=s..(47>c:byte()and c or"x")      -- Construct a string full of "x" with a single dot
  end)

  r:gsub("[^%.]",function(c)            -- Iterate over each character but the dot in the random number
    l=p:find(c)                         -- if c isn't in pi, l=nil 
    if l                                -- which is one of the two falsy value in lua
    then
      p,s=p:sub(1,l-1).."x"..p:sub(l+1),-- If c is in pi, we replace it in p by an x
          s:sub(1,l-1)..c..s:sub(l+1)   -- and in s by its value
    end
  end)
  return s
end

슬프게도, 루아는 여기서 나를 전혀 도와주지 않습니다. pi의 마지막 숫자를 반올림하는 math.pi :

print(math.pi)
>> 3.1415926535898

이 숫자를 잘라야합니다.

stringPI=""..math.pi
print(stringPI:sub(1,#stringPI-1))
>> 3.141592653589

이 과제를 수행하는 두 번째 큰 기본값은 string.replace ()의 루아 부족이었습니다. 을 사용 하여이 작업을 두 번 s:sub(1,l-1)..c..s:sub(l+1)수행 할 때 익명 기능을 수행하고 더 짧을 것이라고 생각했습니다. 그렇지 않으므로 두 번 작성했습니다.

내가 점에 대해 조심 해야하는 이유는 루아가 어떻게 그 위치를 반환하는지입니다. 정규 표현식에서 점은 "모든 문자"를 의미하므로 .루프 의 문자 를 평가할 때 첫 번째 문자와 일치합니다.

c="."  -- The value of the dot in the loop
found = stringPI:find(c)
print(stringPI)
print("location of \".\": "..found)
print("char at "..found..": "..stringPI:sub(found,found))

>> 3.141592653589
>> location of ".": 1   --Keep in mind that lua arrays are 1-based :)
>> char at 1: 3 

루아를 온라인으로 테스트 할 수 있습니다 . PRNG를 시드하지 않기 때문에 값을 보면서 몇 가지 테스트를 실행할 수있는 코드가 있습니다.

function f()m,s=math,""p,r=m.pi..s,s..m.random()print("Random number: "..r)p=p:sub(1,#p-1)p:gsub(".",function(c)s=s..(c:byte()<47 and c or"x")end)r:gsub("[^%.]",function(c)l=p:find(c)if l then p,s=p:sub(1,l-1).."x"..p:sub(l+1),s:sub(1,l-1)..c..s:sub(l+1)end end)return s end

for i=1,10
do
    print(f())
end

2

파이썬 2.7, 117110 바이트

import math,random
n=list(`random.random()`)
print''.join(n.pop(n.index(d))if d in n else'x'for d in`math.pi`)

최신 QPython Android 앱에서 테스트되었지만 어디서나 작동합니다.

편집 1 : str(pi)백틱으로 변경되었습니다 .

시험용:

import math,random
n=list(`random.random()`)
print `math.pi`
print ''.join(n)
print''.join(n.pop(n.index(d))if d in n else'x'for d in`math.pi`)

좋은 대답입니다! "SO를 사용하여 코드를 표시하는 아포스트로피"는 백틱 또는 그 로브 기호입니다. :-)
cat

1

파이썬, 147 바이트

import math as m,random as r
L=lambda t:[_ for _ in str(t)]
p=L(m.pi)
R=L(r.random())
A=""
print R #subtracted from byte count
for n in p:
    try:R.remove(n);A+=n
    except:A+='x'
print A

상당히 자명 한 설명 : 람다 함수는 float를 list로 변환합니다. 그런 다음 임의의 목록에서 각 숫자를 제거하려고 pi-list를 반복합니다. 우리가 가능하다면 대답에 덧붙이십시오. 그렇지 않은 경우 대신 'x'를 추가하십시오.


str(t)단지 당신의 정밀도의 11 개 자리를 제공 t, repr(t)당신에게 모든 제공 t의 15 개 자리를.
국수 9

1

펄, 70 바이트

$_=4*atan2(1,1);s/\d/x$&/g;for$i(rand=~/\d/g){s/x$i/$i/}s/x./x/g;print

의견 :

$_=4*atan2(1,1);        # Perl doesn't have a Pi constant
s/\d/x$&/g;             # prepend a x to all digits in Pi
for $i (rand=~/\d/g)    # iterate the digits in the random number
{ s/x$i/$i/ }           # replace first occurrence of x-nr pair 
s/x./x/g;               # strip all remaining numbers
print                   # print!

이 버전은 pi, 난수 및 결과를 인쇄합니다.

$_=$p=4*atan2(1,1);
s/\d/x$&/g;
$r=rand;
for $i ($r=~/\d/g)
{ s/x$i/$i/ }
s/x./x/g;
print "$p\n$r\n$_\n"

출력 예 :

3.14159265358979
0.877757977767946
x.x4x59x6xxx897x

나는 이것이 괜찮기를 바랍니다.

  • pi는 3을 포함하여 총 15 자리 숫자를 포함하므로 정확도를 초과하지 않습니다.
  • 마지막 숫자 ( 9)가 정확합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.