Wyzwanie
Napisz funkcję, która implementuje printf
formatowanie ciągów w stylu C.
Zasady
- Państwo musi wdrożyć przynajmniej
%%
,%c
,%s
,%d
i%f
. - Nie wolno używać wbudowanej metody formatowania ciągów.
- Nie wolno uruchamiać programów zewnętrznych ani łączyć się z Internetem z poziomu programu.
- Ty decydujesz, jak obsłużyć nieprawidłowe dane, ale Twój program nie może zakończyć się nienormalnie.
- Jeśli to możliwe, powinieneś napisać funkcję wariadyczną .
Słowa kluczowe „MUSZĄ”, „MUSI NIE”, „WYMAGANE”, „MUSZĄ”, „NIE MUSZĄ”, „POWINNY”, „NIE POWINNY”, „ZALECANE”, „MAJĄ” i „OPCJONALNIE” w tym dokumencie to należy interpretować zgodnie z opisem w RFC 2119 .
%c
zrobić? Całkiem pewny%s
,%d
i%f
są na smyczki, wskazówki i pływaków respectivelly, ale pewien%c
.%c
wyświetla wartość ASCII przekazanego int IIRC97
i'a'
oba stanąa
się na wyjściu.%-02d
prawda? tylko trzy% c,% s,% d?Odpowiedzi:
APL (73)
Niektóre testy:
Wyjaśnienie:
G←'%!',⍺
: przedrostek fikcyjnego specyfikatora do łańcucha (dla łatwiejszego przetwarzania)(Z←G='%')/⍳⍴G
: znajdź indeksy wszystkich%
znaków w ciągu; przechowuj także maskę bitów wZ
⌷∘G¨1↓1+
: wybierz wszystkie znaki obok%
s i upuść manekina.⍵,⍪
: dopasuj każdy specyfikator do wartości z odpowiedniego argumentu.{
...}/
: uruchom następującą funkcję dla każdej pary:'c'0≡⍵,∊⊃⍺
: jeśli argument jest liczbą, a specyfikatorem jestc
::⎕UCS⍺
: następnie zwróć wartość Unicode argumentu,⋄⍕⍺
: w przeciwnym razie zwraca ciąg reprezentujący argument.⊂
: załącz⊂2∘↓¨Z⊂G
: podziel ciąg znaków na%
s, a następnie usuń pierwsze dwa znaki z każdego podłańcucha (tutaj przychodzi manekin) i dołącz wynik tego.↑
: utwórz matrycę z dwóch zamkniętych tablic, dopasowując każdy podciąg do wartości, która powinna za nim podążać.,⌿
: połącz każdy podciąg z jego wartością.⊃,/
: następnie dołącz wynikowe ciągi.źródło
Rubin: 102 znaki
Przykładowy przebieg:
Niepoprawne specyfikatory formatu są przechowywane na miejscu. Specyfikatory formatu bez wartości argumentu są zastępowane pustą wartością danego typu.
źródło
f
Lua 5.2, 115 bajtów
źródło
C ++ (281 znaków)
Nienawidzę C ++, ale wydawało mi się, że to dobry wybór (naprawdę wybrałbym C, jeśli nie, ten
char*
wskaźnik wymaga zbyt wiele wysiłku, aby był naprawdę użyteczny). Bierzechar*
argumenty istd::string
wynik, ale hej, to jest C ++, więc kogo obchodzi spójność (w języku, który sam nie jest spójny)?źródło
main
. Ale jeśli potrzebujesz próbkimain
, spróbuj gist.github.com/xfix/8238576 (użyłem tego podczas testowania tej funkcji).main
funkcji, dodanie jednej zwiększy liczbę znaków. Gdybym nie chciał modyfikować kodu, mógłbym dodać towarzyszący mu plik nagłówkowy i#include
mój program testowy.Java ,
201186174 bajtów12 bajtów dzięki Kevin Cruijssen
Wypróbuj online!
źródło
=s.charAt(0)
zchar c=s.charAt(0)
. Nadal działa w TIO, kiedy to robię.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 bajtów (i trochę więcej, przechodząc na Javę 8, ale to nie jest twoja sprawa, prawda?)