Khoảng cách Levenshtein & OEIS (Cướp)


11

Đây là bài Robber. Bài viết Cop ở đây .


Nhiệm vụ của bạn là lấy một số nguyên đầu vào N và xuất chữ số N trong chuỗi OEIS A002942 .

Chuỗi bao gồm các số vuông được viết ngược:

1, 4, 9, 61, 52, 63, 94, 46, 18, 1, 121, 441, ...

Lưu ý rằng các số 0 đứng đầu được cắt đi ( 100 trở thành 1 , không phải 001 ). Ghép chuỗi này thành một chuỗi (hoặc một số dài cho):

1496152639446181121441

Bạn sẽ xuất chữ số N trong chuỗi / số này. Bạn có thể chọn lấy N là 0-index hoặc 1-index (vui lòng cho biết bạn chọn cái nào).

Các trường hợp thử nghiệm (1 chỉ mục):

N = 5,      ==> 1
N = 17,     ==> 1   <- Important test case! It's not zero.
N = 20,     ==> 4
N = 78,     ==> 0
N = 100,    ==> 4
N = 274164, ==> 1

Mã của bạn sẽ hoạt động với các số lên tới N = 2 ^ 15 (trừ khi ngôn ngữ của bạn không thể xử lý số nguyên 32 bit theo mặc định, trong trường hợp N có thể thấp hơn).


Cướp

Bạn nên cố gắng bẻ khóa bài viết của Cảnh sát.

Mã của bạn phải cùng ngôn ngữ với bài đăng Cop và có khoảng cách Levenshtein chính xác bằng khoảng cách được cung cấp bởi cảnh sát. Mã của bạn không thể dài hơn giải pháp ban đầu (nhưng nó có thể có cùng kích thước).

Bạn có thể kiểm tra khoảng cách Levenshtein ở đây!

Người chiến thắng sẽ là tên cướp bẻ khóa nhiều bài viết nhất.


Đợi đã ... vậy nếu kết quả của tên cướp không giống với chương trình dự định ban đầu ... Cảnh sát không thể viết một chương trình và tạo khoảng cách ...?
Bạch tuộc ma thuật Urn

Chà, cảnh sát phải cung cấp mã thay thế để đánh dấu bài nộp là an toàn và đủ điều kiện để giành chiến thắng. Tôi đã làm rõ trong bài cảnh sát. :)
Stewie Griffin

Tôi chưa bao giờ thử thách một cảnh sát và cướp. Tất cả điều này rất khó hiểu với tôi hah!
Bạch tuộc ma thuật Urn

Câu trả lời:



3

JavaScript, Arnauld

/*ZZ*/m=>[...Array(m+1).keys()].map(eval(atob("eD0+K1suLi4iIit4KnhdLnJldmVyc2VgYC5qb2luYGA="))).join``[m]

1
@Arnauld OK, tôi nghĩ đã Array(m+1)sửa nó.
Lynn

Nó làm. FWIW, tôi đã thêm giải pháp dự định vào bài viết của mình.
Arnauld



2

Mã máy 6502 (C64), Felix Palmen

Tôi đã thử nghiệm điều này với tất cả các trường hợp kiểm tra câu hỏi và khá nhiều tính năng bổ sung (như 2 ^ 15 ... mất một lúc) và nó có vẻ hoạt động giống như bản gốc với LD = 1.

00 C0 20 FD AE A0 00 99 5B 00 C8 20 73 00 90 F7 99 5B 00 A2 0B CA 88 30 09 B9
5B 00 29 0F 95 5B 10 F3 A9 00 95 5B CA 10 F9 A9 01 A0 03 99 69 00 88 10 FA A0
20 A2 76 18 B5 E6 90 02 09 10 4A 95 E6 E8 10 F4 A2 03 76 69 CA 10 FB 88 F0 11
A2 09 B5 5C C9 08 30 04 E9 03 95 5C CA 10 F3 30 D6 A2 03 B5 69 95 57 CA 10 F9
A9 01 85 FB A2 03 A9 00 95 FB CA D0 FB A2 03 B5 FB 95 22 95 26 CA 10 F7 A9 00
A2 03 95 69 CA 10 FB A0 20 A2 02 46 25 76 22 CA 10 FB 90 0C A2 7C 18 B5 AA 75
ED 95 ED E8 10 F7 A2 7D 06 26 36 AA E8 10 FB 88 10 DD A0 0B A9 00 99 5A 00 88
D0 FA A0 20 A2 09 B5 5C C9 05 30 04 69 02 95 5C CA 10 F3 06 69 A2 FD 36 6D E8
D0 FB A2 09 B5 5C 2A C9 10 29 0F 95 5C CA 10 F4 88 D0 D7 E0 0A F0 05 E8 B5 5B
F0 F7 09 30 99 5B 00 C8 E8 E0 0B F0 04 B5 5B 90 F1 88 B9 5B 00 C9 30 F0 F8 A2
7C 18 B5 DB E9 00 95 DB E8 10 F7 90 14 88 30 05 B9 5B 00 D0 EA A2 7C F6 7F D0
03 E8 10 F9 4C 73 C0 B9 5B 00 4C D2 FF

Bản demo trực tuyến , cách sử dụng: sys49152, n trong đó n là đầu vào 0 chỉ mục.


Điều này là chính xác bởi vì bạn đã tìm thấy một số mã hoàn toàn vô dụng mà tôi không biết và sự thay đổi nằm trong mã này : o
Felix Palmen

1

Lua , Katenkyo

i=1s=""while(#s<...+0)do s=s..((i*i)..""):reverse():gsub("(0+)(%d+)$","%2")i=i+1 end
print(s:sub(...,...))

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

Tôi không biết Lua, nhưng đây là một điều đơn giản, chỉ cần thay thế một không gian bằng một dòng mới.


Hum, không nghĩ về điều đó, bản gốc là về thay thế (0+)(%d+)$với (0+)(%d+), vì vậy nó là về regex ^^'
Katenkyo

1

Python 3 , HyperNeutrino

lambda o:"".join(str(p*p+2*p+1)[::~0].lstrip("0")for p in range(o+1))[o]

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


Ninja'd sau 9 giây: P
Uriel

huh thú vị, không phải là người tôi đã có nhưng tốt đẹp :)
HyperNeutrino

Bạn cũng có thể làm ''thay vì""
Uriel

@Uriel Vâng, tôi biết rất nhiều lựa chọn thay thế.
Ông Xcoder


1

Python 2 , dyl Nam

d=lambda y:y if y%10>0 else d(y/10)
lambda n:''.join([str(d(x*x))[::-1]for x in range(1,n+1)])[n-1]#fix

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

Lưu ý: việc gửi cảnh sát này đã bị lỗi và không hoạt động đối với các đầu vào thấp hơn 5. Trong khi tôi ở đó, tôi đã xây dựng giải pháp này có khoảng cách Levenshtein chính xác VÀ sửa lỗi.


1

Perl 5, (-p) Xcali

Cập nhật sau khi nhận xét, Levenshtein Khoảng cách giữa

a$j.=int reverse$_**2for 1..$_;$_--;say$j=~s/.{$_}(.).*/$1/r

p$_=substr w.(join"",map{whyddwzz;0|reverse$_**2}1..$_),$_,1

là 55

Dùng thử trực tuyến


Cho rằng M5.010 là "miễn phí", tôi không nghĩ nó nên được tính ở đây. Tôi không thực sự chắc chắn làm thế nào để đếm -aso với -pcờ. Hai giải pháp tôi đưa ra với cả hai đều sử dụng cùng một cờ. Tôi sẽ nghĩ rằng lá cờ sẽ được dán ở phía trước mà không có khoảng trống, nhưng tôi sẵn sàng bị người khác lắc lư về điều đó.
Xcali

đã cập nhật câu trả lời của tôi
Nahuel Fouilleul

1

Java 8, Kevin Cruijssen

/*!FooBarFooBarFoo!*/N->{String R="",T=R;for(int I=1,J;N+2>R.length();I++){for(T="",J=(I*I+"").length();0<J;T+=(I*I+"").charAt(--J));R+=new Long(T)+"";}return R.charAt(N);}

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

Thay đổi nhật ký

  • Thay thế .replaceAll()bằng new Long().
  • Loại bỏ các bài kiểm tra cho hình vuông hoàn hảo. Bây giờ sử dụng hình vuông hoàn hảo trực tiếp.
  • Cập nhật tất cả các tên biến thành chữ hoa
  • Viết lại sự bất bình đẳng.
  • Và cuối cùng đã thêm một bình luận hàng đầu 21 byte để đạt được LD chính xác.

1
Ồ tốt đẹp Điều đó hoàn toàn khác so với tôi nghĩ, nhưng thật tuyệt khi bạn vẫn đạt 92 LD. Giải pháp tôi có trong đầu là: n->{String r="";for(int i=1;r.length()<=n+1;r+=new Long(new StringBuffer(i*i+++"").reverse()+""));return r.charAt(n);}( 118 byte, 92 LD so với câu trả lời khác của tôi.)
Kevin Cruijssen

1

Octave , Stewie Griffin

@(n)regexprep(fliplr(num2str((1:n)'.^2))'(:)',' +0*','')(n)%abcdefghijk

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

Tôi đã thực sự cố gắng trả lời Octave của riêng tôi và phát hiện ra câu trả lời hiện có. Của tôi đã ngắn hơn đáng kể vì vậy thêm một nhận xét vào cuối là đủ để đạt được khoảng cách cần thiết là 63.


Làm tốt lắm :-) Tôi đã có một vòng lặp input()và mọi thứ diễn ra với nó ...
Stewie Griffin

1

PHP, Jo.

<?for($j++;strlen($p)<$argv[1];$j++)$p.=(int)strrev($j**2);echo($p[$argv[1]+2-3]);

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

(Tôi đã lên kế hoạch chuyển đổi bất bình đẳng để có được LD lớn hơn ...)


0

Mã máy 6502 (C64), Felix Palmen

Cũng có thể là một vết nứt "đơn giản", nhưng nó dường như hoạt động như bản gốc.
Có LD = 1 thật hấp dẫn để cố gắng bẻ khóa nó (xin lỗi, Felix). :)

00 C0 20 FD AE A0 00 99 5B 00 C8 20 73 00 90 F7 99 5B 00 A2 0B CA 98 88 30 09
B9 5B 00 29 0F 95 5B 10 F2 95 5B CA 10 FB A0 20 A2 76 18 B5 E6 90 02 09 10 4A
95 E6 E8 10 F4 A2 03 76 69 CA 10 FB 88 F0 11 A2 09 B5 5C C9 08 30 04 EB 03 95
5C CA 10 F3 30 D6 A2 03 B5 69 95 57 CA 10 F9 A9 01 85 FB A2 03 A9 00 95 FB CA
D0 FB A2 03 B5 FB 95 22 95 26 CA 10 F7 A9 00 A2 03 95 69 CA 10 FB A0 20 A2 02
46 25 76 22 CA 10 FB 90 0C A2 7C 18 B5 AA 75 ED 95 ED E8 10 F7 A2 7D 06 26 36
AA E8 10 FB 88 10 DD A2 0B A9 00 95 5A CA D0 FB A0 20 A2 09 B5 5C C9 05 30 04
69 02 95 5C CA 10 F3 06 69 A2 FD 36 6D E8 D0 FB A2 09 B5 5C 2A C9 10 29 0F 95
5C CA 10 F4 88 D0 D7 E8 B5 5B F0 FB 09 30 99 5B 00 C8 E8 E0 0B F0 04 B5 5B 90
F1 88 B9 5B 00 C9 30 F0 F8 A2 7C 18 B5 DB E9 00 95 DB E8 10 F7 90 14 88 30 05
B9 5B 00 D0 EA A2 7C F6 7F D0 03 E8 10 F9 4C 68 C0 B9 5B 00 4C D2 FF

Bản demo trực tuyến , cách sử dụng: sys49152, n trong đó n là đầu vào 0 chỉ mục.


Tôi không chắc liệu tôi có phải chấp nhận điều này không. Nó thay thế E9(một lệnh trừ) khôngEB được xác định trong mã máy 6502, nhưng tình cờ làm tương tự trên các chip NMOS 6502 và 6510. Chương trình này chẳng hạn như sự cố trên C64 DTV1. Nhưng không thể tìm thấy một C64 thực sự không thực thi chính xác, vì vậy nó có thể được coi là một vết nứt hợp lệ? Tôi có thể hỏi ý kiến ​​về meta ....
Felix Palmen


@FelixPalmen Tôi sẽ sớm trả lời câu hỏi này.
Jo.

giữ nó, xem bình luận của tôi về meta. Cộng đồng bày tỏ rõ ràng ý kiến ​​rằng nó hợp lệ. Đó là lỗi của tôi khi không yêu cầu chỉ ghi lại mã 6502 và tôi sẽ ghi nhớ điều đó cho tương lai.
Felix Palmen
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.