Вызов
Напишите функцию, которая реализует printf
форматирование строки в стиле C.
правила
- Вы должны реализовать , по крайней мере
%%
,%c
,%s
,%d
и%f
. - Вы не должны использовать встроенный метод форматирования строки.
- Вы не должны запускать внешние программы или подключаться к Интернету из вашей программы.
- Вам решать, как обрабатывать неверный ввод, но ваша программа не должна завершаться ненормально.
- Вы должны написать переменную функцию, если это возможно.
Ключевые слова «ДОЛЖЕН», «НЕ ДОЛЖЕН», «ТРЕБУЕТСЯ», «ДОЛЖЕН», «НЕ ДОЛЖЕН», «СЛЕДУЕТ», «НЕ ДОЛЖЕН», «РЕКОМЕНДУЕТСЯ», «МОЖЕТ» и «ДОПОЛНИТЕЛЬНО» в этом документе интерпретироваться как описано в RFC 2119 .
%c
? Довольно уверен%s
,%d
и%f
для строк, целых и плавающих соответственно, но не уверен%c
.%c
отображает значение ASCII переданного int IIRC97
и'a'
стал быa
на выходе.%-02d
правильно? только три% c,% s,% d?Ответы:
APL (73)
Некоторые тесты:
Объяснение:
G←'%!',⍺
: префикс фиктивного спецификатора к строке (для упрощения обработки)(Z←G='%')/⍳⍴G
: найти индексы всех%
символов в строке; также хранить битовую маску вZ
⌷∘G¨1↓1+
: выберите все символы рядом с%
s и бросьте манекен.⍵,⍪
: сопоставить каждый спецификатор с его значением из правильного аргумента.{
...}/
: запустить следующую функцию для каждой пары:'c'0≡⍵,∊⊃⍺
: если аргумент является числом, а спецификаторc
::⎕UCS⍺
: затем вернуть значение аргумента в юникоде,⋄⍕⍺
: в противном случае возвращает строковое представление аргумента.⊂
: приложить⊂2∘↓¨Z⊂G
: разбить строку на%
s, а затем удалить первые два символа каждой подстроки (это то место, где фигурирует манекен), и заключить результат этого.↑
: сделать матрицу из двух вложенных массивов, сопоставляя каждую подстроку со значением, которое должно следовать за ней.,⌿
: объединить каждую подстроку с ее значением.⊃,/
: затем присоедините получившиеся строки.источник
Рубин: 102 персонажа
Образец прогона:
Неверные спецификаторы формата остаются на месте. Спецификаторы формата без значения аргумента заменяются пустым значением данного типа.
источник
f
Lua 5.2, 115 байт
источник
C ++ (281 символ)
Я ненавижу C ++, но мне показалось, что это хороший выбор (я действительно выбрал бы C, если бы этот
char*
указатель не потребовал слишком много усилий, чтобы быть действительно полезным). Принимаетchar*
аргументы иstd::string
результат, но, эй, это C ++, так кого волнует согласованность (на языке, который сам не согласован)?источник
main
. Но если вам нужен примерmain
, попробуйте gist.github.com/xfix/8238576 (я использовал его при тестировании этой функции).main
функцию, добавив одну, вы просто увеличите количество символов. Если я не хочу изменять код, я могу добавить сопровождающий заголовочный файл и#include
его из моей тестовой программы.Java ,
201186174 байта12 байтов благодаря Кевину Круйссену
Попробуйте онлайн!
источник
=s.charAt(0)
изchar c=s.charAt(0)
. Это все еще работает в TIO, когда я так делаю.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 байтов (и еще больше, конвертируя в Java 8, но это не ваше дело, не так ли?)