Petakan nomor acak ke pi

27

Representasi presisi ganda desimal hanya dapat menjamin keakuratan 15 tempat desimal, sehingga pi diperkirakan sebagai:

3.141592653589793

Anda dapat melihat bahwa digit 3ada di posisi 1, 10, 16, digit 1ada di posisi 2, 4dll.

Tantangan

Tugas Anda adalah membuat program atau fungsi yang membuat angka ganda acak antara 0 dan 1, dan memetakan nilai-nilai nomor itu ke nilai pi. Anda melakukan ini dengan menempatkan angka-angka yang berbeda di angka acak di posisi digit itu di pi. Jika digit tidak ditemukan di pi, Anda akan melewati itu, dan setiap digit di pi yang tidak ada dalam angka acak akan diwakili oleh x. Setiap nilai hanya dapat digunakan sekali, mulai dari kiri.

Beberapa contoh mungkin akan memperjelas hal ini. Dalam contoh berikut, angka pertama adalah pi, yang kedua adalah angka acak, dan yang terakhir adalah output yang diinginkan.

3.141592653589793
0.111111111111111
x.1x1xxxxxxxxxxxx

3.141592653589793
0.531000000000000
3.1xx5xxxxxxxxxxx

3.141592653589793
0.123456789123456
3.141592653x8x7xx

3.141592653589793
0.967552381459391
3.14159265358979x

Aturan:

  • Fungsi tidak boleh mengambil input apa pun (pengecualian yang mungkin dijelaskan dalam poin-poin 3)
  • Keluaran harus terdiri dari hanya string keluaran, dengan baris baru opsional (satu spasi tambahan juga diterima)
  • Jika program Anda tidak memiliki nilai Pi bawaan, dan / atau RNG maka Anda dapat meng-hardcode Pi, dan mengambil nomor acak sebagai input. Anda tidak dapat membuat kode angka acak atau mengambil Pi sebagai input.
  • Baik nilai hardcoded untuk Pi, dan 15 digit acak (Anda dapat melewati 0.karena Anda tahu itu akan berada di antara 0 dan 1), akan dimasukkan dalam jumlah byte.
  • Jika bahasa Anda tidak memiliki ketelitian yang dibutuhkan, Anda dapat menggunakan ketelitian yang lebih rendah di bawah pembatasan berikut
    • Digit Pi harus akurat hingga presisi yang Anda miliki
    • Anda tidak dapat menampilkan nilai lebih dari yang Anda yakini benar, yaitu Anda tidak dapat menampilkan 15 digit jika presisi hanya memungkinkan 8 desimal akurat.
    • Nilai hardcoded dari Pi akan dihitung sebagai 16 byte (Anda tidak perlu titik desimal), bahkan jika program Anda hanya mendukung 8 digit.
    • Nilai input untuk angka acak akan dihitung sebagai 15 byte (Anda tidak perlu 0.. Ini karena bahasa dengan presisi rendah seharusnya tidak memiliki keuntungan yang tidak adil.
    • Program harus mendukung presisi 5 desimal (setidaknya).
    • Sunting: Untuk memvalidasi jawaban: Angka acak harus dicetak entah bagaimana, tetapi operasi ini tidak harus dimasukkan dalam jumlah byte. Jadi misalnya, jika memungkinkan untuk menyisipkan print rdi akhir skrip, bagian itu tidak akan meningkatkan skor.
    • Anda tidak dapat mengurangi byte jika itu bagian dari operasi lain yang diperlukan. Yaitu jika kodenya print pi, r, maka Anda hanya bisa mengurangi , r.
    • Jika Anda harus memasukkan bagian-bagian beberapa tempat dalam kode, harap sertakan kedua versi (yang mencetak nomor acak dan yang tidak dengan komentar seperti: _pdan _oNodiperlukan untuk mencetak nomor acak. _pLakukan xxx dan _oNolakukan yyy. _pdan _oNotidak akan dimasukkan dalam hitungan byte.

Kode terpendek dalam byte menang.


Papan peringkat

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai leaderboard keseluruhan.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

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

Stewie Griffin
sumber
2
Jika Anda menggunakan angka acak bawaan, apakah harus berisi 15 digit atau dapatkah lebih banyak? Apakah ada persyaratan untuk menampilkan nomor acak? Jika tidak, itu membuat sedikit sulit untuk memvalidasi jawaban.
user81655
Aah, itu poin bagus! Angka acak dapat memiliki lebih dari 15 digit. Saya akan mengedit yang menjelaskan apa yang harus dilakukan dengan nomor acak. Terima kasih telah berkomentar!
Stewie Griffin
Apakah acak " antara 0 dan 1" berarti 0 < random < 1atau 0 <= random <= 1?
Chris Degnen
@StewieGriffin saya bingung. Apakah ini berarti kita dapat menggunakan 15 digit pi dan 16/17 digit angka acak?
Jakube
@ Jakube, sejujurnya: Saya membaca pertanyaan sedikit salah, dengan demikian menjawab bahwa itu bisa memiliki lebih banyak digit, jadi jawaban untuk pertanyaan Anda adalah ya. Sudah terlambat untuk kembali ke jawaban itu sekarang karena sebagian besar jawaban belum membatasi jumlah angka acak. Harap batasi hingga 17 saja.
Stewie Griffin

Jawaban:

5

Pyth, 25 byte

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

Cobalah online: Demonstrasi atau Tes yang menunjukkan nomor acak

Penjelasan:

 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)
Jakube
sumber
14

LabVIEW, 53 Primview LabVIEW

Saya mencocokkan Strings dan memasukkan nomor ke string x.xxx "kosong" dan menghapus nomor dari pi sehingga tidak muncul lagi.

nomor acak dan karakter tunggal di sini agak terlihat, apakah itu benar atau apakah saya harus mengulang rekaman?

Eumel
sumber
Ini cukup jelas melakukan pekerjaan bahkan jika beberapa karakter agak sulit dilihat, jadi Anda tidak perlu mengulang apa pun ... Jawaban yang bagus! =)
Stewie Griffin
6

Mathematica, 105 atau 147 karakter

Jika angka acak " antara 0 dan 1" berarti 0 <= random <= 1, yaitu termasuk 0 & 1.

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

(105 karakter)

Kalau tidak, berarti mengambil angka acak " antara 0 dan 1" 0 < random < 1.

Ulangi untuk mendapatkan 15 bilangan bulat acak, tidak semuanya nol. Pilih pelengkap dari rentang 0 hingga 9, yaitu angka-angka dari 0 hingga 9 yang tidak ada dalam daftar acak. Ubah bilangan bulat itu menjadi string dan ganti karakter yang cocok dalam string pi.

(147 karakter)

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

Digit acak: -

FromDigits[r]

820307536180783
Chris Degnen
sumber
Selesai Jeda baris hanya termasuk untuk keterbacaan.
Chris Degnen
2
Masih keluar sebagai 149 byte untuk saya (dengan linebreak, 146 tanpa). Tidak ada yang salah dengan menambahkan versi golf dan ungolfed. Beberapa tips golf: Trueadalah 1>0, RandomIntegerdapat menggunakan notasi infiks {0,9}~RandomInteger~15. Anda mungkin dapat menyimpan beberapa byte dengan memberikan rbeberapa nilai dan benar-benar menggunakan kondisi Whilealih - alih menggunakan Break.Kemudian Formungkin menyimpan byte lain While. Meskipun saya tidak melihat mengapa Anda memerlukan loop sama sekali jika Anda menganggap angka acak dalam kisaran [0,1).
Martin Ender
@ MartinBüttner Saya suka 1>0:-)
Chris Degnen
Saya biasanya membaca angka acak "antara 0 dan 1" berarti 0 <acak <1.
Chris Degnen
5

JavaScript (ES6), 89 87 byte

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

Penjelasan

Sunting: String acak sekarang tidak terpotong seperti yang dijelaskan oleh poster.

Loop melalui setiap digit pi dan menghapus digit dari angka acak jika ditemukan, yang lain menggantikan digit dalam pi dengan 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
    ))

Uji

Tes juga menghasilkan angka acak.

pengguna81655
sumber
Tidak bisakah acak () menghasilkan 15 nol yang sesuai dengan 0.000 ... atau 1.000 ...? yaitu tidak antara 0 dan 1.
Chris Degnen
@ ChrisDegnen Math.random()menghasilkan sejumlah rentang [0,1)sehingga bisa 0tetapi tidak pernah 1. OP tidak secara khusus menyatakan apakah kisarannya inklusif atau eksklusif, jadi saya berasumsi bahwa apa pun yang masuk akal baik-baik saja. Ini juga rentang yang digunakan jawaban lain. Namun Anda telah membuat saya sadar bahwa jika itu tepat 0akan gagal karena .pi tidak akan cocok dan menjadi x. Ini memiliki peluang 1 banding 2 ^ 53 tetapi saya memutuskan untuk memperbaikinya.
user81655
:-) maaf soal itu.
Chris Degnen
Kemungkinan untuk memukul tepat 0 atau 1 untuk double acak dapat diabaikan, jadi untuk tujuan tantangan ini rentang [0,1]baik-baik saja (begitu juga (0,1)).
Stewie Griffin
Bagus. Saya mengusulkan varian yang lebih pendek.
MST
3

CJam, 48 46 42 38 36 byte

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

Uji di sini.

Dan ini adalah versi yang mencetak π dan nomor acak:

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

Uji di sini.

Saya tidak memotong angka acak ke 15 tempat desimal, seperti diklarifikasi oleh OP dalam komentar.

Penjelasan

Idenya adalah untuk mengubah setiap karakter dalam representasi string π menjadi sepasang karakter itu dan x. Untuk setiap karakter dalam angka acak, kami menukar pasangan pertama yang dimulai dengan karakter itu. Pada akhirnya kami menampilkan karakter kedua dari setiap pasangan.

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.
Martin Ender
sumber
2

Lua, 231 230 byte

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)

Penjelasan

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

Sayangnya, lua tidak membantu saya sama sekali di sini. math.pi bulatkan digit terakhir pi yang dikembalikan:

print(math.pi)
>> 3.1415926535898

Saya harus memotong nomor ini:

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

Default besar kedua untuk melakukan tantangan ini adalah kurangnya string.replace (). Saat saya melakukan tindakan ini dua kali menggunakan s:sub(1,l-1)..c..s:sub(l+1), saya ingin melakukan fungsi anonim, berpikir itu akan lebih pendek. Bukan, jadi saya menyimpannya dua kali.

Alasan saya harus berhati-hati tentang titik, adalah bagaimana lua mengembalikan posisinya. Dalam regex, sebuah titik berarti "karakter apa saja", jadi ketika saya mengevaluasi karakter .di loop saya, itu cocok dengan karakter pertama:

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 

Anda dapat menguji lua online . Karena saya tidak melakukan seeding pada PRNG, berikut adalah kode yang memungkinkan Anda untuk menjalankan beberapa tes sambil tetap memperhatikan nilai.

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
Katenkyo
sumber
2

Python 2.7, 117 110 byte

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`)

Diuji pada aplikasi Android QPython terbaru, tetapi harus bekerja di mana saja.

Sunting 1: diubah str(pi)menjadi backticks.

Untuk pengujian:

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`)
uryga
sumber
Jawaban bagus! "Apostrof SO yang digunakan untuk menandai kode" adalah backticks atau simbol grove, by the way :-)
cat
1

Python, 147 byte

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

Cukup jelas: fungsi lambda mengubah float ke daftar; kami kemudian mengulangi pi-list yang berusaha menghapus setiap digit dari daftar acak. Jika kita bisa, bagus, tambahkan jawabannya; jika tidak, tambahkan 'x' sebagai gantinya.

Kieran Hunt
sumber
str(t)hanya memberi Anda 11 digit presisi t, repr(t)memberi Anda semua t15 digit.
Noodle9
1

Perl, 70 byte

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

Dengan komentar:

$_=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!

Versi ini akan mencetak pi, nomor acak, dan hasilnya:

$_=$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"

Contoh output:

3.14159265358979
0.877757977767946
x.x4x59x6xxx897x

Saya harap ini baik-baik saja:

  • pi berisi total 15 digit, termasuk 3, sehingga tidak melebihi akurasi.
  • digit terakhir ( 9) akurat.
Kenney
sumber