To wyzwanie dla gliniarzy i rabusiów . Wątek gliniarzy do tego wyzwania jest tutaj
Ciekawe pytanie do przemyślenia to:
Jeśli mam ciąg liczb, ile z nich muszę podać, zanim stanie się jasne, o jakiej sekwencji mówię?
Na przykład, jeśli chcę mówić o dodatnich liczbach całkowitych w kolejności od , mógłbym powiedzieć , ale czy to naprawdę wystarczy?1 , 2 , 3 , …
Mam jeden sposób na udzielenie odpowiedzi na to pytanie i bycie golfistą. To wymaga golfa. Podano wystarczającą liczbę sekwencji, jeśli najkrótszy kod, który je tworzy, tworzy wszystkie warunki sekwencji. Jeśli myślimy o tym w kategoriach golfa kodu, oznacza to, że dostarczyłeś wystarczającą liczbę przypadków testowych, tak aby najkrótszy kod, który przechodzi przez przypadki testowe, wykonał pożądane zadanie.
Wyzwanie
To wyzwanie jest wyzwaniem dla gliniarzy i rabusiów . W którym gliniarze będą prezentować przypadki testowe, a złodzieje będą musieli znaleźć krótszy sposób na sfałszowanie przypadków testowych niż zamierzona sekwencja. Gliniarze przedstawią następujące rzeczy:
Fragment kodu, który przyjmuje dodatnią liczbę całkowitą jako dane wejściowe i tworzy liczbę całkowitą jako dane wyjściowe. Kod ten może mieć wartość zero lub jeden indeksowany, ale powinno być jasne, czym jest indeksowanie. Ten kod określi twoją sekwencję.
Wszelkie odpowiednie wymagania dotyczące platformy lub języka, które mogą mieć wpływ na wynik, na przykład rozmiar longinta.
Liczba wraz z pierwszymi członami sekwencji obliczonymi przez kod. Będą one działać jako „przypadki testowe”.n
Rabusie znajdą program w tym samym języku, który jest krótszy niż ten przedstawiony i przejdzie wszystkie przypadki testowe (produkuje takie same dane wyjściowe dla pierwszych danych wejściowych jak kod gliniarza). Kod rabusia musi również różnić się wyjściem z programu policjanta dla pewnej liczby większej niż .n
Punktacja
Rabusie zostaną punktowani w liczbie znalezionych pęknięć, przy czym im więcej pęknięć, tym lepiej. Odpowiedź można złamać ponownie, znajdując poprawną odpowiedź krótszą niż oryginalne pęknięcie. Jeśli odpowiedź zostanie złamana po raz drugi, punkt zostanie przyznany drugiemu crackerowi, a nie pierwszemu.
źródło
Odpowiedzi:
cQuents , odpowiedź Stephena , 3 bajty
Wypróbuj online!
Jak to działa
Wygląda sekwencji powinno być identyczne, ale to daje
12345678910
don = 10
natomiast"::$
daje1234567891
.źródło
JavaScript, odpowiedź fəˈnɛtɪk (17 bajtów)
undefined
||
22
Testowanie
Alternatywnie, wypróbuj online!
źródło
Haskell , odpowiedź Laikoni , 15 bajtów
Wypróbuj online!
Zazwyczaj zwracałem uwagę na coś takiego w komentarzu, ale potem pomyślałem, że gliniarze i złodzieje są trochę bardziej poderżnięci.
To tylko odpowiedź BMO minus specjalny przypadek
b 42
. Ponieważ oryginał Laikoni przechodzi przez zmiennoprzecinkowy, nie jest to konieczne: po prostu znajdź liczbę wystarczająco dużą, aby podać w niej błędy zaokrąglania, ale nie dokładnąInteger
arytmetykę. Na przykład:źródło
Python 2 , odpowiedź xnora , 43 bajty
Wypróbuj online!
Kredyty
Ogromne uznanie dla tego cracku musi pochodzić od @ Mr.Xcodera, który jako pierwszy opublikował komentarz na temat możliwego ataku przy użyciu tej metody oraz do @PoonLevi, który znalazł 44-bajtowe rozwiązanie.
W jaki sposób?
Teoria
W szczególności dla :a=2
Istnieje więc dodatnia liczba całkowita taka, że:k
Który prowadzi do:
2 p - 1 = 2 k p + 1 2 p - 1 ≡ 1
Ta ostatnia formuła jest tą, z której pochodzi kod Pythona i obecnie obowiązuje dla , mimo że nie jest względnie pierwsze.2p=2 2
A teraz najważniejsze: odwrotność małego twierdzenia Fermata nie jest prawdziwa. Możemy mieć dla pewnej liczby złożonej . Takie liczby są nazywane pseudopierwszymi liczbami Fermata w celu . Pseudopierwsze Fermata do zasady 2 są również znane jako liczby Pouleta .n aan−1≡1(modn) n a
Pierwszy pseudopierwszy Fermat do podstawy (lub pierwszy numer Pouleta) to , dla których mamy:2 n=341=11×31
Oznacza to, że nasz algorytm zwróci zamiast oczekiwanej 69- tej liczby pierwszej .341 347
Realizacja
@PoonLevi znalazł następujące 44-bajtowe rozwiązanie, które jest bezpośrednio oparte na :(2)
Używając1 21−1≡0(mod1)
<2
zamiast==1
, zapisujemy 1 bajt, ale wprowadzamy do sekwencji, ponieważ :Wypróbuj online!
Zaczynając od , otrzymujemy oczekiwane warunki o 1, ponieważ wykonujemy jedną iterację mniej:p=2
Wypróbuj online!
Ostatnią sztuczką jest użycie
n<1or
zamiastn and
. Jest to tak samo długie, ale powoduje, że ostatnia iteracja zwraca True zamiast 0 , dlatego dodaje brakujące przesunięcie do każdego terminu.źródło
Python 3 , crashoz , 45 bajtów
Wypróbuj online!
Wyrażeniesin(x) x7
x*60-x**3*10+x**5/2-x**7/84
to szereg Taylora dla do wyrażenia , pomnożony przez 60. Jest to wystarczająco dokładne na użytych danych wejściowych, ale w przypadku wyższych wartości oba będą się rozchodzić w miarę, jak skrócone terminy stają się bardziej odpowiednie.źródło
JavaScript (ES6), odpowiedź Arnaulda (10 bajtów)
Wypróbuj online!
źródło
Haskell , odpowiedź Laikoni ,
2622 bajtów-4 bajty, nie używając infix
div
, dzięki Laikoni !Wypróbuj online!
Wyjaśnienie
Dla termin można przepisać, ponieważ daje nam wystarczającą liczbę bajtów do dopasowania wzorca na co prowadzi do pęknięcia w obrębie 28 bajtów:0≤n≤20 n>20
ceiling(realToFrac n/2)
div(n+1)2
źródło
((n+1)`div`2)
->div(n+1)2
.> <> , odpowiedź crashoz 203 bajtów
Wypróbuj online!
Zamierzałem zrobić coś sprytnego z faktem, że powyższe liczby nieparzyste / parzyste
n=20
były takie same, z wyjątkiem powtarzającego się elementu w środku, ale łatwiej było po prostu na stałe zakodować każdy element.Wejście odbywa się za pośrednictwem
-v
flagi. Nie drukuje nic dla elementów powyżej 34.źródło
Pascal (FPC) , odpowiedź AlexRacera , 80 bajtów
Wypróbuj online!
Gdy wyjścia są identyczne, ale gdy powyższy kod wyprowadza , podczas gdy kod AlexRacera wyprowadza .0≤n≤120 n=128 127 126
To wydaje się późną odpowiedzią, ale i tak dziękuję @AlexRacer za dobrą łamigłówkę!
źródło
JavaScript, odpowiedź fəˈnɛtɪk (12 bajtów)
Działa to dla podanych wartości, ale zawodzi w przypadku wielu innych wartości (np. ) z powodu błędów precyzji.x=6
Testowanie
Alternatywnie, wypróbuj online!
źródło
JavaScript, odpowiedź fəˈnɛtɪk (17 bajtów)
Możesz zobaczyć w linku TIO lub wyniku fragmentu stosu, że nie powiedzie się dla wpisów wyższych niż .15
Jeśli dokładność byłaby wymagana tylko dla (pierwszych wartości), to działałby również dla 16 bajtów.15n≤14 15
x=>Math.exp(x)|1
Testowanie
Alternatywnie, wypróbuj online!
źródło
Łuska , pękanie 5 bajtów BMO z
32 bajtami-1 dzięki BMO (
LdΣ
->LΣ
ponieważ, gdy podano aTnum
,L
wykonuje „długość reprezentacji ciągu”)Wypróbuj online!
Cyfrowa długość liczb trójkątnych * odpowiada a następnie różni się przy ... kiedy daje a daje .a ( 24 ) 3 4a(0)⋯a(23) a(24)
3 4
LΣ
←d+16
* Gdzie ma cyfrową długość (nie )1 0T(0)=0 1 0
źródło
L
iLd
są równoważne, oszczędzając bajt;)L
zastępuje to „długość reprezentacji ciągu”Tnum
.> <> , Odpowiedź Aidena F. Pierce'a , 36 bajtów
Wypróbuj online!
Inne rozwiązanie z każdą wartością zakodowaną na stałe w wierszu. Ponieważ pierwotna odpowiedź była również w większości zakodowana, nie czuję się z tego powodu winny.
źródło
JavaScript, odpowiedź fəˈnɛtɪk , 23 bajty
Zwraca dla .n ≥ 140 n≥14
Wypróbuj online!
W jaki sposób?
Wyrażenie
`${73211e9}`
rozwija się do łańcucha"73211000000000"
, zapewniając tablicę przeglądową 14 wartości, które są odejmowane od 14, co daje oczekiwaną sekwencję.Dla wynikiem jest:n≥14
21 bajtów
Zwracan≥14
NaN
dla , który może, ale nie musi, być uważany za poprawny wynik.Wypróbuj online!
źródło