Cel
Biorąc pod uwagę ciąg z ciągiem skrótów, oblicz jego całkowitą długość i podziel przez odległość od początku do końca.
Symulacja
Co symulujemy? Według tego artykułu stosunek długości rzeki do odległości między początkiem a końcem wynosi w przybliżeniu Pi! (Być może zostało to obalone empirycznie, ale mogłem znaleźć dane i dla tego wyzwania założymy, że to prawda).
Jak to symulujemy?
- Weź ciąg znaków spacji i skrótów
- Do każdego skrótu będą przylegały dwa inne
- Z wyjątkiem pierwszego i ostatniego skrótu, który będzie miał tylko 1
- Każda postać leży na kracie
(x, y)
x
jest indeksem znaku w linii- np.
c
jest czwartą postacią w0123c567
- np.
y
jest numerem wiersza znaku- np.
c
jest na 3. linii:
- np.
0line
1line
2line
3c...
- Zsumuj odległości między sąsiednimi skrótami, nazwij to
S
- Określ odległość między pierwszym a ostatnim hashem, nazwij to
D
- Powrót
S/D
Specyfikacja
- Wejście
- Elastyczny, przyjmuj dane wejściowe na dowolny ze standardowych sposobów (np. Parametr funkcji, STDIN) i w dowolnym standardowym formacie (np. Ciąg, Binarny)
- Wynik
- Elastyczny, daje wydruk w dowolny ze standardowych sposobów (np. Zwrot, wydruk)
- Dopuszczalne są białe pola, końcowe i białe znaki wiodące
- Dokładność, proszę podać co najmniej 4 miejsca dziesiętne dokładności (tj.
3.1416
)
- Punktacja
- Najkrótszy kod wygrywa!
Przypadki testowe
Takie są moje przybliżenia rzek. Moje przybliżenia mogą być słabe lub te mogą być kiepską próbą populacji rzeki. Te obliczenia wykonałem też ręcznie; Mogłem przegapić obliczenia.
### ####
# # #
# # #
# # #
# # #
# # #
## # # #####
## # #
##
1.6519
#
#
#
#
#
#
#
#
# #
# # #
# #
#
##
#
#
#
#
#
#
#
#
# #
# ##
#
#
#
#
#
#
#
#
#
#
#
1.5498
###
# #
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
###
#
#
#
#
#
#
#
#
#
##
#
#
##
##
##
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
####
#
#
1.5257
TL; DR
Wyzwania te są symulacjami algorytmów, które wymagają jedynie natury i twojego mózgu (i być może pewnych zasobów wielokrotnego użytku) do przybliżenia Pi. Jeśli naprawdę potrzebujesz Pi podczas apokalipsy zombie, te metody nie marnują amunicji ! Łącznie jest dziewięć wyzwań .
#<tag>
Odpowiedzi:
MATL ,
4844423733 bajtówDość kilka bajtów zaoszczędzonych dzięki pomysłowi rahnema1 (odpowiedź Octave) na złożenie dwóch zwojów w jeden
Pobiera to dane wejściowe jako macierz binarną z
;
separatorem wierszy.1
odpowiada skrótowi i0
spacji.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Oto konwerter formatu, który pobiera dane wejściowe jako tablice
;
znaków 2D (ponownie jako separator) i tworzy reprezentacje łańcuchowe odpowiednich macierzy binarnych.Wyjaśnienie
To była zabawa! Kod wykorzystuje
trzydwa zwoje 2D, każdy w innym celu:1
Wymagana maska byłaby do wykrywania pionowych i poziomych sąsiadów, którzy dzielą odległośćChcemy jednak, aby każda para sąsiadów była wykrywana tylko raz. Więc bierzemy połowę maski (a ostatni rząd zer można usunąć):
Podobnie, aby wykryć ukośnych sąsiadów, którzy dzielą odległość
sqrt(2)
, maska byłabyale z tego samego powodu co powyżej
Jeśli ta maska zostanie pomnożona
sqrt(2)
i dodana do pierwszej, dwa zwoje można zastąpić jednym zwojem połączoną maskąPunkty początkowe i końcowe są z definicji punktami tylko z jednym sąsiadem. Aby je wykryć, rozmawiamy z nimi
i zobacz, które punkty dają
1
wynik.Aby utworzyć połączoną maskę elementu 1, krócej jest wygenerować jej kwadrat, a następnie wziąć pierwiastek kwadratowy. Maska w punkcie 2 to predefiniowany literał.
źródło
Oktawa, 99 bajtów
metoda prawie taka sama jak odpowiedź MATL, ale tutaj jest jądro zwojów
to
sqrt(2) =1.41
jest dla diagonalnych sąsiadów i1
dla bezpośrednich sąsiadów, więc kiedy sumujemy wartości wyniku nad rzeką, otrzymujemy dwukrotność rzeczywistej odległości.wersja bez golfa :
Wypróbuj (wklej) w Octave Online
źródło
{[x y]=find(c<2&c>0),pdist([x y])}{2}
jest cholernie sprytny !!!JavaScript (ES6), 178
Wprowadź jako ciąg znaków z nowymi liniami w kształcie prostokąta : każda linia jest wypełniona spacjami do tej samej długości (jak w przykładach)
Mniej golfa
Test
źródło