|
Titlul: Code golf challenge: logaritm Scris de: Cosmin Negruseri din Ianuarie 31, 2012, 07:35:33 http://infoarena.ro/blog/code-golf-logaritm
Titlul: Răspuns: Code golf challenge: logaritm Scris de: Mihai Calancea din Ianuarie 31, 2012, 10:56:08 Facem o cautare binara gen Patrascu dar continuam si pe puterile negative ale lui 2, pe care le calculam scotand radical in mod succesiv din 2. sper ca e ok, n-am avut timp sa o testez acum.
Titlul: Răspuns: Code golf challenge: logaritm Scris de: Cosmin Negruseri din Ianuarie 31, 2012, 11:01:26 Pai ii zice code golf pt ca trebuie si codul :).
Titlul: Răspuns: Code golf challenge: logaritm Scris de: Mihai Calancea din Ianuarie 31, 2012, 11:12:40 yup, scuze, nu eram atent. sunt in ora de germana:)) am sa bag si cod.
Titlul: Răspuns: Code golf challenge: logaritm Scris de: Constantin-Cristian Balas din Ianuarie 31, 2012, 11:55:18 Cod: typedef double d; LE: (thanks rgrig) Cod: #define r return Titlul: Răspuns: Code golf challenge: logaritm Scris de: MciprianM din Ianuarie 31, 2012, 14:05:07 96 caractere; din pacate nu merge decat pentru x > 1.
Cod: double log(double x){double p,r=1.0000105766425498,t;for(p=0,t=r;t<x;p+=1,t*=r);return p/65536;}Titlul: Răspuns: Code golf challenge: logaritm Scris de: Radu Grigore din Ianuarie 31, 2012, 15:06:16 MciprianM: Simpatica solutia. Uite o varianta recursiva (care merge si pentru x < 1):
Cod: typedef double d;d e=1.0000105766425498;d L(d x, d a){return x<1?-L(1/x,a):x<e?a:L(x/e,a+1./65536);}Edit: Am schimbat l in L ca la fonturile astea se confunda cu 1. Edit2: Uitasem typedeful. Edit3: Uite si o varianta in Haskell. COnstanta e un pic mai scurta dar cred ca merge. Cod: e=1.0000105766425 Titlul: Răspuns: Code golf challenge: logaritm Scris de: Cosmin Negruseri din Ianuarie 31, 2012, 21:36:32 Misto! Ati sarit direct la variantele obfuscate, puteti baga si explicatii la solutii?
[Update1] Eu am doua, dar nu am pus efort sa le fac scurte. Prima e pe ideea de care vorbea Mihai mai sus. La fiecare pas incerc sa aflu o cifra in baza 2 a rezultatului. Cod: def log_base2(y): Un coleg de echipa a venit cu o idee mai scurta, el foloseste faptul ca ln(x) ~= x - 1 pentru x foarte apropiat de 1 si proprietatea ca ln(x) = 2 * ln(sqrt(x)). Cod: def ln(x): [Update2] A 2-a solutie scrisa mai scurt in Python are 85 de caractere 'non whitespace': Cod: import math [Update3] 93 de caractere daca nu numaram 'white space' in C++, 77 fara include math: Cod: #include <math.h> Titlul: Răspuns: Code golf challenge: logaritm Scris de: MciprianM din Februarie 01, 2012, 11:44:55 In solutia mea, r este 2^(1/65536), iar p este logaritm in baza r din x. Adica r^p=x adica logaritm in baza 2 din x e p/65536.
P.S.: Precizia e de 4 zecimale pt ca 65536 > 10000. Ca sa ajung la solutia mea de la faptul ca raspunsul poate fi scris ca fractie zecimala cu 4 cifre sau ca p/10000, unde p e intreg. am folosit 65536 pentru ca 2^(1/65536) e mai usor de calculat decat 2^(1/10000) (faci radical de radical de radical ... din 2). Edit: Mie imi place solutia cu ln(x)=2ln(sqrt(x)) si ln(x)=x-1 pt x apropiat de 1 - e geniala. Din pacate am auzit destul de multi oameni care ziceau chestii de genu': daca ii problema de mate eu nu o stiu face. De-aia imi place solutia asta. Omul care foloseste solutia asta nu se teme de mate si cred ca ar trebui promovata mai mult gandirea matematica la info. Tin minte ca la noi la liceu se preda algoritmul cu planificarea spectacolelor (ala din capitolul greedy din Cormen) fara demonstratie. Adica profesorul le zicea ca solutia e asa: sortati intervalele de timp in care se pot tine spectacolele dupa terminare si apoi luati greedy intervalele. Fara sa se explice de ce merge (ca de-aia se fac demonstratii, nu? ca sa se observe ca ii adevarata o teorema - in cazul nostru ca algoritmul functioneaza sau ca are timpul de executie nu stiu cat si nu stiu cate altele). Si alti algoritmi erau tratati la fel (imi vin in minte acuma aia de grafuri: Kruskal, Dijkstra, ...). Cred ca se intelege ca vreau sa zic ca matematica nu promoveaza invatarea algoritmilor pe de rost ci intelegerea lor, nu? Titlul: Răspuns: Code golf challenge: logaritm Scris de: Paul Herman din Februarie 03, 2012, 19:06:18 Solutia mea, desi contine ceva mai multe caractere decat cele postate anterior, adica 115 cu whitespace, se bazeaza pe ideea ca integrala din 1/x dx este ln(x). Astfel putem foarte usor face asta destul de precis, metode mai bune fiind regulile lui Simpson, dintre care este recomandata Simpson 3/8. Stiu ca este foarte lenta pt. numere mai mari, dar imi place deoarece este foarte simpla.
Cod: #define d double Codul curat si un exemplu de folosire: Cod: #include <cstdio> O alta solutie ce mi-a venit in minte este bazata pe derivata lui a^x, dupa cum este cunoscut (a^x)' = a^x * ln(a). Codul bazat pe aceasta idee se afla mai jos si are 76 de caractere. Cod: double f(double x){return (pow(x,2.0+1e-6)-pow(x,2.0))/1e-6/pow(x,2.0+1e-7);}Codul curat si un exemplu de utilizare: Cod: #include <cstdio> Edit: Acum am vazut ca nu am voie sa folosesc functia putere asa ca am adaptat ultima solutie sa foloseasca radical de ordinul doi pentru a obtine o putere rationala de ordinul 1e-6. Codul sub aceasta forma este mai jos. Cod: double ln(double x) |