স্বযুক্ত লগ


16

সমস্যাটি"

একটি ফাংশন log(বা অন্যান্য 3 অক্ষরের নাম) সংজ্ঞায়িত করুন যা যখন লগ / মুদ্রণ / লেখার জন্য প্রশ্ন করা হয় (প্রশ্নে ভাষার জন্য পূর্বনির্ধারিত যাই হোক না কেন) নির্দেশ (উত্স হিসাবে) এবং প্রথম যুক্তি উভয়ই। অন্য কথায়:

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), পরের দিকে আমরা একটি (বেশ উন্মত্ত) জাভাস্ক্রিপ্ট (কেবল নোড) সমাধান করেছি (এটি i: 777সম্পূর্ণ লাইনের চেয়ে আউটপুট দেয়) উত্স) যা আশ্চর্যজনকভাবে দীর্ঘ ছিল এবং আমাকে কোডগল্ফিংয়ের কথা মনে করিয়ে দিয়েছিল এবং অন্যান্য (বিশেষত কোড গল্ফিং) ভাষাগুলি আরও কত ভাল ভাবে তা আমাকে অবাক করে দিয়েছে।

বোনাসেস

-10% : কোনও ফাইল পঠন নেই (সংকলকের বাইরে)

পুনশ্চ. এটি এখানে আমার প্রথম 'প্রশ্ন', সুতরাং আমি যে কোনও ভুল করেছি তা নির্দ্বিধায় মনে করুন।


1
কোডগলফ.এসই তে স্বাগতম! আমি ব্যক্তিগতভাবে মনে করি আপনার প্রশ্নটি বেশ শালীন, তবে লোকেরা উত্তরের উপর কাজ শুরু করার আগেই অস্পষ্টতা ইত্যাদি সমাধান করার জন্য সাধারণত স্যান্ডবক্সের মাধ্যমে প্রশ্ন ধারণা চালানো ভাল ধারণা ।
মার্টিন ইন্ডার

থেক্স এবং দরকারী @ স্যান্ডবক্স, এটির ব্যবহারের ব্যাখ্যাটি দেওয়া ভাল হতে পারে help/on-topic(এটি উল্লেখ করা হয়েছে, তবে এটি সেখানে বর্ণিত পদ্ধতিটি যাচাই করার জন্য আমি এটিকে বিবেচনা করি না)।
ডেভিড মুলদার

@ ওলেভ্যানিলাবুরলুটজ: অবশ্যই তা নয়, আপনি কি কাউকে তখনও সত্য বলে দাবি করেছেন?
ডেভিড মুলদার

অনুগ্রহটি ট্রুংডিকিউর জন্য (আমি মনে করি যে তার সমাধানটি কেবল কোড দৃষ্টিকোণ থেকে আশ্চর্যজনক (আমাদের নোড কেবলমাত্র সমাধানের চেয়ে ভাল), দৈর্ঘ্য নির্বিশেষে) 24 ঘন্টা অপেক্ষা করতে হবে যদিও আমি এটি প্রদান করার আগেই।
ডেভিড মুলদার

উত্তর:


14

সি (40 -10% = 36) (38 -10% = 34.2)

মনে রাখবেন যে সি-তে কোনও logক্রিয়াকলাপ কেবল নির্দিষ্ট ধরণের জন্য সংজ্ঞায়িত করা যায়। সুতরাং, এই log"ফাংশন" কেবল intআর্গুমেন্ট নেয় takes

#define log(x)printf("log("#x") %d",x)

আরও একটি সাধারণ সমাধান আর্গুমেন্ট নিজেই যুক্ত করার পাশাপাশি কীভাবে যুক্তিটি প্রিন্ট করতে হবে তা নির্দিষ্ট করে:

#define lg2(f,x)printf("lg2("#x") "f,x)

যা যেমন lg2("%s", "I'm a string");বা হিসাবে ব্যবহৃত হবে lg2("%f", 3.1415)


আমি মনে করি না যে চূড়ান্ত বন্ধনীগুলির চারপাশে xপ্রয়োজনীয়।
ব্যবহারকারী 12205

@ স্পেস: আমি ভেবেছিলাম যে ব্যবহারকারী যদি যুক্তিতে কিছু বিজোড় চরিত্র রাখেন তবে তাদের প্রতিফলন করার পরে আমি মনে করি আপনি ঠিক বলেছেন। আমি তাদের অপসারণ করব।
nneonneo

10

পাইথন (65 -10% = 58.5)

এটি ধরে নিয়েছে যে আপনার কোডটি কোনও ফাইলে রয়েছে (এটি ইন্টারেক্টিভ ইন্টারপ্রেটারে ডাকলে বিজোড় আউটপুট উত্পাদন করে):

import traceback as t
def log(x):print t.extract_stack()[-2][3],x

এটি পাইথন ২.7..6 এ পরীক্ষা করা হয়েছে।

উদাহরণ:

def foo():
    x = 1
    log(x)
    for i in xrange(10):
        log(x+i+1)
    return x

log(foo())

আউটপুট

log(x) 1
log(x+i+1) 2
log(x+i+1) 3
log(x+i+1) 4
log(x+i+1) 5
log(x+i+1) 6
log(x+i+1) 7
log(x+i+1) 8
log(x+i+1) 9
log(x+i+1) 10
log(x+i+1) 11
log(foo()) 1

1
নিস! বলার অপেক্ষা রাখে না, এটি এমন এক ধরণের পাগল জিনিস যা আমাকে প্রোগ্রামার হিসাবে আগ্রহী করে (একটি নেটিভ ফাংশনটির নেতিবাচক সূচক: ও): পি কিছু দস্তাবেজ খুঁজে পেতে বিস্মিত হয়েছে
ডেভিড মুলদার

9

সি ++ 121 71 67 -10% = 60.3

#include<iostream>
#define log(x)std::cout<<"log("#x") "<<(x)<<"\n"

এর মতো ব্যবহৃত:

int main() {
    int i = 777;
    int j = 333;
    log(i);
    log(i+j+1);
}

আউটপুট:

log(i) 777
log(i+j+1) 1111

আপনি সি ++: এর পরিবর্তে সিটিতে লিখলে আপনি 30 চরটি সরিয়ে এবং একটি ওয়ান-লাইনার তৈরি করতে পারেন #define log(x)printf("log(%s) %d\n",#x,x), তবে এটি কেবল পূর্ণসংখ্যার কাজ করবে of
ব্যবহারকারী 12205

@ace: তারপরে এটি কেবল এক ধরণের জন্য কাজ করে। (এছাড়াও, এটি আমার প্রস্তাবিত সমাধান, নীচে দেখুন)
নিউনিও

@ ন্ননিও যখন আমি মন্তব্য পোস্ট করার আগে রিফ্রেশ করতে ভুলে গিয়েছি তখন আমি এটিকে ঘৃণা করি।
ব্যবহারকারী 12205

5

রিবোল 3 - 31.5 (35 - 10%)

এখানে @ ডিগ্রাটুন থেকে সংক্ষিপ্ত একটি সাধারণ বাস্তবায়ন যা সংখ্যার জন্য ভালভাবে কাজ করে:

log: func[p][print[{log[}p{]}do p]]

এটি চালানো ফলাফল:

>> log: func[p][print[{log[}p{]}do p]]
>> i: 777
>> j: 333
>> log [i]
log[ 777 ] 777
>> log[i + j + 1]
log[ i + j + 1 ] 1111

এটি 42.3 অক্ষরে (47 - 10%) নম্বরের ধরণের ফর্মটি প্রদর্শনের জন্য অনেক বেশি নমনীয় হতে পারে

log: func[p][print[{log}mold p mold/only do p]]

আউটপুট:

>> log: func[p] [print[{log}mold p mold/only do p]]
>> log [join "4" 4]
log [join "4" 4] "44"  ;; shows a string
>> log [1 + 2]
log [1 + 2] 3 

4

জাভাস্ক্রিপ্ট (325)

আমি মনে করি এটি log ফাংশনটি আপনি সন্ধান করছেন:

function log(m){L=(new Error()).stack.match(/(at log \([\s\S]+?at .+?:)\d+:\d+/m)[0].split('\n')[1].match(/:\d+:\d+/)[0];N=L.split(':')[1];C=parseInt(L.split(':')[2]);R=new XMLHttpRequest();R.open('GET',location.href,0);R.onload=function(){console.log(R.response.split('\n')[N-1].substr(C-1).split(';')[0]+' = '+m)};R.send()}

ব্যবহার

<script>
function log(m){L=(new Error()).stack.match(/(at log \([\s\S]+?at .+?:)\d+:\d+/m)[0].split('\n')[1].match(/:\d+:\d+/)[0];N=L.split(':')[1];C=parseInt(L.split(':')[2]);R=new XMLHttpRequest();R.open('GET',location.href,0);R.onload=function(){console.log(R.response.split('\n')[N-1].substr(C-1).split(';')[0]+' = '+m)};R.send()}

function doSomething() {
  var a = 123; log(a); var b = "Hello, I am TrungDQ!"; log(b);
}
doSomething();
var message = "...or just do it out here";
log(message + "!");
</script>

আউটপুট

log(a) = 123
log(b) = Hello, I am TrungDQ!
log(message + "!") = ...or just do it out here!

দীর্ঘ কোড

<script>
function log(msg) {
  // Get the line number and offset of the line where is function is called
  var lineInfo = (new Error()).stack.match(/(at log \([\s\S]+?at .+?:)\d+:\d+/m)[0].split('\n')[1].match(/:\d+:\d+/)[0];
  var lineNum = lineInfo.split(':')[1];
  var charOffset = parseInt(lineInfo.split(':')[2]);

  // Get the file source
  request = new XMLHttpRequest();
  request.open('GET', window.location.href, true);

  request.onload = function() {
    // Get file source code
    var response = request.responseText;
    // Get the `log` line
    var line = response.split('\n')[lineNum - 1];
    // Get the `log` statement
    var logStatement = line.substr(charOffset - 1).split(';')[0];
    // Print it
    console.log(logStatement + ' = ' + msg);
  };
  request.send();
}

function doSomething() {
  var a = 123; log(a); var b = "Hello, I am TrungDQ!"; log(b);
}
doSomething();
</script>

কেবল তখনই কাজ করে যখন স্ক্রিপ্টটি <script>ট্যাগের ভিতরে রাখা হয়.html ডকুমেন্টে কারণ এটি location.hrefউত্স কোডটি পাওয়ার জন্য একটি অনুরোধ প্রেরণ করে। জেএসফিডেল, এফ 12 ডিভাইস কনসোল, এম্বেড করা .jsফাইলগুলি কাজ করবে না, আমি এটি সর্বত্র উপলব্ধ করার চেষ্টা করছি ...

যাইহোক, এই প্রশ্ন আকর্ষণীয়।


আমি সামান্য সন্দেহবাদী এটি ক্রস ব্রাউজারগুলি।
ফরিদ নুরি নেশাত 12 '

3

স্কালা - (221 - 10%) = 198.9

ইয়া ম্যাক্রোস! এটি আসলে তারা ধরণের ধরণের জিনিস for

import language.experimental.macros
def log(p:Any)=macro l
def l(c:reflect.macros.Context)(p:c.Expr[Any])={import c.universe._;reify{println("log("+(c.Expr[String](Literal(Constant(show(p.tree)))).splice)+") "+p.splice)}}

পঠনযোগ্য সংস্করণ:

import language.experimental.macros
def log(p: Any) = macro l
def l(c: reflect.macros.Context)(p: c.Expr[Any]) = {
  import c.universe._
  val inputString = show(p.tree)
  val inputStringExpr = c.Expr[String](Literal(Constant(inputString)))
  reify {
    println("log(" + (inputStringExpr.splice) + ") " + p.splice)
  }
}

উদাহরণ:

log(1)
val x = 3
log(x)
val y = 4
log(x+y)

আউটপুট:

log(1) 1
log(x) 3
log(x.+(y)) 7

যেহেতু সংযোজনটি স্কালায় একটি মেথড কল তাই এটি ভার্বোজ সিনট্যাক্সটি আবার যুক্ত করে তবে এটি খুব কাছে! অন্যান্য কয়েকটি ক্ষেত্রে এটি আরও কিছুটা ভার্বোজ।


বাহ, এটি @ ফাংশনটির সংযোজনটি দেখতে বেশ আকর্ষণীয়। শেখার জন্য এত দুর্দান্ত স্টাফ: ডি
ডেভিড মুল্ডার

2

বাশ (21 - 10% = 18.9)

এই:

alias log=echo;set -v

তারপরে logআপনি যেমন ব্যবহার করবেন তেমন ব্যবহার করুন echo:

log $((1+1))

অথবা

A=2
B=3
log $((A+B))

এই পদ্ধতিটি যা প্রয়োজন তা করবে; বোনাস হিসাবে, কিছু অতিরিক্ত তথ্যও মুদ্রিত হবে, তবে কোনও সুস্পষ্ট নিয়ম এটি নিষেধ করে না।


2

BASH

BASH এ "(...)" ব্যবহার করে আর্গুমেন্টগুলি পাস করা হয় না, তাই আমি 'লগ ()' এর আউটপুটটিকে সেই স্টাইলের সাথে মানিয়ে তুলতে পারি:

$ log(){ echo "$FUNCNAME $@: $(($@))"; }
$ i=333
$ j=777
$ log i
log i: 333
$ log i+j+1
log i+j+1: 1111

$((...))$[...]পরিবর্তে হতে পারে তবে আমি অক্ষর গণনা করি নি, এখন পর্যন্ত এটি কোনও বিষয় নয়।

2

Clojure

(defmacro log[x] `(let [x# ~x] (println "log("'~x")" x#)))

হোমসাইকোনসিটির সুবিধা রয়েছে!

ব্যবহার করা:

(def i 777)
(def j 333)
(log i) ;Prints log( i ) 777
(log (+ i j 1)) ;Prints log( (+ i j 1) ) 1111

আসুন দেখুন কি হচ্ছে এর সাথে macroexpand:

(macroexpand '(log (+ i j 1))) 
;; Prints the following: 
(let* [x__1__auto__ (+ i j 1)] (clojure.core/println "log(" (quote (+ i j 1)) ")" x__1__auto__))

যদি আপনি উদ্ধৃতি দেন x, আপনার কি সত্যিই কোনও মধ্যবর্তী জিনসিম (যেমন? x#) ব্যবহার করা দরকার ? আমি মনে করি আপনি কেবল একবারই ভাবটি মূল্যায়ন করবেন (বিটিডাব্লু, আমি কোনও ক্লোজার বিশেষজ্ঞ নই)
coredump

2

জুলিয়া, 51 * 0.9 = 45.9

julia> x=4
4
julia> macro log(x) println("log($x) $(log(eval(x)))") end
julia> @log(x)
log(x) 1.3862943611198906

বিকল্পভাবে, তবে নিয়মগুলি পূরণ করছে না

julia> @show log(x)
log(x) => 1.3862943611198906

2

টিসিএল, 42.3 (47 - 10%)

proc log c {puts [dict g [info fr -1] cmd]\ $c}

ব্যবহার:

set i 777
set j 333
log $i  ;#outputs: "log $i 777"
log [expr {$i+$j+1}] ;#outputs: "log [expr {$i+$j+1}] 1111"

সম্পাদনা : ছোট উন্নতি


0

কমন লিস্প - 119.7 (133 -10%)

(defmacro @(&whole f &rest r)(let((g(gensym)))`(let((,g(multiple-value-list,@r)))(progn(format t"~s~{ ~a~}
"',f,g)(values-list,g)))))
  • নামকরণ করা হয়েছে @কারণ logএটি স্ট্যান্ডার্ড লোগারিদম ফাংশন এবং ডিফল্টরূপে লক করা হয় (কমপক্ষে এসবিসিএল-এ)। এছাড়াও, @শুধুমাত্র একটি চরিত্র দীর্ঘ।
  • হিসাবে কাজ progn , একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট গ্রহণ করে, কিন্তু স্ট্যান্ডার্ড আউটপুট প্রিন্ট করে। বাস্তব অ্যাপ্লিকেশনগুলিতে, আমি সম্ভবত signalস্পেস-বিভাজিত আউটপুট মুদ্রণের পরিবর্তে এস-এক্সপ্রেশন সহ একটি শর্ত করব।
  • বিদ্যমান ক্লোজুর সমাধানের বিপরীতে, আমরা শেষ পর্যন্ত লগড এক্সপ্রেশনটির মানটি ফিরিয়ে দিই, যাতে (@ x) যখনই ব্যবহার করা যায়x ব্যবহার করা যায়।
  • মুদ্রণ ব্যবহার করে prin1, যা একটি read-যোগ্য স্ট্রিংকে আউটপুট করে । লগ হওয়া এক্সপ্রেশনগুলি পুনরুত্পাদন করার চেষ্টা করার সময় এটি দরকারী।
  • সমস্ত সম্ভাব্য প্রকারগুলি পরিচালনা করে (সি উত্তর দেখুন)
  • একচেটিয়া মানগুলিতে নেয়
  • বিভিন্ন আউটপুট উত্পাদন করে না (স্কেলার উত্তর দেখুন)
  • একটি ফাইল এবং REPL থেকে কাজ করে (পাইথনের উত্তর দেখুন)
  • ব্রাউজার / ইন্টারপ্রেটার ট্রিকের প্রয়োজন নেই (পাইথন ট্রেসব্যাক, জাভাস্ক্রিপ্ট অনুরোধ)

নমুনা আউটপুট:

CL-USER>(@ (+ 3 2))   ; user input
(@ (+ 3 2)) 5         ; printed output
5                     ; result of expression

CL-USER> (@ (values 3 4))  ; input
(@ (VALUES 3 4)) 3 4       ; logging
3                          ; first value
4                          ; second value

CL-USER>(@ (round 3.4))
(@ (ROUND 3.4)) 3 0.4000001
3                          ; rounded value
0.4000001                  ; delta

এবং অবশেষে, আমি উপরের লগইন করলে আমার defmacroঅরোগল্ড সংস্করণ রয়েছে:

CL-USER> (@ (defmacro @(&whole f &rest r)(let((g(gensym)))`(let((,g(multiple-value-list,@r)))(progn(format t"~s~{ ~a~}
"',f,g)(values-list,g))))))
STYLE-WARNING: redefining COMMON-LISP-USER::@ in DEFMACRO
(@
 (DEFMACRO @ (&WHOLE F &REST R)
   (LET ((G (GENSYM)))
     `(LET ((,G (MULTIPLE-VALUE-LIST ,@R)))
        (PROGN
         (FORMAT T ,"~s~{ ~a~}
"
                 ',F ,G)
         (VALUES-LIST ,G)))))) @
@ ; actual result

0

পিএইচপি 138

আপনি logঅন্য কোনও মডিউল ( APD) ব্যবহার না করে পিএইচপিতে পুনরায় ঘোষনা করতে পারবেন না তাই আমি loggপরিবর্তে ব্যবহার করেছি , logপ্রয়োজনে উদাহরণ সহ পুনরায় জমা দিতে পারি । এটি গৌণ, তবে আরও পাপযুক্ত আমি অনুমান করি যে এটি লগ ফাংশনটি নিজেই একটি লাইনে রয়েছে ume আমি মন্তব্য দ্বারা নির্ধারিত হিসাবে আমার উত্তর আপডেট করতে পারেন।

<?php function logg($v){$b=debug_backtrace()[0];$h=fopen($b['file'],"r");for($i=0;$i<$b['line']&&$l=fgets($h);$i++);echo trim($l)." $v";}

উদাহরণ আউটপুট:

for ($i=1; $i<10; $i++) {   
  $j=$i+1;
  $k=$j+1;
  logg($i+$j+$k);
  echo "\n";
}
/*
logg($i+$j+$k); 6
logg($i+$j+$k); 9
logg($i+$j+$k); 12
logg($i+$j+$k); 15
logg($i+$j+$k); 18
logg($i+$j+$k); 21
logg($i+$j+$k); 24
logg($i+$j+$k); 27
logg($i+$j+$k); 30
*/

-2

জাভাস্ক্রিপ্ট 55 53

function log(x){console.log('log("'+x+'") '+eval(x))}

ব্যবহার:

var i = 777,
    j = 333;
log("i")
log("j")
log("12*4")
log("i*j-4")

আউটপুট:

log("i") 777
log("j") 333
log("12*4") 48
log("i*j-4") 258737

আপনি ডাবল উক্তি ব্যবহার করা উচিত "অন্যথায় এটি কাজ করবে না।


আমি প্রদত্ত সিউডো কোডটি অনুসরণ না করে ইতিমধ্যে নিয়মগুলি বাঁকানো নির্বিশেষে, বড় সমস্যাটি হ'ল বৈশ্বিক প্রেক্ষাপটে ভেরিয়েবলগুলি সংজ্ঞায়িত করা হয় তবেই কেবল এটি কাজ করে (আমি জানি knowশাল মূল্যায়নের প্রসঙ্গটি তার চেয়ে জটিল, তবে পয়েন্ট দাঁড়ায়)
ডেভিড মুলদার

চ্যালেঞ্জের বিষয়টি হ'ল আপনি কোনও স্ট্রিং পাস করবেন না ... -1
ডুরকনব

বিন্দুটি করছিল না log("i:", i)... আমি মনে করি না এটি জেএস ছাড়া 'বা করা যায় "না ... আপনি এটি ব্যবহার করে এটি আরও ছোট করে তুলতে পারেন console.log('log('+o+')'+eval(x))তবে আউটপুট কোড লাইনের সাথে মেলে না (যিনি যত্নশীল)
রাফায়েলকাস্ট্রোটো

2
আপনি এটি একটি এক লাইনে করতে পারেন, আমি নোডে এটি করেছি, কীভাবে? একটি ত্রুটি নিক্ষেপ করে, স্ট্যাক পেয়ে, ফাইলটি পড়ে এবং লাইনটি বের করে। হ্যাঁ, কান্ড পাগল: ডি। তদাতিরিক্ত এটি ব্যবহার করা সম্ভব হতে পারে arguments.callee.caller.toString()তবে আপনি যখন দুটি লগ রাখেন তখন কোন লাইনটি তা নির্ধারণ করতে পারছিলাম না।
ডেভিড মুলদার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.