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.

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.


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.


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.


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!


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!


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




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)


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


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


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ą.


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
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.