Zmień kod, zmień sekwencję: rabusie

15

To wyzwanie dla . Dla gwintu policjantów, przejdź 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ć.

Gliniarze konstruują kod A, który wytwarza S 1, i podają liczbę X, która według nich jest najlepszą możliwą odległością Levenshteina (w znakach) do stworzenia B, która wytwarza S 2 .

Wyzwanie rabusiów

Aby złamać zgłoszenie konkretnego gliniarza, złodzieje muszą wymyślić program C w tym samym języku (i wersji), co ta odpowiedź, która wytwarza S 2 (n) i zmiana znaku Y w stosunku do A (z Y <= X). Rabusie niekoniecznie muszą znaleźć dokładnie ten sam kod B, który wyprodukował gliniarz (potajemnie). Zgłoszenia złodziei muszą być zgodne z tym samym indeksem 0 lub 1 indeksem, jak określono w oświadczeniu gliniarza.

Jeśli sobie z tym poradzisz, opublikuj odpowiedź z rozwiązaniem, łącząc się z odpowiedzią policjanta, i zostaw komentarz na temat odpowiedzi policjanta z powrotem do twojej.

Każdą odpowiedź gliniarza można złamać tylko raz i oczywiście nie wolno ci złamać własnej odpowiedzi. Jeśli odpowiedź gliniarza okaże się nieprawidłowa przed lub po pęknięciu, nie jest liczona do wyniku rabusia.

Wygrywanie i punktacja

Rabusie są punktowani (X - Y)*5 + 5za każde z ich pęknięć, a rabuś z najwyższym wynikiem ogółem wygrywa.

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 także więc obowiązują wszystkie zwykłe zasady gry w golfa.
AdmBorkBork
źródło

Odpowiedzi:

7

Pyke, Levenshtein odległość 1, A036487 , A135628 - wynik 5

Pęknięcie wejścia przez błotniaka

wX*e

Wypróbuj tutaj!

Oryginalny kod X*e, placów wejście, X, który rozmnaża się przez wejście *, a następnie połówki podłogi rezultacie e.

Sztuczka polega na tym, że 'X'jest to 56 w podstawowej reprezentacji 96 w, więc wXdaje 56, pomnóż to przez dane wejściowe, następnie piętro i połowę, a otrzymasz 28-krotność danych wejściowych w razie potrzeby.

Jonathan Allan
źródło
Dokładnie to, co miałem. Trwało nieco dłużej niż się spodziewałem
Blue
Gdy tylko to zobaczyłem, wiedziałem, że to było zamierzone rozwiązanie.
Jonathan Allan
4

Brain-Flak , 28 bajtów, odległość 4, A002817 , A090809

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

Ta odpowiedź została odkryta za pomocą brutal-forcer, który wygenerował 35 000 możliwych programów (wiele z nich było niezrównoważonych, a zatem nieprawidłowy kod wyłamywania mózgu, ale i tak rzuciłem błąd i znalazłem odpowiedź). Było to około 20-tysięcznego przetestowanego programu i znalezienie go zajęło około godziny (choć nie wiem dokładnie, ile czasu minęło, kiedy mnie nie było, kiedy zakończyło się).

Nie chciałem jeszcze publikować tej odpowiedzi, ponieważ nie mam jeszcze pełnego zrozumienia, jak działa ten program. Jednak odpowiedź będzie wkrótce bezpieczna, więc nie chcę, żeby wygasła. Mam nadzieję, że zaktualizuję tę odpowiedź jeszcze raz, gdy ją w pełni zrozumiem, a także opublikuję kod użyty do znalezienia tej odpowiedzi. Ale na razie opublikuję tylko częściowe wyjaśnienie.

#Push the sum of:
(

    #The (n-1)th triangular number, and the range [1, n] (The range doesn't count towards the sum I believe)
    ({(({})[()])}{})

    #Triangulate every number on the stack
    {{({}[()])}{}}

)

Ma to sens, ponieważ OEIS stwierdza:

Dla n> 0 warunki tej sekwencji są powiązane z A000124 przez a (n) = suma (i * A000124 (i), i = 0..n-1). [Bruno Berselli, 20 grudnia 2013 r.]

A A000124 to liczby trójkątne + 1. Jednak nie wiem dokładnie, czym jest forumla, więc nie mogę w pełni wyjaśnić, jak to działa.

James
źródło
3

Perl 6, 19 bajtów, X = 1, A000045 → A000035

{(0,1,*+<*...*)[$_]}

+>zamiast +<działałby również.

Wypróbuj online!

Jak to działa

infix ... jest całkiem użyteczny w przypadku prostych sekwencji rekurencyjnych. (0,1,*+*...*)Częścią oryginalnego kodu, który jest skrótem

(0, 1, -> $x, $y { $x + $y } ... *)

określa sekwencję, która zaczyna się od 0 i 1 , a następnie dodaje elementy, obliczając sumę dwóch poprzednich pozycji w sekwencji.

W przeciwieństwie do tego, (0,1,*+<*...*)wykorzystuje lewe przesunięcie bitowe ( +>prawe przesunięcie bitowe również działałoby) do skonstruowania sekwencji parzystości. Ponieważ przesunięcie 1 jednostki zerowej w lewo wynosi 1 , a przesunięcie 0 jednej jednostki w lewo wynosi 0 , otrzymujemy pożądane naprzemienne wzory zer i jedynek.

Dennis
źródło
2

Perl 6 , 10 bajtów, odległość 1 - wynik 5

Pęknięcie wpisu przez smls

*[0]o 1***

Staje się:

*[0]o 1*+*

Wypróbuj online!

Jonathan Allan
źródło
Dobra robota! Nie myślałem o tym rozwiązaniu, moje było nieco trudniejsze i faktycznie wymagało, *[0]o aby tam być. Myślę, że to oznacza, że ​​mogę wymyślić inne wyzwanie oparte na mojej „sztuczce” ... :)
smls
Naprawdę nie znam Perla, po prostu zobaczyłem ***i pomyślałem, że wygląda na to, że może rozwinąć dynastyczną operację mnożenia *, przy poprzednich argumentach naprawdę nie wiem, co właściwie robi kod. Edytuj wyjaśnienia!
Jonathan Allan
2
1***jest analizowany jako 1 ** *, tj. lambda, która wykonuje „1 do potęgi x”. 1*+*jest analizowany jako 1 * (+*), tj. lambda, która robi „1 pomnożone przez (x zamienione na liczbę)”.
smls
2

Perl 6 , dystans 2, smls

Oryginalny:

+(*%%2)

Pęknięcie:

+(*+0%2)

Wypróbuj online!

Joey Marianer
źródło
Cholera, znowu proste rozwiązanie, którego nie rozważałem ... (Mój był znacznie bardziej zaciemniony +(^*Z%2). Chyba nie jestem zbyt dobry w przygotowaniu tych wyzwań.
sml
2

WolframAlpha, Distance 1, Greg Martin , A002378 , A000537

(sum1to#of n^1)^2&

Jak to działa

Zrozumiałem, że co ciekawe, (n * (n + 1) / 2) ^ 2 to wzór na drugą sekwencję. Ponieważ suma (1 do n) jest równoważna n * (n + 1) / 2, po prostu musiałem zmienić * na ^.

ćpun matematyki
źródło
Powinieneś poinformować go, że złamałeś jego odpowiedź
Post Rock Garf Hunter
Dobrze zauważony! :)
Greg Martin
2

Brain-Flak , 20 bajtów, DJMcMayhem

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

Wypróbuj online!

Dodano ({})na początku pętli, aby podwoić wartość w każdej iteracji.

Martin Ender
źródło
Ładny! FWIW, moim 18-bajtowym rozwiązaniem było({(({}[()])){}}{})
James
1

JavaScript, Distance 4, LliwTelracs

Oryginalny:

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

Pęknięcie:

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

Wypróbuj online!

Kritixi Lithos
źródło
1

JavaScript (ES6), dystans 1, Advancid

Oryginalny:

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

Pęknięcie:

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

Wypróbuj online!

lub

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

Wypróbuj online!

Jakoś udało mi się sprawić, żeby zachowywał się inaczej między TIO a repl.it (absolutnie nie mam pojęcia, dlaczego 2 * 1 ^ ... byłoby równe 0, zgodnie z repl.it)

Fəˈnɛtɪk
źródło
Jestem zbyt głupi, nie myślałem o zmianie 2 do 0. Oto funkcja B: as=function(){ return 2*2**((1^1)*-1*~arguments[0]/11-(4-(as+[]).length%89))-(as+[]).length%7}.
1

Java, Distance 4, Peech , A094683 , A000290

Oryginalny:

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;}

Pęknięcie:

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%1==(int)Math.log10(Math.E)/Math.log((double)'H'-'@')?(int)n*n:k;}
                                                                                                                                                          ^                                                         ^^^

zwraca n * n

Fəˈnɛtɪk
źródło
1

JavaScript, Advancid , odległość 2, A059841 i A000004

Pozostawia kod tylko za linkiem TIO, ponieważ wydaje się, że psuje stronę.

Dzięki @nderscore, którego kodu użyłem do odszyfrowania kodu początkowego

Wystąpił nadmiarowy kod, taki jak użycie !! [] + [] + [] zamiast !! [] + [].

Dodanie! + [] - (! + []) (+ 1-1) początkowo uniemożliwiło odszyfrowanie.

Wypróbuj online

Fəˈnɛtɪk
źródło
1

Pyke, Levenshtein odległość 2, A008788, A007526

'SS^

Wypróbuj tutaj!

Jak to działa

To powoduje mieszaną konwersję bazy.

'Spobiera dane wejściowe n i stosuje, pchając [1, ..., n] na stosie. Następny Spobiera dane wejściowe n i ponownie wypycha tę samą tablicę. 'wydaje się, że powoduje, że następne polecenie zostanie zastosowane do poprzedniego szczytu stosu; Jestem trochę rozmyślny w szczegółach.

Wreszcie ^stosuje konwersję mieszanej zasady, więc [1, ..., n] [1, ..., n] f oblicza
a (n): = [1] n + n + (n) (n-1) .. . + [n!] 1 gdzie nawiasy oznaczają wartość miejsca i cyfrę po prawej stronie.

Teraz a (n) = (1 + (1) (n-1) + (n-1) (n-2) (n-3) + ... + (n-1)!) N = n ( a (n) + 1) , która jest tą samą rekurencyjną formułą, która definiuje a (n) w [A007526]. Ponieważ pusta suma wynosi zero, a (0) = 0 i przypadek podstawowy również się zgadzają.

Dennis
źródło
Jak udało ci się to osiągnąć przy tak niewielu próbach? Interesują mnie twoje procesy myślowe
Blue
Mieszana konwersja bazy jest dość powszechną sztuczką golfową. Nie po raz pierwszy go użyłem.
Dennis