Восстановить измененный исходный код


27

В очень необычной аварии с участием небольшого образца радия, кита на электрическом стуле и трех липких медведей часть исходного кода The Management ™ была видоизменена. Босс The Management ™ мало что знает, на самом деле ответственность за это взяли на себя полицейские, пытаясь помешать «злым» планам Management ™. Таким образом, Robbers® были наняты в попытке восстановить оригинальный код, потому что кому иногда не нравится быть злым?

примечание: эта проблема была в значительной степени вдохновлена Unscramble Исходный код .

Описание

Это задача .

  • В полицейских будет написать программу (мутантный код) , который выполняет задачи # 1 (а также написать программу , которая выполняет задачу # 2, но держится в секрете).
  • В разбойниках будут пытаться переломить «мутацию» и изменить исходный код в код , который выполняет задачу # 2.

В этом вызове Задача № 1 будет выводить nпростое число th , а Задача № 2 будет выводить число nФибоначчи th (что в любом случае, по мнению Копов, является каким-то злым). Последовательность Фибоначчи определяется как ( n=11; n=21; n=32; ...), а простые числа определяются как ( n=12; n=23; n=35; ...).

Цель полицейских состоит в том, чтобы минимизировать разницу между программами, которые выполняют Задачу № 1 и Задачу № 2, не позволяя грабителям воссоздать код, который завершает Задачу № 2.

Полицейские правила

Полицейские напишут две программы (одну, которая завершает задачу № 1, и другую, которая завершает задачу № 2), и сделают следующую информацию общедоступной:

  • Первая программа (который выводит nе простое число)
  • Редактировать расстояние Левенштейна между первой программой и второй программы
  • Языка программирования , что обе программы написаны (должен быть тот же язык для обеих программ)

Следующие ограничения применяются к обеим программам:

  • Они должны быть длиной не более 128 символов.
  • Они должны использовать только печатный ASCII (плюс переводы строки, что также разрешено).
  • Они должны занять менее 10 секунд n=45, и они не обязаны производить правильный вывод для любого n>45.
  • Они не должны использовать какие-либо хеширующие или криптографические функции.

Правила Грабителя

Грабитель попытается изменить программу полицейского (которая выполняет задачу № 1) на программу, которая выполняет задачу № 2 (не обязательно оригинальную программу, написанную полицейским) на расстоянии редактирования, указанном полицейским.

Уже взломанное представление не может быть взломано снова (только первый грабитель, взломавший представление, получает кредит).

После взлома, пожалуйста, сделайте следующее:

  • Опубликуйте ответ на сопутствующий вопрос (ссылку) , указав язык, свое решение и ссылку на оригинальный ответ.
  • Оставьте комментарий с текстом «Cracked», который ссылается на ваш опубликованный ответ.
  • Отредактируйте ответ полицейского, если у вас есть права на редактирование (если у вас его нет, либо подождите, пока кто-то другой с необходимыми привилегиями сделает это за вас, либо предложите изменить).

счет

Если программа полицейского остается без изменений в течение 1 недели, полицейский может опубликовать исходный код, который выполняет задание № 2 (на указанном расстоянии редактирования), и с этого момента отправка считается "безопасной". Безопасная отправка, которая имеет наименьшее расстояние редактирования, победит. В случае ничьей побеждает самая короткая программа (оригинал, завершающий задание № 1). Если два представления все еще связаны, побеждает тот, который был опубликован ранее.

Если грабитель успешно взламывает представление полицейского, оценка грабителя увеличивается на расстояние редактирования этого представления. Например, грабитель, взломавший представление с расстоянием редактирования 3 и один с расстоянием 5, зарабатывает 8 очков. Грабитель с наибольшим количеством очков побеждает. В случае ничьей сначала выигрывает грабитель, набравший очки.

Leaderboard

  1. Руби, 6 (гистократ)

Небольшой инструмент для вычисления расстояния Левенштейна


1
Что такое 1-е число Фибоначчи? 0 или 1? Или это не имеет значения
kukac67

@ kukac67 Это 1; Я редактировал пост.
Дверная ручка

Каким должен быть вывод программ в случае переполнения?
es1024 29.12.14

Должна ли это быть полная программа или функция? А как насчет анонимной функции?
Tyilo

2
Что считается «хеширующей или криптографической функцией»? Могу ли я конвертировать вещи? Могу ли я взять большие экспоненты по модулю больших простых чисел?
Мартин Эндер

Ответы:


6

Python 2, расстояние = 8 [ взломано ]

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]

Наконец получил этот под пределом char. Не должно быть слишком сложно, но я думал, что идея была интересной.


Предполагаемое решение:

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]

Идея состояла в том F(n+2) = 1 + (sum over F(k) from k = 1 to n), чтобы использовать это и тот факт, что последовательные числа Фибоначчи взаимно просты. 1В аргументе сокращения должен был обеспечить +1.

Похоже, feersum обнаружил другую линию атаки!




4

Рубин, расстояние 6 [безопасно]

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

Придумывать пары формул с небольшими расстояниями редактирования - это весело, но кажется, что этот подход может быть более эффективным / раздражающим. Вы можете точно понять, что я сделал, но это не значит, что вы можете изменить это.

Решение:

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

Объяснение:

Код генерирует Золотое сечение с 11 десятичными разрядами и использует его для непосредственного вычисления последовательности Фиббоначи. Достаточно точно, чтобы правильно определить необходимое количество терминов. Эта часть не была полностью запутана, если вы знаете формулу. Чтобы затруднить грубую силу, обращающую вспять мои мутации и восстановившую константу, я использовал восьмеричную нотацию (начальный 0) и научную нотацию (4e10). Деление на 4e10, а не 1e11 делает это более похожим на то, что я делю на что-то, .0чтобы форсировать деление поплавка, когда на самом деле что-либо в научной нотации по какой-то причине всегда является Float в Ruby, даже если Bignum может показаться более логичным. Я думал, что со всем p=разбираюсь, но то, как я это написал, вы можете просто удалить p. Я мог бы'p=решение, используя p&&вместо #второй строки, но я не думал об этом.


Не думал пытаться вставить туда eвниз, когда делал грубую силу. Действительно подлый раствор. :)
Векторизация

3

Python 2 - LD = 13 трещины

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

Хороший, легкий (надеюсь, не слишком легкий), чтобы начать все с :)

Похоже, это было слишком просто;) Я чувствую себя довольно глупо, потому что я забыл, что вы можете использовать комментарии: /



3

Haskell, расстояние = 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

Это может быть более читабельным, но importслишком много байтов, поэтому мне пришлось немного поиграть в гольф.


2

Рубин, расстояние 14 ( треснувший )

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]


Хм, ваша последовательность Фиббоначи начинается с 0, где правила говорят, чтобы начинаться с 1. В противном случае проверяется (хотя и сильно отличается от моего предполагаемого решения).
гистократ

Хорошо, исправлено. Хорошее использование Ферма, кстати.
векторизовано


2

J, расстояние = 4 [безопасно]

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

Решение:

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

Метод:

Знаменатель {. 2(x:)непрерывной дроби (+%)1 + 1 / (... (1 + 1 / (1 + 1 / (1 + 1 / (1)))))).


1

Python 3, расстояние = 14 [ взломано ]

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)

У меня было несколько запасных символов, поэтому я добавил немного пробела для ясности :)




1

TI-BASIC , расстояние 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

>представляет STO→ключ и $представляет квадратный корневой символ.


4
Некоторые из этих символов, кажется, не для печати ASCII.
feersum

@feersum Спасибо, исправлено. Расстояние все еще 38.
Timtech

1

Python 2 - расстояние = 12 [ треснувший ]

Я вроде доволен тем, как это получилось.

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()]

Давайте посмотрим, сколько времени это займет ... Я предполагаю, что он все еще будет взломан.

Изменить: укороченный код чуть-чуть, не влияет на работу / расстояние.

Предполагаемое решение

Я пытался идти без комментариев или изменений новой строки.

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

Питон 3 - Расстояние = 14 [ Трещины ]


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)

Посмотрим, как долго это длится ...


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.