Le problème"
Définissez une fonction log
(ou un autre nom à 3 lettres) qui, lorsqu'elle sera appelée, enregistrera / imprimera / écrira (quelle que soit la valeur par défaut pour la langue en question) à la fois l'instruction (en tant que source) et le premier argument. En d'autres termes:
i=777
j=333
log(i) //outputs: "log(i) 777"
log(i+j+1) //outputs: "log(i+j+1) 1111"
À toutes fins pratiques, la sortie i: 777
serait suffisante, mais dans certaines langues, il existe des bibliothèques de réflexion très spécifiques pour cela, et ce ne serait pas un défi, donc l'instruction entière devrait être sortie.
Inspiration
L'inspiration pour cela était moi et un autre programmeur discutant à quel point il est irritant que souvent (avec de mauvais débogueurs), vous écrivez des choses comme console.log("i:", i)
, ensuite nous avons fait une solution (assez folle) javascript (nœud uniquement) (elle génère i: 777
plutôt que la ligne entière de source) qui était étonnamment longue et m'a rappelé le codegolfing et m'a fait me demander à quel point les autres langues (en particulier le golf de code) s'en tireraient mieux.
Bonus
-10% : pas de lecture de fichier (au-delà du compilateur)
PS. C'est ma première «question» ici, alors n'hésitez pas à signaler toutes les erreurs que j'ai faites.
help/on-topic
(il est mentionné, mais je n'ai pas jugé utile de vérifier la façon dont il a été décrit ici).Réponses:
C
(40-10% = 36)(38-10% = 34,2)Notez qu'en C, une
log
fonction ne peut être définie que pour un type spécifique. Par conséquent, cettelog
"fonction" ne prend que desint
arguments.Une solution plus générale spécifie comment imprimer l'argument, en plus de l'argument lui-même:
qui serait utilisé par exemple
lg2("%s", "I'm a string");
oulg2("%f", 3.1415)
.la source
x
soient nécessaires.Python (65-10% = 58,5)
Cela suppose que votre code se trouve dans un fichier (il produit une sortie étrange s'il est appelé dans l'interpréteur interactif):
Il a été testé sur Python 2.7.6.
Exemple:
les sorties
la source
C ++
1217167-10% = 60,3Utilisé comme ceci:
Les sorties:
la source
#define log(x)printf("log(%s) %d\n",#x,x)
mais cela ne fonctionnera qu'avec des entiers.Rebol3 - 31,5 (35 - 10%)
Voici une implémentation simple raccourcie de @draegtun qui fonctionne bien pour les nombres:
Le lancer génère:
Il peut être beaucoup plus flexible (pour afficher la forme de types non numériques) à 42,3 caractères (47 - 10%)
Le résultat:
la source
Javascript (325)
Je pense que c'est la
log
fonction que vous recherchez:Usage
Production
Code long
Fonctionne uniquement lorsque le script est placé dans la
<script>
balise qui est placée dans le.html
document car il envoie une demandelocation.href
pour obtenir le code source. JSfiddle, F12 Dev Tool Console, les.js
fichiers intégrés ne fonctionneront pas, j'essaie de le rendre disponible partout ...Quoi qu'il en soit, cette question est intéressante.
la source
Scala - (221 - 10%) = 198,9
Ouais les macros! C'est en fait exactement le genre de choses pour lesquelles ils sont.
Version lisible:
Exemple:
Les sorties:
Étant donné que l'addition est un appel de méthode dans Scala, il ajoute cette syntaxe verbeuse, mais c'est assez proche! C'est aussi un peu plus verbeux dans quelques autres cas.
la source
bash (21 - 10% = 18,9)
Cette:
Ensuite, utilisez
log
comme vous utiliseriezecho
:ou
Cette méthode fera tout ce qui est nécessaire; en bonus, des informations supplémentaires seront également imprimées, mais aucune règle explicite ne l'interdit.
la source
FRAPPER
Les arguments ne sont pas passés en utilisant "(...)" dans BASH, donc je laisse la sortie de 'log ()' s'adapter à ce style:
la source
$((...))
peut être à la$[...]
place mais je n'ai pas compté les caractères, donc ça n'a pas d'importance jusqu'à présent.Clojure
L'homoiconicité a ses avantages!
Utiliser:
Voyons ce qui se passe avec
macroexpand
:la source
x
, avez-vous vraiment besoin d'utiliser un gensym intermédiaire (ie.x#
)? Je pense que vous n'évaluerez l'expression qu'une seule fois (btw, je ne suis pas un expert de Clojure)Julia, 51 * 0,9 = 45,9
Alternativement, mais ne respectant pas les règles
la source
Tcl, 42,3 (47 - 10%)
Usage:
Edit : petite amélioration
la source
Lisp commun - 119,7 (133-10%)
@
carlog
est la fonction de logarithme standard et verrouillé par défaut (au moins sur SBCL). De plus, il@
ne contient qu'un seul caractère.progn
, prenant un nombre variable d'arguments, mais imprime sur la sortie standard. Dans les applications réelles, j'aurais probablementsignal
une condition avec une expression S au lieu d'imprimer une sortie séparée par un espace.(@ x)
peut être utilisée chaque fois qu'ellex
est utilisée.prin1
, quiread
génère une chaîne -able. Ceci est utile lorsque vous essayez de reproduire des expressions enregistrées.Exemples de sorties:
Et enfin, si je me connecte ci-dessus
defmacro
, j'ai la version non golfée:la source
PHP 138
Vous ne pouvez pas redéclarer
log
en PHP sans utiliser un autre module (APD
) donc j'ai utilisé à lalogg
place, je peux resoumettre aveclog
exemple si nécessaire. C'est mineur, mais plus pécheresse, je suppose, c'est que cela suppose que la fonction de journal est sur une ligne par elle-même. Je peux mettre à jour ma réponse en fonction des commentaires.exemple de sortie:
la source
JavaScript
5553Usage:
Production:
Vous DEVEZ utiliser des guillemets doubles
"
sinon cela ne fonctionnera pas.la source
log("i:", i)
'
"
console.log('log('+o+')'+eval(x))
arguments.callee.caller.toString()
, mais je n'ai pas pu déterminer quelle ligne est laquelle lorsque vous avez deux journaux.