Ngôn ngữ J có một cú pháp rất ngớ ngẩn để chỉ định các hằng số . Tôi muốn tập trung vào một tính năng đặc biệt: khả năng viết trong các cơ sở tùy ý.
Nếu bạn viết XbY
cho X
bất kỳ số nào và Y
bất kỳ chuỗi chữ số nào, thì J sẽ hiểu Y
là X
số cơ sở , trong đó 0
thông qua 9
ý nghĩa thông thường của chúng và a
thông qua z
đại diện từ 10 đến 35.
Và khi tôi nói X
bất kỳ số nào, tôi có nghĩa là bất kỳ số nào . Đối với mục đích của câu hỏi này, tôi sẽ giới hạn X
là một số nguyên dương, nhưng trong J bạn có thể sử dụng bất cứ thứ gì: số âm, phân số, số phức, bất cứ thứ gì.
Điều kỳ lạ là bạn chỉ có thể sử dụng các số từ 0 đến 35 làm số cơ sở của mình - bất kỳ chữ số nào, bởi vì bộ sưu tập các ký hiệu có thể sử dụng của bạn chỉ bao gồm 0-9 và az.
Vấn đề
Tôi muốn có một chương trình giúp tôi chơi những con số ma thuật như 2.933.774.030.998 bằng phương pháp này. Chà, được thôi, có lẽ không lớn lắm, tôi sẽ dễ dàng với bạn. Vì thế...
Nhiệm vụ của bạn là viết chương trình hoặc hàm lấy số thập phân (thường là lớn)
N
trong khoảng từ 1 đến 4.294.967.295 (= 2 32 -1) làm đầu vào và xuất / trả về biểu diễn ngắn nhất của biểu mẫuXbY
, trong đóX
là số nguyên dương,Y
là một chuỗi gồm chữ cái và số (0-9 và az, trường hợp không nhạy cảm), vàY
giải thích cơ sởX
tương đươngN
.Nếu độ dài của mỗi đại diện đại
XbY
diện lớn hơn hoặc bằng số chữ số củaN
, thì đầu raN
thay thế. Trong tất cả các mối quan hệ khác, bạn có thể xuất ra bất kỳ tập hợp con không trống nào của các biểu diễn ngắn nhất.
Đây là mã golf, nên ngắn hơn là tốt hơn.
Các trường hợp thử nghiệm
Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
5 | 5
|
10000000 | 79bkmom 82bibhi 85bgo75 99bauua 577buld
| 620bq9k 999baka
|
10000030 | 85bgo7z
|
10000031 | 10000031
|
12345678 | 76bs9va 79bp3cw 82bmw54 86bjzky 641buui
|
34307000 | 99bzzzz
|
34307001 | 34307001
|
1557626714 | 84bvo07e 87brgzpt 99bglush 420blaze
|
1892332260 | 35bzzzzzz 36bvan8x0 37brapre5 38bnxkbfe 40bij7rqk
| 41bgdrm7f 42bek5su0 45bablf30 49b6ycriz 56b3onmfs
| 57b38f9gx 62b244244 69b1expkf 71b13xbj3
|
2147483647 | 36bzik0zj 38br3y91l 39bnvabca 42bgi5of1 48b8kq3qv
(= 2^31-1) | 53b578t6k 63b2akka1 1022b2cof 1023b2661 10922bio7
| 16382b8wv 16383b8g7 32764b2gv 32765b2ch 32766b287
| 32767b241
|
2147483648 | 512bg000 8192bw00
|
4294967295 | 45bnchvmu 60b5vo6sf 71b2r1708 84b12mxf3 112brx8iv
(= 2^32-1) | 126bh5aa3 254b18owf 255b14640 1023b4cc3 13107bpa0
| 16383bgwf 21844b9of 21845b960 32765b4oz 32766b4gf
| 32767b483 65530b1cz 65531b1ao 65532b18f 65533b168
| 65534b143 65535b120
Nếu bạn không chắc chắn về việc liệu một số đại diện có bằng một số nào đó hay không, bạn có thể sử dụng bất kỳ trình thông dịch J nào, như phiên bản trên Dùng thử trực tuyến . Chỉ cần gõ stdout 0":87brgzpt
và J sẽ nhổ ra 1557626714
. Lưu ý rằng J chỉ chấp nhận chữ thường, mặc dù vấn đề này không phân biệt chữ hoa chữ thường.
Một số lý thuyết có thể hữu ích
- Đối với tất cả
N
ít hơn 10.000.000, biểu diễn thập phân cũng ngắn như mọi phần khác và do đó là đầu ra duy nhất được chấp nhận. Để lưu bất cứ thứ gì bạn cần ngắn hơn ít nhất bốn chữ số trong cơ sở mới và thậm chí nhiều hơn nếu cơ sở lớn hơn 99. - Nó đủ để kiểm tra các cơ sở lên đến trần của căn bậc hai của
N
. Đối với bất kỳ cơ sở lớn hơn B ,N
sẽ được nhiều nhất là hai chữ số trong cơ sở B , vì vậy lần đầu tiên bạn sẽ nhận được một cái gì đó bằng một chữ số đầu tiên hợp lệ là vào khoảng B ≈N
/ 35. Nhưng với kích thước đó, bạn sẽ luôn có kích thước tối thiểu bằng số thập phân, vì vậy không có điểm nào để thử. Điều đó trong tâm trí, ceil (sqrt (số lớn nhất tôi sẽ yêu cầu bạn giải quyết vấn đề này)) = 65536. - Nếu bạn có bất kỳ đại diện nào trong một cơ sở nhỏ hơn 36, thì đại diện cơ sở 36 sẽ ít nhất là ngắn. Vì vậy, bạn không phải lo lắng về các giải pháp vô tình ngắn trong các cơ sở nhỏ hơn 36. Ví dụ: đại diện
35bzzzzzz
cho 1.892.332.260 sử dụng một chữ số bất thường cho cơ sở đó, nhưng36bvan8x0
có cùng độ dài.