Проблема"
Определите функцию log
(или другое трехбуквенное имя), которая при вызове будет регистрировать / печатать / записывать (независимо от того, что по умолчанию для рассматриваемого языка) как инструкцию (как источник), так и первый аргумент. Другими словами:
i=777
j=333
log(i) //outputs: "log(i) 777"
log(i+j+1) //outputs: "log(i+j+1) 1111"
Для всех практических целей i: 777
будет достаточно вывода , но в некоторых языках для этого есть очень специфичные библиотеки отражений, и это не будет проблемой, поэтому должна быть выведена вся инструкция.
вдохновение
Вдохновением для этого послужили я и другой программист, обсуждающие, как это раздражает, что часто (с плохими отладчиками) вы пишете что-то вроде console.log("i:", i)
следующего: мы сделали (довольно сумасшедшее) решение javascript (только для узла) (оно выводит, i: 777
а не всю строку source), который был на удивление длинным и напомнил мне о Codegolfing и заставил меня задаться вопросом, насколько лучше другие (особенно Code-Golf) языки будут жить.
Бонусы
-10% : нет чтения файлов (кроме компилятора)
PS. Это мой первый «вопрос», поэтому не стесняйтесь указывать на любые ошибки, которые я допустил.
help/on-topic
(упоминается, но я не считаю, что стоит проверить, как это там описано).Ответы:
С
(40 -10% = 36)(38 -10% = 34,2)Обратите внимание, что в C
log
функция может быть определена только для определенного типа. Следовательно, этаlog
«функция» принимает толькоint
аргументы.Более общее решение определяет способ печати аргумента в дополнение к самому аргументу:
который будет использоваться как например
lg2("%s", "I'm a string");
илиlg2("%f", 3.1415)
.источник
x
необходимы.Python (65 -10% = 58,5)
Это предполагает, что ваш код находится в файле (он выдает странный вывод, если вызывается в интерактивном интерпретаторе):
Он был протестирован на Python 2.7.6.
Пример:
выходы
источник
C ++
1217167 -10% = 60,3Используется так:
Выходы:
источник
#define log(x)printf("log(%s) %d\n",#x,x)
но это будет работать только с целыми числами.Ребол3 - 31,5 (35 - 10%)
Вот простая реализация, сокращенная от @draegtun, которая хорошо работает для чисел:
Запуск его выводит:
Это может быть намного более гибким (для отображения формы нечисловых типов) в 42,3 символа (47 - 10%)
Выход:
источник
Javascript (325)
Я думаю, что это
log
функция, которую вы ищете:использование
Выход
Длинный код
Работает только тогда, когда скрипт помещен внутри
<script>
тега.html
документ, потому что он отправляет запросlocation.href
на получение исходного кода. JSfiddle, F12 Dev Tool Console, встроенные.js
файлы не будут работать, я пытаюсь сделать его доступным везде ...Во всяком случае, этот вопрос интересен.
источник
Скала - (221 - 10%) = 198,9
Yay макросы! На самом деле это именно то, для чего они нужны.
Читаемая версия:
Пример:
Выходы:
Поскольку сложение - это вызов метода в Scala, он добавляет этот подробный синтаксис обратно, но он довольно близок! Это также немного более многословно в паре других случаев.
источник
Баш (21 - 10% = 18,9)
Эта:
Затем используйте так,
log
как вы бы использовалиecho
:или
Этот метод будет делать все, что требуется; в качестве бонуса, некоторая дополнительная информация будет также напечатана, но никакое явное правило не запрещает это.
источник
BASH
Аргументы не передаются с использованием «(...)» в BASH, поэтому я позволил выводу log () соответствовать этому стилю:
источник
$((...))
может быть$[...]
вместо этого, но я не считал символы, так что это не имеет значения до сих пор.Clojure
Homoiconicity имеет свои преимущества!
Использовать:
Давайте посмотрим, что происходит с
macroexpand
:источник
x
, вам действительно нужно использовать промежуточный генсим (т.е.x#
)? Я думаю, что вы будете оценивать выражение только один раз (кстати, я не эксперт по Clojure)Юлия, 51 * 0,9 = 45,9
В качестве альтернативы, но не соответствует правилам
источник
Tcl 42,3 (47 - 10%)
Использование:
Изменить : небольшое улучшение
источник
Лисп обыкновенный - 119,7 (133-10%)
@
потому, чтоlog
является стандартной функцией логарифма и по умолчанию заблокирован (по крайней мере, для SBCL). Кроме того,@
только один символ в длину.progn
, принимая переменное количество аргументов, но выводит на стандартный вывод. В реальных приложениях я бы наверноеsignal
использовал условие с S-выражением вместо вывода вывода через пробел.(@ x)
можно было использовать всякий раз, когдаx
использовании.prin1
, который выводитread
-able строку. Это полезно при попытке воспроизвести зарегистрированные выражения.Пример выходов:
И, наконец, если я
defmacro
войду в журнал выше , у меня будет версия без гольфа:источник
PHP 138
Вы не можете переопределить
log
в PHP без использования другого модуля (APD
), поэтому я использовалlogg
вместо этого, я могу повторно прислать сlog
примером, если это необходимо. Это незначительно, но более греховно, я предполагаю, что это предполагает, что функция log находится на одной строке. Я могу обновить свой ответ в соответствии с комментариями.пример вывода:
источник
JavaScript
5553Использование:
Выход:
Вы ДОЛЖНЫ использовать двойные кавычки,
"
иначе это не сработает.источник
log("i:", i)
... Я не думаю, что это не может быть сделано без'
или"
в JS ... Вы можете уменьшить его, используя,console.log('log('+o+')'+eval(x))
но вывод не будет соответствовать строке кода (кого это волнует)arguments.callee.caller.toString()
, но я не смог выяснить, какая линия, когда у вас есть два журнала.