Giới thiệu:
Tôi có vô số mật mã khác nhau được lưu trữ trong một tài liệu tôi từng biên soạn khi còn bé, tôi đã chọn một vài trong số những mật mã mà tôi nghĩ là phù hợp nhất cho các thử thách (không quá tầm thường và không quá khó) và biến chúng thành thử thách. Hầu hết trong số họ vẫn còn trong hộp cát, và tôi không chắc liệu tôi sẽ đăng tất cả chúng hay chỉ một vài. Nhưng đây là người đầu tiên trong số họ bắt đầu mọi thứ.
Mật mã máy tính sẽ mã hóa văn bản đã cho thành các nhóm ký tự 'ngẫu nhiên' của một nhóm nhất định length
. Nếu một nhóm như vậy chứa một chữ số, nó sẽ sử dụng chữ số đó để lập chỉ mục thành nhóm riêng cho ký tự được mã hóa. Nếu không có chữ số nào trong nhóm, điều đó có nghĩa là ký tự đầu tiên được sử dụng.
Ví dụ: giả sử chúng tôi muốn mã hóa văn bản this is a computer cipher
với độ dài cho trước 5
. Đây là một đầu ra tiềm năng (lưu ý: các số được lập chỉ mục 1 trong ví dụ bên dưới):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Hãy lấy một vài nhóm làm ví dụ để giải thích cách giải mã nhóm:
qu5dt
: Nhóm này chứa một chữ số5
, do đó, ký tự thứ 5 (1 chỉ mục) của nhóm này là ký tự được sử dụng cho văn bản được giải mã :t
.hprit
: Nhóm này không chứa chữ số, do đó, ký tự đầu tiên của nhóm này được sử dụng ngầm cho văn bản được giải mã :h
.osyw2
: Nhóm này chứa một chữ số2
, do đó, ký tự thứ 2 (1 chỉ mục) của nhóm này là ký tự được sử dụng cho văn bản được giải mã :s
.
Thử thách:
Cho một số nguyên length
và chuỗi word_to_encipher
, xuất ngẫu nhiên chuỗi được mã hóa như được mô tả ở trên.
Bạn chỉ phải mã hóa cho length
và word_to_encipher
, do đó không cần phải tạo chương trình / chức năng giải mã. Tuy nhiên, tôi có thể thực hiện một thử thách phần 2 cho việc giải mã trong tương lai.
Quy tắc thử thách:
- Bạn có thể giả định
length
sẽ nằm trong phạm vi[3,9]
. - Bạn có thể giả sử di
word_to_encipher
chúc chỉ chứa các chữ cái. - Bạn có thể sử dụng cả chữ thường hoặc chữ hoa đầy đủ (vui lòng cho biết cái nào bạn đã sử dụng trong câu trả lời của mình).
- Đầu ra của bạn, mỗi nhóm và vị trí của các chữ số trong một nhóm (nếu có) phải là ngẫu nhiên thống nhất . Vì vậy, tất cả các chữ cái ngẫu nhiên của bảng chữ cái có cùng cơ hội xảy ra; vị trí của chữ cái được mã hóa trong mỗi nhóm có cùng cơ hội xảy ra; và vị trí của chữ số có cùng cơ hội xảy ra (ngoại trừ khi đó là ký tự đầu tiên và không có chữ số nào xuất hiện; và rõ ràng nó không thể ở cùng vị trí với ký tự được mã hóa).
- Bạn cũng được phép sử dụng các chữ số 0 được lập chỉ mục thay vì 1 chỉ mục. Vui lòng cho biết câu nào trong hai câu bạn đã sử dụng trong câu trả lời của bạn.
- Chữ số
1
(hoặc0
khi được lập chỉ mục 0) sẽ không bao giờ xuất hiện trong đầu ra. Vì vậy,b1ndh
không phải là một nhóm hợp lệ để mã hóa ký tự 'b'. Tuy nhiên,b4tbw
có giá trị, nơi4
enciphers sựb
tại 4 (1-lập chỉ mục) vị trí, và các nhân vật khácb
,t
,w
là ngẫu nhiên (mà tình cờ cũng chứa mộtb
). Nhóm hợp lệ có thể khác củalength
từ 5 đến Mã hóa nhân vật 'b' là:abcd2
,ab2de
,babbk
,hue5b
,, vv
Quy tắc chung:
- Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất bằng byte thắng.
Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'. - Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
- Lỗ hổng mặc định bị cấm.
- Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
- Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.
Các trường hợp thử nghiệm:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
, ab2de
, babbk
tất cả giống nhau không? Cũng b1akk
hợp lệ?
b1akk
tôi muốn nói không. Sẽ chỉnh sửa nó trong mô tả thách thức để làm rõ. Nếu ký tự đầu tiên là ký tự được mã hóa, không có chữ số nào xuất hiện.
"a??"
có 676 kết quả tốt, nhưng "1a?"
, "?a1"
, "2?a"
, "?2a"
, có only104 kết quả. Vì vậy, nếu tôi đang cố chọn một kết quả trong tất cả 780 kết quả này, thì phân phối "vị trí của chữ được mã hóa" là 13: 1: 1, không phải 1: 1: 1. Và tôi sẽ coi đây là cách "ngẫu nhiên thống nhất" hoạt động.