Pyth, 49 48 46 44 byte
_s.b@+kNsYc3mC+913d-.iU25smXm17hT4Cd"KGO"17_
Coba di sini.
Masih bekerja untuk memperpendek fungsi untuk menghasilkan alfabet ... dan ya, generator lebih panjang dari pengodean alfabet sebanyak 4 karakter, tetapi tidak dalam 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
Begini cara fungsi penghasil alfabet bekerja. Mari kita ambil semua codepoint dan kurangi 913 (nilai terkecil):
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
Sekarang mari kita tarik yang tidak sesuai dengan pola:
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
Oke, jadi strateginya terbentuk: hasilkan rentang 0 hingga 24 (kita akan berurusan dengan 17 yang hilang nanti), lalu masukkan 75, 71, dan 79 di lokasi yang benar.
Bagaimana kita bisa memasukkan outlier? Pyth memiliki .i
fungsi nterleave yang mengambil ex. [1,2,3]
dan [4,5,6]
dan menghasilkan [1,4,2,5,3,6]
. Kami harus menambahkan beberapa placeholder, karena jelas outliernya berjauhan. Mari kita mewakili pengganti dengan 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
Benar, jadi array outlier bawah dimulai dengan empat X
s. Bisakah kita mengelompokkan outlier ke masing-masing didahului oleh empat X
dan melihat apa yang tersisa?
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
Sekarang kita membuat pengamatan kunci lain: sejak 79 datang pada akhir , bisa ada setiap jumlah X
s mendahuluinya, dan setiap jumlah X
s berikut juga! Ini karena interleaving [1,2,3]
dan [4,5,6,7,8,9]
menghasilkan [1,4,2,5,3,6,7,8,9]
—catat bahwa elemen tambahan dalam array kedua berakhir di akhir, dan karena mereka akan dihapus, kita dapat mengizinkannya dengan aman.
Itu berarti kita dapat menormalkan ini sehingga setiap outlier didahului oleh empat X
dan digantikan oleh 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]
Bagus! Sekarang kita bisa mengambil array [75, 71, 79]
, menyisipkan empat nilai placeholder sebelum setiap elemen dan enam setelahnya, dan kemudian interleave dengan rentang 0..24
.
Tapi tunggu, apa yang terjadi 17
? Ingat, baris teratas dalam semua contoh ini telah hilang 17. Kita cukup menghapus 17 setelah interleaving; tetapi ini membiarkan kemungkinan jahat lainnya terbuka. Anda dapat menebaknya — nilai placeholder yang telah kami rujuk X
akan menjadi 17. Ini memungkinkan kami untuk menghapus kedua nilai 17 yang asing dan semua nilai placeholder dalam sekali gerakan.
Akhirnya! Berikut kode yang digunakan untuk mengimplementasikan ini:
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