Pyth mungkin bahasa tujuan serba guna yang paling sukses. Meskipun agak menurun karena bahasa yang lebih baru, dari 2014 hingga 2016 sintaksis Pyth yang ringkas, pembaruan terus-menerus, kelebihan beban, dan (untuk zamannya) banyak bawaan membuatnya menjadi favorit bagi sebagian besar pertanyaan.
Kode Pyth seringkali sulit dibaca. Bahkan output dari mode debug (transpiled Python) sering terdiri dari garis panjang, kadang-kadang dengan tanda kurung bersarang sepuluh dalam. Namun, Pyth yang diformat dengan benar sangat mudah dibaca.
Berikut adalah sepotong kode Pyth, yang ditulis oleh @isaacg di Play the Word Chain .
.MlZfqhMtTeMPT+Lzs.pMyQ
Jauh lebih mudah dibaca seperti ini.
.M Filter by gives-maximal-value of
l Z lambda Z:length(Z) over
f filter by (lambda T:
q equal
hM t T head-map tail T
eM P T end-map Pop T)
+L Append z to each element in
z
s .pM y Q flattened permutations of each subset of Q
Untuk tantangan ini, kami menghilangkan aspek kompleksitas-kolmogorov dari pengkategorian karakter Pyth dan fokus pada pemformatan. Alih-alih menjadi kode Pyth, input akan terdiri dari karakter dalam 0123456789M
. Digit n
mewakili fungsi arity n
, dan M
mewakili operator. Misalnya, kode di atas direpresentasikan sebagai 210221M101M102M011M10
. Berikut adalah langkah-langkah untuk menghapuskan:
Pisahkan string menjadi token.
Token cocok [0-9]M*
. 0M
tidak akan terjadi pada input.
Tambahkan trailing 0s.
Ketika tidak ada cukup argumen, Pyth menambahkan sebanyak mungkin variabel implisit (variabel lambda atau Q
s) ke kode sebagaimana diperlukan untuk mengisi argumen program; ini harus diwakili oleh 0
s.
Grup token menjadi beberapa baris.
Arity dari token adalah nilai digitnya.
Token arity-0 (yaitu a 0) mengakhiri garis.
Untuk toity-1 token, token berikutnya harus berada pada baris yang sama, dipisahkan oleh spasi.
Untuk arity> = 2 token, argumennya pergi pada baris yang terpisah, dalam urutan mereka muncul dalam kode, masing-masing diikuti oleh sub-dokumen mereka sendiri dan seterusnya. Argumen untuk token dimasukkan ke akhir token itu ditambah satu spasi.
Memasukkan
String nonempty (atau array char, array string panjang-1, dll. Sebagaimana diizinkan oleh Metode I / O Standar) yang terdiri dari 0123456789M
, yang tidak akan mengandung substring 0M
.
Keluaran
String diformat sesuai dengan aturan di atas.
Uji kasus
210221M101M102M011M10
2
1 0
2
2
1M 1 0
1M 1 0
2M
0
1 1M 1 0
123M4M
1 2
3M
4M
0
0
0
0
0
0
0
2MM
2MM
0
0
11011100
1 1 0
1 1 1 0
0
9000000
9
0
0
0
0
0
0
0
0
0
210221M101M102M011M10
adalah[2,1,0,2,2,1,'M',1,0,1,'M',1,0,2,'M',0,1,1,'M',1,0]
M
s diizinkan untuk menggunakan tipe data yang berbeda dari bilangan bulat.M
?Jawaban:
JavaScript (ES8),
160159 byteCobalah online!
Berkomentar
sumber
Haskell ,
192190187 byteCobalah online!
Harus ada cara yang lebih baik untuk menangani kasus arity-1, saat ini membutuhkan 45 byte.
Suntingan:
pred
bukann-1
.Cobalah online!
sumber
Arang , 75 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Ulangi karakter input dan ubah menjadi daftar digit dengan
M
sufiks opsional .Balikkan daftar ini sehingga kami dapat menggunakannya
Pop
untuk mengkonsumsinya.Variabel ini adalah tumpukan token yang aritynya belum terpenuhi.
Variabel ini adalah tumpukan arity yang tersisa dari token yang tidak terpenuhi.
Ulangi sampai kami menghabiskan semua token dan mengosongkan tumpukan.
Dapatkan token berikutnya atau
0
jika tidak ada.Cetak token dan kemudian gerakkan kursor secara horizontal jika dimulai dengan
1
sebaliknya.Tambahkan token dan aritynya ke variabel yang sesuai.
Ulangi sementara tumpukan arity adalah kosong tapi arity atas adalah nol.
Buang nol arity.
Hapus tokennya dan pindahkan banyak karakter yang tersisa.
Jika ada arities yang tersisa maka kurangi arity atas.
sumber