O serii
Po pierwsze, możesz potraktować to jak każde inne wyzwanie związane z golfem i odpowiedzieć na nie, nie martwiąc się serią. Istnieje jednak tabela wyników dla wszystkich wyzwań. Możesz znaleźć tabelę liderów wraz z kilkoma więcej informacji o serii w pierwszym poście .
Chociaż mam szereg pomysłów w szeregu, przyszłe wyzwania nie są jeszcze ustalone. Jeśli masz jakieś sugestie, daj mi znać w odpowiednim poście z piaskownicą .
Hole 4: The Bertrand Paradox
Bertrand paradoksem jest ciekawy problem, który pokazuje, jak różne metody zbierania losowe akordy w kółko może dawać różne dystrybucje akordów, ich środkowych i ich długości.
W tym wyzwaniu należy wygenerować losowe akordy koła jednostkowego, stosując metodę „właściwą”, tj. Taką, która wytwarza rozkład akordów niezmienny przy skalowaniu i translacji. W powiązanym artykule w Wikipedii „Metoda 2” jest taką metodą.
Oto dokładne zasady:
- Powinieneś wziąć jedną dodatnią liczbę całkowitą,
N
która określa liczbę akordów, które powinny zostać zwrócone. Wyjściem powinna być listaN
akordów, każdy określony jako dwa punkty na okręgu jednostki, podany przez ich kąt biegunowy w radianach. - Twój kod powinien mieć możliwość zwrócenia co najmniej 2 20 różnych wartości dla każdego z dwóch kątów . Jeśli dostępne RNG ma mniejszy zasięg, musisz najpierw zbudować RNG o wystarczająco dużym zasięgu na górze wbudowanego lub musisz wdrożyć własny odpowiedni RNG . Ta strona może być do tego pomocna.
- Dystrybucja akordów musi być nie do odróżnienia od tej wyprodukowanej przez „Method 2” w powiązanym artykule Wikipedii. Jeśli wdrażasz inny algorytm do wybierania akordów, dołącz dowód poprawności. Niezależnie od tego, jaki algorytm wybierzesz do wdrożenia, teoretycznie musi on być w stanie wygenerować dowolny prawidłowy akord w okręgu jednostki (z wyjątkiem ograniczeń bazowego PRNG lub typów danych o ograniczonej precyzji).
- Wdrożenie powinno wykorzystywać i zwracać albo liczby zmiennoprzecinkowe (o szerokości co najmniej 32 bity), albo liczby o stałym punkcie (o szerokości co najmniej 24 bity), a wszystkie operacje arytmetyczne powinny być dokładne z dokładnością do co najmniej 16 ul .
Możesz napisać pełny program lub funkcję i pobrać dane wejściowe za pomocą STDIN (lub najbliższej alternatywy), argumentu wiersza poleceń lub argumentu funkcji i wygenerować wynik za pomocą STDOUT (lub najbliższej alternatywy), wartości zwracanej funkcji lub parametru funkcji (wyjściowej).
Dane wyjściowe mogą być w dowolnym dogodnym formacie listy lub ciągu, o ile poszczególne liczby są wyraźnie rozróżnialne, a ich całkowita liczba jest zawsze równa.
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach). I oczywiście najkrótsze zgłoszenie na użytkownika wejdzie również do ogólnej tabeli liderów serii.
Wyobrażanie sobie
Możesz użyć poniższego fragmentu, aby wyrenderować wygenerowane linie i sprawdzić ich rozkład. Wystarczy wkleić listę par kątów w polu tekstowym. Fragment powinien być w stanie obsłużyć prawie każdy format listy, o ile liczby są prostymi liczbami dziesiętnymi (bez notacji naukowej). Zalecam użycie co najmniej 1000 linii, aby uzyskać dobry pomysł na dystrybucję. Podałem również kilka przykładowych danych dla różnych metod przedstawionych w poniższym artykule.
Przykładowe dane wygenerowane za pomocą metody 1.
Przykładowe dane wygenerowane za pomocą metody 2.
Przykładowe dane wygenerowane za pomocą metody 3.
Tabela liderów
Pierwszy post z serii generuje tabelę wyników.
Aby upewnić się, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając 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
(Język nie jest obecnie wyświetlany, ale fragment go wymaga i analizuje, a w przyszłości mogę dodać tabelę wyników według języków).
Pyth,
252322 bajtówPort odpowiedzi C ++ 11 programu rcrmn. To jest moje pierwsze użycie Pytha i miałem dużo zabawy!
Wersja 23-bajtowa:
Wytnij bajt, zmieniając program, aby używał foldów + sum i ustawiał J na krotkę, usuwając K.
Oryginalny:
Odetnij 2 bajty dzięki @orlp.
Wyjaśnienie:
źródło
*2_
jest taki sam jaky_
. ZmiennaZ
ma początkowo wartość 0, więc możesz usunąć to miejsce.tO0 4
, pisząc.tOZ4
.,+JK-JK
y
i zapomniałemZ
. Naprawiony; dzięki!Julia, 48 bajtów
Wykorzystuje algorytm metody 2, podobnie jak większość dotychczasowych odpowiedzi. Tworzy funkcję lambda, która pobiera liczbę całkowitą i zwraca tablicę nx 2. Aby to nazwać, nadaj mu nazwę, np
f=n->...
.Niegolfowane + wyjaśnienie:
Bardzo podoba mi się wygląd wizualizacji, więc dołączę jedną. To wynik
f(1000)
.źródło
Pyth, 22 bajty
Port odpowiedzi C ++.
Miałem kolejne 23 bajtowe rozwiązanie(teraz 22!), Ale była to prawie kopia odpowiedzi pyth @ kirbyfan64sos z optymalizacjami, więc musiałem trochę przemyśleć i wyjść poza pole i kreatywnie (ab) użyć operatora fold.Zauważ, że to nie działa teraz z powodu błędu w operatorze składania po wprowadzeniu
reduce2
. Zgłaszam prośbę.Dla refence było to moje inne rozwiązanie, które działa w ten sam sposób:
VQKy*.nZOZJ.tOZ4,+KJ-KJ
źródło
IDL, 65 bajtów
Oczywiście jest to ten sam algorytm co @rcrmn, mimo że wyprowadziłem go niezależnie przed przeczytaniem ich odpowiedzi.
Funkcja losowa IDL korzysta z Mersenne Twister, która ma okres 2 19937 -1.
EDYCJA: Uruchomiłem 1000 akordów przez powyższy wizualizator, oto zrzut ekranu wyniku:
źródło
C ++ 11, 214 bajtów
Jest to więc prosta implementacja właściwego algorytmu ze strony wikipedii. Głównym problemem tutaj w golfie są och, tak cholernie długie nazwy, jakie mają losowe klasy generatorów. Ale w przeciwieństwie do dobrego starego, jest przynajmniej odpowiednio jednolity.
Wyjaśnienie:
źródło
M_PI_2
wygląda podejrzanie. Myślę, że zamiast tego powinna wynosić 1.APL, 46 bajtów
Mój pierwszy program APL w historii! Z pewnością można go znacznie poprawić (ponieważ brakuje mi ogólnego rozumienia APL), więc wszelkie sugestie byłyby fantastyczne. Tworzy to funkcję,
f
która przyjmuje na wejściu liczbę całkowitą, oblicza pary punktów cięciwy przy użyciu metody 2 i drukuje każdą parę oddzieloną znakiem nowej linii.Możesz spróbować online !
Wyjaśnienie:
Uwaga: Moje poprzednie 19-bajtowe rozwiązanie było nieprawidłowe, ponieważ zwróciło (x, y) zamiast (x + y, xy). Obfituje smutek.
źródło
Java, 114 bajtów
Podstawowa implementacja w java. Użyj jako wyrażenia lambda.
Przykładowe użycie
źródło
Math
gdzieś? Lub coś? (Nie jestem programistą Java)Math
wyświetleń. Co meta mówi o używaniu kodu do generowania innego kodu w celu rozwiązania problemu?Rubinowy, 72 bajty
Mój pierwszy golf tutaj! Użyłem tego samego kodu, co wszyscy, mam nadzieję, że to w porządku
źródło
Java, 115
123Jest to w zasadzie to samo co większość innych, ale potrzebuję oceny Java dla tej dziury, więc oto:
W pastebin można znaleźć 1000 przykładowych akordów , oto pierwsze pięć z jednego przebiegu:
źródło
CJam,
2422 bajtówPodobnie jak w przypadku innych algorytmów, tutaj jest wersja w CJam.
Wejście 1000 daje rozkład taki jak:
Jak to działa
Algorytm jest po prostu
x = 2 * Pi * rand(); print [x, x + 2 * acos(rand())]
Aktualizacja : 2 bajty zapisane dzięki Martinowi!
Wypróbuj tutaj
źródło
Python 3,
144117 bajtów(dzięki Blckknght za
lambda
wskaźnik)Korzystając z tej samej metody co inni:
Z dokumentacji Python:
Wynik
I tak dalej.
Wyobrażanie sobie
źródło
f=lambda n:[(x,x+2*m.acos(r()))for x in(2*m.pi*r()for _ in range(n))]
Perl, 60
źródło
R
60565349 bajtówDodatkowe 4 bajty dzięki @JayCe i zmianie na funkcję.
Korzystanie z tej samej podstawowej formuły co pozostałe. R domyślnie używa metody Mersenne-Twister, ale inne można ustawić. Zwraca listę rozdzieloną spacjami.
Wypróbuj online!
źródło
SmileBASIC, 62 bajty
źródło