乱数をpiにマッピングします


27

小数点の倍精度表現では、小数点以下15桁の精度しか保証できないため、piは次のように近似されます。

3.141592653589793

あなたは桁があることがわかります3の位置にあり1, 10, 16、数字が1位置している2, 4など

チャレンジ

あなたの仕事は、0から1の間のランダムな倍数を作成し、その数の値をpiの値にマッピングするプログラムまたは関数を作成することです。これを行うには、数字がpiにある位置の乱数に異なる数字を配置します。piに数字が見つからない場合はスキップし、乱数に含まれないpiの数字はすべてで表されますx。各値は、左から1回だけ使用できます。

いくつかの例はおそらくこれをより明確にするでしょう。次の例では、最初の数値はpi、2番目の数値は乱数、最後の数値は目的の出力です。

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
    • :あなたは、コード内の部品にいくつかの場所を挿入する必要がある場合は、プリント乱数やコメントなどでないものという両方のバージョン(1を含めてください_p_oNo。乱数を印刷するために必要とされるが、_pXXXを行い、_oNoいYYY。_pおよび_oNoバイト数には含まれません。

バイト単位の最短コードが勝ちます。


リーダーボード

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


2
組み込みの乱数を使用している場合、15桁を含める必要がありますか?乱数を出力するための要件もありますか?そうでない場合、回答の検証が少し難しくなります。
user81655

ああ、それは良い点です!乱数は15桁を超える場合があります。乱数の処理方法を説明する編集を行います。コメントしていただきありがとうございます!
スティーヴィーグリフィン

ランダムな「0と1の」は、0 < random < 1またはを意味し0 <= random <= 1ますか?
クリスデグネン

@StewieGriffin混乱しています。これは、15桁のpiと16/17桁の乱数を使用できるということですか?
ジャクベ

@ジャクベ、正直に言って、私は質問を少し間違って読んだので、もっと数字があるかもしれないと答えたので、あなたの質問に対する答えはイエスです。ほとんどの回答がランダムな数字の数に上限を設けていないため、今すぐその回答に戻るのは遅すぎます。ただし、17に制限してください。
スティーヴィーグリフィン

回答:


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ます。

ループして、すべてゼロではなく、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


できた 改行は読みやすくするためにのみ含まれています。
クリスデグネン

2
私にとってはまだ149バイトとして出力されます(改行あり、146バイトなし)。ゴルフバージョンと非ゴルフバージョンの両方を追加しても何も問題はありません。いくつかのゴルフのヒント:True1>0RandomInteger中置表記法を使用できます{0,9}~RandomInteger~15。することができますおそらく与えることによって、いくつかのバイトを保存するrいくつかの値を、実際の条件を使用してWhile使用するのではなく、Break.その後Forの上に別のバイトを保存するかもしれませんWhile。範囲内の乱数を代わりに仮定する場合、ループが必要な理由はまったくわかりませんが[0,1)
マーティンエンダー

@MartinBüttner好き1>0:-)
クリスデグネン

私は通常、0 <ランダム<1を意味する「0と1の間の」乱数を読んでいました
クリスDegnen

5

JavaScript(ES6)、89 87バイト

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

説明

編集:ランダム文字列は、ポスターで明確にされたように切り捨てられません。

piの各桁をループし、見つかった場合は乱数から数字を削除しxます。それ以外の場合は、piの数字をに置き換えます。

_=>(
    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の間
クリスDegnen

@ChrisDegnen Math.random()は多くの範囲を生成する[0,1)ため、でき0ませんでした1。OPは、範囲が包括的であるか排他的であるかを具体的に述べていなかったため、妥当なものは何でも問題ないと思いました。これは、他の回答が使用する範囲でもあります。しかし、あなたは私がそれが正確0である場合.、piが一致しないために失敗することを認識させましたx。これは2分の1の確率で発生しますが、とにかく修正することにしました。
user81655

:-)ごめんなさい。
クリスデグネン

ランダムなdoubleに対して正確に0または1をヒットする可能性は無視できるため、このチャレンジの目的では範囲[0,1]は問題ありません(そうです(0,1))。
スティーヴィーグリフィン

いいね 短いバリエーションを提案します。
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です。乱数の各文字について、その文字で始まる最初のペアを交換します。最後に、各ペアの2番目の文字を出力します。

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

Lua、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

悲しいことに、luaはここではまったく役に立ちません。math.piは、それが返すpiの最後の桁を丸めます:

print(math.pi)
>> 3.1415926535898

私はこの番号を切り捨てる必要があります:

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

このチャレンジを行うための2番目の大きなデフォルトは、string.replace()のlua不足でした。を使用してこのアクションを2回s:sub(1,l-1)..c..s:sub(l+1)実行しているため、匿名関数を実行したいと考えました。そうではないので、私はそれを二度書き続けました。

ドットに注意しなければならない理由は、luaがその位置を返す方法です。正規表現では、ドットは「任意の文字」を意味するため.、ループ内の文字を評価するとき、最初の文字と一致します。

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 

オンラインで luaをテストできます。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、117の 110バイト

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

Python、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

かなり自明です:ラムダ関数はフロートをリストに変換します。次に、pi-listをループして、ランダムリストから各桁を削除しようとします。できれば、答えに追加してください。そうでない場合は、代わりに「x」を追加します。


str(t)から11桁の精度のみが得られt、の15桁repr(t)すべてが得られますt
Noodle9

1

Perl、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.