Khôi phục mã nguồn bị đột biến


27

Trong một tai nạn rất bất thường liên quan đến một mẫu radium nhỏ, một con cá voi bị điện giật và ba con gấu keo, một số mã nguồn của The Management ™ đã bị đột biến. Ít ông chủ của The Management ™ biết, thực ra đó là Cops ©, người chịu trách nhiệm, trong nỗ lực ngăn chặn các kế hoạch "xấu xa" của The Management ™. Vì vậy, Robbers® đã được thuê trong một nỗ lực để lấy lại mã gốc, bởi vì đôi khi ai đó không thích trở nên xấu xa?

lưu ý: Thử thách này được truyền cảm hứng mạnh mẽ bởi Giải mã mã nguồn .

Sự miêu tả

Đây là một thử thách .

  • Các cảnh sát sẽ viết một chương trình (mã bị đột biến) thực hiện Nhiệm vụ số 1 (và cũng viết một chương trình thực hiện Nhiệm vụ số 2, nhưng được giữ bí mật).
  • Những tên cướp sẽ cố gắng đảo ngược "đột biến" và thay đổi mã gốc này thành mã thực hiện Nhiệm vụ # 2.

Trong thử thách này, Nhiệm vụ số 1 sẽ là xuất nsố nguyên tố thứ và Nhiệm vụ số 2 sẽ là xuất nsố Fibonacci thứ (dù sao cũng là điều xấu, theo Cops ©). Chuỗi Fibonacci được định nghĩa là ( n=11; n=21; n=32; ...) và các số nguyên tố được xác định là ( n=12; n=23; n=35; ...).

Mục tiêu của cảnh sát là giảm thiểu sự khác biệt giữa các chương trình hoàn thành Nhiệm vụ số 1 và Nhiệm vụ số 2, đồng thời ngăn chặn bọn cướp tạo lại mã hoàn thành Nhiệm vụ # 2.

Nội quy

Các cảnh sát sẽ viết hai chương trình (một chương trình hoàn thành Nhiệm vụ số 1 và một chương trình hoàn thành Nhiệm vụ số 2) và công khai các thông tin sau:

  • Các chương trình đầu tiên (mà kết quả đầu ra các nthứ số nguyên tố)
  • Các Levenshtein chỉnh sửa khoảng cách giữa các chương trình đầu tiên và chương trình thứ hai
  • Các ngôn ngữ lập trình mà cả hai chương trình được viết bằng (phải là cùng một ngôn ngữ cho cả hai chương trình)

Các hạn chế sau đây áp dụng cho cả hai chương trình:

  • Chúng phải có độ dài 128 ký tự trở xuống.
  • Họ chỉ phải sử dụng ASCII có thể in được (cộng với dòng mới, cũng được cho phép).
  • Họ phải mất ít hơn 10 giây để chạy n=45và họ không bắt buộc phải tạo ra đầu ra chính xác cho bất kỳ n>45.
  • Họ không được sử dụng bất kỳ chức năng băm hoặc mật mã nào.

Quy tắc cướp

Tên cướp sẽ cố gắng thay đổi chương trình của cảnh sát (hoàn thành Nhiệm vụ số 1) thành chương trình hoàn thành Nhiệm vụ số 2 (không nhất thiết là chương trình gốc được viết bởi cảnh sát) trong khoảng cách chỉnh sửa được chỉ định bởi cảnh sát.

Một bản đệ trình đã bị bẻ khóa không thể bị bẻ khóa một lần nữa (chỉ có tên cướp đầu tiên bẻ khóa bài nộp mới được ghi nhận).

Sau khi bẻ khóa một bài nộp, xin vui lòng làm như sau:

  • Đăng câu trả lời cho câu hỏi đi kèm (thử thách) này , cung cấp ngôn ngữ, giải pháp của bạn và liên kết đến câu trả lời ban đầu.
  • Để lại một bình luận với văn bản "Cracked" liên kết đến câu trả lời được đăng của bạn.
  • Chỉnh sửa câu trả lời của cảnh sát nếu bạn có các đặc quyền chỉnh sửa (nếu bạn không, hãy đợi cho đến khi người khác có các đặc quyền bắt buộc làm như vậy cho bạn hoặc đề nghị chỉnh sửa).

Chấm điểm

Nếu chương trình của cảnh sát vẫn không bị theo dõi trong 1 tuần, cảnh sát có thể đăng mã gốc hoàn thành Nhiệm vụ # 2 (trong khoảng cách chỉnh sửa được chỉ định) và việc gửi đi từ đó được coi là "an toàn". Trình an toàn có khoảng cách chỉnh sửa nhỏ nhất sẽ giành chiến thắng. Trong trường hợp hòa, chương trình ngắn nhất (bản gốc hoàn thành Nhiệm vụ số 1) sẽ thắng. Nếu hai bài nộp vẫn bị ràng buộc, bài nào được đăng trước đó sẽ thắng.

Nếu một tên cướp phá vỡ thành công bản đệ trình của cảnh sát, điểm của tên cướp sẽ tăng lên theo khoảng cách chỉnh sửa của bản đệ trình đó. Ví dụ, một tên cướp phá vỡ một bài nộp với khoảng cách chỉnh sửa là 3 và một với khoảng cách 5 kiếm được 8 điểm. Tên cướp có số điểm cao nhất sẽ chiến thắng. Trong trường hợp hòa, tên cướp nào giành được điểm số trước sẽ thắng.

Bảng xếp hạng

  1. Ruby, 6 (lịch sử)

Một công cụ nhỏ để tính khoảng cách Levenshtein


1
Số Fibonacci thứ 1 là gì? 0 hay 1? Hoặc nó không quan trọng
kukac67

@ kukac67 Đó là 1; Tôi đã chỉnh sửa bài viết.
Doorknob

Đầu ra của các chương trình nên là gì, trong trường hợp tràn?
es1024

Nó phải là một chương trình đầy đủ hay nó có thể là một chức năng? Một chức năng ẩn danh thì sao?
Tyilo

2
Cái gì được tính là "hàm băm hoặc mật mã"? Tôi có thể chuyển đổi cơ sở không? Tôi có thể lấy số nguyên tố modulo lớn theo cấp số nhân không?
Martin Ender

Câu trả lời:


6

Python 2, distance = 8 [ bẻ khóa ]

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]

Cuối cùng có cái này dưới giới hạn char. Không nên quá khó, nhưng tôi nghĩ ý tưởng này thật thú vị.


Giải pháp dự định:

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]

Ý tưởng là sử dụng điều đó F(n+2) = 1 + (sum over F(k) from k = 1 to n), và thực tế là các số Fibonacci liên tiếp là số nguyên tố. Các 1đối số giảm được cho là để cung cấp +1.

Có vẻ như frageum đã tìm thấy một đường tấn công khác!




4

Ruby, khoảng cách 6 [an toàn]

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

Đến với các cặp công thức với khoảng cách chỉnh sửa ngắn rất thú vị, nhưng có vẻ như phương pháp này có thể hiệu quả / khó chịu hơn. Bạn có thể hiểu chính xác những gì tôi đã làm, nhưng điều đó không có nghĩa là bạn có thể đảo ngược nó.

Dung dịch:

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

Giải trình:

Mã này tạo ra Tỷ lệ vàng đến 11 vị trí thập phân và sử dụng nó để tính trực tiếp chuỗi Fftimeaci. Nó chỉ đủ chính xác để có được số lượng điều khoản cần thiết đúng. Phần đó hoàn toàn không bị xáo trộn, nếu bạn tình cờ biết công thức. Để làm cho việc vũ trang đảo ngược các đột biến của tôi trở nên khó khăn hơn và phục hồi hằng số, tôi đã sử dụng ký hiệu bát phân (số 0 đứng đầu) và ký hiệu khoa học (4e10). Chia cho 4e10 chứ không phải 1e11 khiến nó trông giống như tôi đang chia cho thứ gì đó .0để buộc phân chia phao, khi thực sự bất cứ điều gì trong ký hiệu khoa học là vì một lý do nào đó luôn là Float trong Ruby, ngay cả khi Bignum dường như có ý nghĩa hơn. Tôi nghĩ rằng tôi đã thông minh với các p=công cụ, nhưng cách tôi viết nó bạn chỉ có thể xóa p. Tôi có thể 'p=giải pháp bằng cách sử dụng p&&thay vì #trên dòng thứ hai, nhưng tôi không nghĩ về nó.


Không nghĩ đến việc cố gắng chèn một cái exuống đó khi làm vũ phu. Giải pháp thực sự lén lút. :)
Vectorized

3

Python 2 - LD = 13 Đã bẻ khóa

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

Một thứ tốt đẹp, dễ dàng (hy vọng không quá dễ dàng) để bắt đầu mọi thứ :)

Có vẻ như nó quá dễ dàng;) Tôi cảm thấy khá ngớ ngẩn khi tôi quên bạn có thể sử dụng nhận xét: /



3

Haskell, khoảng cách = 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

Điều này có thể dễ đọc hơn, nhưng importđã ăn quá nhiều byte, vì vậy tôi phải đánh gôn một chút.


2

Ruby, khoảng cách 14 ( Cracked )

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]


Hừm, chuỗi Fftimeaci của bạn bắt đầu bằng 0, trong đó các quy tắc nói bắt đầu bằng 1. Nếu không thì hãy kiểm tra (mặc dù rất khác với giải pháp dự định của tôi).
lịch sử

Ok, đã sửa. Sử dụng tốt của btw Fermat.
Vectorized


2

J, khoảng cách = 4 [an toàn]

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

Dung dịch:

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

Phương pháp:

Mẫu số {. 2(x:)của phân số tiếp tục (+%)1 + 1 / (... (1 + 1 / (1 + 1 / (1 + 1 / (1))))).


1

Python 3, khoảng cách = 14 [ bẻ khóa ]

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)

Tôi đã có một số ký tự dự phòng vì vậy tôi đặt một số khoảng trắng cho rõ ràng :)




1

TI-BASIC , khoảng cách 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

>đại diện cho STO→chìa khóa và $đại diện cho biểu tượng căn bậc hai.


4
Một số trong những ký tự này dường như không thể in được ASCII.
frageum

@feersum Cảm ơn, đã sửa. Khoảng cách vẫn là 38.
Timtech

1

Python 2 - khoảng cách = 12 [ bẻ khóa ]

Tôi rất vui với cách này.

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

Chúng ta hãy xem nó mất bao lâu ... Tôi cho rằng nó sẽ vẫn bị bẻ khóa.

Chỉnh sửa: rút ngắn mã một chút, không ảnh hưởng đến hoạt động / khoảng cách.

Giải pháp dự định

Tôi đã cố gắng để không có ý kiến ​​hoặc thay đổi dòng mới.

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 - Khoảng cách = 14 [Đã bẻ khóa ]


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)

Chúng ta sẽ thấy điều này kéo dài bao lâu ...


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.