Pyth, 49 48 46 44 byte
_s.b@+kNsYc3mC+913d-.iU25smXm17hT4Cd"KGO"17_
Hãy thử nó ở đây.
Vẫn đang làm việc để rút ngắn chức năng tạo bảng chữ cái ... và vâng, trình tạo dài hơn mã hóa bảng chữ cái bằng 4 ký tự, nhưng không tính bằng byte.
_s.b@+kNsYc3[...]_
_ get input (implicit) and reverse
[...] generate "ΑΒΓΔΕϜΖΗΘΙΚΛΜΝΞΟΠϘΡΣΤΥΦΧΨΩϠ" (see below)
c3 split into 3 equal chunks
.b map over each input digit (as Y) and chunk (as N)...
+kN prepend empty string to N (to support digits of 0)
@ sY get the Yth element of the empty-string-plus-digits array
s concatenate all the digits
_ reverse again to put digits back in the right order
Đây là cách chức năng tạo bảng chữ cái hoạt động. Hãy lấy tất cả các điểm mã và trừ 913 (giá trị nhỏ nhất):
0 1 2 3 4 75 5 6 7 8 9 10 11 12 13 14 15 71 16 18 19 20 21 22 23 24 79
Bây giờ, hãy rút ra những cái không phù hợp với mẫu:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
75 71 79
Được rồi, vì vậy chiến lược đang hình thành: tạo phạm vi từ 0 đến 24 (chúng ta sẽ xử lý 17 thiếu sau), sau đó chèn 75, 71 và 79 vào đúng vị trí.
Làm thế nào chúng ta có thể chèn các ngoại lệ? Pyth có .i
chức năng nterleave mất ex. [1,2,3]
và [4,5,6]
kết quả trong [1,4,2,5,3,6]
. Tuy nhiên, chúng ta sẽ phải thêm một số trình giữ chỗ, vì rõ ràng các ngoại lệ cách xa nhau. Hãy đại diện cho trình giữ chỗ với X:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
X X X X 75 X X X X X X X X X X 71 X X X X X X X 79
Phải, vì vậy mảng ngoại lệ phía dưới bắt đầu bằng bốn X
s. Chúng ta có thể nhóm các ngoại lệ cho mỗi trước bốn X
giây và xem những gì còn lại không?
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75 X X X X X X [ four X ]71 X X X [ four X ]79
Bây giờ chúng tôi thực hiện một quan sát quan trọng khác: vì 79 đến cuối cùng , có thể có bất kỳ số X
s nào đứng trước nó và bất kỳ số lượng nàoX
theo sau nó! Điều này là do xen kẽ [1,2,3]
và [4,5,6,7,8,9]
kết quả là trong chú thích [1,4,2,5,3,6,7,8,9]
rằng các phần tử bổ sung trong mảng thứ hai kết thúc ở cuối và vì dù sao chúng sẽ bị xóa, chúng ta có thể cho phép điều đó một cách an toàn.
Điều đó có nghĩa là chúng ta có thể bình thường hóa điều này sao cho mọi ngoại lệ đều đi trước bốn X
giây và thành công sau 6:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24
[four X]75[ six X ] [ four X ]71[ six X ] [four X]79[six X]
Tuyệt quá! Bây giờ chúng ta chỉ cần lấy mảng [75, 71, 79]
, chèn bốn giá trị giữ chỗ trước mỗi phần tử và sáu sau, sau đó xen kẽ nó với phạm vi 0..24
.
Nhưng chờ đã, chuyện gì đã xảy ra 17
? Hãy nhớ rằng, dòng trên cùng trong tất cả các ví dụ này đã bị thiếu 17. Chúng ta chỉ cần xóa 17 sau khi xen kẽ; nhưng điều này để lại một khả năng ác thú vị khác mở ra. Bạn đoán nó là giá trị giữ chỗ mà chúng tôi đã đề cập đến là X
17. Điều này cho phép chúng tôi loại bỏ cả 17 giá trị ngoại lai và tất cả các giá trị giữ chỗ trong một cú trượt.
Cuối cùng! Đây là mã được sử dụng để thực hiện điều này:
mC+913d-.iU25smXm17hT4Cd"KGO"17
m "KGO" for each char in the string "KGO"...
Cd take its ASCII value ("KGO" -> 75,71,79)
m17hT generate an 11-element array filled with 17
X 4 replace the 5th element with the ASCII value ^^
s concatenate all of these together
.iU25 interleave with range(25)
- 17 remove all the 17s
m d for each value in the resulting array...
+913 add 913 (to get the real character value)
C convert to character