Mappa un numero casuale a pi


27

Una rappresentazione a doppia precisione di un decimale può garantire solo un'accuratezza di 15 cifre decimali, quindi pi è approssimato come:

3.141592653589793

Puoi vedere che la cifra 3è in posizioni 1, 10, 16, la cifra 1è in posizioni 2, 4ecc.

Sfida

Il tuo compito è creare un programma o una funzione che crei un doppio numero casuale compreso tra 0 e 1 e mappi i valori di quel numero sul valore di pi. Puoi farlo posizionando le diverse cifre nei numeri casuali nella posizione che la cifra ha in pi. Se la cifra non viene trovata in pi, la salterai e ogni cifra in pi che non è nel numero casuale verrà rappresentata da un x. Ogni valore può essere utilizzato una sola volta, a partire da sinistra.

Alcuni esempi probabilmente lo renderanno più chiaro. Negli esempi seguenti, il primo numero è pi, il secondo è il numero casuale e l'ultimo è l'output desiderato.

3.141592653589793
0.111111111111111
x.1x1xxxxxxxxxxxx

3.141592653589793
0.531000000000000
3.1xx5xxxxxxxxxxx

3.141592653589793
0.123456789123456
3.141592653x8x7xx

3.141592653589793
0.967552381459391
3.14159265358979x

Regole:

  • La funzione non deve accettare alcun input (una possibile eccezione è spiegata nel punto 3)
  • L'output deve consistere solo della stringa di output, con una nuova riga opzionale (è accettato anche un singolo spazio finale)
  • Se il tuo programma non ha un valore Pi incorporato e / o un RNG, allora puoi hardcode Pi e prendere il numero casuale come input. Non è possibile codificare il numero casuale o prendere Pi come input.
  • Sia il valore hardcoded per Pi, sia le 15 cifre casuali (puoi saltare 0.poiché sai che sarà compreso tra 0 e 1), saranno inclusi nel conteggio dei byte.
  • Se la tua lingua non ha la precisione richiesta, puoi usare meno precisione con le seguenti restrizioni
    • Le cifre di Pi devono essere accurate fino alla precisione che hai
    • Non è possibile generare più valori di quanti ne siano garantiti, ovvero non è possibile emettere 15 cifre se la precisione consente solo 8 decimali accurati.
    • Il valore hardcoded di Pi verrà conteggiato come 16 byte (non è necessario il punto decimale), anche se il programma supporta solo 8 cifre.
    • Il valore di input per il numero casuale conterà come 15 byte (non è necessario 0.. Questo perché le lingue con bassa precisione non dovrebbero avere un vantaggio ingiusto.
    • Il programma deve supportare una precisione di 5 decimali (almeno).
    • Modifica: per convalidare la risposta: il numero casuale deve essere stampato in qualche modo, ma questa operazione non deve essere inclusa nel conteggio dei byte. Ad esempio, se è possibile inserire un carattere print ralla fine dello script, quella parte non aumenterà il punteggio.
    • Non è possibile sottrarre i byte se fa parte di un'altra operazione necessaria. Cioè se il codice è print pi, r, allora puoi solo sottrarre , r.
    • Se devi inserire parti diverse posizioni nel codice, includi entrambe le versioni (quella che stampa il numero casuale e quella che non ha un commento come: _pe _oNosono necessarie per stampare il numero casuale. _pFa xxx e _oNonon yyy. _pe _oNonon saranno inclusi nel conteggio dei byte.

Il codice più corto in byte vince.


Classifica

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

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


2
Se si utilizza un numero casuale incorporato, deve contenere 15 cifre o può avere più? Inoltre ci sono dei requisiti per produrre il numero casuale? Altrimenti, è più difficile convalidare le risposte.
user81655,

Aah, questo è un buon punto! Il numero casuale può contenere più di 15 cifre. Farò una modifica spiegando cosa fare con il numero casuale. Grazie per aver commentato!
Stewie Griffin,

Casuale " tra 0 e 1" significa 0 < random < 1o 0 <= random <= 1?
Chris Degnen,

@StewieGriffin Sono confuso. Questo significa che possiamo usare 15 cifre di pi e un numero casuale di 16/17 cifre?
Jakube,

@Jakube, a dire il vero: ho letto la domanda un po 'male, quindi ho risposto che potrebbe avere più cifre, quindi la risposta alla tua domanda è sì. È troppo tardi per tornare su quella risposta ora poiché la maggior parte delle risposte non ha limitato il numero di cifre casuali. Per favore limitalo a 17 però.
Stewie Griffin,

Risposte:


5

Pyth, 25 byte

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

Provalo online: dimostrazione o test che mostra il numero casuale

Spiegazione:

 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

Abbino le stringhe e inserisco il numero in una stringa x.xxx "vuota" e rimuovo il numero da pi in modo che non venga più visualizzato.

il numero casuale e i singoli caratteri qui sono in qualche modo visibili, va bene o devo rifare la registrazione?


Fa abbastanza chiaramente il lavoro anche se alcuni caratteri sono un po 'difficili da vedere, quindi non devi rifare nulla ... Bella risposta! =)
Stewie Griffin il

6

Mathematica, 105 o 147 caratteri

Se il numero casuale " tra 0 e 1" significa 0 <= random <= 1, cioè include 0 e 1.

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

(105 caratteri)

Altrimenti, per indicare un numero casuale " compreso tra 0 e 1" 0 < random < 1.

Ripeti per ottenere 15 numeri interi casuali, non tutti zero. Seleziona il complemento da 0 a 9, cioè quei numeri da 0 a 9 non nell'elenco casuale. Converti questi numeri interi in stringhe e sostituisci i caratteri corrispondenti in una stringa pi.

(147 caratteri)

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

Cifre casuali: -

FromDigits[r]

820307536180783


Fatto. Le interruzioni di riga sono incluse solo per la leggibilità.
Chris Degnen,

2
Viene ancora visualizzato come 149 byte per me (con interruzioni di riga, 146 senza). Non c'è niente di sbagliato nell'aggiungere sia una versione golfizzata che una versione non golfizzata. Alcuni consigli golf: Truesi 1>0, RandomIntegerpossono utilizzare notazione infissa {0,9}~RandomInteger~15. Probabilmente puoi salvare alcuni byte dando run valore e in realtà usando la condizione di Whileinvece di usare Break.Then Forpotresti salvare un altro byte While. Anche se non vedo il motivo per cui hai bisogno del loop se invece si assume il numero casuale nell'intervallo [0,1).
Martin Ender,

@ MartinBüttner Mi piace 1>0:-)
Chris Degnen il

Di solito leggevo un numero casuale "tra 0 e 1" per indicare 0 <casuale <1.
Chris Degnen,

5

JavaScript (ES6), 89 87 byte

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

Spiegazione

Modifica: la stringa casuale ora non viene troncata come chiarito dal poster.

Passa attraverso ogni cifra di pi e rimuove la cifra dal numero casuale se è stata trovata, altrimenti sostituisce la cifra in pi con 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
    ))

Test

Il test genera anche il numero casuale.


Non è possibile che random () produca 15 zeri in cui corrisponderebbe a 0.000 ... o 1.000 ...? cioè non tra 0 e 1.
Chris Degnen il

@ChrisDegnen Math.random()produce un numero di gamma [0,1)così che non potrebbe, 0ma mai 1. L'OP non ha specificato specificamente se la gamma fosse inclusiva o esclusiva, quindi ho ipotizzato che qualunque cosa fosse ragionevole va bene. Questo è anche l'intervallo utilizzato dalle altre risposte. Comunque mi hai fatto sapere che se è esattamente 0fallirà perché .in in pi non sarà abbinato e diventerà x. Questo ha una possibilità 1 in 2 ^ 53 di accadere, ma ho deciso di risolverlo comunque.
user81655

:-) scusa per quello.
Chris Degnen,

La probabilità di colpire esattamente 0 o 1 per un doppio casuale è trascurabile, quindi ai fini di questa sfida una gamma [0,1]va bene (così è (0,1)).
Stewie Griffin,

Bello. Propongo una variante più breve.
MST

3

CJam, 48 46 42 38 36 byte

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

Provalo qui.

Ed ecco la versione che stampa sia π che il numero casuale:

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

Provalo qui.

Non troncare il numero casuale a 15 cifre decimali, come chiarito dall'OP in un commento.

Spiegazione

L'idea è di trasformare ogni carattere nella rappresentazione in forma di stringa di π in una coppia di quel carattere e x. Per ogni personaggio nel numero casuale, scambiamo la prima coppia che inizia con quel personaggio. Alla fine abbiamo prodotto il secondo carattere di ogni coppia.

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 byte

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)

spiegazioni

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

Purtroppo, lua non mi aiuta affatto qui. math.pi attorno all'ultima cifra di pi restituisce:

print(math.pi)
>> 3.1415926535898

Devo troncare questo numero:

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

Il secondo grande default per fare questa sfida era la mancanza di string.replace (). Mentre sto facendo questa azione due volte usando s:sub(1,l-1)..c..s:sub(l+1), volevo fare una funzione anonima, pensando che sarebbe stata più breve. Non lo è, quindi l'ho tenuto scritto due volte.

Il motivo per cui devo stare attento al punto, è come lua ritorna nella sua posizione. Nelle regex, un punto significa "qualsiasi carattere", quindi quando sto valutando il personaggio .nel mio ciclo corrisponde al primo carattere:

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 

Puoi provare Lua online . Dato che non sto seminando il PRNG, ecco un codice che ti consente di eseguire diversi test mentre guardi ancora i valori.

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 byte

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

Testato sull'ultima app QPython per Android, ma dovrebbe funzionare ovunque.

Modifica 1: modificato str(pi)in backtick.

Per i test:

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

Bella risposta! Gli "apostrofi che SO utilizza per contrassegnare il codice" sono simboli di backtick o boschetto, a proposito :-)
cat

1

Python, 147 byte

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

Abbastanza autoesplicativo: la funzione lambda converte float in list; passiamo quindi in rassegna l'elenco pi tentando di rimuovere ogni cifra dall'elenco casuale. Se possiamo, bene, aggiungerlo alla risposta; in caso contrario, aggiungi invece una 'x'.


str(t)ti dà solo 11 cifre di precisione t, repr(t)ti dà tutte te 15 le cifre.
Noodle9,

1

Perl, 70 byte

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

Con commenti:

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

Questa versione stamperà pi, il numero casuale e il risultato:

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

Esempio di output:

3.14159265358979
0.877757977767946
x.x4x59x6xxx897x

Spero che vada bene:

  • pi contiene un totale di 15 cifre, incluso il 3, quindi non supera la precisione.
  • l'ultima cifra ( 9) è precisa.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.