Balikkan metode Format.
The Format
metode kelas String (atau equivallent, sepertisprintf
) tersedia dalam banyak bahasa. Pada dasarnya dibutuhkan string "Format" yang mungkin berisi placeholder dengan beberapa format tambahan, dan nol atau lebih nilai yang akan dimasukkan daripada placeholder itu.
Tugas Anda adalah mengimplementasikan fungsi terbalik dalam bahasa pilihan Anda.
API
Nama metode harus berupa format1
ataudeformat
.
Memasukkan : Parameter 1 akan menjadi string "Format", seperti dalam metode format asli. Parameter ke-2 adalah string yang diurai (lihat contoh di bawah). Tidak ada parameter lain yang diperlukan atau diizinkan.
Keluaran : array (atau bahasa pilihan Anda) dari nilai-nilai yang diekstraksi sesuai dengan placeholder dalam format.
Penampung yang {0}
, {1}
, {2}
, dll
Dalam hal format yang buruk Anda dapat melakukan kesalahan, atau mengembalikan apa pun yang Anda suka.
Dalam hal input tidak valid, Anda dapat melakukan kesalahan, atau mengembalikan apa pun yang Anda suka. Masukan tidak valid adalah sedemikian rupa sehingga tidak dapat dihasilkan oleh String.Format menggunakan format string yang sama, misalnya: '{0}{0}', 'AAB'
.
Contohnya
deformat('{0} {1}', 'hello world') => ['hello', 'world']
deformat('http{0}://', 'https://') => ['s']
deformat('http{0}://', 'http://') => [''] // array of one item which is an empty string
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
Kemenduaan
Dalam hal ambiguitas Anda dapat mengembalikan jawaban yang sesuai. Sebagai contoh:
deformat('{0} {1}', 'Edsger W. Dijkstra')
// both ['Edsger', 'W. Dijkstra'] and ['Edsger W.', 'Dijkstra'] are applicable.
Beberapa Aturan Lagi
- Untuk membuatnya lebih mudah, tidak perlu benar-benar mendukung pemformatan. Anda bisa melupakan semua tentang angka nol di depan, titik desimal atau masalah pembulatan. Hanya menghasilkan nilai sebagai string.
- Untuk membuatnya non-sepele, Ekspresi Reguler tidak diperbolehkan .
- Anda tidak perlu menjaga kurung kurawal dalam input (mis. Parameter input kedua tidak akan mengandung
{
s atau}
s).
Kemenangan
Ini golf kode ! (harus dibaca sebagai "Ini Sparta!") fungsi yang benar memiliki kemenangan terpendek. Celah standar dilarang.
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
, bagaimana jika kita malah diberikandeformat('{0}{1}{0}', 'AAAA')
?['', 'AAAA']
,['A', 'AA']
,['AA', '']
deformat('{0}{1}{0}', 'ABBA') => ['', 'ABBA']
? Jika demikian, ada solusi murah kecuali setiap string muncul setidaknya dua kali.deformat('{0}_{1}_{0}', 'A_BB_A')
?Jawaban:
Haskell, 220 karakter
Istirahat jika Anda menggunakan beberapa representasi untuk pola yang sama (
{1}
vs{01}
) - tidak menegakkan kesetaraan mereka, membuang kecocokan untuk semua kecuali satu representasi.19 karakter dapat disimpan dengan menghilangkan
mapKeys((0+).read)$
jika urutan yang cocok dari 10 pola tidak masalah, atau jika padding dengan panjang yang sama mungkin diperlukan, atau jika urutan pola dapat diterima. Bagaimanapun, jika suatu pola dihilangkan dari argumen pertama, itu juga dihilangkan dari hasilnya.Menghapus
!!0
dari ujung akanformat1
mengembalikan daftar semua solusi, bukan hanya yang pertama.sebelum bermain golf:
sumber
read
menyisakan Anda dengan tipe yang ambigu. Haskell tidak tahu tipe apa yang bisa dipesan untuk membaca kunci.+0
memaksa nomor, dari mana Haskell sudah dapat membuat pilihan sewenang-wenang dan berlaku untuk bilangan bulat.Ruby, 312 karakter
5 karakter dapat diselamatkan dengan memilih kecocokan dengan panjang nol, membuat
ABBA
solusi['', 'ABBA']
, dan bukan solusi yang disukai pertanyaan. Saya memilih untuk menafsirkan contoh sebagai bagian tersirat dari spesifikasi.sumber
Python, 208 karakter, meskipun tidak lengkap.
Fungsi menyapu kedua string secara bersamaan, sampai menemukan penjepit pembuka di string input, menandakan placeholder.
Kemudian, diasumsikan placeholder telah diperluas, dan mencoba untuk memajukan indeks string keluaran melewatinya dengan melihat daftar nilai yang ditemukan sejauh ini.
Jika belum diperluas, ia akan menambah entri baru ke daftar nilai, dan mulai menambahkan karakter dari string output hingga mencapai karakter setelah placeholder di string input.
Ketika sampai di akhir string input, ia mengembalikan nilai yang ditemukan sejauh ini.
Ini berfungsi dengan baik untuk input sederhana, tetapi memiliki sejumlah masalah:
Ini membutuhkan pembatas yang diketahui setelah setiap placeholder dalam input, sehingga tidak bekerja dengan placeholder tepat di sebelah satu sama lain yaitu "{0} {1}". Inilah sebabnya saya perlu menambahkan char space ke kedua string.
Itu mengasumsikan contoh pertama dari setiap placeholder berada dalam urutan misalnya "{ 0 } { 1 } {1} {0} { 2 }".
Ini hanya berfungsi untuk 10 penampung pertama karena mengasumsikan panjangnya 3 karakter.
Sama sekali tidak menangani kasus ambigu :(
sumber
Kode C ++ 11, 386 karakter
Fungsi format1 memiliki 2 string sebagai input (const char *) dan mengembalikan hashmap dengan integer kunci (pola) dan nilai adalah string yang diidentifikasi. Jika tidak ada yang ditemukan atau kesalahan, hashmap kosong dikembalikan.
Pemakaian:
Keluaran:
Contoh 2:
Keluaran:
Pola dalam representasi desimal, input lebih besar dari yang
MAXINT
akan meluap tetapi masih berfungsi.Meskipun ada solusi yang lebih kecil dalam bahasa pemrograman lain, ini adalah C ++ terkecil - namun! :)
Ini adalah kode sebelum bermain golf:
sumber