Desafio
Escreva uma função que implemente a printf
formatação de string no estilo C.
Regras
- Você deve implementar pelo menos
%%
,%c
,%s
,%d
e%f
. - Você não deve usar um método de formatação de string interno.
- Você não deve executar programas externos ou conectar-se à Internet a partir do seu programa.
- Cabe a você decidir como lidar com entradas inválidas, mas seu programa não deve terminar de forma anormal.
- Você deve escrever uma função variável, se possível.
As palavras-chave "DEVEM", "NÃO DEVEM", "NECESSÁRIO", "DEVEM", "NÃO DEVEM", "DEVEM", "NÃO DEVEM", "RECOMENDADO", "PODE" e "OPCIONAL" neste documento são para ser interpretado como descrito na RFC 2119 .
%c
faz? Certamente%s
,%d
e%f
são para strings, ints e floats respectivamente, mas não tenho certeza%c
.%c
exibe o valor ASCII de um passado-in int IIRC97
e'a'
ambos ficama
na saída.%-02d
certo? apenas esses três% c,% s,% d?Respostas:
APL (73)
Alguns testes:
Explicação:
G←'%!',⍺
: prefixa um especificador fictício à string (para facilitar o processamento)(Z←G='%')/⍳⍴G
: encontre os índices de todos os%
caracteres na string; Também armazene uma máscara de bit emZ
⌷∘G¨1↓1+
: selecione todos os caracteres ao lado de se%
solte o manequim.⍵,⍪
: combine cada especificador com seu valor no argumento correto.{
...}/
: execute a seguinte função em cada par:'c'0≡⍵,∊⊃⍺
: se o argumento for um número e o especificador forc
::⎕UCS⍺
: retorne o valor unicode do argumento,⋄⍕⍺
: caso contrário, retorne a representação em cadeia do argumento.⊂
: delimitar⊂2∘↓¨Z⊂G
: divida a sequência nos se, em%
seguida, remova os dois primeiros caracteres de cada substring (é aqui que o manequim entra) e inclua o resultado disso.↑
: crie uma matriz com as duas matrizes incluídas, correspondendo cada substring com o valor que deve segui-lo.,⌿
: junte cada substring com seu valor.⊃,/
: em seguida, junte as strings resultantes.fonte
Ruby: 102 caracteres
Exemplo de execução:
Especificadores de formato inválidos são mantidos no lugar. Especificadores de formato sem valor de argumento são substituídos pelo valor vazio do tipo especificado.
fonte
f
Lua 5.2, 115 bytes
fonte
C ++ (281 caracteres)
Eu odeio C ++, mas parecia uma boa escolha (eu realmente escolheria C, senão esse
char*
ponteiro exige muito esforço para ser realmente útil). Recebechar*
argumentos estd::string
resulta, mas ei, isso é C ++, então quem se importa com consistência (em uma linguagem que não é consistente)?fonte
main
. Mas se você precisar de amostramain
, tente gist.github.com/xfix/8238576 (usei esse enquanto testava essa função).main
função significativa , adicionar uma apenas aumentaria a contagem de caracteres. Se não quisesse modificar o código, poderia adicionar um arquivo de cabeçalho que o acompanha e#include
a partir do meu programa de teste.Java ,
201186174 bytes12 bytes graças a Kevin Cruijssen
Experimente online!
fonte
=s.charAt(0)
a partirchar c=s.charAt(0)
. Ainda funciona no TIO quando faço isso.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 bytes (e um pouco mais através da conversão para Java 8, mas isso não é realmente sua coisa, não é?)