To wyzwanie dla gliniarzy i rabusiów. To jest nić rabusia. W gwint policjanta jest tutaj .
Policjanci wybiorą dowolną sekwencję z OEIS i napiszą program p, który wypisze pierwszą liczbę całkowitą z tej sekwencji. Będą one również znaleźć kilka ciągów s . Jeśli wstawisz s gdzieś w p , ten program musi wydrukować drugą liczbę całkowitą z sekwencji. Jeśli wstawisz s + s w tej samej lokalizacji w p , ten program musi wydrukować trzecią liczbę całkowitą z sekwencji. s + s + s w tej samej lokalizacji wydrukuje czwartą itd. i tak dalej. Oto przykład:
Python 3, sekwencja A000027
print(1)
Ukryty ciąg ma dwa bajty .
Łańcuch jest taki +1
, ponieważ program print(1+1)
wypisze drugą liczbę całkowitą w A000027, program print(1+1+1)
wypisze trzecią liczbę całkowitą itp.
Policjanci muszą ujawnić sekwencję, oryginalny program p oraz długość ukrytego ciągu s . Rabusie łamią przesłanie, znajdując dowolny ciąg znaków do tej długości i lokalizację, w której można go wstawić w celu utworzenia sekwencji. Ciąg nie musi być zgodny z zamierzonym rozwiązaniem, aby być poprawnym pęknięciem, podobnie jak lokalizacja, w której jest wstawiany.
Jeśli złamiesz jedną z odpowiedzi gliniarzy, opublikuj swoje rozwiązanie (z ujawnionym ukrytym ciągiem i lokalizacją) oraz link do odpowiedzi. Następnie skomentuj odpowiedź gliniarzy, podając link do twojego cracka tutaj.
Zasady
Twoje rozwiązanie musi działać dla dowolnej liczby w sekwencji lub przynajmniej do rozsądnego limitu, w którym nie powiedzie się z powodu ograniczeń pamięci, przepełnienia liczby całkowitej / stosu itp.
Zwycięski rabuś to użytkownik, który pęka najwięcej zgłoszeń, a remis jest tym, który pierwszy osiągnął taką liczbę pęknięć.
Zwycięski gliną jest glina z najkrótszych ciągów s , który nie jest pęknięta. Tiebreaker to najkrótsza p . Jeśli nie ma żadnych niezrackowanych zgłoszeń, policjant, który miał rozwiązanie niesprawdzone dla najdłuższych zwycięstw.
Aby zostać uznane za bezpieczne, rozwiązanie musi pozostać niezakłócone przez 1 tydzień, a następnie musi zostać ujawniony ukryty ciąg (i lokalizacja, w której należy go wstawić).
s nie może być zagnieżdżony, musi być konkatenowany od końca do końca. Na przykład, jeśli ów był
10
, każda iteracja pójdzie10, 1010, 101010, 10101010...
zamiast10, 1100, 111000, 11110000...
Wszystkie rozwiązania kryptograficzne (na przykład sprawdzanie skrótu podłańcucha) są zakazane.
Jeśli s zawiera znaki spoza ASCII, musisz również określić używane kodowanie.
źródło
%
lewicowych współpracowników.Brain-Flak , A000984 firmy Nitrodon
To tylko 30 bajtów, nie jestem pewien, co Nitrodon miał na myśli.
Wypróbuj online!
Wyjaśnienie
Próbowałem wielu rzeczy, ale oto, co zadziałało. Warunki A000984 są centralnymi elementami trójkąta Pascala.
Teraz zorientowałem się, że mogę je zdobyć, sumując przekątne nad nimi:
Na przykład:
A ponieważ ostatnią czynnością w programie Nitrodon jest podsumowanie wszystkiego, wydawało się to dobrym kandydatem (bardziej jak próbowałem wielu rzeczy, ale ten skończył się działaniem).
Chcemy więc programu, który pobiera jedną sumę częściową, a tworzy następną. Na szczęście istnieje całkiem fajny sposób na przejście od jednego do drugiego. Każdy wiersz to delty następnego wiersza. To jestn ty termin z rzędu to różnica między n tym i n−1 terminem w następnym rzędzie.
Jedynym problemem jest to, że nie mamy dość ostatniego wiersza, aby obliczyć żądany wiersz. Ponieważ każdy wiersz jest o jeden dłuższy niż ostatni, jeśli mamy wiersz, nie możemy uzyskać ostatniego członka następnego wiersza za pomocą tej metody. Jednak tutaj mamy inną sztuczkę, ostatni członek każdego rzędu jest równy wszystkim poprzednim członkom tego rzędu!
A jeśli jesteś zaznajomiony z Brain-Flak, który powinien ci wystarczyć jako coś, co będzie naprawdę łatwe do zrobienia.
Teraz kod:
Aby rozpocząć, wykonujemy obliczenie następnego wiersza, w którym każdy nowy członek jest sumą dwóch sąsiadujących starych członków. Można to zrobić za pomocą:
Co w zasadzie przesuwa element nad i dodaje (bez usuwania) to, co już było na nim. Jednak wszystko to odwraca, więc następnym razem, gdy otrzymamy wiersz, musimy go odłożyć.
Teraz musimy obliczyć ostatniego członka wiersza. Jak powiedziałem wcześniej, jest to bardzo łatwe. Ponieważ mieliśmy pętlę nad wszystkimi elementami wiersza, możemy po prostu pobrać tę sumę i przesunąć ją. Pchamy go przed drugą pętlą, aby wylądował na dole.
I to wszystko.
źródło
Brain-Flak, A000290 , autor: Sriotchilism O'Zaic
Oryginalny:
Pęknięty:
Wypróbuj online!
Alternatywnie:
Wypróbuj online!
źródło
MATL , sekwencja A005206 autorstwa Luisa Mendo
Oryginalny:
Wypróbuj online!
Pęknięty:
Nie jestem ekspertem od MATL-u, ale z tego, co rozumiem, oryginał
voOdoO
tworzy dwie puste tablice i tablicę[0]
na stosie. to[0]
jest drukowane bez nawiasów jako pierwszy element sekwencji. Następnie crack / rozwiązanie wykonuje następujące czynności:d
usuwa elementy ze stosu i (zakładając, że jest to liczba lub tablica wielkości 1) zamienia go w pustą tablicę. Te puste tablice nie są drukowane, ale wpływają na rozmiar stosuNq
liczy rozmiar stosu i odejmuje jeden. Jest ton+1
termin oceniania funkcji (ponieważ zaczyna się od 2 i zwiększa o jedną każdą iterację z powodud
dodawania do stosu niewidocznych elementów)17L
to jest stałaPhi = (1+sqrt(5))/2
/k
wykonuje to,floor((n+1)/Phi)
co jest jedną z formuł, które obliczają elementy sekwencji. Ta formuła jest wymieniona w OEIS jakoa(n) = floor(sigma*(n+1)) where sigma = (sqrt(5)-1)/2
z wyjątkiem tego, że używamy tożsamości(sqrt(5)-1)/2 = 1/Phi
źródło
\N17L/k&
(zwróć uwagę na dwa różne zastosowania&
na środku i na końcu kodu), ale twoje rozwiązanie jest prostsze i bardziej eleganckiPython 3 - A__
Wypróbuj online!
100 butelek piwa, dodaj,
-1
aby uzyskać kolejny numer99
itp.źródło
-1
. Uściślę to.Beczka , sekwencja A000045 , autor: A__
Oryginalny:
Pęknięty:
Zauważ, że wyzwaniem było znalezienie podciągu o długości <= 6, ale znaleziony ciąg ma długość 5.
Definicja poleceń dla tych, którzy są zbyt leniwi, aby sprawdzić specyfikację Keg:
0
i1
wcisnąć odpowiednią liczbę na stos;"
przesuwa górę stosu na spód stosu (rolka);&
wkłada stos do góry do rejestru, jeśli jest pusty, w przeciwnym razie opróżnia rejestr na stosie;+
dodaje dwie górne wartości stosu.Inicjał
1"
po prostu wstawia 1 na dole stosu. Ta rosnąca lista jedynek odgrywa rolę tylko w pierwszej iteracji, gdzie pozwala nam założyć, że stos zaczyna się1 0
raczej niż po prostu0
. Rzeczywiście program10:&+.
, w którym:&+
część jest powtarzana, ma dokładnie takie samo zachowanie jak powyższe rozwiązanie, z tym wyjątkiem, że nie ma rosnącej listy 1 na dole.Ponieważ
&
jest używany tylko raz w powtarzającej się części i ma naprzemienne zachowanie, zachowanie1":&+
zależy od parzystości iteracji.Teraz ten program tak naprawdę nie drukuje sekwencji sekwencji Fibonacciego zaczynającej się od 0, 1 od początku; faktycznie drukuje sekwencję Fibonacciego 1, 0 z drugiego miejsca, tj. z 0. (Daje to tę samą sekwencję.) Wiedząc o tym, program można łatwo przeanalizować:
[a, b]
i kończy jakoa+b (&=b)
.[b] (&=a)
i kończy jako[b, b+a]
.To rzeczywiście oblicza sekwencję zgodnie z wymaganiami.
źródło
:
polecenie na początku łańcucha.Java 8+, sekwencja A010686 autorstwa Benjamina Urquharta
źródło
Brain-Flak, A000578 autorstwa Sriotchilism O'Zaic
Oryginalny:
Wypróbuj online!
Pęknięty:
Wypróbuj online!
źródło
Pyret , sekwencja A083420 , autor: MLavrentyev
Możesz go uruchomić tutaj, ale nie wymyśliłem, jak połączyć z kodem. Będziesz musiał skopiować i wkleić.
Podana funkcja ignoruje swój drugi argument. Podwaja swój pierwszy i dodaje jeden, który wygeneruje potrzebną
2^n - 1
sekwencję potrzebną tutaj - wszystko, co muszę zrobić, to powiedzieć mu, ile razy wykonać tę operację, dokonaną przez zmianę długości złożonej listy. Na szczęście Pyret nie narzeka na ten przecinek.źródło
Python 3 , sekwencja A268575 według NieDzejkob
Oryginalny:
Pęknięty (100 bajtów):
Wypróbuj online!
Z tego, co mogę zebrać, oryginalny kod konfiguruje definicje, aby ukryty ciąg był jak najkrócej skrócony, a następnie definiuje początkowy wzorzec Gry w Życie. Ukryty ciąg jest następnie równoważny zapisaniu iteracji Gry Życia Conwaya w 102 bajtach.
Na potrzeby tego pęknięcia
S
jest funkcją, która sumuje elementy w argumentach (które są iterowalne) iF
stosuje funkcję zwracającą iterowalność do każdego elementu listy i niszczy wszystkie wyniki razem.;A=-1,1,0;
kończy poprzednią instrukcję i skraca krotkę (-1,1,0) literą A, która jest używana jakoproduct(A,A)
dająca wszystkich sąsiadów względem danej komórki, a także samej komórki.*X,=F(lambda a:(S(a,x)for x in product(A,A)),W);
tworzy nową listęX
obejmującą wszystkich sąsiadów komórekW
iW
same komórki przez dodanie względnych pozycji sąsiadów do każdej komórki i rozbicie ich razem na listę.W={p for p in X if 2<X.count(p)<4+({p}<W)}
przechodzi przez tę listęX
i określa, czy każda komórkaX
należy do zestawu komórek w następnej iteracji. Zostało to niemal dosłownie zaczerpnięte z gry w golfa Game of Life .źródło
Haskell, A014675 , autor : Khuldraeseth na'Barya
Oryginalny kod
Z podciągiem
Wypróbuj online!
źródło
flip take[1,2]
zamiast tej wewnętrznej lambda. W przeciwnym razie identyczne.(`take`[2,1])
jest nawet o jeden bajt krótszy(`take`)
napotkałem błąd kompilacji, więc pomyślałem,(`take`[2,1])
że też. :(Kalkulator biurkowy, A006125 , autor: A__
Oryginalny:
Pęknięty:
Wypróbuj online!
Prosta implementacja.
źródło
Sa2Lad1-*2/^
na wypadek, gdyby ktoś mnie o to zapytał.cQuents , sekwencja A003617 autorstwa Stephena
Wypróbuj online!
Rozpocznij od najniższej liczby n + 1-cyfrowej, jednej po której następuje n zer. W
#2
określa, że tylko drugie określenie sekwencji, która jest określenie sekwencji podawano raz na nasiona będą drukowane; ta definicja sekwencji po prostu wyszukuje i zwraca następną liczbę pierwszą.źródło
Python 3 - agtoever
Wypróbuj online!
źródło
MATL , sekwencja A000796 autorstwa Luisa Mendo
Oryginalny:
Wypróbuj online!
Pęknięty:
Oryginalny autor podstępnie utworzył tablicę,
[-7:-1]
a następnie wyodrębnił i zanegował pierwszy jej element7
. Następnie użył tego, aby uzyskać zaokrągloną 7-tą cyfrę pi (która jest3
) i przedstawił ją jako pierwszą cyfrę pi. Dodanie|SQ
powoduje, że pierwotna tablica jest dodatnia, sortuje ją i dodaje jeden do wszystkiego. Oznacza to, że po wszystkim zamiast uzyskać indeks7
, otrzymuje indeks-2
po jednej aplikacji,-3
po dwóch aplikacjach i tak dalej. Jest-
to ważne, ponieważ mówiY$
funkcji, aby nie zaokrąglać cyfr.źródło
Forth (gforth) , A000042 , autor: NieDzejkob
Wypróbuj online!
Trywialny 1-bajter po prostu rozszerza literał. Problem polega na tym, że przepełnia 64 bity już od dziewiętnastej cyfry. Łatwym rozwiązaniem jest wielokrotne drukowanie pojedynczej cyfry, prawda? Tak, ale to nie jest takie proste. Chociaż zaznaczenie
1 .
na końcu rzeczywiście wydrukuje dodatkowe wymagane cyfry, zostaną one oddzielone spacjami. To nie zadziała.Now, according to Wikipedia, "
.(
(dot-paren) is an immediate word that parses a parenthesis-delimited string and displays it." Fortunately, that displaying has no other weird characters, so using.(
to print a single 1 should suffice. And it does. No space is needed after the close-paren, so these five characters (there's a space after the open-paren) can be repeated to our hearts' content. To demonstrate, I've included in TIO an example that would have overflowed a 64-bit int several times over. Works like a charm.źródło
Unefunge-98 (PyFunge), sequence A000108, by NieDzejkob
Try it online!
Repeated six times
Two bytes to spare of the nineteen allowed! What appears to be a space there is actually a 0x01 Start Of Header character.
Explanation:
This challenge is all about generating
a(n)
froma(n-1)
and perhapsn
. OEIS provides the explicit formulaa(n) = (2n)!/(n!(n+1)!)
, which is easily enough converted toa(n) = a(n-1) * (4n-6) / n
. Now to implement this in Funge.I must be inserting code between the
1
and the.
. That's half the puzzle done already. All that remains is what code to insert? Funge is notably lacking in stack manipulation tools, so the bottom of the stack is off-limits; I need to track bothn
anda(n)
without growing the stack. And how better to do that than with Funge space?That 0x01 character is my counter
n
. I keepa(n)
on the stack, as it must be on the stack after my bit finishes executing.źródło
Python 3, A008574 by tsh
Try it online!
źródło
V, A000290, by DJMcMayhem
yields the squares from 1.
Try it online!
The base
é*
inserts*
andØ.
counts the number of non-newline characters in the entire buffer. The insertionÄ
duplicates the top line to its own line, on which2é*
inserts**
. Concatenations of the insertions yield successive odd numbers with the largest at the top. The finalØ.
in effect sums the first n odd numbers, hence yielding the n-th square .źródło
ÄÎé*<CR>
AsciiDots, sequence A019523 by Alion
Once!
Twice!
Ten times!
While trying to figure out how the code/language works, I learned that the first two lines of the existing code does all the work of outputting the Fibonacci sequence infinitely. The code terminates when any dot hits the
&
, so I merely needed to add further delay in the remaining lines to allow for the appropriate number of entries to output.After some trial, error, and observation, I discovered that the correct delay interval is 16 time units per number. Fitting enough characters in a single row seemed infeasible, so I would need to put the delay in 2 rows, leaving 10 characters for the actual delay. In order for the pattern to match up with itself, both rows had to have 5 characters, and since the middle three characters in a row can be traversed twice, this gives 16 time units as desired.
The requirement to match this up to the
&
in the eighth column seemed to make this impossible, until I realized that I could start with a newline in the interior of the third row. This makes the penultimate row the right length, and removes the now-redundant end of the third line.źródło
\v
/v>-----)
Brachylog, sequence A114018 by Unrelated String
Original program:
String to insert:
Try it online!
Explanation
Here is first the explanation of the original program (knowing that the sequence used is "least n-digit prime whose digit reversal is also prime")
As you can see, the program is fairly straightforward except for one thing: there is a completely useless
b - behead
predicate call, that removes the first element of the reverse of our number, with which we don't do anything.This is a definite clue as to how we can find the string. The idea is that, since we want to increase the length of the number by 1 digit each time we add the string, we need a string that "evaluates" the length of that number somehow, using that useless
b
.The solution is to use
ẹb
: first,ẹ - elements
will transform the number into a list of digits; then,b - behead
will remove its first element. The trick is thatb
will fail if the list of digits is empty. So everytime we append ab
, we will increase the length of the required number by 1 (because it will fail until the assigned value of?
is high enough to contain sufficiently many digits so that the lastb
is applied on a list of one digit).Re-appyling
ẹ
each time has no effect because it's already a list of digits. We only need it once at the beginning because if we behead a number like9001
instead of the list of its digits, we will get001 = 1
which loses information about the number of digits.źródło
9001b1
issue, it actually just turned out that althoughb
will fail if the list of digits is empty, it won't fail if you never actually have a list, because single-digit numbers behead to 0, including 0 itself.b
is weirdVDM-SL, A000312, by Expired Data
Since VDM-SL's
let
-expressions can re-bind variables which are already bound in an enclosing scope,x**x
can be evaluated arbitrarily deeply nested in scopes in whichx
is one more than in the previous scope, while the originalx
is still less than the cardinality ofm(1)
.źródło
If you insert s somewhere into p, this program must print the second integer from the sequence. If you insert s + s into the same location in p, this program must print the third integer from the sequence.
Note the behavior of the exampleprint(1)
.++
to map overrideHaskell, A083318 by xnor
Try it online!
źródło
show
.Haskell, A000045 (Fibonacci), by Rin's Fourier transform
Try it online!
23 bytes exactly.
This one was fun and a bit tricky. The reversed 0 and 1 threw me off for a little bit before I realized that wasn't an issue. The lack of
$
in the original had me trying sketchy stuff like$...$id
(one byte too long) before it dawned on me that I could just wrap it all in parentheses. All in all, a nice little puzzle.H.PWiz points out that pattern matching could have saved me at least five bytes:
$(\[x,y]->[y,x+y])
. That darn pointfree challenge has me thinking pointfree everywhere.źródło