Ordne pi eine Zufallszahl zu

27

Eine Darstellung einer Dezimalstelle mit doppelter Genauigkeit kann nur eine Genauigkeit von 15 Dezimalstellen garantieren, daher wird pi angenähert als:

3.141592653589793

Sie können sehen, dass sich die Ziffer 3an Positionen befindet 1, 10, 16, die Ziffer 1sich an Positionen befindet 2, 4usw.

Herausforderung

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die eine zufällige doppelte Zahl zwischen 0 und 1 erzeugt und die Werte dieser Zahl auf den Wert von pi abbildet. Sie tun dies, indem Sie die verschiedenen Ziffern in den Zufallszahlen an die Stelle setzen, die diese Ziffer in pi hat. Wenn die Ziffer in pi nicht gefunden wird, überspringen Sie sie und jede Ziffer in pi, die nicht in der Zufallszahl enthalten ist, wird durch ein dargestellt x. Jeder Wert kann nur einmal verwendet werden, beginnend von links.

Einige Beispiele werden dies wahrscheinlich klarer machen. In den folgenden Beispielen ist die erste Zahl pi, die zweite ist die Zufallszahl und die letzte ist die gewünschte Ausgabe.

3.141592653589793
0.111111111111111
x.1x1xxxxxxxxxxxx

3.141592653589793
0.531000000000000
3.1xx5xxxxxxxxxxx

3.141592653589793
0.123456789123456
3.141592653x8x7xx

3.141592653589793
0.967552381459391
3.14159265358979x

Regeln:

  • Die Funktion sollte keine Eingaben annehmen (eine mögliche Ausnahme wird in Aufzählungspunkt 3 erläutert)
  • Die Ausgabe darf nur aus der Ausgabezeichenfolge mit optionalem Zeilenumbruch bestehen (ein einzelnes Leerzeichen wird ebenfalls akzeptiert).
  • Wenn Ihr Programm keinen integrierten Pi-Wert und / oder RNG hat, können Sie Pi fest codieren und die Zufallszahl als Eingabe verwenden. Sie können die Zufallszahl nicht fest codieren oder Pi als Eingabe verwenden.
  • Sowohl der fest codierte Wert für Pi als auch die 15 zufälligen Ziffern (Sie können überspringen, 0.da Sie wissen, dass er zwischen 0 und 1 liegt) werden in die Byteanzahl einbezogen.
  • Wenn Ihre Sprache nicht die erforderliche Genauigkeit aufweist, können Sie unter den folgenden Einschränkungen eine geringere Genauigkeit verwenden
    • Die Ziffern von Pi müssen bis zu Ihrer Genauigkeit genau sein
    • Sie können nicht mehr Werte ausgeben, als Sie garantiert korrekt haben, dh Sie können keine 15 Stellen ausgeben, wenn die Genauigkeit nur 8 genaue Dezimalstellen zulässt.
    • Der fest codierte Wert von Pi wird als 16 Byte gezählt (Sie benötigen keinen Dezimalpunkt), auch wenn Ihr Programm nur 8 Ziffern unterstützt.
    • Der Eingabewert für die Zufallszahl wird mit 15 Bytes angegeben (das brauchen Sie nicht 0.. Dies liegt daran, dass Sprachen mit geringer Genauigkeit keinen unfairen Vorteil haben sollten.
    • Das Programm muss (mindestens) eine Genauigkeit von 5 Dezimalstellen unterstützen.
    • Bearbeiten: Um die Antwort zu validieren: Die Zufallszahl sollte irgendwie gedruckt werden, aber diese Operation muss nicht in die Byteanzahl einbezogen werden. Wenn es beispielsweise möglich ist, ein print ram Ende des Skripts einzufügen , erhöht dieser Teil die Punktzahl nicht.
    • Sie können die Bytes nicht subtrahieren, wenn sie Teil einer anderen erforderlichen Operation sind. Dh wenn der Code ist print pi, r, dann kann man nur subtrahieren , r.
    • Wenn Sie mehrere Orte Teile im Code einfügen müssen, geben Sie bitte beide Versionen (die, das druckt die Zufallszahl und die, die mit einem Kommentar nicht wie: _pund _oNo. Sind die Zufallszahl drucken benötigt _ptut xxx und _oNotut yyy. _pund _oNowird nicht in die Byteanzahl einbezogen.

Kürzester Code in Bytes gewinnen.


Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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

Stewie Griffin
quelle
2
Wenn Sie eine integrierte Zufallszahl verwenden, muss diese 15 Stellen enthalten oder kann sie mehr enthalten? Gibt es auch irgendwelche Anforderungen, um die Zufallszahl auszugeben? Wenn nicht, ist es etwas schwieriger, die Antworten zu validieren.
user81655
Aah, das ist ein guter Punkt! Die Zufallszahl kann mehr als 15 Stellen haben. Ich werde eine Bearbeitung vornehmen und erklären, was mit der Zufallszahl zu tun ist. Danke für den Kommentar!
Stewie Griffin
Bedeutet zufälliges " zwischen 0 und 1" 0 < random < 1oder 0 <= random <= 1?
Chris Degnen
@ StewieGriffin Ich bin verwirrt. Bedeutet dies, dass wir 15 Stellen pi und eine 16/17-stellige Zufallszahl verwenden können?
Jakube
@Jakube, um ehrlich zu sein: Ich habe die Frage etwas falsch gelesen und darauf geantwortet, dass sie mehr Ziffern haben könnte. Die Antwort auf Ihre Frage lautet also Ja. Für eine erneute Beantwortung ist es jetzt zu spät, da die meisten Antworten die Anzahl der zufälligen Ziffern nicht begrenzt haben. Bitte beschränken Sie es auf 17.
Stewie Griffin

Antworten:

5

Pyth, 25 Bytes

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

Probieren Sie es online aus: Demonstration oder Test mit der Zufallszahl

Erläuterung:

 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
quelle
14

LabVIEW, 53 LabVIEW-Grundelemente

Ich passe Strings an und füge die Nummer in einen "leeren" x.xxx String ein und entferne die Nummer von pi, damit sie nicht wieder auftaucht.

Die Zufallszahl und die einzelnen Zeichen hier sind irgendwie sichtbar. Ist das in Ordnung oder muss ich die Aufnahme wiederholen?

Eumel
quelle
Es ist ganz klar, dass man den Job macht, auch wenn ein paar Zeichen schwer zu erkennen sind, so dass man nichts wiederholen muss ... Schöne Antwort! =)
Stewie Griffin
6

Mathematica, 105 oder 147 Zeichen

Wenn Zufallszahl " zwischen 0 und 1" bedeutet 0 <= random <= 1, beinhaltet das zB 0 & 1.

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

(105 Zeichen)

Andernfalls bedeutet Zufallszahl " zwischen 0 und 1"0 < random < 1 .

Schleife, um 15 zufällige Ganzzahlen zu erhalten, nicht alle Nullen. Wählen Sie einen Bereich von 0 bis 9, dh die Zahlen von 0 bis 9 sind nicht in der Zufallsliste enthalten. Konvertieren Sie diese Ganzzahlen in Zeichenfolgen und ersetzen Sie die übereinstimmenden Zeichen in einer Pi-Zeichenfolge.

(147 Zeichen)

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

Zufällige Ziffern: -

FromDigits[r]

820307536180783
Chris Degnen
quelle
Getan. Zeilenumbrüche nur zur besseren Lesbarkeit.
Chris Degnen
2
Kommt noch als 149 Bytes für mich raus (mit Zeilenumbrüchen, 146 ohne). Es ist nichts falsch daran, sowohl eine Golf- als auch eine Ungolf-Version hinzuzufügen. Einige Golf - Tipps: Trueist 1>0, RandomIntegerkann Infixschreibweise verwenden {0,9}~RandomInteger~15. Sie können wahrscheinlich einige Bytes sparen, indem Sie reinen Wert angeben und tatsächlich die Bedingung von verwenden, Whileanstatt Break.Then zu verwenden, und Formöglicherweise ein weiteres Byte darüber speichern While. Obwohl ich nicht verstehe, warum Sie die Schleife überhaupt brauchen, wenn Sie stattdessen die Zufallszahl im Bereich annehmen [0,1).
Martin Ender
@ MartinBüttner Ich mag 1>0:-)
Chris Degnen
Normalerweise würde ich die Zufallszahl "zwischen 0 und 1" lesen, um 0 <zufällig <1 zu bedeuten.
Chris Degnen
5

JavaScript (ES6), 89 87 Bytes

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

Erläuterung

Bearbeiten: Die zufällige Zeichenfolge wird jetzt nicht mehr abgeschnitten, da dies durch das Poster verdeutlicht wird.

Durchläuft jede Ziffer von pi und entfernt die Ziffer von der Zufallszahl, wenn sie gefunden wurde. Anderenfalls wird die Ziffer in pi durch ersetzt 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
    ))

Prüfung

Test gibt auch die Zufallszahl aus.

user81655
quelle
Konnte random () nicht 15 Nullen erzeugen, die 0.000 ... oder 1.000 ... entsprechen würden? dh nicht zwischen 0 und 1.
Chris Degnen
@ChrisDegnen Math.random()produziert eine Reihe des Bereichs, [0,1)so dass es 0aber nie konnte 1. Das OP gab nicht ausdrücklich an, ob der Bereich inklusive oder exklusiv war, und ich ging davon aus, dass alles, was angemessen war, in Ordnung ist. Dies ist auch der Bereich, den die anderen Antworten verwenden. Wie auch immer, Sie haben mich darauf aufmerksam gemacht, dass es, wenn es genau 0ist, scheitern wird, weil das .in pi nicht übereinstimmt und wird x. Dies hat eine 1 zu 2 ^ 53 Chance, aber ich habe mich trotzdem entschlossen, es zu beheben.
user81655
:-) tut mir leid.
Chris Degnen
Die Wahrscheinlichkeit, für ein zufälliges Double genau 0 oder 1 zu treffen, ist vernachlässigbar. Für die Zwecke dieser Herausforderung ist ein Bereich [0,1]also in Ordnung (so ist es auch (0,1)).
Stewie Griffin
Nett. Ich schlage eine kürzere Variante vor.
MST
3

CJam, 48 46 42 38 36 Bytes

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

Teste es hier.

Und hier ist die Version, die sowohl π als auch die Zufallszahl ausgibt:

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

Teste es hier.

Ich schneide die Zufallszahl nicht auf 15 Dezimalstellen ab, wie dies vom OP in einem Kommentar erläutert wurde.

Erläuterung

Die Idee ist, jedes Zeichen in der Zeichenfolgendarstellung von π in ein Paar dieses Zeichens und umzuwandeln x. Für jedes Zeichen in der Zufallszahl tauschen wir das erste Paar, das mit diesem Zeichen beginnt. Am Ende geben wir das zweite Zeichen jedes Paares aus.

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
quelle
2

Lua, 231 230 Bytes

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)

Erklärungen

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

Leider hilft mir Lua hier überhaupt nicht. math.pi rund um die letzte Ziffer von pi gibt es zurück:

print(math.pi)
>> 3.1415926535898

Ich muss diese Nummer abschneiden:

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

Der zweite große Standard für diese Herausforderung war das Fehlen von string.replace (). Da ich diese Aktion zweimal durchführe s:sub(1,l-1)..c..s:sub(l+1), wollte ich eine anonyme Funktion ausführen , da ich dachte, sie wäre kürzer. Es ist nicht so, also habe ich es zweimal geschrieben.

Der Grund, warum ich auf den Punkt aufpassen muss, ist, wie lua seine Position zurückgibt. In regulären Ausdrücken bedeutet ein Punkt "ein beliebiges Zeichen". Wenn ich also das Zeichen .in meiner Schleife auswerte , stimmt es mit dem ersten Zeichen überein:

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 

Sie können lua online testen . Da ich den PRNG nicht einsetze, ist hier ein Code, mit dem Sie mehrere Tests durchführen können, während Sie noch Werte beobachten.

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
quelle
2

Python 2.7, 117 110 Bytes

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

Getestet mit der neuesten QPython-Android-App, sollte aber überall funktionieren.

Edit 1: geändert str(pi)in Backticks.

Zum Prüfen:

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
quelle
Gute Antwort! Die "Apostrophe, mit denen SO Code markiert" sind übrigens Backticks oder Hain-Symbole :-)
cat
1

Python, 147 Bytes

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

Ziemlich selbsterklärend: Lambda-Funktion konvertiert float in list; wir durchlaufen dann die pi-liste und versuchen jede ziffer aus der zufallsliste zu entfernen. Wenn wir es gut können, hängen Sie es an die Antwort an; Wenn nicht, fügen Sie stattdessen ein 'x' hinzu.

Kieran Hunt
quelle
str(t)gibt Ihnen nur 11 Stellen Genauigkeit ab t, repr(t)gibt Ihnen alle t15 Stellen.
Noodle9
1

Perl, 70 Bytes

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

Mit Kommentaren:

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

Diese Version gibt pi, die Zufallszahl und das Ergebnis aus:

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

Beispielausgabe:

3.14159265358979
0.877757977767946
x.x4x59x6xxx897x

Ich hoffe das ist okay:

  • pi enthält insgesamt 15 Stellen, einschließlich der 3, sodass die Genauigkeit nicht überschritten wird.
  • die letzte Ziffer (9 ) ist korrekt.
Kenney
quelle