Tantangan
Tulis fungsi yang mengimplementasikan printf
pemformatan string gaya- C .
Aturan
- Anda harus menerapkan setidaknya
%%
,%c
,%s
,%d
dan%f
. - Anda tidak boleh menggunakan metode pemformatan string bawaan.
- Anda tidak boleh menjalankan program eksternal atau terhubung ke Internet dari program Anda.
- Terserah Anda untuk memutuskan bagaimana menangani input yang tidak valid, tetapi program Anda tidak boleh berhenti secara tidak normal.
- Anda harus menulis fungsi variadik jika memungkinkan.
Kata kunci "HARUS", "HARUS TIDAK", "DIPERLUKAN", "AKAN", "TIDAK AKAN", "HARUS TIDAK", "HARUS TIDAK", "DIREKOMENDASIKAN", "MUNGKIN", dan "OPTIONAL" dalam dokumen ini adalah untuk ditafsirkan seperti yang dijelaskan dalam RFC 2119 .
%c
harus dilakukan Cukup yakin%s
,%d
dan%f
untuk string, int dan mengapung dengan hormat, tetapi tidak yakin%c
.%c
menampilkan nilai ASCII dari int IIRC yang lewat97
dan'a'
keduanya akan menjadia
pada output.%-02d
kan? Hanya tiga% c,% s,% d?Jawaban:
APL (73)
Beberapa tes:
Penjelasan:
G←'%!',⍺
: awali specifier dummy ke string (untuk memudahkan pemrosesan)(Z←G='%')/⍳⍴G
: temukan indeks semua%
karakter dalam string; juga menyimpan bitmask diZ
⌷∘G¨1↓1+
: pilih semua karakter di sebelah huruf%
s, dan jatuhkan boneka.⍵,⍪
: cocokkan setiap specifier dengan nilainya dari argumen yang tepat.{
...}/
: jalankan fungsi berikut pada setiap pasangan:'c'0≡⍵,∊⊃⍺
: jika argumennya adalah angka dan specifiernya adalahc
::⎕UCS⍺
: lalu kembalikan nilai unicode argumen,⋄⍕⍺
: jika tidak, kembalikan representasi string argumen.⊂
: melampirkan⊂2∘↓¨Z⊂G
: pisahkan string pada%
s dan kemudian hapus dua karakter pertama dari masing-masing substring (ini adalah tempat dummy masuk), dan lampirkan hasilnya.↑
: buat matriks dari dua array terlampir, sesuaikan setiap substring dengan nilai yang harus mengikutinya.,⌿
: gabungkan setiap substring dengan nilainya.⊃,/
: lalu gabungkan string yang dihasilkan.sumber
Ruby: 102 karakter
Contoh dijalankan:
Penentu format tidak valid disimpan. Penentu format tanpa nilai argumen diganti dengan nilai kosong dari tipe yang diberikan.
sumber
f
Lua 5.2, 115 byte
sumber
C ++ (281 karakter)
Saya benci C ++, tapi sepertinya pilihan yang baik (saya benar-benar akan pergi dengan C, jika tidak
char*
pointer itu memerlukan terlalu banyak usaha untuk benar-benar berguna). Membawachar*
argumen, danstd::string
hasil, tapi hei, itu C ++, jadi siapa yang peduli tentang konsistensi (dalam bahasa itu sendiri tidak konsisten)?sumber
main
. Tetapi jika Anda memerlukan sampelmain
, coba gist.github.com/xfix/8238576 (Saya menggunakan yang itu saat menguji fungsi ini).main
fungsi yang bermakna , menambahkan satu hanya akan meningkatkan jumlah karakter. Jika saya tidak ingin mengubah kode, saya bisa menambahkan file header yang menyertainya dan#include
dari program pengujian saya.Java ,
201186174 byte12 byte terima kasih kepada Kevin Cruijssen
Cobalah online!
sumber
=s.charAt(0)
darichar c=s.charAt(0)
. Itu masih berfungsi di TIO ketika saya melakukannya.void f(String s,Object...a){for(char c,i=0,j=0;i<s.length();System.out.print(c==37?(c=s.charAt(i++))<38?c:c==99?(char)(int)a[j++]:a[j++]:c==37?"":c))c=s.charAt(i++);}
166 byte (dan beberapa lagi dengan mengkonversi ke Java 8, tetapi itu tidak benar-benar hal Anda, bukan?)