Podwójna precyzja reprezentacji dziesiętnej może zagwarantować dokładność tylko 15 miejsc po przecinku, dlatego wartość pi jest przybliżana jako:
3.141592653589793
Możesz zobaczyć, że cyfra 3
jest w pozycjach 1, 10, 16
, cyfra 1
jest w pozycjach 2, 4
itp.
Wyzwanie
Twoim zadaniem jest utworzenie programu lub funkcji, która utworzy losową podwójną liczbę od 0 do 1 i odwzoruje wartości tej liczby na wartość pi. Robisz to, umieszczając różne cyfry w liczbach losowych w miejscu, w którym cyfra ma liczbę pi. Jeśli cyfra nie zostanie znaleziona w pi, pominiesz ją, a każda cyfra w pi, która nie jest liczbą losową, będzie reprezentowana przez x
. Każda wartość może być użyta tylko raz, zaczynając od lewej.
Kilka przykładów prawdopodobnie to wyjaśni. W poniższych przykładach pierwsza liczba to pi, druga to liczba losowa, a ostatnia to pożądana wartość wyjściowa.
3.141592653589793
0.111111111111111
x.1x1xxxxxxxxxxxx
3.141592653589793
0.531000000000000
3.1xx5xxxxxxxxxxx
3.141592653589793
0.123456789123456
3.141592653x8x7xx
3.141592653589793
0.967552381459391
3.14159265358979x
Zasady:
- Funkcja nie powinna pobierać żadnych danych wejściowych (możliwy wyjątek wyjaśniono w punkcie 3)
- Dane wyjściowe powinny składać się tylko z ciągu wyjściowego z opcjonalnym znakiem nowej linii (akceptowana jest również pojedyncza spacja)
- Jeśli twój program nie ma wbudowanej wartości Pi i / lub RNG, możesz na stałe wpisać Pi i przyjąć liczbę losową jako dane wejściowe. Nie można na stałe zakodować losowej liczby ani wziąć Pi jako danych wejściowych.
- Zarówno zapisana na stałe wartość Pi, jak i 15 losowych cyfr (możesz pominąć,
0.
ponieważ wiesz, że będzie to od 0 do 1), zostaną uwzględnione w liczbie bajtów. - Jeśli twój język nie ma wymaganej precyzji, możesz użyć mniejszej precyzji pod następującymi ograniczeniami
- Cyfry Pi muszą być dokładne z dokładnością do posiadanej dokładności
- Nie możesz wypisać więcej wartości, niż masz pewność, że są poprawne, tzn. Nie możesz wypisać 15 cyfr, jeśli precyzja pozwala tylko na 8 dokładnych miejsc po przecinku.
- Zakodowana wartość Pi będzie liczyła się jako 16 bajtów (nie potrzebujesz przecinka dziesiętnego), nawet jeśli twój program obsługuje tylko 8 cyfr.
- Wartość wejściowa dla liczby losowej będzie liczona jako 15 bajtów (nie potrzebujesz
0.
. Jest tak, ponieważ języki o niskiej precyzji nie powinny mieć nieuczciwej przewagi. - Program musi obsługiwać precyzję co najmniej 5 miejsc po przecinku.
- Edycja: Aby potwierdzić odpowiedź: Liczba losowa powinna być jakoś wydrukowana, ale ta operacja nie musi być uwzględniona w liczbie bajtów. Na przykład, jeśli możliwe jest wstawienie znaku
print r
na końcu skryptu, ta część nie zwiększy wyniku. - Nie można odjąć bajtów, jeśli jest to część innej niezbędnej operacji. To znaczy
print pi, r
, jeśli kod jest , możesz tylko odjąć, r
. - Jeśli musisz wstawić części do kilku miejsc w kodzie, dołącz obie wersje (tę, która drukuje liczbę losową i tę, która nie zawiera komentarza, na przykład:
_p
i_oNo
są potrzebne do wydrukowania liczby losowej._p
Robi xxx i_oNo
robi yyy._p
i_oNo
nie zostaną uwzględnione w liczbie bajtów.
Najkrótszy kod w bajtach wygrywa.
Tabela liderów
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
## Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
0 < random < 1
lub0 <= random <= 1
?Odpowiedzi:
Pyth, 25 bajtów
Wypróbuj online: demonstracja lub test pokazujący losową liczbę
Wyjaśnienie:
źródło
LabVIEW, 53 LabVIEW Prymitywy
Dopasowuję ciągi znaków i umieszczam liczbę w „pustym” ciągu x.xxx i usuwam liczbę z pi, aby nie wyświetlała się ponownie.
losowa liczba i pojedyncze znaki tutaj są dość widoczne, czy wszystko w porządku, czy muszę powtórzyć nagranie?
źródło
Matematyka, 105 lub 147 znaków
Jeżeli liczba losowa „ między 0 a 1” oznacza
0 <= random <= 1
, tzn. Obejmuje 0 i 1.(105 znaków)
W przeciwnym razie, biorąc pod uwagę liczbę losową „ od 0 do 1”
0 < random < 1
.Pętla, aby uzyskać 15 losowych liczb całkowitych, nie wszystkie zero. Wybierz dopełnienie z zakresu od 0 do 9, tzn. Te liczby od 0 do 9, których nie ma na liście losowej. Konwertuj te liczby całkowite na ciągi i zamień pasujące znaki w ciągu pi.
(147 znaków)
Losowe cyfry: -
źródło
True
jest1>0
,RandomInteger
można użyć notacji Infix{0,9}~RandomInteger~15
. Prawdopodobnie możesz zapisać niektóre bajty, podającr
pewną wartość i faktycznie wykorzystując warunekWhile
zamiast zamiast opcjiBreak.
Następnie możeszFor
zapisać kolejny bajtWhile
. Chociaż nie rozumiem, dlaczego w ogóle potrzebujesz pętli, jeśli zamiast tego przyjmiesz losową liczbę w zakresie[0,1)
.1>0
:-)JavaScript (ES6),
8987 bajtówWyjaśnienie
Edycja: Losowy ciąg nie jest teraz obcinany, jak wyjaśniono w plakacie.
Pętla przechodzi przez każdą cyfrę pi i usuwa cyfrę z liczby losowej, jeśli została znaleziona, w przeciwnym razie zamienia cyfrę w pi na
x
.Test
Test wypisuje również liczbę losową.
Pokaż fragment kodu
źródło
Math.random()
tworzy szereg zakresów,[0,1)
więc może,0
ale nigdy1
. OP nie określił konkretnie, czy zakres jest obejmujący, czy wyłączny, więc założyłem, że wszystko, co jest rozsądne, jest w porządku. Jest to również zakres używany przez inne odpowiedzi. Jednak uświadomiłeś mi, że jeśli tak jest,0
zawiedzie, ponieważ.
in pi nie zostanie dopasowany i stanie sięx
. Ma to szansę 1 na 2 ^ 53, ale i tak postanowiłem to naprawić.[0,1]
jest w porządku (tak jest(0,1)
).CJam,
4846423836 bajtówSprawdź to tutaj.
A oto wersja, która wypisuje zarówno π, jak i liczbę losową:
Sprawdź to tutaj.
Nie zmniejszam liczby losowej do 15 miejsc po przecinku, jak wyjaśniono w OP w komentarzu.
Wyjaśnienie
Chodzi o to, aby każdy znak w ciągu π zamieniać w parę tego znaku i
x
. Dla każdego znaku w liczbie losowej zamieniamy pierwszą parę, która zaczyna się od tego znaku. Na koniec wypisujemy drugi znak z każdej pary.źródło
Lua,
231230 bajtówObjaśnienia
Niestety, lua tutaj wcale mi nie pomaga. math.pi wokół ostatniej cyfry pi zwraca:
Muszę skrócić ten numer:
Drugim dużym domyślnym zadaniem, które wykonało to wyzwanie, był lua brak string.replace (). Ponieważ
s:sub(1,l-1)..c..s:sub(l+1)
wykonuję tę akcję dwukrotnie , chciałem wykonać anonimową funkcję, myśląc, że będzie ona krótsza. Tak nie jest, więc napisałem dwa razy.Powodem, dla którego muszę uważać na kropkę, jest sposób, w jaki lua zwraca swoją pozycję. W wyrażeniach regularnych kropka oznacza „dowolny znak”, więc gdy oceniam znak
.
w mojej pętli, pasuje on do pierwszego znaku:Możesz przetestować lua online . Ponieważ nie uruchamiam PRNG, oto kod pozwalający na uruchomienie kilku testów podczas oglądania wartości.
źródło
Python 2.7,
117110 bajtówTestowany na najnowszej aplikacji QPython na Androida, ale powinien działać wszędzie.
Edycja 1: zmieniono
str(pi)
na backticks.Dla testów:
źródło
Python, 147 bajtów
Dość oczywiste: funkcja lambda przekształca liczbę zmiennoprzecinkową na listę; następnie przeglądamy listę pi, próbując usunąć każdą cyfrę z listy losowej. Jeśli możemy, dobrze, dołączmy to do odpowiedzi; jeśli nie, dodaj zamiast niego „x”.
źródło
str(t)
daje tylko 11 cyfr precyzjit
,repr(t)
daje wszystkiet
15 cyfr.Perl, 70 bajtów
Z komentarzami:
Ta wersja wypisze pi, liczbę losową i wynik:
Przykładowe dane wyjściowe:
Mam nadzieję, że to w porządku:
9
) jest dokładna.źródło