Défi
Écrivez une fonction qui implémente printf
la mise en forme des chaînes de style C.
Règles
- Vous devez mettre en œuvre au moins
%%
,%c
,%s
,%d
et%f
. - Vous ne devez pas utiliser une méthode de formatage de chaîne intégrée.
- Vous ne devez pas exécuter de programmes externes ni vous connecter à Internet à partir de votre programme.
- C'est à vous de décider comment gérer les entrées invalides, mais votre programme ne doit pas se terminer anormalement.
- Vous devriez écrire une fonction variadique si possible.
Les mots clés "DOIT", "NE DOIT PAS", "OBLIGATOIRE", "DOIT", "NE DOIT PAS", "DEVRAIT", "NE DEVRAIENT PAS", "RECOMMANDÉ", "MAI" et "FACULTATIF" dans ce document sont à interpréter comme décrit dans la RFC 2119 .
%c
-il? Plutôt sûr%s
,%d
et%f
sont respectives pour les cordes, les pouces et les flotteurs, mais pas sûrs%c
.%c
affiche la valeur ASCII d'un entier transmis IIRC97
et'a'
deviendrait tous les deuxa
sur la sortie.%-02d
? juste que trois% c,% s,% d?Réponses:
APL (73)
Quelques tests:
Explication:
G←'%!',⍺
: préfixe un spécificateur factice à la chaîne (pour un traitement plus facile)(Z←G='%')/⍳⍴G
: recherche les indices de tous les%
caractères de la chaîne; stocker également un bitmask dansZ
⌷∘G¨1↓1+
: sélectionnez tous les caractères à côté du%
s et déposez le mannequin.⍵,⍪
: faire correspondre chaque spécificateur avec sa valeur de l'argument de droite.{
...}/
: exécutez la fonction suivante sur chaque paire:'c'0≡⍵,∊⊃⍺
: si l'argument est un nombre et que le spécificateur estc
::⎕UCS⍺
: retourne ensuite la valeur unicode de l'argument,⋄⍕⍺
: sinon, retourne la représentation sous forme de chaîne de l'argument.⊂
: joindre⊂2∘↓¨Z⊂G
: divisez la chaîne sur le%
s puis supprimez les deux premiers caractères de chaque sous-chaîne (c'est là que le mannequin entre en jeu), et entourez le résultat de cela.↑
: créez une matrice à partir des deux tableaux fermés, en faisant correspondre chaque sous-chaîne avec la valeur qui doit la suivre.,⌿
: joindre chaque sous-chaîne avec sa valeur.⊃,/
: puis joignez les chaînes résultantes.la source
Ruby: 102 caractères
Exemple d'exécution:
Les spécificateurs de format non valides sont conservés. Les spécificateurs de format sans valeur d'argument sont remplacés par la valeur vide du type donné.
la source
f
Lua 5.2, 115 octets
la source
C ++ (281 caractères)
Je déteste le C ++, mais cela semblait être un bon choix (j'irais vraiment avec C, sinon ce
char*
pointeur nécessite trop d'efforts pour être réellement utile). Prend deschar*
arguments et desstd::string
résultats, mais bon, c'est C ++, alors qui se soucie de la cohérence (dans un langage qui lui-même n'est pas cohérent)?la source
main
. Mais si vous avez besoin d'un échantillonmain
, essayez gist.github.com/xfix/8238576 (j'ai utilisé celui-ci lors du test de cette fonction).main
fonction significative , en ajouter une augmenterait simplement le nombre de caractères. Si je ne voulais pas modifier le code, je pourrais ajouter un fichier d'en-tête d'accompagnement et#include
à partir de mon programme de test.Java ,
201186174 octets12 octets grâce à Kevin Cruijssen
Essayez-le en ligne!
la source
=s.charAt(0)
dechar c=s.charAt(0)
. Cela fonctionne toujours dans le TIO quand je le fais.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 octets (et encore plus en convertissant en Java 8, mais ce n'est pas vraiment votre truc, n'est-ce pas?)