Code contest

73 respostas
Daniel_Quirino_Olive

viram?

73 Respostas

bandrade

Marketeiro… :twisted:

((calma, calma, foi só uma brincadeirinha… hehehe…

caramba, mega expressão regular, parabéns… (; :stuck_out_tongue:

plentz

Opa opa, thanks.

PS: tem que testar aquele teu código ainda einh Daniel, por enquanto só funciona no papel,hehehe.

saoj

Esse context foi covardia. Java não tem regex na linguagem, o que eu acho PÉSSIMO. Os malucos do Mustang prefererm colocar XML na linguagem do que REGEX. Vai entender !!!??? (Não, o suporte de Java a Regex, não é bom, principalmente quando eu tenho que escapar a barra invertida, ou seja, escapar o escape!)

Java é a pior linguagem para fazer parse/tratamento de textos, isso é fato.

Contest #2:

Fazer um servidor em Non-Blocking mode para receber conexões com a String “Hi” e responder com “Bye” e fechar a conexão.

:slight_smile:

Realmente Ruby é muito mais pragmático do que Java, isso não se discute mesmo. O que a gente pode fazer é ir abstraindo a API do Java por conta própria em nossos próprios projetos. Se a API não é pragmática a gente abstrai ela pra ela ficar. (Claro que isso ainda é pior do que ter uma linguagem realmente pragmática)

Uma pergunta de leigo em Ruby: Qual é o Tomcat do Ruby ??? Qual é web container do Ruby e qual é a API de “rubylets” no Ruby ? Como eu faria um script ruby para receber uma requisição e responder com <html>Hi Ruby</html> ? Só posso usar RoR pra isso ? E o equivalente a JSP, existe ? Será que daria para portar o Mentawai para Ruby ?

saoj

Ninguém respondeu então tive que correr para o Google !!!

Achei algo bem interessante:

http://www.linuxjournal.com/article/8356

marcelomartins

Legal, mas vamos lembrar, que digitar menos caracteres não quer dizer necessáriamente que alguma coisa é melhor :slight_smile:

1112

Versão Python ou Perl, anyone?

J

Daniel,

Mande uma nova versão:

def content = new URL("http://www.google.com.br/search?q=groovy").getText();
println(content =~/class=l href=\"(.*?)\">(.*?)< /a.*?j><font .*?>(.*?)<br /></);

Para não dizer que é covardia, a versão em Ruby faz isso. :smiley:

Falando nisso, já viram? http://grails.codehaus.org/

J

Só existe uma coisa que me deixa puto da vida nesses “contest” e o fato de sempre puxarem a sardinha para um lado. E nem precisava, por que o Java vai perder em numero de linhas do Ruby de qualquer forma… mas:

  1. Pra que isso? Nos outros não há isso.
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
  1. Nao usar Regexp do Java. Pode não ser assim, mas têm.
    http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/package-summary.html
renatosilva

Concordo com você. Quando eu me deparo com essas situações eu até me assusto, tipo “essa classe útil me parece meio óbvia. Porque isso não tá na API?”

Eu fico me perguntando se não existem projetos que já fazem isso. Tem o Commons da Apache mas nã sei se se encaixa exatamente. Por exemplo, existe alguma coisa que faça isso:

new XMLSerializer.write(myObject);
String s = FileUtil.read("simples-assim.txt");

Além do Sérgio, é costume de vocês fazer essa “pragmação”? Que tal juntar tudo e fazer um framework?

plentz

Tem alguma sugestão melhor?Mande que eu altero lá. Ninguém falou que o código não pode receber ajustes e comentários.

juzepeleteiro:
1) Pra que isso? Nos outros não há isso.

urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");

Porque segundo o Giuliano, sem esta linha não estava funcionando. Mais uma vez, mande o código que você melhorou e (se funcionar,claro) eu troco lá.

jack_ganzha

Só para aproveitar a deixa:
http://blastemica.blogspot.com/2006/03/apis-que-no-mordem.html

O código em Groovy ficou muito legal. Preciso arrumar um tempinho para incluir a linguagem nos meus estudos.

valeuz…

F

Falando em RegEx acabo de ficar p*** da vida com o java.util.regex.

Pattern pKey = Pattern.compile("PA");
        
        Matcher mKey = pKey.matcher("PATO");
        return mKey.find();

O dito não tem o comportamento das outras implementações de Reg Ex e retorna true (o correto seria false). Para fazer ele trabalhar da maneira correta tem que acrescentar “^PA$”.

abs.,
Flávio Suguimoto

urubatan
juzepeleteiro:
Só existe uma coisa que me deixa puto da vida nesses "contest" e o fato de sempre puxarem a sardinha para um lado. E nem precisava, por que o Java vai perder em numero de linhas do Ruby de qualquer forma... mas: 1) Pra que isso? Nos outros não há isso.
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");

2) Nao usar Regexp do Java. Pode não ser assim, mas têm.
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/package-summary.html


o problema é que o google não curte java, e da um erro se o User-Agent não for alterado, para evitar que qualquer um saia fazendo um buscador automático pro google.

mas o código java aquele é muito grande mesmo, da uma olhada neste:
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public class HTTPSample {
	public static void main(String[] args) throws Exception {
		URLConnection con = new URL("http://www.google.com/search?q=java").openConnection();
		con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
		Scanner sc = new Scanner(con.getInputStream());
		System.out.println(sc.findWithinHorizon("<a class=l href=\".*?\">.*?</a>", 0).replaceAll("<a class=l href=\"(.*?)\">(.*?)</a>", "$2=$1").replaceAll("<.*?>", ""));
	}
}
renatosilva

jack_-_ganzha:
http://blastemica.blogspot.com/2006/03/apis-que-no-mordem.html

valeuz…

Texto Sensacional! Teu blog?

fmeyer

Nha Diego. teu wordpress ta executando meus comentarios :twisted: arruma isso ai

o codigo que eu postei eh php ta um pouco mais enchuto…

<?php
	$html = implode('', file('http://www.example.com/'));	
	preg_match_all("|class=l href=\"(.*?)\">(.*?)</a.*?j><font.*?>(.*?)<br><|", $html, $out, PREG_SET_ORDER);
	echo $out[0][1]." ".$out[0][2]." ".$out[0][3];
?>
velo

Também li, gostei…

Tem até sugestão de melhoria pro menta…

Mas de boa, acho que o pessoal não faz mais coisas assim por falta de sugestão…
Eu pelo menos faria.

VELO

plentz

Urubatan, realmente, bem melhor a tua versão. Já tem até versão em VB lá, que por sinal é a piada da vez. Ah, Fernando, ficou legal tua versão em PHP, ta praticando é? :stuck_out_tongue:

W

Segue a versao que fiz aqui em Python (2.4.3)

import urllib
import re

class AppURLopener(urllib.FancyURLopener):
  version = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1"

urllib._urlopener = AppURLopener()

html = urllib.urlopen('http://www.google.com.br/search?q=python').read()
out = re.search('class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><', html, re.DOTALL)
print re.sub('<.*?>', '', (out.group(1) + '\n' + out.group(2) + '\n' + out.group(3)))

versao em TCl/TK (8.4.12)

package require http
http::config -useragent {Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1}
set html [http::data [http::geturl {http://www.google.com.br/search?q=tcl}]]
set out [regexp -inline {class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><} $html]
puts [regsub -all {<.*?>} [concat "[lindex $out 1]\n[lindex $out 2]\n[lindex $out 3]"] "" ]

*Edit para incluir a versao em TCL e para arrumar a versao Python.
mudancas na versao python:

  • re.findall -> re.search : (findall retorna todos os "matches", search retorna soh o primeiro)
  • out[0][0] -> out.group(1) : (findall retorna uma lista de tuplas, search retorna um MatchObject)

flwz!

Luca

Olá

Alguns dos códigos que li por lá e por aqui são discursos enfáticos de porque usar Java e não usar sânscrito, perl e outras coisas igualmente complexas (apesar de às vezes divertidas).

[]s
Luca

cv1

Nao eh beeeem um code contest. Eh um “mostre como eh facil tornar codigo em qualquer linguagem ilegivel quando vc usa expressoes regulares”. :wink:

plentz

Se o carinha que for ver o código não conhecer absolutamente nada de regular expressions, nem que fossem separadas em 3 regexp diferentes, ou feito qualquer tipo de bruxaria o baiano ia entender o que significa. E sim, “code contest” é só um nomezinho tosco pra uma categoria mais tosca ainda. Ah claro, sem contar que num concurso normalmente existe um ganhador.

G

Carlos,

porque não posta la um código legível e fácil?

Daniel_Quirino_Olive

Como o Villela disse, Regexp torna qualquer pedaço de código bem feito em um lixo ilegível. Tanto é que eu nem questionei a regexp que o Diego fez para o exemplo dele em Ruby. Apenas copiei e colei na minha versão Groovy (que ficou um lixo e ainda não pude testar).

Agora, sobre a opinião do Luca: eu achei a versão em Python muito bonitinha. A versão em Ruby também. Mesmo a versão Java 5.0 ficou show de bola (o que ajuda a calar algumas vozes que dizem que Java é muito ruim para processamento de texto - Ok, não é a melhor coisa do mundo para processamento de texto, mas não é de todo ruim também). O que me deixou realmente impressionado (pelo lado negativo) foi o fato de o objeto java.net.URLConnection não possuir um user-agent padrão (o que me faz pensar se aquele script em Groovy vai funcionar ou não).

G

Daniel,

e que outra API teriamos para trabalhar com texto além das Expressões Regulares? E que tenha a mesma performance?

falou…

urubatan

ele possui um UserAgent padrão, só que o google da um erro 403 se usar o padrão, pq ele filtra “robos de busca” que possam ser feitos em java.
se não fosse isto, dava pra usar url.openStream() direto :smiley:

louds

flaleite:
Falando em RegEx acabo de ficar p*** da vida com o java.util.regex.

Pattern pKey = Pattern.compile("PA");
        
        Matcher mKey = pKey.matcher("PATO");
        return mKey.find();

O dito não tem o comportamento das outras implementações de Reg Ex e retorna true (o correto seria false). Para fazer ele trabalhar da maneira correta tem que acrescentar “^PA$”.

abs.,
Flávio Suguimoto

Flávio, ajuda você aprender a usar a API corretamente. Senão fica a impressão que você não sabe do que está falando e simplesmente está reclamando sem razão.

Leia a API da classe Matcher, você vai notar que find() e match() se comportam de formas diferentes.

Daniel_Quirino_Olive

giulianocosta:
Daniel,

e que outra API teriamos para trabalhar com texto além das Expressões Regulares? E que tenha a mesma performance?

falou…

http://tusker.org/regex/regex_benchmark.html

thiago.correa

flaleite:
Falando em RegEx acabo de ficar p*** da vida com o java.util.regex.

Pattern pKey = Pattern.compile("PA");
        
        Matcher mKey = pKey.matcher("PATO");
        return mKey.find();

O dito não tem o comportamento das outras implementações de Reg Ex e retorna true (o correto seria false). Para fazer ele trabalhar da maneira correta tem que acrescentar “^PA$”.

abs.,
Flávio Suguimoto

O find ele procura a expressão em um determinado texto, se você usar macthes ele deverá retornar false!

G

Daniel Quirino Oliveira:
giulianocosta:
Daniel,

e que outra API teriamos para trabalhar com texto além das Expressões Regulares? E que tenha a mesma performance?

falou…

http://tusker.org/regex/regex_benchmark.html

Daniel, eu me referia a algo que não tenha que trabalhar com expressões regulares. E não outras implementações de Expressões Regulares. Mas mesmo assim valeu pela dica dos benchmarks

Rafael_Afonso

Olá:

Aqui vai a minha versão em Groovy:

"http://www.google.com".toURL().eachLine{
	it.eachMatch("<a(.*?)href=(\\"|)(.*?)(\\"|)(.*?)>(.*?)</a>"){println  "* " + it[6] + " --> " + it[5]}
}

A Resposta:

* Página inicial personalizada --> /url?sa=p&pref=ig&pval=2&q=http://www.google.com.br/ig%3Fhl%3Dpt-BR"
* Efetuar login --> https://www.google.com/accounts/Login?continue=http://www.google.com.br/&hl=pt-BR"
* Imagens --> /imghp?hl=pt-BR&tab=wi&ie=UTF-8"
* Grupos --> http://groups.google.com.br/grphp?hl=pt-BR&tab=wg&ie=UTF-8"
* Diretório --> /dirhp?hl=pt-BR&tab=wd&ie=UTF-8"
* Notícias<sup><a	style="text-decoration:none"><font	color=red>Novo!</font> --> http://news.google.com.br/nwshp?hl=pt-BR&tab=wn&ie=UTF-8"
* mais&nbsp;&raquo; --> /intl/pt-BR/options/" class=q
* Pesquisa avançada --> /advanced_search?hl=pt-BR
* Preferências --> /preferences?hl=pt-BR
* Ferramentas de idiomas --> /language_tools?hl=pt-BR
* Soluções de publicidade --> /intl/pt/ads/
* Tudo sobre o Google --> /intl/pt-BR/about.html
* Google.com in English --> http://www.google.com/ncr

Alguma Observações:

  • Se eu tento http://www.google.com.br/search?q=groovy acabo obtendo um erro HTTP 403. será que o Google é capaz de barrar requisições que não venham de browsers?
  • Por que it[6] e it[5]? Confesso que não sei. Cheguei a eles por tentativa e erro. Se no closure do eachMatch tivesse usado simplesmente it.toString(), apareceria um array de Strings. Creio que deve ser algo haver com os i[/i]. Devo ler melhor a API de regex do Java.
  • Como podem ver não é a solução perfeita, pois anida aparecem as aspas finais do href.

Grato,

plentz

Rafael Afonso:
Olá

Alguma Observações:

Olá Rafael, o Daniel explicou isso antes…

Rafael_Afonso

diego_sl:
Rafael Afonso:
Olá

Alguma Observações:

Olá Rafael, o Daniel explicou isso antes…

Bem, nunca mexi com a classe java.net.URLConnection. Por isso nunca senti esse problema na pele, nem compreendi a observação do Daniel. Agora entendo.

Grato,

Daniel_Quirino_Olive

A classe URL do Groovy não é exatamente a java.net.URL. É uma extensão que foi criada baseada nesta classe. Quando você faz URL.eachLine() ou URL.getText() (como eu fiz), ele acaba usando um URLConnection por baixo dos panos para tratar as transações HTTP necessárias. Eu conversei com o Guillaume Laforge para se adicionar um delegate para o método URLConnection.setRequestProperty(String). Vamos ver no que dá.

Daniel_Quirino_Olive

Reload:
Contest desta semana é: http://nullability.org/?p=34

T
import java.io.*;
import java.util.*;
class RemoveArquivosVelhos {
    public static void main(String[] args) {
        final long ontem = new Date().getTime() - 7L * 24 * 3600 * 1000;
        for (File f : new File("/tmp/backup").listFiles(new FileFilter() {
            public boolean accept (File pathname) {
                return pathname.lastModified() < ontem;
            }
        })) {
            f.delete();
        }
    }
}

Eu sei, eu sei, poderia deletar o arquivo dentro do accept, mas não sei se o sistema operacional vai gostar muito disso. Prefiro montar a lista de arquivos a serem deletados, e depois deletar os arquivos.

EDIT - Aham, não tinha visto que era 1 semana (não 1 dia). Corrigido

1112

Ainda não testei, usa Commons:

import java.io.File;
import java.util.Date;

import static org.apache.commons.io.FileUtils.* ;
import org.apache.commons.io.filefilter.AgeFileFilter ;

public class Backup {
    public static void main( String[] args ) {
        File dir = new File("/tmp/backup");
        Date lastWeek = new Date( System.currentTimeMillis() - 7L*3600*24*1000 );
        AgeFileFilter filter = new AgeFileFilter( lastWeek );
        for( Object f : listFiles( dir, filter, null ) ) ((File)f).delete();
    }
}

Edit: Testei e tinha esquecido de um parêntese. Acontece. Agora tá certinho.

T

Em C# (só compilei, não testei)

using System;
using System.IO;
public class RemoveArquivosVelhos {
    public static void Main(string[] args) {
        foreach (FileInfo fi in (new DirectoryInfo (@"\temp\backup")).GetFiles()) {
            if (((TimeSpan) (DateTime.Now - fi.LastWriteTime)).Days > 7) {
                fi.Delete();
            }
        }
    }
}
F
#@®®¡$:
Ainda não testei, usa Commons:
import java.io.File;
import java.util.Date;

import static org.apache.commons.io.FileUtils.* ;
import org.apache.commons.io.filefilter.AgeFileFilter ;

public class Backup {
    public static void main( String[] args ) {
        File dir = new File("/tmp/backup");
        Date lastWeek = new Date( System.currentTimeMillis() - 7L*3600*24*1000 );
        AgeFileFilter filter = new AgeFileFilter( lastWeek );
        for( Object f : listFiles( dir, filter, null ) ((File)f).delete();
    }
}

Willerson,

Vc pode fazer a uma versão para os "rubyzeros" entenderem. :D

import java.io.File;
 import java.util.Date;
 
 import static org.apache.commons.io.FileUtils.* ;
 import org.apache.commons.io.filefilter.AgeFileFilter ;
 
 public class Backup {
     public static void main( String[] args ) {
         for( Object f : listFiles( new File("/tmp/backup"), new AgeFileFilter( new Date( System.currentTimeMillis() - 7L*3600*24*1000 ) ), null ) ((File)f).delete();
     }
 }

Brincadeirinha... Paz... :lol: :lol:

Rafael_Afonso

Uma outra versão em Groovy:

def limpaDir(nameDir, diasAtras) {
	def dir = new File(nameDir)	// Não precisa chamar import
	def diaMinimo = new Date() - diasAtras	//  O operador menos subtrai o número de dias
	dir.eachFile { if((new Date(it.lastModified())) < diaMinimo) {it.delete()}}
}

limpaDir("c:/temp", 5)
  • Não seria interessante ter um método String.toFile()? Funcionaria da mesma forma que String.toUrl().
1112

flaleite:
Willerson,

Vc pode fazer a uma versão para os “rubyzeros” entenderem. :smiley:

(…)
Brincadeirinha… Paz… :lol: :lol:

a) Só tem um “l”.
b) Ei, o “rubyzeros” é alguma crítica oculta? :lol: Se for, se ferrou, eu sou Ruby-enthusiast também. :wink:
c) Eu procurei manter a convenção de linhas com no máximo 80 caracteres.

Brincadeirinha again. :lol:

F

#@®®¡$:
flaleite:
Willerson,

Vc pode fazer a uma versão para os “rubyzeros” entenderem. :smiley:

(…)
Brincadeirinha… Paz… :lol: :lol:

a) Só tem um “l”.
b) Ei, o “rubyzeros” é alguma crítica oculta? :lol: Se for, se ferrou, eu sou Ruby-enthusiast também. :wink:
c) Eu procurei manter a convenção de linhas com no máximo 80 caracteres.

Brincadeirinha again. :lol:

Desculpe pelo l a mais :oops:

Eu tbm sou pró Ruby e acho uma Rails fantastico. Mas eu só fiz essa brincadeira para mostrar que uma boa solução independe da qtde de linhas ou caracteres.

Daniel_Quirino_Olive

Versões em Python, Smalltalk, Lisp, Pascal, COBOL, PL1, Natural, VB, Clipper, Brainf*ck, Ada … são bem-vindas! :slight_smile:

W

Versao Ruby "clonada" da versao Groovy do Rafael Afonso :lol:

def limpaDir(nameDir, diasAtras)
  diaMinimo = Time.now - diasAtras*24*60*60
  Dir.glob("#{nameDir}/*.*").each do |f|
    File.delete(f) if (File.mtime(f) < diaMinimo)
  end
end

limpaDir("/temp/backup", 7)

flw!

plentz

WNS:
Versao Ruby "clonada" da versao Groovy do Rafael Afonso :lol:

def limpaDir(nameDir, diasAtras)
  diaMinimo = Time.now - diasAtras*24*60*60
  Dir.glob("#{nameDir}/*.*").each do |f|
    File.delete(f) if (File.mtime(f) < diaMinimo)
  end
end

limpaDir("/temp/backup", 7)

flw!

Legal WNS, tinha feito algo muito parecido também, mas tu chegou antes. Mas confesso que estava fazendo mais artesanalmente, não conhecia o Dir.glob :slight_smile:

Daniel_Quirino_Olive

Reload. Novo code contest: http://nullability.org/?p=49

Aproveitem o tempo ocioso de vocês e, ao invés de ficarem batendo boca sobre estas coisas do Fantástico, quebrem a cabeça com algo divertido :slight_smile:

bandrade

Credo, nunca achei que fatorial pudesse ser tão complicado… hehehe… (;

T

Em Python é fácil. Já deixei meu post lá. Só não sei quanto tempo leva para calcular 200000!

Em MIT Scheme Lisp há uma implementação recursiva na própria documentação que não funciona para n > 30000 aproximadamente; vou ter de reescrever uma implementação iterativa.

Ironlynx

Já arriscou Haskell Daniel???Para que tanto trabalho…

fato::Int->Int
fato n
     | n==0=1
     | otherwise =n*fato(n-1)

Ou ainda usando a funca product:

fato::Int
fato=product[1..10]

O chato é por para rodar um valor tão alto, vai demorar um teeempo…

David

Em Ruby:

def fatorial(n)
      i = fat = 1
      n.times do
            fat = fat * i
            i = i + 1
      end
      fat
end

init = Time.now
puts fatorial(200000)
fini = Time.now

puts "Tempo: " + (fini-init).to_s + "s"

Da última vez que eu testei esse código ele tinha conseguido calcular o fatorial de 10000. O de 200000 eu estou testando agora, se der certo eu aviso! :slight_smile:

Edit: Quanto tempo isso demora??? :shock: :shock:

Edit 2: Finalmente! 4219,35 segundos… Uma hora e dez minutos, aproximadamente. E acho que os números gerados pelo programa em Ruby e em Java são iguais… Para criar o arquivo eu simplesmente redirecionei a saída para um arquivo. Depois apaguei tudo que não era fatorial de 200000 dos arquivos gerados pelo ruby e pelo java e usei diff para compará-los.

David

Em groovy:

import java.math.BigInteger

def fatorial(n) {
	BigInteger result = BigInteger.ONE
        aux = 1
	n.times { result *= aux++ }
	result
}

init = System.currentTimeMillis()
println fatorial(200000)
fini = System.currentTimeMillis()
 
println "Tempo: ${ (fini-init) } ms"
Daniel_Quirino_Olive

Vale lembrar que o desafio em si não é quem consegue calcular fatorial com a menor quantidade de linhas de código possível, mas quem consegue calcular o fatorial de um número beeeeeem grande de maneira beeeeeem rápida. No exemplo em Java que foi mostrado como referência, calcular 200000! em um Pentium 4 3.06Ghz (Dual Core), com 1 Gb de RAM usando a JVM 1.5.0_06 sem nenhum tipo de tuning leva aproximadamente 150 segundos (2 minutos e meio).

:wink:

David

No modo threaded ou simple? A minha máquina é um Sempron 2.1Ghz com 512MB de RAM.

F

Daniel,

Seria interessante você ou alguem botar para rodar todas as versões em uma mesma máquina.

Ou usar um denominador comum para equalizar os tempos em diferentes máquinas.

1112

O modo threaded rodou quase 10x mais rápido que o simple na minha máquina aqui do trampo (P4 3.00 GHZ, 512 RAM JVM 1.5.0_04 ), uns 170 segundos.

Daniel_Quirino_Olive

flaleite:
Daniel,

Seria interessante você ou alguem botar para rodar todas as versões em uma mesma máquina.

Ou usar um denominador comum para equalizar os tempos em diferentes máquinas.

Eu tento, Flávio. Mas é complicado: como vou botar uma aplicação Haskell para executar um fatorial de 200.000! que vai levar quase um dia inteiro?

F

Daniel Quirino Oliveira:
flaleite:
Daniel,

Seria interessante você ou alguem botar para rodar todas as versões em uma mesma máquina.

Ou usar um denominador comum para equalizar os tempos em diferentes máquinas.

Eu tento, Flávio. Mas é complicado: como vou botar uma aplicação Haskell para executar um fatorial de 200.000! que vai levar quase um dia inteiro?

:smiley: hahahaha… as que vc não conseguir rodar por ai, por falta de tempo ou de ambiente peça ao pessoal que enviar (ou que puder) que rode anote o tempo e envia a spec da máquina.

urubatan

eu estou des de ontem no final da tarde tentando rodar o fatorial de 200.000.000 :D:D:D

RodrigoSol

Vou rodar em c++ usando a lib MAPM e ver o que dá, mas me parece que java vai levar vantagem…

#include "stdafx.h"
#include "stdio.h"
#include "m_apm.h"
#include "iostream.h"
#include <sys/timeb.h>
#include <time.h>

MAPM Factorial(MAPM n)
{
        MAPM i;
        MAPM product=1;
        for (i=2; i<=n; i++)
           product*=i;

        return product;
}

int main(int argc, char* argv[])
{

    struct _timeb timebuffer;
    char *timeline;
	char  obuf[256];
    
	_ftime( &timebuffer );
	timeline = ctime( & ( timebuffer.time ) );
    
	printf( "The time is %.19s.%hu %s", timeline, timebuffer.millitm, &timeline[20] );
	MAPM n = Factorial(200000);
	timeline = ctime( & ( timebuffer.time ) );
	t.toString(obuf, 50); 
	printf("n = [%s] \n",obuf); 
    printf( "The time is %.19s.%hu %s", timeline, timebuffer.millitm, &timeline[20] );
	return 0;
}
Daniel_Quirino_Olive

Threaded.

Mas vocês podem usar a estratégia que vocês quiserem para calcular 200000!. A questão é saber como vocês vão fazer isso executar rápido.

RodrigoSol

Gastou 170s em java para 200.000? esse é o melhor numero até aqui?

Daniel_Quirino_Olive

O recorde é 151.4s (Dell Optiplex GX280, Pentium 4 - 3.06Ghz Dual Core, 1Gb RAM, JVM 1.5.0_06 em Windows XP Pro SP2).

F

Daniel,

É muito dificil tu fazer o teste usando o Java 6 Beta?

]['s

Daniel_Quirino_Olive

Daniel,

É muito dificil tu fazer o teste usando o Java 6 Beta?

]['s

149.66s (Dell Optiplex GX280, Pentium 4 - 3.06Ghz Dual Core, 1Gb RAM, JVM 1.6.0-beta em Windows XP Pro SP2). Novo recorde.

RodrigoSol

Resultado da minha versão em c++:

The time is Thu May 25 12:01:21.330 2006
n = [1.42022534547031440496694633368230597608996535674640E+973350] 
The time is Thu May 25 12:53:45.210 2006

Demorou 52 Minutos…

RodrigoSol

Acabou a diversão:

-----------------------------------------------
COMPUTING 200000! = 1.4202 E+973350
-----------------------------------------------
PrimeSchoenhage         3,99 Sec <2731e705>
PrimeSwingLuschny       2,69 Sec <2731e705>
PrimeVardi              2,92 Sec <2731e705>
PrimeSwingList          2,75 Sec <2731e705>
PrimeSwingCache         3,53 Sec <2731e705>
SplitRecursive          5,13 Sec <2731e705>

http://www.luschny.de/math/factorial/FastFactorialFunctions.htm

David

Ah, mas cadê o arquivo de quase 1MB com todos os centenas de milhares de dígitos do número??? :lol:

RodrigoSol

Serve esse? :wink:

David

Acho que temos um vencedor, hehehe! :thumbup:

RodrigoSol

Acho que não… o algoritmo já estava pronto… O melhor implementado por alguém daqui ainda é a versão java do Daniel…

Daniel_Quirino_Olive

Tentem implementar algo parecido com a versão em Java em alguma outra linguagem, isto é, use threads para calcular resultados parciais (em C++ deve ficar interessante isso. Em Fortran idem. Em Ruby, eu tenho cá minhas dúvidas se vai ficar rápido de verdade).

F

Daniel,

É muito dificil tu fazer o teste usando o Java 6 Beta?

]['s

149.66s (Dell Optiplex GX280, Pentium 4 - 3.06Ghz Dual Core, 1Gb RAM, JVM 1.6.0-beta em Windows XP Pro SP2). Novo recorde.

Daniel!

Obrigado. Tu usou algum tipo de parametro na jvm ou foi no default mesmo?
Interessante pois achei que o java 6 seria bem mais rapido, visto que tao falando magavilhas da performance dele. :smiley:

]['s

Daniel_Quirino_Olive

ele possui um UserAgent padrão, só que o google da um erro 403 se usar o padrão, pq ele filtra “robos de busca” que possam ser feitos em java.
se não fosse isto, dava pra usar url.openStream() direto :D

Ahh, ressuscitando este tópico apenas para um lembrete: caso vocês queiram tapear o bloqueio de user-agents estranhos que o Google faz, faça isso no seu código Java:

System.setProperty("http.agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4"); // user-agent do Mozilla Firefox

:wink:

urubatan

Minha vez de lançar um code contest pra galera
http://www.urubatan.com.br/2007/07/13/code-contest-valendo-uma-cortesia-para-o-just-java-2007/
Valendo uma entrada de gratis pro Just Java :smiley:

Criado 31 de março de 2006
Ultima resposta 13 de jul. de 2007
Respostas 73
Participantes 25