Сопоставить случайное число с пи

27

Представление десятичной дроби с двойной точностью может гарантировать точность только до 15 десятичных разрядов, таким образом, число пи приблизительно:

3.141592653589793

Вы можете видеть, что цифра 3в позициях 1, 10, 16, цифра 1в позициях 2, 4и т. Д.

Вызов

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

Самый короткий код в байтах побеждает.


Leaderboard

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## 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 цифр. Я сделаю правку, объясняющую, что делать со случайным числом. Спасибо за комментарий!
Стьюи Гриффин
Случайное « между 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)
Jakube
источник
14

LabVIEW, 53 примитива LabVIEW

Я сопоставляю Strings и помещаю число в «пустую» строку x.xxx и удаляю число из pi, чтобы оно больше не отображалось.

случайное число и одиночные символы здесь видны, это нормально, или мне нужно повторить запись?

Eumel
источник
Он довольно четко выполняет свою работу, даже если несколько символов немного сложно увидеть, поэтому вам не нужно ничего переделывать ... Хороший ответ! =)
Стьюи Гриффин
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 без). Нет ничего плохого в добавлении версии для игры в гольф и не в гольф. Некоторые гольфы советы: Trueэто 1>0, RandomIntegerможно использовать инфиксное обозначение {0,9}~RandomInteger~15. Вероятно, вы можете сохранить несколько байтов, задав rнекоторое значение и фактически используя условие Whileвместо использования « Break.Тогда» Forможет сохранить еще один байт While. Хотя я не понимаю, зачем вам вообще нужен цикл, если вместо этого вы принимаете случайное число в диапазоне [0,1).
Мартин Эндер
@ MartinBüttner Мне нравится 1>0:-)
Крис Дегнен
Я обычно читал бы случайное число «между 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"))

объяснение

Редактировать: Случайная строка теперь не обрезается, как пояснил автор.

Перебирает каждую цифру числа Пи и удаляет цифру из случайного числа, если оно было найдено, иначе заменяет цифру в Пи на 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
    ))

Тест

Тест выводит также случайное число.

user81655
источник
Разве функция random () не может создать 15 нулей, в которых будет соответствовать 0,000 ... или 1000 ...? т.е. не между 0 и 1.
Крис Дегнен
@ChrisDegnen Math.random()производит ряд диапазона, [0,1)так что он мог бы, 0но никогда 1. ОП конкретно не указывал, был ли диапазон инклюзивным или эксклюзивным, поэтому я предположил, что все, что было разумно, хорошо. Это также диапазон, который используют другие ответы. Однако вы дали мне понять, что если это именно так, то 0это не удастся, потому что .in pi не будет совпадать и становиться x. Это имеет шанс 1 к 2 ^ 53, но я все равно решил это исправить.
user81655
:-) прости насчет этого.
Крис Дегнен
Вероятность попадания точно в 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

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

К сожалению, Луа мне здесь совсем не помогает. math.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), я хотел сделать анонимную функцию, думая, что она будет короче. Это не так, поэтому я сохранил это дважды.

Причина, по которой я должен быть осторожен с точкой, заключается в том, как Луа возвращает свою позицию. В регулярных выражениях точка означает «любой символ», поэтому, когда я оцениваю символ .в моем цикле, он соответствует первому символу:

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
Katenkyo
источник
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`)

Протестировано на последнем Android-приложении QPython, но должно работать где угодно.

Редактировать 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`)
uryga
источник
Хороший ответ! «Апострофы, которые 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

Довольно понятно: лямбда-функция конвертирует float в список; Затем мы перебираем пи-список, пытаясь удалить каждую цифру из случайного списка. Если мы можем, хорошо, добавьте это к ответу; если нет, добавьте вместо этого «х».

Киран Хант
источник
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!

Эта версия будет печатать пи, случайное число и результат:

$_=$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) является точной.
Кинни
источник