Mã hóa cảnh sát và cướp (Cops)


28

Đây là một thử thách . Chủ đề của bọn cướp ở đây .

Một câu hỏi thú vị để suy nghĩ là:

Nếu tôi có một dãy số thì tôi phải cung cấp bao nhiêu trong số chúng trước khi rõ ràng tôi đang nói về dãy số nào?

Ví dụ: nếu tôi muốn nói về các số nguyên dương theo thứ tự bắt đầu từ , tôi có thể nói , nhưng điều đó có thực sự đủ không?11,2,3,

Tôi có một cách để trả lời câu hỏi này, và là một người chơi gôn, nó liên quan đến môn đánh gôn. Bạn đã cung cấp đủ các điều khoản của một chuỗi nếu mã ngắn nhất tạo ra các thuật ngữ đó tạo ra tất cả các điều khoản của chuỗi. Nếu chúng tôi nghĩ về điều này về mặt golf-mã, điều này có nghĩa là bạn đã cung cấp đủ các trường hợp thử nghiệm sao cho mã ngắn nhất vượt qua các trường hợp thử nghiệm thực hiện nhiệm vụ mong muốn.

Thử thách

Thử thách này là một thử thách . Trong đó cảnh sát sẽ trình bày các trường hợp thử nghiệm và những tên cướp sẽ phải tìm một cách ngắn hơn để giả mạo các trường hợp thử nghiệm khác với chuỗi dự định. Cảnh sát sẽ trình bày những điều sau đây:

  • Một đoạn mã lấy số nguyên không âm làm đầu vào và tạo ra một số nguyên làm đầu ra. Mã này sẽ xác định trình tự của bạn. Mã của bạn không cần hỗ trợ 0 làm đầu vào, thay vào đó chọn lấy 1 làm đầu vào nhỏ nhất. Cần phải rõ ràng nếu đây là trường hợp trong câu trả lời của bạn.

  • Bất kỳ nền tảng hoặc yêu cầu ngôn ngữ có liên quan có thể ảnh hưởng đến đầu ra, ví dụ như kích thước của longint.

  • Một số , cùng với sự đầu tiên về trình tự theo tính toán của các mã. Chúng sẽ hoạt động như "trường hợp thử nghiệm".nnn

Bạn được khuyến khích giải thích chuỗi của bạn làm gì và liên kết OEIS nếu nó tồn tại, tuy nhiên đó là mã của bạn xác định chuỗi không phải là mô tả.

Những tên cướp sẽ tìm thấy một chương trình có cùng ngôn ngữ ngắn hơn chương trình được trình bày và vượt qua tất cả các trường hợp thử nghiệm (tạo ra cùng một đầu ra cho đầu vào đầu tiên dưới dạng mã của cảnh sát). Mã của tên cướp cũng phải khác về đầu ra so với chương trình của cảnh sát đối với một số lượng lớn hơn .nnn

Cảnh sát phải có khả năng bẻ khóa câu trả lời của chính họ trước khi gửi chúng.

Sau một tuần, một cảnh sát có thể tiết lộ vết nứt của họ và đánh dấu câu trả lời của họ là An toàn. Câu trả lời được đánh dấu như vậy không còn có thể bị bẻ khóa.

Chấm điểm

Các câu trả lời của cảnh sát sẽ được tính bằng số byte với ít byte hơn. Cracked câu trả lời một số điểm vô hạn.


Rõ ràng có nhiều cách để giải quyết vấn đề một cách toán học, như chỉ in tất cả các trường hợp thử nghiệm, nhưng vấn đề đó là có điều kiện đối với các trường hợp do cảnh sát cung cấp. Có nên có một quy tắc về điều đó? Có hạn chế nào đối với khả năng tính toán của các trình tự hoặc bất cứ điều gì từ Lý thuyết Ramsey không? (tức là bạn có cần phải có khả năng bẻ khóa trên máy của mình không?)
theREALyumdub

2
@theReallyumdub câu hỏi quy định bạn phải có khả năng bẻ khóa trình của chính bạn.
Phù thủy lúa mì

@CatWizard Cảm ơn, tôi đã tiếp tục và đó là một bài đăng meta rõ ràng, nó rõ ràng cản trở một số kẻ này. Vì vậy, nó không phải là tinh thần của thẻ để tạo ra một vết nứt mất hơn một giờ để tính toán hoặc một cái gì đó
theREALyumdub


Có một "mặc dù về mặt lý thuyết, giải pháp của bạn phải hoạt động cho tất cả các số trong thực tế, nó chỉ cần hoạt động cho ..."?
dùng202729

Câu trả lời:


6

cQuents , 4 byte ( Cracked )

"::$

Hãy thử trực tuyến!

Dưới đây là tám ( n=8) trường hợp:

1 1
2 12
3 123
4 1234
5 12345
6 123456
7 1234567
8 12345678

Mã giải thích:

"      Stringify sequence (join on "", remove it and see what happens)
 ::    Given input n, output all items in the sequence up to and including n
   $   Each item in the sequence equals the index

Vì vậy, chuỗi là 1,2,3,4,5 ..., nó được nối vào ""để nó trở thành 12345 ..., và ::có nghĩa là nó in lên đến đầu vào.



5

Python 3 , 66 57 byte (Đã bẻ khóa )

bẻ khóa bởi xnor
cũng bị bẻ khóa bởi Cat Wizard trước khi chỉnh sửa

def f(n):x=n/10-2;return int(x*60-x**3*10+x**5/2-x**7/84)

Hãy thử trực tuyến!

Xin chào! Đây là một chuỗi để crack cho . Nó cung cấp cho 40 phần tử đầu tiên này với chỉ mục 0, đây không phải là một chuỗi OEISn=40

[-54, -56, -58, -59, -59, -59, -59, -57, -55, -53, -50, -46, -43, -38, -33, -28, -23, -17, -11, -5, 0, 5, 11, 17, 23, 28, 33, 38, 43, 46, 50, 53, 55, 57, 59, 59, 59, 59, 58, 56]

Tôi đã quên xóa khoảng trắng, tôi chưa phải là chuyên gia chơi gôn: p Bạn có phiền nếu tôi chỉnh sửa để sửa lỗi đó không?
crashoz

Chắc chắn đi trước. Tôi sẽ xóa vết nứt của tôi.
Thuật sĩ lúa mì


5

Python 2 , 44 byte ( đã bẻ khóa )

f=lambda n,i=1,p=1:n and-~f(n-p%i,i+1,p*i*i)

Hãy thử trực tuyến!

Các số nguyên tố. Trình tự nào có thể tinh khiết hơn? Hay quá liều ? Mục tiêu của bạn là để tạo ra 50 số nguyên tố đầu tiên cho n=1đến n=50.

Mã này là một trình tạo Định lý Wilson được sao chép chính xác từ mẹo này .

Các giá trị khác nhau cho chuỗi thay thế không phải do giới hạn của máy như tràn và độ chính xác. Không có thư viện bên thứ 3.


Nứt bởi Arnauld, @PoonLevi, và ông Xcoder.


Khá chắc chắn rằng bạn không có ý bị bẻ khóa bởi điều này ; có thể chỉ định "Python (không có thư viện bên thứ 3)" hoặc "Python (không nhập)" hoặc một cái gì đó?
Jonathan Allan

@Jonathan ALLan Cảm ơn, tôi đã chỉnh sửa rằng không có thư viện của bên thứ 3.
xnor

Tôi chưa thể bẻ khóa được điều này (nỗ lực tốt nhất của tôi tại thời điểm này là 47 byte hoặc hơn), nhưng tôi nghĩ có một điều thú vị cần lưu ý về các số nguyên tố cụ thể đó. Đối với mỗi , với , giá trị này giữ: . Đồng thời, điều này không đúng với bất kỳ số nào không phải là số nguyên tố (trong phạm vi được ghi chú ở trên), nhưng nó làm như vậy đối với các giá trị cao hơn. Tôi sẽ để ý tưởng này ở đây để những người khác có thể thử sức mình bằng cách sử dụng kỹ thuật được đề cập và có thể đạt được điểm cao hơn :) i [ 1 , 50 ] N 2 p i2 ( mod  p i )pii[1,50]N2pi2(mod pi)
Ông Xcoder

@ Mr.Xcoder Đây là nỗ lực tốt nhất của tôi dựa trên phương pháp được đề xuất của bạn. Nó phân kỳ thành công ở mức N = 69, trả về 341 (giả ngẫu nhiên Fermat đầu tiên cho cơ sở 2 hoặc số Poulet đầu tiên) nhưng nó cũng thất bại với N = 1. Tôi nghi ngờ tôi có thể tự sửa nó, vì vậy tôi nghĩ tôi nên chia sẻ những gì tôi có. (Cách khắc phục tốt nhất của tôi là 46 byte ...)
Arnauld

1
@Arnauld Tôi tìm thấy giải pháp 44 byte bằng phương pháp này. Tôi dường như không thể đi xa hơn. Có lẽ người khác sẽ có thể tìm ra điều này.
Poon Levi

4

Ngôn ngữ Wolfram (Mathicala) , 39 34 byte (An toàn)

Check[{1,9,7}[[#]],18+Boole[#>9]]&

Hãy thử trực tuyến!

Trông đơn giản, giải pháp nên khó.

1 chỉ số và . Trình tự này không có sẵn trên OEIS.n=99

{1, 9, 7, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}

Danh sách trên bằng với:

Join[{1, 9, 7}, Table[18, 6], Table[19, 90]]

Đây là một mẫu để kiểm tra giải pháp của bạn: Hãy thử trực tuyến!

Dự định Crack

Điều hấp dẫn ở đây là đầu ra tăng 1 khi số chữ số tăng 1, ngoại trừ ba thuật ngữ đầu tiên; giải pháp dự định có liên quan đến chuyển đổi chuỗi.

Do đó, đọc tài liệu về Chuyển đổi giữa Biểu thức & Chuỗi , người ta có thể tìm thấy hàm SpokenString.

Giải pháp đơn giản là độ dài của phiên bản chuỗi nói của biểu thức x^ncho các đầu vào khác nhau:StringLength@SpokenString[x^#]&


3

Haskell , 29 byte (Cracked: 1 , 2 )

a n=n*ceiling(realToFrac n/2)

Hãy thử trực tuyến!

Đây là A093005 : .a(n)=nn2

Các trường hợp thử nghiệm cho , nghĩa là :0n20map a [0..20]

[0,1,2,6,8,15,18,28,32,45,50,66,72,91,98,120,128,153,162,190,200]

Giải pháp dự định (20 byte)

b n=sum$n<$show(3^n)

Hãy thử trực tuyến! Khác nhau ở , với và .n=23a(23)=276b(23)=253

Hàm này tương đương với . Nhờ trần, cả hai hàm chồng lấp cho các đối số nguyên trong phạm vi từ đến :b(n)=n len(3n)=nlog10(1+3n)022

nguồn



@Laikoni, nếu vết nứt dự định ngắn hơn, thì người khác có khả năng có thể yêu cầu kẻ cướp từ BMO.
fnɛtɪk

@ fəˈnɛtɪk Cảm ơn, tôi không biết quy tắc này.
Laikoni

@BMO đã bẻ khóa lại
rjan Johansen

2
@BMO Có bạn đi :)
Laikoni

2

JavaScript (ES6), 12 byte ( Cracked )

Điều này là khá dễ dàng.

n=>n*(8*n+1)

Hãy thử trực tuyến!

Đây là A139275 :

a(n)=n(8n+1)

Mã của bạn phải hỗ trợ :0n<9

0,9,34,75,132,205,294,399,520

Và theo các quy tắc thách thức, nó phải phân kỳ vượt ra ngoài.


n=>8*n*n+nkhác nhau cho n=94906273, đây có phải là một vết nứt hợp lệ?
ngn

@ngn Có vẻ hợp lệ với tôi theo các quy tắc thách thức, nhưng có lẽ bạn nên hỏi OP rằng việc mất độ chính xác có được tính là phân kỳ hợp lệ không? Các vết nứt dự định khác nhau n=9, mặc dù.
Arnauld

@CatWizard ^
ngn

Tôi muốn nói đó là một vết nứt hợp lệ.
Thuật sĩ lúa mì

2
bị nứt ( |thay vì +)
ngn


2

> <> , 276 byte (Đã bẻ khóa )

1$1-:?!v$:      1[0$          >:?!va2[$:{:@%:{$-{,]v
       >$n; v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Hãy thử trực tuyến! Gọi cái này với -v nđể lấy phần tử thứ n (1-index)

1$1-:?!;$::n84*o1[0$          >:?!va2[$:{:@%:{$-{,]v
            v              <  ^   >~{]02.1+1+ffr+1r<
 :}[r]{  [01>:{*@@+$a*l2=?!^~]+ff+9+1g"3"=?v"3"ff+9+1pf0.
 :}[l01-$>    $:0(?v$@$:@@:@)?v@@1-$}v     >"2"ff+9+1p00.
>.       ^-1l v!?} <  .4a}$@@$<   .4a<
^26{]r0[}:{]~{<

Hãy thử trực tuyến! Gọi với -v nđể nhận danh sách các phần tử n-1 bắt đầu từ 1

Phiên dịch cá trực tuyến

Một cái dài và phức tạp, đây là OEIS A004000 .

Đặt a (n) = k, tạo thành m bằng cách đảo ngược các chữ số của k, Thêm m vào k Sau đó Sắp xếp các chữ số của tổng thành thứ tự tăng dần để có a (n + 1).

Ví dụ: 668 -> 668 + 866 = 1534 -> 1345.

Vì mã trong> <> khá dài, nên thách thức là bẻ khóa nó với . 34 phần tử này tạo ra tổng cộng 290 byte, chỉ hơi quá nhiều để mã hóa kết quả;) Dưới đây là 34 phần tử đầu tiên được lập chỉ mục 1n=34

1 2 4 8 16 77 145 668 1345 6677 13444 55778 133345 666677 1333444 5567777 12333445 66666677 133333444 556667777 1233334444 5566667777 12333334444 55666667777 123333334444 556666667777 1233333334444 5566666667777 12333333334444 55666666667777 123333333334444 556666666667777 1233333333334444 5566666666667777

Làm thế nào để một người chạy chương trình để mang lại một đầu ra cho một đầu ra nhất định n(theo yêu cầu của câu hỏi)?
Jonathan Allan

Vì không thực sự có "chức năng" trong cá, tôi đã thêm một phiên bản mà bạn có thể gọi để lấy thứ n (về cơ bản là giống nhau, vì nó phải tính các phần tử trước đó của n-1)
crashoz

Quan trọng hơn, bạn có một vết nứt phù hợp với cùng một chỉ mục đầu vào mang lại đầu ra duy nhất không?
Jonathan Allan

1
Tôi nghĩ vậy, tôi có thể thực hiện một chức năng thực hiện cùng một chuỗi cho nhưng khác với trong khi ngắn hơn ~ 30 byte1<=n<=34n>34
crashoz


2

Thạch , 6 byte , An toàn!

<4+ạ2ȯ

Điều này xác định một chuỗi không có chỉ mục trong đó:

a(n)={1n<32n=3n2n>3

Như vậy mười sáu giá trị đầu tiên làa(0)a(15)1,1,1,2,2,3,4,5,6,7,8,9,10,11,12,13

Hãy thử trực tuyến! ( đây là một phiên bản giá trị duy nhất)

Điều này hiện không có trong OEIS (mặc dù A34138 sẽ hoạt động như một vết nứt nếu đủ ngắn)

Dự định Crack

Trình tự trên đồng ý với số chữ số thập phân của số hạng đầu tiên của A062569 , tổng các ước của giai thừa của (cũng được lập chỉ mục bằng 0). Các hạn A062569 , tuy nhiên, là trong đó có chữ số, không . Mã yêu cầu là năm byte trong Jelly , .n 17 thứ 107004539285280 15 14 = một ( 16 )16n
17th1070045392852801514=a(16)

!ÆsDL


1

JavaScript, 26 byte (Đã bẻ khóa )

let f=x=>x>1?f(x-1)*f(x-2)+1:1

for (x of [0,1,2,3,4,5,6,7]) {
  console.log(x + ' -> ' + f(x))
}

OEIS A007660

Đầu ra là 6 phần tử đầu tiên có 0 chỉ mục (1,1,2,3,7,22)

(hơi thay đổi so với những gì OEIS đã liệt kê là)

Chỉ cần tạo một câu trả lời đơn giản để giải quyết mọi thứ

Hãy thử trực tuyến!



Ví dụ đầu ra của đoạn trích của bạn bắt đầu từ 1, không phải 0?
Paŭlo Ebermann

@ PaŭloEbermann Đã sửa lỗi đó
fnɛtɪk






0

> <> , 42 byte, bị bẻ khóa

i3%0v
642 .
840
789
159
a 1
v<<
n
l
?
\/
;

Hãy thử trực tuyến!

Trình tự để bẻ khóa (0-indexed): 101786, 5844, 19902(không phải trên OEIS).

Dự định giải pháp , để tham khảo.



Thông thường, những tên cướp nên cứng mã hóa đầu ra
Jo King

@JoKing Vết nứt của bạn dường như không tạo ra bất kỳ giá trị nào khác với giá trị của tôi (hoặc có thể tôi chưa kiểm tra kỹ đủ để tìm giá trị nào khác nhau), nhưng điều đó có thể dễ dàng chỉnh sửa. Mặc dù dường như không có bất cứ điều gì trong các quy tắc cấm mã hóa cứng, tôi đồng ý rằng nó có thể không phù hợp với tinh thần của thách thức - trong mọi trường hợp bạn đã chứng minh rằng mã hóa cứng (đối với một cảnh sát) có rủi ro riêng.
Aidan F. Pierce

1
Tôi đã cập nhật câu trả lời của mình để tạo ra một giá trị khác cho4
Jo King

0

Perl 6 , 53 byte

{(1,2,2,{$!=++$;prepend(@,2-$!%2 xx$_).pop}...*)[$_]}

Hãy thử trực tuyến!

Khối mã ẩn danh trả về chuỗi Kolakoski được lập chỉ mục 0 ( OEIS A000002 ). Các giải pháp được yêu cầu để phù hợp với 130 yếu tố đầu tiên, do đó, đối với một số yếu tố n > 129khác với trình tự Kolakoski.


0

Pascal (FPC) , 86 byte ( đã bẻ khóa )

var n:word;begin read(n);write(n div 2+n div 4+n div 8+n div 16+n div 32+n div 64)end.

Hãy thử trực tuyến!

n=120

0   0   1   1   3   3   4   4   7   7   8   8  10  10  11  11  15  15  16  16  18  18  19  19  22  22  23  23  25  25  26  26  31  31  32  32  34  34  35  35  38  38  39  39  41  41  42  42  46  46  47  47  49  49  50  50  53  53  54  54  56  56  57  57  63  63  64  64  66  66  67  67  70  70  71  71  73  73  74  74  78  78  79  79  81  81  82  82  85  85  86  86  88  88  89  89  94  94  95  95  97  97  98  98 101 101 102 102 104 104 105 105 109 109 110 110 112 112 113 113 116


Giải pháp ban đầu của tôi là

var n,i,s:word;begin read(n);i:=2;repeat s:=s+n div i;i:=i*2until i>n;write(s)end.

nhưng r_64 làm cho nó thậm chí còn tốt hơn !


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.