แม็พตัวเลขสุ่มกับ pi


27

การแสดงทศนิยมที่แม่นยำสองเท่าสามารถรับประกันความถูกต้องของตำแหน่งทศนิยม 15 ตำแหน่งเท่านั้นดังนั้น pi จึงประมาณเป็น:

3.141592653589793

คุณจะเห็นว่าตัวเลข3อยู่ในตำแหน่ง1, 10, 16ตัวเลข1อยู่ในตำแหน่ง2, 4อื่น ๆ

ท้าทาย

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่สร้างตัวเลขสองเท่าแบบสุ่มระหว่าง 0 ถึง 1 และจับคู่ค่าของตัวเลขนั้นกับค่าของ 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 คุณสามารถ hardcode Pi และนำตัวเลขสุ่มเป็นอินพุต คุณไม่สามารถ hardcode หมายเลขสุ่มหรือใช้ Pi เป็นอินพุตได้
  • ทั้งค่าฮาร์ดโค้ดสำหรับ Pi และตัวเลขสุ่ม 15 หลัก (คุณสามารถข้ามได้0.เนื่องจากคุณรู้ว่ามันจะอยู่ระหว่าง 0 ถึง 1) จะรวมอยู่ในการนับไบต์
  • หากภาษาของคุณไม่มีความแม่นยำที่ต้องการคุณสามารถใช้ความแม่นยำน้อยลงภายใต้ข้อ จำกัด ต่อไปนี้
    • ตัวเลขของ Pi ต้องแม่นยำขึ้นอยู่กับความแม่นยำที่คุณมี
    • คุณไม่สามารถส่งออกค่ามากกว่าที่คุณรับประกันได้ว่าถูกต้องเช่นคุณไม่สามารถส่งออก 15 หลักหากความแม่นยำอนุญาตให้ใช้ทศนิยม 8 ตำแหน่งที่แม่นยำเท่านั้น
    • ค่า hardcoded ของ Pi จะนับเป็น 16 ไบต์ (คุณไม่จำเป็นต้องมีจุดทศนิยม) แม้ว่าโปรแกรมของคุณรองรับเฉพาะตัวเลข 8 หลัก
    • ค่าที่ป้อนสำหรับหมายเลขสุ่มจะนับเป็น 15 ไบต์ (คุณไม่ต้องการ0.) เนื่องจากภาษาที่มีความแม่นยำต่ำไม่ควรมีข้อได้เปรียบที่ไม่เป็นธรรม
    • โปรแกรมต้องรองรับความแม่นยำ 5 ทศนิยม (อย่างน้อย)
    • แก้ไข: เพื่อตรวจสอบความถูกต้องของคำตอบ: หมายเลขสุ่มควรถูกพิมพ์อย่างใด แต่การดำเนินการนี้ไม่จำเป็นต้องรวมอยู่ในจำนวนไบต์ ตัวอย่างเช่นหากเป็นไปได้ที่จะแทรก a print rในตอนท้ายของสคริปต์ส่วนนั้นจะไม่เพิ่มคะแนน
    • คุณไม่สามารถลบไบต์ได้หากเป็นส่วนหนึ่งของการดำเนินการอื่นที่จำเป็น เช่นถ้ารหัสเป็นแล้วคุณสามารถลบprint pi, r, r
    • หากคุณต้องใส่ชิ้นส่วนหลายแห่งในรหัสโปรดใส่ทั้งสองเวอร์ชัน (อันที่พิมพ์หมายเลขสุ่มและอันที่ไม่มีความคิดเห็นเช่น: _pและ_oNoจำเป็นต้องพิมพ์หมายเลขสุ่ม_pทำ xxx และ_oNoทำ yyy. _pและ_oNoจะไม่รวมอยู่ในจำนวนไบต์

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## 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 หลักและตัวเลขสุ่ม 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 Primitives

ฉันจับคู่ Strings และใส่ตัวเลขลงในสตริง "ว่าง" 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


เสร็จสิ้น ตัวแบ่งบรรทัดรวมไว้เพื่อให้สามารถอ่านได้เท่านั้น
Chris Degnen

2
ยังคงออกมาเป็น 149 ไบต์สำหรับฉัน (ที่มี linebreaks, ไม่มี 146) ไม่มีอะไรผิดปกติกับการเพิ่มทั้งรุ่น golfed และ ungolfed เคล็ดลับการเล่นกอล์ฟ: Trueถูก1>0, สามารถใช้มัดสัญกรณ์RandomInteger {0,9}~RandomInteger~15คุณสามารถอาจบันทึกไบต์บางส่วนโดยให้rค่าบางอย่างและใช้จริงสภาพของWhileแทนการใช้Break.แล้วอาจบันทึกไบต์อื่นมากกว่าFor ถึงแม้ว่าผมจะไม่เห็นว่าทำไมคุณต้องห่วงเลยถ้าคุณแทนถือว่าจำนวนสุ่มในช่วงWhile [0,1)
Martin Ender

@ MartinBüttnerฉันชอบ1>0:-)
Chris Degnen

ฉันมักจะอ่านตัวเลขสุ่ม "ระหว่าง 0 ถึง 1" เพื่อหมายถึง 0 <random <1
Chris Degnen

5

JavaScript (ES6), 89 87 ไบต์

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

คำอธิบาย

แก้ไข:สตริงแบบสุ่มจะไม่ถูกตัดทอนตามที่ผู้โพสต์ชี้แจง

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

ทดสอบ

ทดสอบผลลัพธ์ตัวเลขสุ่มด้วย


ไม่สามารถสุ่ม () สร้าง 15 ศูนย์ซึ่งจะสอดคล้องกับ 0.000 ... หรือ 1.000 ... เช่นไม่ใช่ระหว่าง 0 ถึง 1
Chris Degnen

@ChrisDegnen Math.random()ผลิตจำนวนของช่วง[0,1)จึงจะทำได้แต่ไม่เคย0 1OP ไม่ได้ระบุว่าช่วงนั้นครอบคลุมหรือไม่เหมือนใครดังนั้นฉันจึงสันนิษฐานว่าอะไรก็ตามที่สมเหตุสมผล นี่เป็นช่วงที่คำตอบอื่น ๆ ใช้ แต่คุณได้ทำให้ฉันตระหนักว่าถ้ามันเป็นสิ่ง0ที่มันจะล้มเหลวเพราะในปี่จะไม่ได้รับการจับคู่และกลายเป็น. xนี่มีโอกาสเกิดขึ้น 1 ใน 2 ^ 53 แต่ฉันตัดสินใจที่จะแก้ไข
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=

ทดสอบที่นี่

ฉันจะไม่ตัดจำนวนสุ่มเป็นทศนิยม 15 ตำแหน่งตามที่ OP ชี้แจงไว้ในความคิดเห็น

คำอธิบาย

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

Lua 231 230 ไบต์

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

ค่าเริ่มต้นใหญ่ที่สองในการทำสิ่งนี้คือ lua ขาด string.replace () ในขณะที่ฉันกำลังใช้การกระทำนี้สองครั้งs:sub(1,l-1)..c..s:sub(l+1)ฉันต้องการทำฟังก์ชั่นนิรนามโดยคิดว่ามันจะสั้นลง มันไม่ใช่ดังนั้นฉันจึงเขียนมันสองครั้ง

เหตุผลที่ฉันต้องระวังเกี่ยวกับจุดคือลัวะคืนตำแหน่งของมันอย่างไร ใน regexes จุดหมายถึง "ตัวละครใด ๆ " ดังนั้นเมื่อฉันประเมินตัวละคร.ในวงของฉันมันตรงกับตัวอักษรตัวแรก:

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

Python 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)เป็น backticks

สำหรับการทดสอบ:

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

คำตอบที่ดี! "apostrophes 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 ที่พยายามลบแต่ละหลักออกจากรายการแบบสุ่ม ถ้าเราทำได้ดีก็ต่อท้ายคำตอบ ถ้าไม่ใช่ให้เพิ่ม 'x' แทน


str(t)ให้ความแม่นยำ 11 หลักจากtเท่านั้นrepr(t)ให้t15 หลักทั้งหมดของคุณ
Noodle9 9

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!

รุ่นนี้จะพิมพ์ปี่จำนวนสุ่มและผล:

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

ฉันหวังว่ามันจะโอเค:

  • ไพมีทั้งหมด 15 หลักรวมถึง 3 ดังนั้นจึงไม่เกินความแม่นยำ
  • ตัวเลขสุดท้าย ( 9) นั้นถูกต้อง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.