Masalah"
Tetapkan fungsi log
(atau nama 3 huruf lainnya) yang bila dipanggil akan mencatat / mencetak / menulis (apa pun default untuk bahasa yang bersangkutan) baik instruksi (sebagai sumber) maupun argumen pertama. Dengan kata lain:
i=777
j=333
log(i) //outputs: "log(i) 777"
log(i+j+1) //outputs: "log(i+j+1) 1111"
Untuk semua tujuan praktis, hasilnya i: 777
akan cukup, tetapi dalam beberapa bahasa ada perpustakaan refleksi yang sangat spesifik untuk itu, dan itu tidak akan menjadi tantangan, sehingga seluruh instruksi harus dikeluarkan.
Inspirasi
Inspirasi untuk ini adalah saya dan programmer lain yang mendiskusikan betapa menjengkelkannya hal itu sering terjadi (dengan debugger buruk), Anda menulis hal-hal seperti console.log("i:", i)
, selanjutnya kami membuat solusi javascript (node only) (cukup gila) (yang dihasilkan i: 777
daripada seluruh jajaran source) yang ternyata sangat panjang dan mengingatkan saya pada codegolfing dan membuat saya bertanya-tanya berapa banyak bahasa lain (terutama golf code) yang lebih baik.
Bonus
-10% : Tidak ada pembacaan file (di luar kompiler)
PS. Ini adalah 'pertanyaan' pertama saya di sini, jadi silakan tunjukkan kesalahan yang saya buat.
help/on-topic
(disebutkan, tapi saya tidak menganggapnya layak untuk memeriksa cara dijelaskan di sana).Jawaban:
C
(40 -10% = 36)(38 -10% = 34.2)Perhatikan bahwa, dalam C,
log
fungsi hanya dapat didefinisikan untuk jenis tertentu. Karena itu,log
"fungsi" ini hanya membutuhkanint
argumen.Solusi yang lebih umum menentukan cara mencetak argumen, selain argumen itu sendiri:
yang akan digunakan sebagai contoh
lg2("%s", "I'm a string");
ataulg2("%f", 3.1415)
.sumber
x
diperlukan.Python (65 -10% = 58.5)
Ini mengasumsikan kode Anda ada dalam file (menghasilkan output aneh jika dipanggil dalam interpreter interaktif):
Ini telah diuji pada Python 2.7.6.
Contoh:
output
sumber
C ++
1217167 -10% = 60,3Digunakan seperti ini:
Output:
sumber
#define log(x)printf("log(%s) %d\n",#x,x)
tetapi itu hanya akan berfungsi sebagai bilangan bulat.Rebol3 - 31,5 (35 - 10%)
Berikut ini adalah implementasi sederhana yang disingkat dari @draegtun yang berfungsi baik untuk angka:
Menjalankannya menghasilkan:
Ini bisa menjadi jauh lebih fleksibel (untuk menampilkan bentuk tipe non-angka) di 42,3 karakter (47 - 10%)
Hasil:
sumber
Javascript (325)
Saya pikir ini adalah
log
fungsi yang Anda cari:Pemakaian
Keluaran
Kode panjang
Hanya berfungsi ketika skrip dimasukkan ke dalam
<script>
tag yang dimasukkan ke dalam.html
dokumen karena skrip mengirim permintaanlocation.href
untuk mendapatkan kode sumber. JSfiddle, F12 Dev Tool Console,.js
file yang disematkan tidak akan berfungsi, saya mencoba membuatnya tersedia di mana-mana ...Bagaimanapun, pertanyaan ini menarik.
sumber
Scala - (221 - 10%) = 198.9
Makro Yay! Ini sebenarnya jenis barang untuk mereka.
Versi yang dapat dibaca:
Contoh:
Output:
Karena penjumlahan adalah pemanggilan metode dalam Scala, ia menambahkan sintaks verbose itu kembali, tetapi cukup dekat! Ini juga sedikit lebih bertele-tele dalam beberapa kasus lainnya.
sumber
bash (21 - 10% = 18,9)
Ini:
Kemudian gunakan
log
seperti yang akan Anda gunakanecho
:atau
Metode ini akan melakukan semua yang diperlukan; sebagai bonus, beberapa informasi tambahan juga akan dicetak, tetapi tidak ada aturan eksplisit yang melarangnya.
sumber
PESTA
Argumen tidak diteruskan menggunakan "(...)" di BASH, jadi saya membiarkan keluaran 'log ()' cocok dengan gaya itu:
sumber
$((...))
bisa$[...]
saja tetapi saya tidak menghitung karakter, jadi tidak masalah sampai sekarang.Clojure
Homoiconicity memiliki manfaatnya!
Menggunakan:
Mari kita lihat apa yang terjadi dengan
macroexpand
:sumber
x
, apakah Anda benar-benar perlu menggunakan gensym perantara (mis.x#
)? Saya pikir Anda hanya akan mengevaluasi ekspresi sekali (btw, saya bukan ahli Clojure)Julia, 51 * 0,9 = 45,9
Atau, tetapi tidak memenuhi aturan
sumber
Tcl, 42,3 (47 - 10%)
Pemakaian:
Sunting : peningkatan kecil
sumber
Gangguan Umum - 119,7 (133 -10%)
@
karenalog
ini adalah fungsi logaritma standar dan dikunci secara default (setidaknya pada SBCL). Juga,@
hanya satu karakter.progn
, mengambil sejumlah variabel argumen, tetapi mencetak ke output standar. Dalam aplikasi nyata, saya mungkin akan melakukannyasignal
suatu kondisi dengan ekspresi-S bukannya mencetak keluaran yang dipisahkan ruang.(@ x)
dapat digunakan kapan sajax
digunakan.prin1
, yang menghasilkan aread
string yang bisa digunakan. Ini berguna ketika mencoba mereproduksi ekspresi yang dicatat.Output sampel:
Dan akhirnya, jika saya log di atas
defmacro
, saya memiliki versi yang tidak ungolfed:sumber
PHP 138
Anda tidak dapat mendeklarasikan ulang
log
dalam PHP tanpa menggunakan modul lain (APD
) jadi saya gunakanlogg
sebagai gantinya, saya bisa mengirimkan kembali denganlog
contoh jika diperlukan. Itu kecil, tetapi lebih berdosa saya kira adalah ini menganggap fungsi log on a line dengan sendirinya. Saya dapat memperbarui jawaban saya sebagaimana ditentukan oleh komentar.contoh output:
sumber
JavaScript
5553Pemakaian:
Keluaran:
Anda HARUS menggunakan tanda kutip ganda
"
jika tidak maka tidak akan berhasil.sumber
log("i:", i)
... Saya tidak berpikir itu tidak dapat dilakukan tanpa'
atau"
di js ... Anda dapat membuatnya lebih kecil menggunakanconsole.log('log('+o+')'+eval(x))
tetapi output tidak akan cocok dengan baris kode (siapa yang peduli)arguments.callee.caller.toString()
, tetapi saya tidak dapat mengetahui baris mana yang ketika Anda memiliki dua log.