Pi'ye rasgele bir sayı eşleme


27

Ondalık bir çift hassasiyetli gösterimi, yalnızca 15 ondalık basamağın doğruluğunu garanti edebilir, bu nedenle pi, şöyledir:

3.141592653589793

Sen haneli olduğunu görebilirsiniz 3pozisyonlarda ise 1, 10, 16, basamaklı 1pozisyonlarda olduğu 2, 4gibi

Meydan okuma

Görevin, 0 ile 1 arasında rastgele bir çift sayı oluşturan ve bu sayının değerlerini pi değerine eşleyen bir program veya işlev oluşturmaktır. Bunu, farklı basamakları rasgele sayılara, basamağın pi'deki konumuna getirerek yapabilirsiniz. Rakam pi'de bulunmazsa, atlarsınız ve rasgele sayıdaki pi olmayan her rakam bir ile temsil edilir x. Her değer soldan başlayarak yalnızca bir kez kullanılabilir.

Birkaç örnek muhtemelen bunu daha net hale getirecektir. Aşağıdaki örneklerde, birinci sayı pi, ikincisi rasgele sayı ve sonuncusu istenen çıktıdır.

3.141592653589793
0.111111111111111
x.1x1xxxxxxxxxxxx

3.141592653589793
0.531000000000000
3.1xx5xxxxxxxxxxx

3.141592653589793
0.123456789123456
3.141592653x8x7xx

3.141592653589793
0.967552381459391
3.14159265358979x

Kurallar:

  • İşlev herhangi bir girdi almamalıdır (olası bir istisna madde 3 numaralı madde işaretinde açıklanmıştır).
  • Çıktı, isteğe bağlı yeni satırlı yalnızca çıktı dizgisinden oluşur (tek bir arka boşluk da kabul edilir)
  • Programınızın yerleşik bir Pi değeri ve / veya bir RNG'si yoksa, Pi'yi kodlayabilir ve rastgele sayıyı girdi olarak alabilirsiniz. Rasgele sayıyı kodlayamaz veya Pi'yi girdi olarak alamazsınız.
  • Hem Pi için kodlanmış değer, hem de 15 rastgele rakam ( 0.0 ile 1 arasında olacağını bildiğinizden atlayabilirsiniz ) bayt sayımına dahil edilir.
  • Dilinizde gerekli hassasiyet yoksa, aşağıdaki kısıtlamalar altında daha az hassaslık kullanabilirsiniz.
    • Pi'nin rakamları, sahip olduğunuz hassasiyete kadar kesin olmalıdır
    • Doğru olması garanti edilenden daha fazla değer veremezsiniz, yani hassasiyet yalnızca 8 doğru ondalık basamağa izin veriyorsa 15 basamak veremezsiniz.
    • Pi'nin kodlanmış değeri, programınız sadece 8 haneyi desteklese bile, 16 bayt (ondalık basamağa ihtiyacınız yoktur) olarak sayılır.
    • Rastgele sayının giriş değeri 15 bayt olarak sayılır (buna ihtiyacınız yoktur 0.. Bunun nedeni düşük hassasiyetli dillerin haksız bir avantaja sahip olmaması gerektiğidir.
    • Program 5 ondalık hassasiyetini (en azından) desteklemelidir.
    • Düzenleme: Cevabı doğrulamak için: Rastgele sayı bir şekilde yazdırılmalıdır, ancak bu işlem bayt sayımına dahil edilmek zorunda değildir. Bu nedenle, örneğin, print rbetiğin sonuna bir harf ekleyebiliyorsanız , o bölüm puanı artırmaz.
    • Gerekli başka bir işlemin bir parçasıysa baytları çıkaramazsınız. Yani kod buysa, print pi, ryalnızca çıkarabilirsiniz , r.
    • : Kodda parça çeşitli yerlerde eklemek varsa, baskılar rastgele sayı ve bir yorum gibi olan Bilmeyen o iki sürümünü (birini ekleyin _pve _oNo. Rasgele sayı yazdırmak için gerekli olan _pxxx yapar ve _oNoyapar yyy _pve _oNobayt sayısına dahil edilmeyecektir.

Bayt cinsinden en kısa kod kazanır.


Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

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


2
Dahili bir rasgele sayı kullanıyorsanız, 15 basamak içermesi gerekir mi, yoksa daha fazlasına sahip olabilir mi? Ayrıca rastgele sayı çıktısı almak için herhangi bir gereksinim var mı? Aksi halde cevapları doğrulamak biraz zorlaşır.
user81655 21:15

Aah, bu iyi bir nokta! Rastgele sayı 15'ten fazla basamak içerebilir. Rasgele sayıyla ne yapılacağını açıklayan bir düzenleme yapacağım. Yorum yaptığın için teşekkürler!
Stewie Griffin,

"Rastgele mu arasındaki ortalama 0 ile 1" 0 < random < 1ya 0 <= random <= 1?
Chris Degnen

@StewieGriffin Kafam karıştı. Bu, 15 basamak pi ve 16/17 basamak rasgele sayı kullanabileceğimiz anlamına mı geliyor?
Jakube

@Jakube, dürüst olmak gerekirse: soruyu biraz yanlış okudum, bu yüzden daha fazla rakam olabileceğini yanıtladı, bu yüzden sorunuzun cevabı evet. Yanıtların çoğu rastgele basamak sayısını sınırlamadığından, şimdi bu cevaba geri dönmek için çok geç. Lütfen bunu 17 ile sınırlandırın.
Stewie Griffin,

Yanıtlar:


5

Pyth, 25 bayt

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

Çevrimiçi deneyin: Rastgele sayıyı gösteren Gösteri veya Test

Açıklama:

 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 İlkelleri

Strings ile eşleşir ve sayıyı "empty" x.xxx dizgisine koyarım ve sayıyı pi'den silerim, böylece tekrar ortaya çıkmaz.

rastgele sayı ve buradaki tekil karakterler görünebilir, tamam mı yoksa kaydı tekrar yapmak zorunda mıyım?


Birkaç karakterin görülmesi biraz zor olsa bile, işi net bir şekilde yapıyor, bu yüzden hiçbir şeyi tekrarlamanıza gerek yok ... Güzel cevap! =)
Stewie Griffin,

6

Mathematica, 105 veya 147 karakter

Eğer " 0 ile 1 arasında " rasgele sayı, " 0" anlamına gelir 0 <= random <= 1;

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

(105 karakter)

Aksi takdirde, " 0 ile 1 arasında " rasgele sayı alarak demek 0 < random < 1.

Sıfır değil, 15 rasgele tamsayı almak için döngü. 0 ila 9 aralığından tamamlayıcıyı seçin, yani rastgele listede olmayan 0 ila 9 arasındaki sayılar. Bu tamsayıları dizelere dönüştürün ve eşleşen karakterleri bir pi dizesinde değiştirin.

(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

Rastgele basamaklar: -

FromDigits[r]

820307536180783


Bitti. Satır sonları yalnızca okunabilirlik için dahil edilmiştir.
Chris Degnen,

2
Hala benim için 149 bayt olarak çıkıyor (çizgiler, 146 olmadan). Hem golf hem de çirkin sürüm eklerken yanlış bir şey yok. Bazı golf ipuçları: Trueedilir 1>0, RandomIntegerinfix notasyonu kullanabilirsiniz {0,9}~RandomInteger~15. Büyük olasılıkla bir rmiktar değer vererek ve gerçekte Then Whilekullanmak yerine koşulunu kullanarak bazı baytları kaydedebilirsiniz . Rağmen sayı olarak rastgele bir sayı varsayarsanız neden döngüye hiç ihtiyacınız olduğunu anlamıyorum . Break.ForWhile[0,1)
Martin Ender

@ MartinBüttner Sevdiğim 1>0:-)
Chris Degnen

Genellikle "0 ile 1 arasında" rasgele sayıları okuyacağım, 0 <rastgele <1
46'da Chris Degnen

5

JavaScript (ES6), 89 87 bayt

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

açıklama

Düzenleme: Rastgele dize şimdi poster tarafından açıklandığı gibi kesilmez.

Pi'nin her basamağında ilmekler ve bulunduğunda rastgele sayıdaki basamağı kaldırır, aksi halde pi ile basamağın yerini alır 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
    ))

Ölçek

Test ayrıca rasgele sayıyı da verir.


Rastgele (), 0.000 ... veya 1.000 ... değerlerine karşılık gelen 15 sıfır üretemez mi? yani 0 ile 1 arasında değil
Chris Degnen

@ChrisDegnen Math.random()aralığında bir dizi üretir [0,1)elinden yüzden 0ama asla 1. OP, menzilin kapsayıcı mı yoksa özel mi olduğunu açıkça belirtmedi, bu yüzden makul olanın iyi olduğunu varsaydım. Bu aynı zamanda diğer cevapların kullandığı aralıktır. Bununla birlikte, eğer tam olarak 0başarısız olursa, .in pi'nin eşleşmeyeceği ve olamayacağının farkında olmamı sağladın x. Bunun 1'de 2 ^ 53 olma şansı var ama yine de düzeltmeye karar verdim.
user81655 21:15

:-) üzgünüm ama bunun hakkında.
Chris Degnen

Rastgele bir çift için tam olarak 0 veya 1'e vurma olasılığı önemsizdir, bu nedenle bu zorluğun amacı için bir aralık [0,1]iyidir (öyle (0,1)).
Stewie Griffin,

Güzel. Daha kısa bir değişken öneririm.
MST

3

CJam, 48 46 42 38 36 bayt

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

Burada test et.

Ve işte hem π hem de rasgele sayıyı basan sürüm:

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

Burada test et.

OP tarafından bir yorumda açıklandığı gibi rastgele sayıları 15 ondalık basamağa kesmiyorum.

açıklama

Fikir, each karakterindeki her karakteri π karakterinin bir karaktere dönüştürmek ve x. Rastgele sayıdaki her karakter için, bu karakterle başlayan ilk çifti değiştiririz. Sonunda her çiftin ikinci karakterini çıkardık.

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 bayt

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)

açıklamalar

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

Ne yazık ki, lua bana burada hiç yardımcı olmuyor. math.pi döndürdüğü pi'nin son basamağı etrafında:

print(math.pi)
>> 3.1415926535898

Bu sayıyı kesmem gerekiyor:

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

Bu zorluğu yapmak için ikinci büyük varsayılan, string.replace () 'nin yetersizliği idi. Bu işlemi iki kez kullanarak s:sub(1,l-1)..c..s:sub(l+1)yaptığım için daha kısa olacağını düşünerek isimsiz bir işlev yapmak istedim. Öyle değil, ben de iki kere yazdım.

Noktaya dikkat etmemin sebebi, Lua'nın konumunu nasıl geri döndürdüğü. Regexes'te, nokta "herhangi bir karakter" anlamına gelir, bu yüzden .döngüdeki karakteri değerlendirdiğimde ilk karakterle eşleşir:

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'yı çevrimiçi olarak test edebilirsiniz . PRNG'yi tohumlamadığım için, hala değerleri izlerken bir kaç test yapmanıza izin veren bir kod.

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 bayt

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

En son QPython Android uygulamasında test edilmiştir, ancak herhangi bir yerde çalışması gerekir.

Düzenleme 1: str(pi)backticks olarak değiştirildi .

Test için:

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

Güzel cevap! "SO işareti kodunu işaretlemek için kullanır" bu arada backticks veya grove sembollerdir, bu arada :-)
cat

1

Python, 147 bayt

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

Oldukça açıklamalı: lambda işlevi şamandırayı listeye dönüştürür; daha sonra rastgele listeden her bir rakamı kaldırmaya çalışan pi-listeyi dolaşıyoruz. Yapabilirsek, iyi, cevabı ekleyebiliriz; değilse, bunun yerine 'x' ekleyin.


str(t)size sadece 11 hane duyarlığı verir t, repr(t)hepinize t15 hane verir.
Noodle9

1

Perl, 70 bayt

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

Yorumlarla:

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

Bu sürüm pi, rasgele sayı ve sonucu basacaktır:

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

Örnek çıktı:

3.14159265358979
0.877757977767946
x.x4x59x6xxx897x

Umarım bu iyidir:

  • pi, 3'ü de içeren toplam 15 hane içerir, bu nedenle doğruluğu aşmaz.
  • Son hane ( 9) doğrudur.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.