Desafío
Escriba una función que implemente el printfformato de cadena de estilo C.
Reglas
- Usted debe implementar al menos
%%,%c,%s,%dy%f. - No debe utilizar un método de formateo de cadena incorporado.
- No debe ejecutar programas externos ni conectarse a Internet desde su programa.
- Depende de usted decidir cómo manejar la entrada no válida, pero su programa no debe finalizar de manera anormal.
- Usted debe escribir una función variadic si es posible.
Las palabras clave "DEBE", "NO DEBE", "REQUERIDO", "DEBE", "NO DEBE", "DEBE", "NO DEBE", "RECOMENDARSE", "PUEDE" y "OPCIONAL" en este documento. para ser interpretado como se describe en RFC 2119 .

%chacer? Bastante seguro%s,%dy%fson para cadenas, ints y flotadores respectivamente, pero no estoy seguro%c.%cmuestra el valor ASCII de un int IIRC pasado97y'a'ambos se convertiránaen la salida.%-02dcorrecta? solo eso tres% c,% s,% d?Respuestas:
APL (73)
Algunas pruebas:
Explicación:
G←'%!',⍺: prefija un especificador ficticio a la cadena (para un procesamiento más fácil)(Z←G='%')/⍳⍴G: encuentra los índices de todos los%caracteres en la cadena; También almacenar una máscara de bits enZ⌷∘G¨1↓1+: seleccione todos los caracteres al lado de la%s, y suelte el maniquí.⍵,⍪: empareja cada especificador con su valor del argumento correcto.{...}/: ejecuta la siguiente función en cada par:'c'0≡⍵,∊⊃⍺: si el argumento es un número y el especificador esc::⎕UCS⍺: luego devuelve el valor unicode del argumento,⋄⍕⍺: de lo contrario, devuelve la representación de cadena del argumento.⊂: encerrar⊂2∘↓¨Z⊂G: divide la cadena en%s y luego elimina los dos primeros caracteres de cada subcadena (aquí es donde entra el ficticio) y encierra el resultado de eso.↑: crea una matriz con las dos matrices encerradas, haciendo coincidir cada subcadena con el valor que debería seguir.,⌿: une cada subcadena con su valor.⊃,/: luego une las cadenas resultantes.fuente
Ruby: 102 caracteres
Ejecución de muestra:
Los especificadores de formato no válidos se mantienen en su lugar. Los especificadores de formato sin valor de argumento se reemplazan con el valor vacío del tipo dado.
fuente
fLua 5.2, 115 bytes
fuente
C ++ (281 caracteres)
Odio C ++, pero parecía una buena opción (realmente iría con C, si no ese
char*puntero requiere demasiado esfuerzo para ser realmente útil). Tomachar*argumentos ystd::stringresultados, pero bueno, eso es C ++, entonces, ¿a quién le importa la consistencia (en un lenguaje que en sí mismo no es consistente)?fuente
main. Pero si necesita una muestramain, pruebe gist.github.com/xfix/8238576 (usé esa mientras probaba esta función).mainfunción significativa , agregar una solo aumentaría el recuento de caracteres. Si no quisiera modificar el código, podría agregar un archivo de encabezado adjunto y#includedesde mi programa de prueba.Java ,
201186174 bytes12 bytes gracias a Kevin Cruijssen
Pruébalo en línea!
fuente
=s.charAt(0)dechar c=s.charAt(0). Todavía funciona en el TIO cuando lo hago.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 (y algo más al convertir a Java 8, pero eso no es lo suyo, ¿verdad?)