Das Problem"
Definieren Sie eine Funktion log
(oder einen anderen 3-Buchstaben-Namen), die beim Aufruf sowohl die Anweisung (als Quelle) als auch das erste Argument protokolliert / druckt / schreibt (was auch immer die Standardeinstellung für die betreffende Sprache ist). Mit anderen Worten:
i=777
j=333
log(i) //outputs: "log(i) 777"
log(i+j+1) //outputs: "log(i+j+1) 1111"
Für alle praktischen Zwecke würde die Ausgabe i: 777
ausreichen, aber in einigen Sprachen gibt es dafür sehr spezielle Reflektionsbibliotheken, und das wäre keine Herausforderung, weshalb die gesamte Anweisung ausgegeben werden sollte.
Inspiration
Die Inspiration dafür war, dass ich und ein anderer Programmierer darüber diskutierten, wie irritierend es ist, dass Sie oft (mit schlechten Debuggern) Dinge schreiben console.log("i:", i)
, als nächstes haben wir eine (ziemlich verrückte) Javascript-Lösung (nur Knoten) erstellt (sie gibt i: 777
eher als die gesamte Zeile aus) Quelle), die überraschend lang war und mich an Codegolf erinnerte und mich fragen ließ, wie viel besser andere (insbesondere Code-Golf) Sprachen abschneiden würden.
Boni
-10% : Kein Lesen von Dateien (außerhalb des Compilers)
PS. Dies ist meine erste "Frage" hier, also zögern Sie nicht, auf Fehler hinzuweisen, die ich gemacht habe.
help/on-topic
(es wird erwähnt, aber ich fand es nicht wert, die Beschreibung dort zu überprüfen).Antworten:
C
(40-10% = 36)(38-10% = 34,2)Beachten Sie, dass in C eine
log
Funktion nur für einen bestimmten Typ definiert werden kann. Daher akzeptiert dieselog
"Funktion" nurint
Argumente.Eine allgemeinere Lösung gibt an, wie das Argument zusätzlich zum Argument selbst gedruckt werden soll:
was würde als zB
lg2("%s", "I'm a string");
oder verwendet werdenlg2("%f", 3.1415)
.quelle
x
notwendig sind.Python (65 - 10% = 58,5)
Dies setzt voraus, dass sich Ihr Code in einer Datei befindet (bei Aufruf im interaktiven Interpreter wird eine ungerade Ausgabe erzeugt):
Es wurde auf Python 2.7.6 getestet.
Beispiel:
Ausgänge
quelle
C ++
1217167 -10% = 60,3So verwendet:
Ausgänge:
quelle
#define log(x)printf("log(%s) %d\n",#x,x)
funktioniert jedoch nur für Ganzzahlen.Rebol3 - 31,5 (35 - 10%)
Hier ist eine einfache Implementierung, die von @draegtun abgekürzt wurde und für Zahlen gut funktioniert:
Ausführen von Ausgaben:
Es kann bei 42,3 Zeichen (47 - 10%) viel flexibler sein (um die Form von Nicht-Nummern-Typen anzuzeigen )
Die Ausgabe:
quelle
Javascript (325)
Ich denke, das ist die
log
Funktion, die Sie suchen:Verwendung
Ausgabe
Langer Code
Funktioniert nur, wenn das Skript in einem
<script>
Tag abgelegt ist, das im.html
Dokument abgelegt ist, da es eine Anforderunglocation.href
zum Abrufen des Quellcodes sendet . JSfiddle, F12 Dev Tool Console, eingebettet.js
Dateien funktionieren nicht, ich versuche, sie überall verfügbar zu machen ...Jedenfalls ist diese Frage interessant.
quelle
Scala - (221-10%) = 198,9
Ja, Makros! Dies ist eigentlich genau die Art von Sachen, für die sie sind.
Lesbare Version:
Beispiel:
Ausgänge:
Da das Addieren ein Methodenaufruf in Scala ist, wird die ausführliche Syntax wieder hinzugefügt, aber es ist ziemlich nah! In einigen anderen Fällen ist es auch etwas ausführlicher.
quelle
Bash (21 - 10% = 18,9)
Dies:
Dann verwenden
log
Sie wie gewohntecho
:oder
Diese Methode erledigt alles, was erforderlich ist. Als Bonus werden einige zusätzliche Informationen gedruckt, die jedoch nicht ausdrücklich verboten sind.
quelle
BASH
Argumente werden in BASH nicht mit "(...)" übergeben, daher lasse ich die Ausgabe von 'log ()' zu diesem Stil passen:
quelle
$((...))
kann$[...]
stattdessen sein, aber ich habe die Zeichen nicht gezählt, so dass es bis jetzt keine Rolle spielt.Clojure
Homoikonizität hat ihre Vorteile!
Benutzen:
Mal sehen, was passiert mit
macroexpand
:quelle
x
, müssen Sie wirklich ein mittleres Gensym (dhx#
) verwenden? Ich denke, Sie werden den Ausdruck nur einmal bewerten (übrigens bin ich kein Clojure-Experte)Julia, 51 * 0,9 = 45,9
Alternativ aber nicht den Regeln entsprechend
quelle
Tcl, 42,3 (47 - 10%)
Verwendung:
Edit : kleine Verbesserung
quelle
Gemeines Lisp - 119,7 (133 -10%)
@
weillog
der Standard Logarithmusfunktion und standardmäßig gesperrt (zumindest auf SBCL). Außerdem@
ist nur ein Zeichen lang.progn
Variable mit einer variablen Anzahl von Argumenten, wird jedoch auf die Standardausgabe gedruckt. In realen Anwendungen würde ich wahrscheinlichsignal
eine Bedingung mit einem S-Ausdruck verwenden, anstatt eine durch Leerzeichen getrennte Ausgabe zu drucken.(@ x)
verwendet werden kann, wannx
immer er verwendet wird.prin1
, die eineread
-able Zeichenfolge ausgibt . Dies ist nützlich, wenn Sie versuchen, protokollierte Ausdrücke zu reproduzieren.Beispielausgaben:
Und schließlich, wenn ich das Obige
defmacro
anmelde, habe ich die ungolfed Version:quelle
PHP 138
Sie können
log
in PHP nicht neu deklarieren, ohne ein anderes Modul (APD
) zu verwenden. Ich habe eslogg
stattdessen verwendet und kann eslog
bei Bedarf mit einem Beispiel erneut einreichen . Das ist geringfügig, aber sündiger, denke ich, ist die Annahme, dass die Protokollfunktion in einer eigenen Zeile ist. Ich kann meine Antwort entsprechend den Kommentaren aktualisieren.Beispielausgabe:
quelle
JavaScript
5553Verwendung:
Ausgabe:
Sie MÜSSEN doppelte Anführungszeichen verwenden,
"
sonst funktioniert es nicht.quelle
log("i:", i)
... Ich glaube nicht, dass es ohne'
oder"
in js nicht möglich ist ... Sie können es mit verkleinern,console.log('log('+o+')'+eval(x))
aber die Ausgabearguments.callee.caller.toString()
, aber ich konnte nicht herausfinden, welche Zeile welche ist, wenn Sie zwei Protokolle haben.