Desafío
Escriba una función que implemente el printf
formato de cadena de estilo C.
Reglas
- Usted debe implementar al menos
%%
,%c
,%s
,%d
y%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 .
%c
hacer? Bastante seguro%s
,%d
y%f
son para cadenas, ints y flotadores respectivamente, pero no estoy seguro%c
.%c
muestra el valor ASCII de un int IIRC pasado97
y'a'
ambos se convertirána
en la salida.%-02d
correcta? 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
f
Lua 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::string
resultados, 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).main
funció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#include
desde 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?)