Zmień kod, zmień sekwencję: gliniarze


27

To wyzwanie dla . Przejdź do wątku rabusiów tutaj .

Wyzwanie to obejmuje dwie sekwencje OEIS wybrane przez gliniarzy - S 1 , S 2 - oraz to, jak dobrze te sekwencje można zagrać w golfa i zaciemnić.

Wyzwanie gliniarzy

Twoim wyzwaniem jako gliniarza jest wybranie swobodnie dostępnego języka i dwóch sekwencji OEIS. Następnie napisz kod A w tym języku, który pobiera dane wejściowe n i wytwarza S 1 (n). Kiedy ten kod został zmodyfikowany przez odległość Levenshteina z X znaków (gdzie X nie więcej niż 0.5 * (length A)) i przekształcony kodu B w tym samym język musi następnie wytwarzać S 2 (n). Musisz napisać ten kod B , ale nie ujawniaj go, dopóki wyzwanie nie będzie bezpieczne (patrz poniżej).

Zgłoszenia gliniarzy muszą zawierać nazwę języka, pełny kod A , liczbę bajtów A , wartość X liczby zmian w dostępie do ich tajnego kodu B oraz wybrane numery sekwencji S 1 i S 2 . Możesz wybrać, czy każda sekwencja ma być indeksowana 0, czy indeksowana 1, ale określ ją w swoim zgłoszeniu.

Aby złamać konkretne zgłoszenie, złodzieje muszą wymyślić program C w tym samym języku (i wersji), który wytwarza S 2 (n) i zmienia znak Y na inny niż A (z Y <= X). Rabusie niekoniecznie muszą znaleźć dokładnie ten sam kod B, który wyprodukował gliniarz (potajemnie).

Wygrywanie i punktacja

Jeśli twoja odpowiedź policjanta nie zostanie złamana w ciągu 7 dni (168 godzin), możesz ujawnić swoje własne rozwiązanie B , w którym to momencie twoja odpowiedź jest uważana za bezpieczną. Dopóki nie ujawnisz swojego rozwiązania, może ono zostać złamane przez rabusiów, nawet jeśli minęło już 7 dni. Jeśli twoja odpowiedź się popsuła, zaznacz to w nagłówku odpowiedzi wraz z linkiem do odpowiedzi odpowiedniego rabusia.

Gliniarze wygrać mając niezarysowanego przedstawienie z najkrótszym A . W przypadku remisu jako remis zostanie użyty najmniejszy X. Jeśli nadal remisuje, wcześniejsze zgłoszenie wygra.

Dalsze zasady

  • Nie wolno używać żadnych wbudowanych funkcji do mieszania, szyfrowania lub generowania liczb losowych (nawet jeśli generator liczb losowych zostanie ustawiony na stałą wartość).
  • Dozwolone są programy lub funkcje, ale kod nie może być fragmentem i nie można zakładać środowiska REPL.
  • Możesz przyjmować dane wejściowe i przekazywać dane wyjściowe w dowolnym dogodnym formacie . Metody wejścia / wyjścia muszą być takie same dla obu sekwencji.
  • Ostatecznym kalkulatorem odległości Levenshteina dla tego wyzwania jest ten na Planet Calc.
  • Oprócz bycia wyzwaniem CnR, jest to również więc obowiązują wszystkie zwykłe zasady gry w golfa.

Upewnij się również, że jeśli zmienisz coś w tym pytaniu, zaktualizujesz jednego z nich.
mbomb007

Co jeśli policjant nazywa funkcję / zmienną naprawdę dużą w stosunku do faktycznego kodu generującego sekwencję? W tym przypadku będzie można utworzyć dowolną sekwencję, a odległość między lewami będzie mniejsza niż(0.5*len(A))
hashcode55

@ hashcode55 Dwie rzeczy - 1) prawdopodobnie nie będą dobrym kandydatem do wygrania wątku gliniarzy. 2) jeśli jest tak ogromny, daje także dobrą swobodę złodziei.
AdmBorkBork,

1
jest to golf kod, więc obowiązują wszystkie zwykłe zasady gry w golfa ” Czy to oznacza, że ​​kod A musi być golfowany tak często, jak to możliwe, czy też może być celowo napisany zbyt gadatliwie / niezręcznie, aby uczynić go bardziej podobnym do kodu B ?
smls

Odpowiedzi:


10

Brain-Flak , 28 bajtów, Odległość 4, A002817 , A090809 Pęknięty

Ta odpowiedź wykorzystuje indeksowanie 1

(({({}[()])}{}){({}[()])}{})

Wypróbuj online

Dla wszystkich zainteresowanych jest 27475 prawidłowych programów Brain-Flak z Levenshtein 4 w odległości od tego programu i 27707 z 4 lub mniejszą odległością. Tak więc rozwiązanie brutalnej siły byłoby wykonalne na komputerze klasy konsumenckiej.


Prawdopodobnie byłoby krótsze i szybsze do przeczytania, jeśli masz X = 4zamiast Levenshtein distance of 4.
mbomb007

1
@ mbomb007 Osobiście jestem trochę zdezorientowany, gdy wyzwania używają szeregu zmiennych literowych w zamian za rzeczy, które próbowałem uniknąć zamieszania. Skróciłem go teraz, miejmy nadzieję, nie powodując zamieszania.
Wheat Wizard

wzruszając ramionami . Jeśli wszyscy przeczytają pytanie, powinni je zrozumieć. Xjest naprawdę jedyną zmienną, którą muszą znać.
mbomb007

@ mbomb007 Chociaż pytanie dotyczy również liczby bajtów.
DLosc


6

7 , 33 znaków, 13 bajtów, X = 10, A000124A000142 , Bezpieczny

171720514057071616777023671335133

Wypróbuj online!

Odległość Levenshteina jest mierzona w kategoriach znaków, więc napisałem program w kategoriach znaków, które zawiera powyżej (i Wypróbuj online !, w tym sam język, chętnie uruchamia programy zakodowane w ASCII). Jednak program jest przechowywany na dysku przy użyciu sub-bajtowego kodowania 7, co oznacza, że ​​sam program jest w rzeczywistości następującym zrzutem heksadecymalnym (o długości 13 bajtów):

00000000: 3cf4 2982 f1ce 3bfe 13dc b74b 7f         <.)...;....K.

(Ponieważ odległość Levenshteina mierzona jest liczbą znaków, niekoniecznie dodajesz / usuwasz / zmieniasz 10 bajtów , więc prawdopodobnie najlepiej jest pracować z oryginalnym ASCII.)

Program jak napisano implementuje A000124 (liczby trójkątne + 1); każde pęknięcie musi implementować A000142 (silnia). Oba programy pobierają dane wejściowe ze stdin (jako liczby całkowite dziesiętne), zapisują swoje dane wyjściowe na stdout i traktują wejście 1 jako pierwszy element sekwencji (oraz wejście 2 jako drugi element itp.).

Mam nadzieję, że bardzo wysoka wartość X powstrzyma ludzi przed brutalnym wymuszaniem programu, tym razem (co zawsze stanowi ryzyko w przypadku wpisów policjantów i złodziei w 7).

Rozwiązanie

177172051772664057074056167770236713351353

Wypróbuj online!

Różnice od oryginału:

17 172051 405707 1 61677702367133513 3
17 7 172051 77266 405707 405 61677702367133513 5 3

Nie mam przygotowanych wyjaśnień na temat tego, jak one działają, więc zajmie mi to trochę czasu, aby uzyskać wyjaśnienie, ponieważ będę musiał je zrozumieć od zera. Mam nadzieję, że w końcu będzie wyjaśnienie.




3

Perl 6 , 13 bajtów, X = 1, A161680A000217

Bezpieczny!

{[+] [,] ^$_}
  • S 1 = A161680 = 0 0 1 3 6 10 15 21...= zero, po których następują liczby trójkątne.
  • S 2 = A000217 = 0 1 3 6 10 15 21 28 ...= Liczby trójkątne.
  • Zero indeksowane.

Wypróbuj online!

(Potwierdzono współpracę z wersją Perl 6 działającą na TIO.)

Rozwiązanie

{[+] [\,] ^$_}

Jak działa oryginał:

{           }  # A lambda.
          $_   # Lambda argument.                     e.g. 4
         ^     # Range from 0 to n-1.                 e.g. 0, 1, 2, 3
     [,]       # Reduce with comma operator.          e.g. 0, 1, 2, 3
 [+]           # Reduce with addition operator.       e.g. 6

Jak działa rozwiązanie:

{            } # A lambda.
           $_  # Lambda argument.                     e.g. 4
          ^    # Range from 0 to n-1.                 e.g. 0, 1, 2, 3
     [\,]      # Triangle reduce with comma operator. e.g. (0), (0,1), (0,1,2), (0,1,2,3)
 [+]           # Reduce with addition operator.       e.g. 10

Wykorzystuje fakt, że operatory numeryczne, takie jak dodawanie, traktują listę jako liczbę elementów, więc w tym przykładzie suma jest 1 + 2 + 3 + 4 = 10.

I tak, no-op „Reduce with przecinkiem” w oryginale niejako omija zasady gry w golfa, ale wolę patrzeć na to jako na głupiutki algorytm, który został w jak największym stopniu zagrany w golfa (białe znaki itp.) co to jest... :)


To błaga o brutalną siłę, gdybym miał czas lub skłonność (i znajomość perla).
Rohan Jhunjhunwala

To przetrwało wystarczająco długo, aby być oznaczone jako bezpieczne
fəˈnɛtɪk




1

WolframAlpha, 18 bajtów, X = 1

Cracked by math_junkie!

(sum1to#of n^1)*2&

Czasami WolframAlpha faktycznie będzie w stanie wyświetlić taką czystą funkcję w formie funkcjonalnej (innym razem się myli); ale można go wesoło wywołać przy użyciu danych wejściowych - na przykład (sum1to#of n^1)*2&@5zbiorów 30.

S1 = A002378 (liczby stałe)

S2 = A000537 (suma pierwszych nkostek)

Obie sekwencje mają indeks 0.




1

JavaScript, 15704 bajtów, odległość 2, A059841 i A000004 - pęknięty

To rozwiązanie jest bardzo długie, więc możesz znaleźć pełny kod w tym github gist.

Oryginalna odpowiedź (ta) ma 1 indeks. (Wiem, że to zdecydowanie za długo, tylko dla zabawy).


Pęknięty . Ponadto dodanie absolutnie bezużytecznego kodu! + [] - (! + []) Nie jest tak naprawdę zgodne z duchem reguł
fəˈnɛtɪk

Właśnie dlatego, ta odpowiedź powoduje pewne problemy dla PO tego wyzwania. Najwyraźniej powoduje to zablokowanie całej strony, ponieważ wygląda jak szkicowy JavaScript. Czy możesz umieścić kod w linku zewnętrznym? (Gist, pastedump itp.)
DJMcMayhem

Właściwie sam to sobie przypomniałem. Jeśli wolisz mieć kod gdzie indziej, możesz go edytować ponownie, jeśli przekroczyłem swoje granice.
DJMcMayhem

Myślę, że! + [] - (! + []) Sprawia, że ​​nie można po prostu odwrócić konwersji. Ale niektóre inne śmieci tylko wydłużają czas. Odpowiednik kodu to tylko 15640 bajtów.
fəˈnɛtɪk


0

JavaScript, 30 bajtów, odległość 4, A000290 , A000079 , - Pęknięty!

f=x=>{return x?2*x-1+f(x-1):0}

Indeksowanie na podstawie 0

@Kritixi Lithos rozwiązanie faktycznie różniło się od mojego

f=x=>{return x?f(x-1)+f(x-1):1}

Wypróbuj online


1
To jest x**2i nie2**x
Kritixi Lithos

Myślę, że to A000290 , a nie A000079.
betseg

@KritixiLithos to powinno być jedno i drugie. Zmieniłem niewłaściwy link sekwencji na górze, kiedy zmieniłem drugi koniec.
fəˈnɛtɪk


0

JavaScript (ES6), odległość wynosi 1, A000079 i A000004 - pęknięty

as=function(){ return 2*2**((11)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

Oryginalna odpowiedź (ta) jest oparta na 0. Teraz, gdy został złamany, oto oryginalna funkcja B:

as=function(){ return 2*2**((1^1)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}

1
Byłem w stanie uzyskać mój crack codegolf.stackexchange.com/a/109976/64505, aby zachowywać się niespójnie między dwoma różnymi środowiskami.
fəˈnɛtɪk


0

Java 7, Levenshtein odległość 4, A094683 , A000290 , Pęknięty

int x{double r=1;for(int i=0;i<42;i++)r=r/2+n/r/2;int k=(int)((int)n*(float)n/Math.pow(n,(Math.sin(n)*Math.sin(n)+Math.cos(n)*Math.cos(n))/2));return n%4%2==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)r:k;}

0-indeksowane.
Wypróbuj tutaj!


@LliwTelracs zrobił to dla pierwszych 15 liczb całkowitych nieujemnych, zobacz moją zaktualizowaną odpowiedź.
peech

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.