Odzyskaj zmutowany kod źródłowy


27

W bardzo nietypowym wypadku z udziałem małej próbki radu, porażonego prądem wieloryba i trzech gumowatych niedźwiedzi, część kodu źródłowego The Management ™ została zmutowana. Mało kto wie, że zarząd Management ™ wiedział, że to właściwie policjanci © byli odpowiedzialni za próbę udaremnienia „złych” planów zarządzania ™. Więc Robbers® został zatrudniony w celu odzyskania oryginalnego kodu, bo kto czasami nie lubi być zły?

Uwaga: To wyzwanie było w dużej mierze zainspirowane przez Rozszyfrowanie kodu źródłowego .

Opis

To wyzwanie dla .

  • Do policjantów będzie napisanie programu (zmutowana kod), który wykonuje zadania nr 1 (a także napisać program, który wykonuje zadania nr 2, ale jest trzymana w tajemnicy).
  • W rabusie będą próbować odwrócić „mutacja” i zmienić ten oryginalny kod do kodu, który wykonuje zadania # 2.

W tym wyzwaniem, Zadanie nr 1 będzie wysyłać nth liczba pierwsza i Zadanie nr 2 będzie wyjście z nth liczby Fibonacciego (który jest w jakiś sposób zło, zgodnie z Cops © każdym razie). Sekwencja Fibonacciego zdefiniowany jako ( n=11; n=21; n=32, ...), i z liczb pierwszych jest zdefiniowany jako ( n=12; n=23; n=35, ...).

Celem gliniarzy jest zminimalizowanie różnicy między programami, które wykonują Zadanie nr 1 i Zadanie nr 2, jednocześnie uniemożliwiając złodziejom odtworzenie kodu wykonującego Zadanie nr 2.

Zasady gliny

Policjanci napiszą dwa programy (jeden, który wykonuje Zadanie nr 1 i drugi, który wykonuje Zadanie nr 2) i podają do wiadomości publicznej następujące informacje:

  • Pierwszy program (czyli wyjść z nth liczba pierwsza)
  • Edit odległość Levenshteina pomiędzy pierwszym i drugim programie programu
  • Język programowania, w którym napisane są oba programy (musi być ten sam język dla obu programów)

Oba programy dotyczą następujących ograniczeń:

  • Muszą mieć maksymalnie 128 znaków.
  • Muszą używać tylko ASCII do wydruku (oraz nowych linii, które są również dozwolone).
  • Uruchomienie musi zająć mniej niż 10 sekund n=45i nie jest wymagane, aby wygenerować poprawny wynik dla żadnego z nich n>45.
  • Nie mogą używać żadnych funkcji mieszających ani kryptograficznych.

Zasady rabusiów

Rabuś spróbuje zmienić program gliniarza (który wykonuje Zadanie 1) w program, który wykonuje Zadanie 2 (niekoniecznie oryginalny program napisany przez gliniarza) w odległości edycji określonej przez gliniarza.

Już złamane zgłoszenie nie może zostać ponownie złamane (tylko pierwszy złodziej, który złamie zgłoszenie, otrzymuje kredyt).

Po złamaniu zgłoszenia wykonaj następujące czynności:

  • Opublikuj odpowiedź na pytanie towarzyszące temu wyzwaniu (link) , podając język, swoje rozwiązanie i link do oryginalnej odpowiedzi.
  • Pozostaw komentarz z tekstem „Pęknięty”, który prowadzi do opublikowanej odpowiedzi.
  • Edytuj odpowiedź policjanta, jeśli masz uprawnienia do edycji (jeśli nie, zaczekaj, aż zrobi to za ciebie ktoś inny z wymaganymi uprawnieniami lub zasugeruj edycję).

Punktacja

Jeśli program gliniarza pozostanie bez krakowania przez 1 tydzień, policjant może opublikować oryginalny kod, który wykonuje Zadanie nr 2 (w określonej odległości edycji), a przesyłanie jest odtąd uważane za „bezpieczne”. Zwycięskie zostanie bezpieczne zgłoszenie o najmniejszej odległości do edycji. W przypadku remisu wygrywa najkrótszy program (oryginał, który wykonuje Zadanie nr 1). Jeśli dwa zgłoszenia są nadal powiązane, to jedno opublikowane wcześniej wygrywa.

Jeśli złodziej z powodzeniem złamie ułożenie gliny, jego ocena wzrośnie o odległość edycji tego ułożenia. Na przykład bandyta, który złamie przesłanie przy odległości edycji 3 i jeden przy odległości 5, otrzymuje 8 punktów. Złodziej z najwyższym wynikiem wygrywa. W przypadku remisu złodziej, który zdobył wynik jako pierwszy, wygrywa.

Tabela liderów

  1. Ruby, 6 (histocrat)

Małe narzędzie do obliczania odległości Levenshteina


1
Co to jest 1. liczba Fibonacciego? 0 czy 1? Czy to nie ma znaczenia
kukac67,

@ kukac67 It's 1; Zredagowałem post.
Klamka

Jaka powinna być wydajność programów w przypadku przepełnienia?
es1024

Czy musi to być pełny program, czy może funkcja? Co z funkcją anonimową?
Tyilo

2
Co liczy się jako „funkcja mieszająca lub kryptograficzna”? Czy mogę konwertować pliki bazowe? Czy mogę przyjmować duże wykładnicze modulo duże liczby pierwsze?
Martin Ender

Odpowiedzi:


6

Python 2, distance = 8 [ cracked ]

from fractions import*
n=input()
k,=P=[2]
while n>len(P):k+=1;z=reduce(lambda x,y:x*y,P,1);P+=[k]*(gcd(z,k)<2)
print P[-1]

Nareszcie dostałem ten poniżej limitu char. Nie powinno to być zbyt trudne, ale pomyślałem, że pomysł był interesujący.


Zamierzone rozwiązanie:

from fractions import* n=input() k,=P=[1] while n>len(P):k+=1;z=reduce(lambda x,y:x+y,P[:-1],1);P+=[z]*(gcd(z,k)<2) print P[-1]

Chodziło o to, aby to wykorzystać F(n+2) = 1 + (sum over F(k) from k = 1 to n), a fakt, że kolejne liczby Fibonacciego są chronione prawem autorskim. Argument 1w redukowaniu miał dostarczyć +1.

Wygląda na to, że feersum znalazło inną linię ataku!




4

Rubin, dystans 6 [bezpieczny]

require'prime';p Prime.take(n=gets.to_i)[-1]
#p (((807462154311276410)**n/(5**0.5)).round)

Wymyślanie par formuł z krótkimi odległościami edycji jest fajne, ale wydaje się, że takie podejście może być bardziej skuteczne / denerwujące. Możesz dokładnie zrozumieć, co zrobiłem, ale to nie znaczy, że możesz to odwrócić.

Rozwiązanie:

require'prime';p=Prime.take(n=gets.to_i)[-1] p (((0742154311276/4e10)**n/(5**0.5)).round)

Wyjaśnienie:

Kod generuje złoty współczynnik do 11 miejsc po przecinku i wykorzystuje go do bezpośredniego obliczenia sekwencji Fibbonaci. To wystarczająca precyzja, aby uzyskać odpowiednią liczbę terminów. Ta część wcale nie była zaciemniona, jeśli znasz formułę. Aby utrudnić odwrócenie mutacji przez brutalną siłę i odzyskanie stałej, zastosowałem notację ósemkową (wiodące 0) i notację naukową (4e10). Dzielenie przez 4e10 zamiast 1e11 sprawia, że ​​wygląda to bardziej jak dzielenie przez coś, .0aby wymusić podział zmiennoprzecinkowy, gdy w rzeczywistości cokolwiek w notacji naukowej jest z jakiegoś powodu zawsze zmiennoprzecinkowe w Rubim, nawet jeśli Bignum wydaje się mieć sens. Myślałem, że jestem sprytny z tym p=materiałem, ale sposób, w jaki to napisałem, możesz po prostu usunąć p. Mógłbym'p=rozwiązanie za pomocą p&&zamiast #w drugiej linii, ale nie pomyślałem o tym.


Nie myślałem o próbie wstawienia etam w dół, gdy robię brutalną siłę. Naprawdę podstępne rozwiązanie. :)
Vectorized

3

Python 2 - LD = 13 Cracked

n=1;j=input();
while j>0:
    n+=1;j-=1;
    while~-all(n%i for i in range(2,n)):n+=1;
print n

Miło, łatwo (mam nadzieję, że nie za łatwo) na początek :)

Wygląda na to, że było to zbyt łatwe;) Czuję się raczej głupio, że zapomniałem, że możesz użyć komentarzy: /



3

Haskell, odległość = 13

import Data.List
x=id=<<snd(mapAccumL(\m n->(,)=<<(++m)$[n|and[n`mod`m1/=0|m1<-m]])[1+1][3..])
main=print.(!!)(0:2:x)=<<readLn

Może to być bardziej czytelne, ale importzjadło zbyt wiele bajtów, więc musiałem trochę zagrać w golfa.


2

Rubinowy, dystans 14 ( Pęknięty )

p [x=2,y=1,*(1..200).map{|i|y==(y*x**(i-1)+x%2).divmod(i)[x-1]?i:1}].-([x-1])[gets.to_i-1]


Hm, twoja sekwencja Fibbonaci zaczyna się od 0, gdzie reguły mówią, że zaczynaj od 1. W przeciwnym razie sprawdza się (choć bardzo różni się od mojego zamierzonego rozwiązania).
histocrat

Ok, naprawione. Dobre wykorzystanie Bermata Fermata.
Vectorized


2

J, odległość = 4 [bezpieczny]

f =: 3 :  '{. (p:) (+) / 0 , y - 1x'

Rozwiązanie:

f =: 3: „{. 2 (x :) (+%) / 0, y $ 1x '

Metoda:

Mianownik {. 2(x:)ciągłej frakcji (+%)1 + 1 / (... (1 + 1 / (1 + 1 / (1 + 1 / (1))))).


1

Python 3, distance = 14 [ cracked ]

n = int(input())
P = [2]
k = 2
while n > len(P):
 k += 1
 for x in P:
  if k%x == 0: break
 else: P += [k]
print(k)

Miałem trochę wolnych znaków, więc wstawiłem trochę spacji dla jasności :)




1

TI-BASIC , odległość 38

Input N:{2>L1:For(A,3,E99:If min(1=gcd(A,seq(A,A,2,$(A:A>L1(1+dim(L1:End:L1(N

>reprezentuje STO→klucz i $symbol pierwiastka kwadratowego.


4
Niektóre z tych znaków nie wydają się być drukowalnymi ASCII.
feersum

@feersum Dzięki, poprawione. Odległość wciąż wynosi 38.
Timtech,

1

Python 2 - distance = 12 [ Cracked ]

Jestem trochę zadowolony z tego, jak to się potoczyło.

f=lambda p,i:p if p[45:]else f(p+[i]if all(i%q for q in p[1:])else p,-~i)
print f([1,2,3],2)[input()]

Zobaczmy, ile to zajmie ... Zakładam, że nadal będzie pęknięty.

Edycja: nieco skrócony kod, bez wpływu na działanie / odległość.

Zamierzone rozwiązanie

Starałem się nie dodawać komentarzy ani zmian w nowej linii.

f=lambda p,i:p if p[45:]else f(p+[p[i]+p[-2]]if all(i|q for q in p[1:])else p,-~i) print f([1,1,1],2)[input()]



0

Python 3 - Distance = 14 [ Cracked ]


a,c,n=1,2,int(input())
while n-1:
 c+=1
 while 1!=list(map(c.__mod__,range(2,46))).count(0):
  c,a=a+c,a
 n-=1
print(c)

Zobaczymy, jak długo to potrwa ...


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.