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


12

Đây là một thử thách . Chủ đề của cảnh sát cho thách thức này là ở đâ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ừ 1 , tôi có thể nói 1,2,3, , nhưng điều đó có thực sự đủ?

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 mã 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 dương làm đầu vào và tạo ra một số nguyên làm đầu ra. Mã này có thể bằng 0 hoặc một chỉ mục nhưng cần phải rõ chỉ mục là gì. Mã này sẽ xác định trình tự của bạn.

  • Bất kỳ yêu cầu về nền tảng hoặc 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ố n , cùng với n đầu tiênn 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".

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 n đầ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 .n

Chấm điểm

Những tên cướp sẽ được ghi điểm về số lượng vết nứt mà chúng tìm thấy với nhiều vết nứt sẽ tốt hơn. Một câu trả lời có thể bị bẻ khóa một lần nữa bằng cách tìm một câu trả lời hợp lệ ngắn hơn vết nứt ban đầu. Nếu một câu trả lời bị bẻ khóa lần thứ hai, điểm được trao cho người bẻ khóa thứ hai chứ không phải lần đầu tiên.


2
Có phải chúng ta không để những tên cướp đánh nhau vì bẻ khóa một câu trả lời (tức là vết nứt ngắn nhất trong ngôn ngữ chiến thắng)
fnɛtɪk

@ fəˈnɛtɪk Âm thanh, tốt, tôi đã thêm nó.
Đăng Rock Garf Hunter

Câu trả lời:



5

JavaScript, câu trả lời của fəˈnɛtɪk (17 byte)

x=>"11237"[x]||22

Vâng đó là dễ dàng để hardcode để có được một điểm số thấp hơn nhiều ... khác với việc thực hiện tham khảo cho bất kỳ mục , 0-lập chỉ mục. Điều này sử dụng một mẹo đánh gôn JS rất nổi tiếng: lập chỉ mục thành một chuỗi có số nguyên vượt quá giới hạn của nó trả về giá trị giả ( ), do đó, nó có thể được ép thành giá trị mặc định bằng cách sử dụng logic OR ( ), trong trường hợp này trường hợp , xử lý các điều khoản cuối cùng của trình tự nhưng cũng có những người để làm theo.x6undefined||22

Kiểm tra

let f=x=>"11237"[x]||22

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

Ngoài ra, hãy thử trực tuyến!


4

Haskell , câu trả lời của Laikoni , 15 byte

b n=n*div(n+1)2

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

Tôi thường sẽ chỉ ra một cái gì đó như thế này trong một bình luận, nhưng sau đó tôi nghĩ, cảnh sát và tên cướp là cắt cổ hơn một chút.

Đây chỉ là câu trả lời của BMO trừ trường hợp đặc biệt b 42. Bởi vì bản gốc của Laikoni đi qua điểm nổi, không cần thiết: chỉ cần tìm một số đủ lớn để đưa ra các lỗi làm tròn trong đó nhưng không phải là Integersố học chính xác . Ví dụ:

a 100000000000000000000000 = 4999999999999999580569600000000000000000000000
b 100000000000000000000000 = 5000000000000000000000000000000000000000000000

Tôi nghĩ rằng điều này có thể là có thể (do đó tôi đã viết rằng nó có thể được viết lại cho các điều khoản bắt buộc) nhưng không tìm thấy giá trị mà nó hoạt động .. Hoàn thành tốt!
ბიმო

4

Python 2 , câu trả lời của xnor , 43 byte

Sự khác biệt đầu tiên xảy ra cho :n=69

f=lambda n,p=2:n<1or-~f(n-(~-2**p%p<2),p+1)

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

Tín dụng

Rất nhiều khoản tín dụng cho vết nứt này phải được gửi tới @ Mr.Xcoder , người đầu tiên đã đăng bình luận về một cuộc tấn công có thể xảy ra bằng phương pháp này và @PoonLevi , người đã tìm thấy giải pháp 44 byte.

Làm sao?

Học thuyết

Việc bẻ khóa dựa trên định lý nhỏ của Fermat nói rằng nếu là số nguyên tố và ap tương đối nguyên tố thì:pap

(1)ap11(modp)

Cụ thể, với :a=2

2p-11(modp)

Vì vậy, tồn tại một số nguyên dương sao cho:k

2p-1= =kp+1

Điều này dẫn đến:

2 p - 1 = 2 k p + 1 2 p - 1 1

2p=2kp+2
2p1=2kp+1
(2)2p11(modp)

Công thức cuối cùng này là mã Python được lấy từ và hiện giữ cho , mặc dù 2p=22 không tương đối chính với chính nó.

Bây giờ, đối với phần quan trọng nhất: sự đảo ngược của định lý nhỏ của Fermat là không đúng. Chúng tôi có thể có đối với một sốtổng hợpsố n . Những con số như vậy được gọi làgiả Fermatđể căn cứ a . Các giả danh Fermat đến cơ sở 2 còn được gọi làsốPoulet.an11(modn)na

Giả hành Fermat đầu tiên cho cơ sở (hoặc số Poulet đầu tiên) là n = 341 = 11 × 31 , mà chúng ta có:2n=341=11×31

2 341 - 1 1

234111(mod341)
234111(mod341)

341347

Thực hiện

(2)

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

<2==112110(mod1)

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

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

p=2

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

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

Bí quyết cuối cùng là sử dụng n<1orthay vì n and. Điều này chỉ dài như vậy nhưng làm cho lần lặp cuối cùng trả về True thay vì 0 , do đó thêm phần bù bị thiếu vào mỗi số hạng.


Chúc mừng tất cả các bạn! Đây là giải pháp tôi có trong tâm trí. Tôi nghĩ thật buồn cười, từ động lực thách thức "Nếu tôi có một dãy số thì tôi phải cung cấp bao nhiêu trong số đó trước khi rõ ràng tôi đang nói về chuỗi nào?", 50 số nguyên tố đầu tiên rõ ràng là không đủ - một người ngoài hành tinh chơi gôn Python sẽ cho rằng bạn đang nói về một chuỗi khác nhau.
xnor

@xnor Tôi thích ý tưởng về một "người ngoài hành tinh chơi gôn"
dylnan

3

Python 3 , crashoz , 45 byte

lambda n:int(60*math.sin(n/10-2))
import math

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

Biểu hiện x*60-x**3*10+x**5/2-x**7/84là loạt Taylor choSTôin(x) lên đến x7 thuật ngữ, nhân với 60. Điều này đủ chính xác trên các đầu vào được sử dụng, nhưng đối với các giá trị cao hơn, hai giá trị sẽ phân kỳ khi các thuật ngữ rút gọn trở nên phù hợp hơn.



2

Haskell , câu trả lời của Laikoni , 26 22 byte

-4 byte bằng cách không sử dụng infix div, nhờ Laikoni !

b 42=0;b n=n*div(n+1)2

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

Giải trình

Dành cho 0n20thuật ngữ này ceiling(realToFrac n/2)có thể được viết lại vì div(n+1)2nó cung cấp cho chúng ta đủ byte để khớp mẫu trên mộtn>20 dẫn đến một vết nứt trong vòng 28 byte:

b 42=0

À, tôi không nghĩ về điều đó. Tôi có một cách tiếp cận khác dẫn đến việc bẻ khóa 20 byte trong trường hợp bạn muốn giải đố nhiều hơn một chút. Ngoài ra ((n+1)`div`2)-> div(n+1)2.
Laikoni

@Laikoni: Vâng, đừng tiết lộ điều đó! Rất tiếc, vâng, đã khá lâu kể từ khi tôi chơi gôn, tôi sẽ cập nhật nó.
ბიმო

2

> <> , câu trả lời của crashoz 203 byte

:l2-$g:0=?;n:





M
-
B
"
BM
",
7M
!"
BBM
!",
7CM
!"-
BBBM
!!",
7BBMM
!!,,
7BBBMM
!!,,
7BBBMM
!!!,,
7BBBBMM
!!!,,
7BBBBMM
!!!!,,
7BBBBBMM
!!!!,,
7BBBBBMM
!!!!!,,
7BBBBBBMM

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

Tôi sẽ làm điều gì đó thông minh với thực tế là các số lẻ / chẵn ở trên n=20đều giống nhau ngoại trừ một phần tử lặp lại ở trung tâm, nhưng việc mã hóa mọi phần tử trở nên dễ dàng hơn.

Đầu vào là thông qua -vcờ. Không in gì cho các yếu tố trên 34.


2

Pascal (FPC) , câu trả lời của AlexRacer , 80 byte

var n,m:word;begin read(n);while n<>0 do begin n:=n div 2;m:=m+n;end;write(m)end.

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

Khi nào 0n120 các đầu ra giống hệt nhau, nhưng khi n= =128 các đầu ra mã ở trên 127, trong khi đầu ra mã của AlexRacer 126.

Đây có vẻ là một câu trả lời muộn, nhưng dù sao cũng cảm ơn @AlexRacer vì một câu đố hay!


1
Wow, cái này thậm chí còn ngắn hơn những gì tôi đã có. Chào mừng đến với PPCG!
AlexRacer


1

JavaScript, câu trả lời của fəˈnɛtɪk (17 byte)

Bạn có thể thấy trong liên kết TIO hoặc trong kết quả Stack Snippet rằng nó không thành công cho các mục cao hơn 15.

x=>2.7182819**x|1

Nếu độ chính xác sẽ chỉ được yêu cầu cho n14 (cái đầu tiên 15các giá trị), sau đó x=>Math.exp(x)|1sẽ hoạt động tốt với 16 byte.

Kiểm tra

f=x=>2.7182819**x|1
g=x=>(3-(5/63)**.5)**x|1

tmp=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
console.log(tmp.map(f).join(","))
console.log(tmp.map(g).join(","))

Ngoài ra, hãy thử trực tuyến!


1

Husk , bẻ khóa 5 byter của BMO với  3  2 byte

-1 nhờ BMO ( LdΣ-> kể từ khi được cho a Tnum, Lthực hiện "độ dài biểu diễn chuỗi")

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

Độ dài kỹ thuật số của các số tam giác * khớp một(0)một(23) sau đó khác nhau ở một(24)
... khi sản lượng3trong khi ←d+16sản lượng4.

* Ở đâu T(0)= =0 có độ dài kỹ thuật số là 1 (không phải 0)


Xin chúc mừng, đó là giải pháp chính xác của tôi! Tuy nhiên tôi chỉ lưu ý rằng cho TNum s LLd tương đương tiết kiệm bạn một byte;)
ბიმო

À, tôi đã tìm kiếm "chữ số" trong wiki để cố gắng tìm độ dài kỹ thuật số, nhưng không phát hiện ra phần Lghi đè là "độ dài của biểu diễn chuỗi" cho Tnum.
Jonathan Allan

(Lưu ý rằng chúng chỉ tương đương với các số nguyên không âm - đủ tốt cho việc này.)
Jonathan Allan


0

JavaScript, câu trả lời của fnɛtɪk , 23 byte

Trả về 0 cho n14.

x=>14-`${73211e9}`[x]|0

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

Làm sao?

Biểu thức `${73211e9}`mở rộng thành chuỗi "73211000000000", cung cấp bảng tra cứu gồm 14 giá trị được trừ từ 14, cung cấp chuỗi dự kiến.

Dành cho n14, kết quả là:

(14 - undefined) | 0
=== NaN | 0
=== 0

21 byte

Trả lại NaNchon14, có thể hoặc không thể được coi là một đầu ra hợp lệ.

x=>14-`${73211e9}`[x]

Hãy thử trực tuyế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.