Позначте випадкове число на pi


27

Уявлення подвійної точності десяткової може гарантувати лише точність 15 знаків після коми, таким чином, пі приблизний як:

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 повинні бути точними до точності, яку ви маєте
    • Ви не можете вивести більше значень, ніж гарантовано правильних, тобто ви не можете вивести 15 цифр, якщо точність дозволяє лише 8 точних десяткових знаків.
    • Твердокодированное значення Pi вважатиметься 16 байтами (вам не знадобиться десяткова крапка), навіть якщо ваша програма підтримує лише 8 цифр.
    • Вхідне значення для випадкового числа вважатиметься 15 байтами (вам не потрібно 0.. Це тому, що мови з низькою точністю не повинні мати несправедливої ​​переваги.
    • Програма повинна підтримувати точність (принаймні) 5 десяткових знаків.
    • Редагувати: щоб підтвердити відповідь: Довільне число повинно бути надруковано якось, але цю операцію не потрібно включати в кількість байтів. Наприклад, якщо можливо вставити а print rв кінці сценарію, ця частина не збільшить бал.
    • Ви не можете відняти байти, якщо це частина іншої необхідної операції. Тобто, якщо код є print pi, r, то ви можете тільки відняти , r.
    • Якщо вам доведеться вставити частини в декілька місць у коді, будь ласка, включіть обидві версії (та, яка друкує випадкове число, і та, яка не містить коментаря, наприклад: _pі _oNoпотрібні для друку випадкового числа. _pРобить xxx і _oNoробить yyy., _pі _oNoне буде включено до підрахунку байтів.

Найкоротший код виграти в байтах.


Таблиця лідерів

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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 цифр чи може воно мати більше? Чи є якісь вимоги для виведення випадкового числа? Якщо ні, то варіювати відповіді трохи складніше.
користувач81655

Аа, це хороший момент! Випадкове число може мати більше 15 цифр. Я зроблю редагування, пояснюючи, що робити зі випадковим числом. Дякуємо за коментар!
Стюі Гріффін

Чи означає випадковий " між 0 і 1" 0 < random < 1або 0 <= random <= 1?
Кріс Дегнен

@StewieGriffin Я розгублений. Чи означає це, що ми можемо використовувати 15 цифр пі та 16/17-значне випадкове число?
Якубе

@Jakube, якщо чесно: я прочитав запитання трохи неправильно, таким чином відповів, що воно може мати більше цифр, тому відповідь на ваше запитання - так. Зараз уже пізно повернутися до цієї відповіді, оскільки більшість відповідей не обмежує кількість випадкових цифр. Будь ласка, обмежте його до 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 Примітиви

Я збігаю Strings і кладу це число у "порожній" рядок x.xxx і виймаю число з pi, щоб воно більше не відображалося.

випадкове число та одиничні символи тут видно, це все в порядку чи мені потрібно повторити запис?


Зрозуміло, що це робиться, навіть якщо кілька символів трохи важко помітити, тож вам нічого не потрібно повторювати ... Гарна відповідь! =)
Стюі Гріффін

6

Математика, 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 без). Немає нічого поганого в тому, щоб додати як версію для гольфу, так і для нього. Деякі гольфи поради: Trueце 1>0, RandomIntegerможна використовувати інфіксне позначення {0,9}~RandomInteger~15. Можливо, ви можете зберегти деякі байти, надавши rдеяке значення і фактично використовуючи умову Whileзамість того, щоб використовувати Break.Потім, Forможливо, зберегти інший байт While. Хоча я не бачу, для чого вам взагалі потрібна петля, якщо ви замість цього припускаєте випадкове число в діапазоні [0,1).
Мартін Ендер

@ MartinBüttner Мені подобається 1>0:-)
Chris Degnen

Я зазвичай читав випадкове число "між 0 і 1", щоб означати 0 <випадковий <1.
Кріс Дегнен

5

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

Тест

Тест також видає випадкове число.


Не вдалося випадково () дати 15 нулів, в яких відповідатиме 0,000 ... або 1 000 ...? тобто не між 0 і 1.
Кріс Деньєн

@ChrisDegnen Math.random()створює ряд діапазонів, [0,1)щоб це могло, 0але ніколи 1. В ОП не було конкретно зазначено, включено чи виключно асортимент, тому я припустив, що все, що було розумним, добре. Це також діапазон, який використовують інші відповіді. Однак ти дав мені зрозуміти, що якщо це точно, 0то він вийде з ладу, тому що .в pi не буде відповідати і стати x. Це шанс трапитися 1 на 2 ^ 53, але я все-таки вирішив це виправити.
користувач81655

:-) вибачте, але це.
Кріс Дегнен

Ймовірність попадання рівно 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=

Перевірте це тут.

Я не прирізаю випадкове число до 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

Луа, 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

На жаль, Луа мені тут зовсім не допомагає. math.pi навколо останньої цифри 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 

Ви можете протестувати 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

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)на задній план.

Для тестування:

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 використовуються для позначення коду" - це символи зворотного зв'язку або гаю, до речі :-)
кіт

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 у список; Потім ми перебираємо пі-список, намагаючись видалити кожну цифру із випадкового списку. Якщо ми можемо, добре, додамо це до відповіді; якщо ні, додайте замість нього "x".


str(t)дає лише 11 цифр точності t, repr(t)дає всі t15 цифр.
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 містить 15 цифр, включаючи 3, так що це не перевищує точності.
  • остання цифра ( 9) точна.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.