Problem"
Zdefiniuj funkcję log
(lub inną trzyliterową nazwę), która po wywołaniu będzie logować / drukować / pisać (niezależnie od tego, jaki jest domyślny dla danego języka) zarówno instrukcję (jako źródło), jak i pierwszy argument. Innymi słowy:
i=777
j=333
log(i) //outputs: "log(i) 777"
log(i+j+1) //outputs: "log(i+j+1) 1111"
Dla wszystkich praktycznych celów wynik i: 777
byłby wystarczający, ale w niektórych językach istnieją do tego bardzo specyficzne biblioteki refleksji, co nie byłoby wyzwaniem, więc cała instrukcja powinna zostać wypisana.
Inspiracja
Inspiracją do tego byłem ja i inny programista dyskutujący o tym, jak irytujące jest to, że często (przy złych debuggerach) piszesz takie rzeczy console.log("i:", i)
, a następnie stworzyliśmy (dość zwariowane) rozwiązanie javascript (tylko węzeł) (generuje ono i: 777
raczej niż całą linię źródło), która była zaskakująco długa i przypominała mi o kodzie golfowym i sprawiła, że zastanawiałem się, o ile lepsze byłyby inne języki (zwłaszcza golfowe).
Bonusy
-10% : Brak odczytu pliku (poza kompilatorem)
PS. To jest moje pierwsze „pytanie” tutaj, więc możesz wskazać wszelkie błędy, które popełniłem.
help/on-topic
(wspomniano, ale nie uważałem za warte sprawdzenia sposobu, w jaki tam został opisany).Odpowiedzi:
C
(40–10% = 36)(38–10% = 34,2)Zauważ, że w C
log
funkcja może być zdefiniowana tylko dla określonego typu. Dlatego talog
„funkcja” przyjmuje tylkoint
argumenty.Bardziej ogólne rozwiązanie określa, jak wydrukować argument, oprócz samego argumentu:
które byłyby wykorzystane jako np .
lg2("%s", "I'm a string");
lublg2("%f", 3.1415)
.źródło
x
były konieczne.Python (65-10% = 58,5)
Zakłada się, że kod znajduje się w pliku (generuje nieparzyste dane wyjściowe, jeśli zostanie wywołany w interaktywnym tłumaczu):
Został przetestowany na Pythonie 2.7.6.
Przykład:
wyjścia
źródło
C ++
1217167-10% = 60,3Używany w ten sposób:
Wyjścia:
źródło
#define log(x)printf("log(%s) %d\n",#x,x)
ale zadziała to tylko z liczbami całkowitymi.Rebol 3 - 31,5 (35 - 10%)
Oto prosta implementacja skrócona z @draegtun, która działa dobrze dla liczb:
Uruchomienie go powoduje:
Może być znacznie bardziej elastyczny (do wyświetlania postaci typów nieliczbowych ) przy 42,3 znakach (47-10%)
Wyjście:
źródło
JavaScript (325)
Myślę, że jest to
log
funkcja, której szukasz:Stosowanie
Wynik
Długi kod
Działa tylko wtedy, gdy skrypt jest umieszczony w
<script>
znaczniku, który jest umieszczony w.html
dokumencie, ponieważ wysyła żądanielocation.href
pobrania kodu źródłowego. JSfiddle, F12 Dev Tool Console, osadzone.js
pliki nie będą działać, staram się udostępniać je wszędzie ...W każdym razie to pytanie jest interesujące.
źródło
Scala - (221 - 10%) = 198,9
Tak, makra! To jest właśnie taki rodzaj rzeczy, do czego są przeznaczone.
Wersja do odczytu:
Przykład:
Wyjścia:
Ponieważ dodawanie jest wywołaniem metody w Scali, dodaje z powrotem tę pełną składnię, ale jest całkiem blisko! Jest to również trochę bardziej szczegółowe w kilku innych przypadkach.
źródło
uderzenie (21-10% = 18,9)
To:
Następnie użyj
log
tak, jakbyś użyłecho
:lub
Ta metoda zrobi wszystko, co jest wymagane; w ramach bonusu zostaną wydrukowane również dodatkowe informacje, ale nie ma wyraźnej zasady zabraniającej tego.
źródło
GRZMOTNĄĆ
Argumenty nie są przekazywane za pomocą „(...)” w języku BASH, więc pozwalam, aby dane wyjściowe „log ()” pasowały do tego stylu:
źródło
$((...))
można$[...]
zamiast tego, ale nie policzyłem znaków, więc do tej pory nie ma to znaczenia.Clojure
Homoiconicity ma swoje zalety!
Używać:
Zobaczmy, co się dzieje z
macroexpand
:źródło
x
cytujesz, czy naprawdę potrzebujesz pośredniego gensym (tj.x#
)? Myślę, że ocenisz wyrażenie tylko raz (przy okazji, nie jestem ekspertem od Clojure)Julia, 51 * 0,9 = 45,9
Alternatywnie, ale niespełniający zasad
źródło
Tcl, 42,3 (47–10%)
Stosowanie:
Edycja : mała poprawka
źródło
Common Lisp - 119,7 (133-10%)
@
ponieważlog
jest standardową funkcją logarytmiczną i domyślnie zablokowany (przynajmniej w SBCL). Również,@
ma tylko jedną postać.progn
, biorąc zmienną liczbę argumentów, ale wypisuje na standardowe wyjście. W rzeczywistych aplikacjach prawdopodobnie użyłbymsignal
warunku z wyrażeniem S zamiast wypisywać wyniki rozdzielone spacjami.(@ x)
można było z niego korzystać przy każdymx
użyciu.prin1
, któreread
generują ciąg -able. Jest to przydatne podczas próby odtworzenia zarejestrowanych wyrażeń.Przykładowe wyniki:
I wreszcie, jeśli
defmacro
zaloguję powyższe , mam wersję bez golfa:źródło
PHP 138
Nie można ponownie ustawić
log
języka w PHP bez użycia innego modułu (APD
), więc użyłem gologg
zamiast tego, wlog
razie potrzeby mogę przesłać przykład. To niewielkie, ale bardziej grzeszne wydaje się, że zakłada to, że funkcja dziennika sama w sobie znajduje się w linii. Mogę zaktualizować swoją odpowiedź zgodnie z komentarzami.przykładowe dane wyjściowe:
źródło
JavaScript
5553Stosowanie:
Wynik:
MUSISZ użyć podwójnych cudzysłowów, w
"
przeciwnym razie to nie zadziała.źródło
log("i:", i)
... Nie sądzę, że nie da się tego zrobić bez'
lub"
w js ... można go zmniejszyć za pomocą,console.log('log('+o+')'+eval(x))
ale wynik nie będzie pasował do linii kodu (kogo to obchodzi)arguments.callee.caller.toString()
, ale nie byłem w stanie dowiedzieć się, która linia jest, kiedy masz dwa dzienniki.