Herausforderung
Schreiben Sie eine Funktion, die die printf
Formatierung von C- Zeichenfolgen implementiert .
Regeln
- Sie müssen mindestens implementieren
%%
,%c
,%s
,%d
und%f
. - Sie dürfen keine integrierte Formatierungsmethode für Zeichenfolgen verwenden.
- Sie dürfen keine externen Programme ausführen oder von Ihrem Programm aus eine Verbindung zum Internet herstellen.
- Es liegt an Ihnen, zu entscheiden, wie mit ungültigen Eingaben umgegangen werden soll, aber Ihr Programm darf nicht abnormal beendet werden.
- Wenn möglich, sollten Sie eine variable Funktion schreiben .
Die Schlüsselwörter "MUSS", "MUSS NICHT", "ERFORDERLICH", "MUSS", "MUSS NICHT", "SOLLTE", "SOLLTE NICHT", "EMPFOHLEN", "KÖNNEN" und "OPTIONAL" in diesem Dokument lauten zu interpretieren wie in RFC 2119 beschrieben .
%c
das Ziemlich sicher%s
,%d
und%f
sind für Streicher, Ints und Schwimmer respectivelly, aber nicht sicher%c
.%c
zeigt den ASCII - Wert eines übergebenen in int IIRC97
und'a'
beide würdena
auf der Ausgabe werden.%-02d
richtig zu unterstützen? nur dass drei% c,% s,% d?Antworten:
APL (73)
Einige Tests:
Erläuterung:
G←'%!',⍺
: Stellen Sie der Zeichenfolge einen Dummy-Bezeichner voran (zur einfacheren Verarbeitung)(Z←G='%')/⍳⍴G
: finde die Indizes aller%
Zeichen in der Zeichenfolge; Speichern Sie auch eine Bitmaske inZ
⌷∘G¨1↓1+
: Wählen Sie alle Zeichen neben dem%
s aus und lassen Sie den Dummy fallen.⍵,⍪
: Ordnen Sie jedem Bezeichner seinen Wert aus dem richtigen Argument zu.{
...}/
: Führen Sie für jedes Paar die folgende Funktion aus:'c'0≡⍵,∊⊃⍺
: Wenn das Argument eine Zahl ist und der Bezeichner lautetc
::⎕UCS⍺
: Geben Sie dann den Unicode-Wert des Arguments zurück.⋄⍕⍺
: Andernfalls geben Sie die Zeichenfolgendarstellung des Arguments zurück.⊂
: einschließen⊂2∘↓¨Z⊂G
: Teilen Sie die Zeichenfolge auf dem%
s und entfernen Sie dann die ersten beiden Zeichen jeder Teilzeichenfolge (hier kommt der Dummy ins Spiel) und fügen Sie das Ergebnis hinzu.↑
: Erstellen Sie aus den beiden eingeschlossenen Arrays eine Matrix, indem Sie jeden Teilstring mit dem Wert abgleichen, der darauf folgen soll.,⌿
: Verbinden Sie jeden Teilstring mit seinem Wert.⊃,/
: Verbinden Sie dann die resultierenden Zeichenfolgen.quelle
Ruby: 102 Zeichen
Probelauf:
Ungültige Formatspezifizierer bleiben erhalten. Formatbezeichner ohne Argumentwert werden durch den leeren Wert des angegebenen Typs ersetzt.
quelle
f
Lua 5,2, 115 Bytes
quelle
C ++ (281 Zeichen)
Ich hasse C ++, aber es schien eine gute Wahl zu sein (ich würde wirklich mit C gehen, wenn dieser
char*
Zeiger nicht zu viel Aufwand erfordert, um wirklich nützlich zu sein). Nimmtchar*
Argumente undstd::string
Ergebnisse, aber hey, das ist C ++. Wen interessiert also die Konsistenz (in einer Sprache, die selbst nicht konsistent ist)?quelle
main
. Wenn Sie jedoch ein Beispiel benötigenmain
, versuchen Sie es mit gist.github.com/xfix/8238576 (ich habe dieses beim Testen dieser Funktion verwendet).main
Funktion erstellen. Wenn Sie eine hinzufügen, erhöht sich nur die Anzahl der Zeichen. Wenn ich den Code nicht ändern wollte, konnte ich eine zugehörige Header-Datei und#include
diese aus meinem Testprogramm hinzufügen .Java ,
201186174 Bytes12 Bytes dank Kevin Cruijssen
Probieren Sie es online aus!
quelle
=s.charAt(0)
auschar c=s.charAt(0)
. Es funktioniert immer noch im TIO, wenn ich das tue.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 (und einige weitere durch Konvertieren in Java 8, aber das ist nicht wirklich Ihr Ding, oder?)