Problem hidden
|This problem was hidden by Editorial Board member probably because it has incorrect language|version or invalid test data, or description of the problem is not clear.|

LISP - Lisp é melhor que Java, C e CPP

Acredite ou não, esse foi o resultado de um estudo conduzido por Ron Garret (Erann Gat) no início do século. A motivação de Garret foi um outro estudo, feito por Lutz Prechelt e publicado na Communications of the ACM, que comparava a performance de tempo de execução e uso de memória de programas escritos em C, C++ e Java. Porém, diferentemente de benchmarcks tradicionais, Prechelt comparou diferentes implementações de uma mesma tarefa feita por 38 desenvolvedores diferentes (em experiência e conhecimento). O estudo de Prechelt mostrou que Java é de 3 a 4 vezes mais lento que C ou C++, porém a variação maior ocorreu entre os programadores, não entre as linguagens, sugerindo que é melhor gastar mais tempo treinando os desenvolvedores do que discutindo que linguagem deve ser escolhida.

Anos depois Garret estendeu esse estudo adicionando Lisp como uma das implementações possíveis para o problema, e dessa vez, além de considerar todos os fatores de comparação de Prechelt, acrescentou o tempo de desenvolvimento como métrica. Os resultados de Garret foram surpreendentes: Lisp ganhou disparado em todos os quesitos, necessitando de menos tempo e linhas de código, consumindo menos memória e executando mais rápido que os programas feitos em C, C++ ou Java. Essa é a sua chance de provar que o estudo de Garret está errado. Como? Resolvendo o mesmo problema proposto, em menos tempo e com implementações mais rápidas. O problema que foi a base de ambos os estudos é o seguinte: Considere o seguinte mapeamento entre letras e dígitos:

E | J N Q | R W X | D S Y | F T | A M | C I V | B K U | L O P | G H Z
e | j n q | r w x | d s y | f t | a m | c i v | b k u | l o p | g h z
0 |   1   |   2   |   3   |  4  |  5  |   6   |   7   |   8   |   9

Queremos usar esse mapeamento para codificar números de telefone em palavras de forma que seja fácil decorá-los. Sua tarefa é escrever um programa que ache, dado um número de telefone, todas as possíveis codificações do mesmo em palavras. Um número de telefone é uma string arbitrária contendo apenas hífen (-), barras (/), e dígitos. As barras e hífen não devem ser codificados. As palavras são tiradas de um dicionário informado em ordem alfabética. Você deve imprimir apenas as palavras que codifiquem completamente o número de telefone. As palavras no dicionário podem ter letras maiúsculas e minúsculas, hífen (-) e aspas ("), porém você deve usar apenas as letras para codificar um número. A palavra deve ser impressa como foi dada no dicionário. A codificação de um número de telefone pode consistir de uma ou mais palavras, separadas por espaço. A codificação é construída palavra por palavra, da esquerda para a direita. Se, em um dado ponto da codificação nenhuma palavra do dicionário pode ser inserida, então um único digito do número de telefone pode ser usado para a codificação, porém dois números consecutivos não são permitidos numa codificação válida. Em outras palavras: em uma codificação parcial que cobre k dígitos, o dígito k + 1 é codificado por ele mesmo se e somente se, primeiro, o dígito k não foi codificado por um dígito e, segundo, não existe palavra no dicionário que pode ser usada na codificação começando no dígito k + 1.

Entrada

Cada instância é composta por uma linha contendo um número inteiro 0 < n <= 75000, o número de palavras no dicionário. As próximas n linhas contêm palavras com no máximo 50 caracteres. Depois do dicionário segue um inteiro 1 < t < 100000, e nas t linhas seguintes os números de telefone a serem codificados. Quando n for 0 seu programa deve parar.

Saída

Para cada instância seu programa deve imprimir uma linha contendo Instancia k, onde k é o numero da k-ésima instância. Para cada número de telefone processado seu programa deve imprimir todas as codificações possíveis em ordem lexicográfica crescente. Cada codificação deve ser impressa no seguinte formato: o número do telefone seguido de dois pontos (:), um espaço e a codificação.

Exemplo

Entrada:
23
Bo"
Boot
Fee
Fest
Mix
Mixer
Name
Ort
Tor
Torf
Wasser
an
blau
bo"s
da
fern
fort
je
jemand
mir
neu
o"d
so
8
112
5624-82
4824
0721/608-4067
10/783--5
1078-913-5
381482
04824
0

Saída:
Instancia 1
5624-82: Mix Tor
5624-82: mir Tor
4824: Tor 4
4824: Torf
4824: fort
10/783--5: je Bo" da
10/783--5: je bo"s 5
10/783--5: neu o"d 5
381482: so 1 Tor
04824: 0 Tor 4
04824: 0 Torf
04824: 0 fort

Adicionado por:Wanderley Guimarăes
Data:2007-09-01
Tempo limite:0.211s
Tamanho do fonte:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Linguagem permitida:Todas exceto: ASM64 CLOJURE ERL FSHARP JS-RHINO NODEJS PERL6 PY_NBC SCALA TCL VB.NET
Origem:Seletiva paea Maratona de Programação do IME - 2006

hide comments
2011-07-18 00:58:26 isak
CPP é mol vezes melhor que java
2011-06-16 00:25:21 Felypp Oliveira [UNIR]
Qual o tamanho máximo que a descriçăo de um número de telefone pode ter? =X
2011-05-31 10:08:54 Rafael Perrella
a saída está certa mesmo... năo duvidem disso
2011-05-27 17:26:53 Rafael Perrella
A saída no SPOJ está certa mesmo? Porque o meu dá certo para o exemplo acima e dá certo para todos os casos de teste que tento, mas quando eu submeto só dá resposta errada. Já tentei de TUDO, até tirei o \n\n após a última instância...

Last edit: 2011-05-27 17:27:14
2011-05-27 00:30:00 Rafael Perrella
Uma linguagem de programaçăo >.<...
2011-05-21 23:51:16 Douglas Eric [Anhanguera-SO]
O que é lisp?
© Spoj.com. All Rights Reserved. Spoj uses Sphere Engine™ © by Sphere Research Labs.