Nota: Esta pergunta foi editada severamente desde que a publiquei aqui pela primeira vez. As regras foram movidas para aqui , leia-as antes de postar qualquer resposta para entender o objetivo disso. Esta foi a primeira pergunta criada na categoria de trollagem de código .
Imagine que um usuário preguiçoso no Stack Overflow faz esta pergunta:
Eu preciso de um programa em que o usuário insira uma matriz de duplas e o programa emita a matriz classificada. Poderia, por favor, fornecer o código?
Como você pode criar um código que trollará esse usuário? Crie um pedaço de código que parecerá útil para um programador inexperiente, mas é totalmente inútil na prática.
O vencedor é a resposta mais votada, exceto se a resposta não for de alguma forma qualificada (para requisitos de elegibilidade, verifique a descrição da tag wiki de trollagem de código ). Se a resposta mais votada anteriormente for derrotada no futuro no número de votações após a aceitação, a nova melhor resposta será aceita e a anterior será inaceitável. No caso de empate, escolherei o vencedor à vontade entre os empatados ou esperarei um pouco mais.
Respostas que não têm código não são elegíveis. Eles podem ser divertidos e receber votos positivos, mas não serão aceitos.
As regras podem ser encontradas na descrição da tag .
Nota: Esta é uma pergunta de controle de código . Por favor, não leve a sério a pergunta e / ou respostas. Mais informações aqui .
fonte
Respostas:
Às vezes, a comunidade aqui não gosta de ajudar com a lição de casa. É por isso que você está recebendo tantas respostas de piadas. Mas eu gosto de ajudar. Aqui está uma solução completa em 'C' (desde que eu assumo que você queira aprender "programação", não "scripts" com Java ou Ruby). Incluí muitas dicas que eu gostaria de saber quando aprendi pela primeira vez
fonte
1st, 2th, 3th, 4th...
e o operador downto - técnicas de programação C muito avançadas.sscanf(input, "%5s", &input[0])
, caso contrário, poderá haver erros de excedência ao analisar a entrada. E a entrada deve ser declaradachar input[sizeof(int)+1]
, para compatibilidade com versões anteriores com sistemas de 64 bits.i==1?"st":"th"
hahaha ...Aqui está em java. É uma trapaça total, inaceitável e impossível de corrigir, porque cria um banco de dados MySQL, insere o número lá, faz uma seleção com uma cláusula ORDER BY e gera os números fornecidos pelo MySQL. De fato, é o MySQL quem está fazendo a classificação, não o programa.
fonte
Não há matança como exagero
Primeiro de tudo, querido GiMmEtHaCoDeZ, vamos tentar dividir sua tarefa:
Como "Dividir e conquistar" é uma estratégia muito importante ao trabalhar com problemas de software, vamos enfrentá-los um por vez
1. Leitura
Outra questão importante no software é a versatilidade. Como não está especificado como o usuário digitará os números, isso pode acontecer por meio do console, por um arquivo, por um serviço da web etc. etc. Talvez até algum método que não possamos pensar no momento. Portanto, é importante que nossa solução possa acomodar vários tipos de entrada. A maneira mais fácil de conseguir isso é extrair a parte importante de uma interface, digamos
onde
DoubleArrayReaderType
é uma enumeração fornecida comTambém é importante tornar o software testável desde o início, para que uma implementação da interface seja
A seguir, a questão lógica é como saberemos carregar o apropriado
IDoubleArrayReader
no código. Isso é fácil, desde que usemos uma fábrica simples:Observe que usamos a reflexão para carregar todos os leitores ativos, para que futuras extensões sejam disponibilizadas automaticamente Agora, no corpo principal do código, apenas fazemos:
2. Processamento (classificação)
Agora precisamos processar, ou seja, classificar os números que adquirimos. Observe que as etapas são completamente independentes uma da outra; portanto, para o subsistema de classificação, não importa como os números foram inseridos. Além disso, o comportamento de classificação também está sujeito a alterações, por exemplo, talvez seja necessário inserir um algoritmo de classificação mais eficiente. Portanto, naturalmente, extrairemos o comportamento de processamento solicitado em uma interface:
E o comportamento de classificação apenas implementará a interface:
Obviamente, precisaremos de uma fábrica para carregar e gerenciar as instâncias de processamento.
3. Escrevendo a saída
Não há muito o que dizer aqui, pois esse é um processo que reflete a entrada. De fato, poderíamos combinar as fábricas de leitura e escrita em uma única
DoubleArrayInputOutputFactory
, assim:Juntando tudo
Por fim, nosso programa principal usará toda essa grandiosidade que já construímos, portanto o código será apenas:
onde, por exemplo, podemos definir
reader
,writer
eprocessor
usandofonte
Interpretação ainda mais literal:
isto é, "a matriz" classificada.
fonte
sort.sh
e chame comosh sort.sh "an array of doubles"
"an array of doubles"
pode ser passado para o script como um argumento da linha de comandos.Perl
De todas as coisas que eu fiz para o CodeGolf.SE, isso provavelmente levou mais tempo, pelo menos algumas horas.
A entrada é do formato
[2,4,5,7,7,3]
e a saída é do formato[2,3,4,5,7,7]
.Não tenho tempo para explicar agora ... volto mais tarde.De qualquer forma, existe algo chamado matriz anônima no Perl. É uma matriz, mas não tem nome. O que sabemos, no entanto, é uma referência (localização da memória) que aponta para ela. Uma série de números entre colchetes cria uma matriz anônima e retorna uma referência a ela.
Essa resposta é criada a partir de uma série de matrizes anônimas, cujas referências são armazenadas
@_
. A entrada é transformada em uma matriz anônima. Em seguida, criamos outras matrizes anônimas, cada elemento da qual é uma referência a um elemento na matriz anterior. Em vez de classificar os elementos na matriz, classificamos os ponteiros para os elementos nessa matriz. Além disso, criamos uma nova matriz para cada etapa (e mais) na operação de classificação.fonte
$_
é uma string vazia nesse ponto. Guardei minha saída desejada$\
, que é o separador de registros de saída.Pitão
Dá ao usuário uma matriz classificada, removendo todos os elementos que não estão em ordem classificada da matriz de entrada.
O algoritmo passa pela lista apenas adicionando cada elemento se não tornar a lista não classificada. Portanto, a saída é uma lista classificada, mas não uma que contém todos os elementos da lista original. Se o op apenas verificar se a lista está na ordem de classificação, ele pode não perceber que a saída está com valores ausentes.
fonte
sys.stdin.read()
um erro de digitação ou parte da verdadeira resposta de pesca à linha? Certamente seria frustrar o OP para dar a matriz como entrada e continuar a esperar pelo resultado ...O(n)
algoritmo de classificação. Agradável.Bash, 54 caracteres
Muitas respostas usando linguagens lentas e ineficientes como C e Python ... vamos acelerar um pouco as coisas, oferecendo uma solução na mãe de todas as linguagens de script: Bash.
Eu sei o que você está pensando - o Bash não consegue nem lidar com a aritmética de ponto flutuante; então, como isso vai resolver, certo? Bem, eis que minha implementação do poderoso algoritmo SleepSort:
O programa é fornecido com entrada como argumentos da linha de comando. Exemplo de execução:
Isso também tem a vantagem de ser o menor de todos os algoritmos de trabalho apresentados aqui. Isso mesmo - uma poderosa linha de bash , usando apenas bash basins e não chamando binários externos (ou seja, se você não contar a saída detalhada puramente opcional). Ao contrário dos bogosorts, seu tempo de execução é determinístico.
Dica: Uma otimização eficaz é dividir os números de entrada por um fator antes de classificar. A implementação é deixada para o leitor.
Editar:
Versão de golfe de 54 caracteres reduzida com impressão menos bonita:
fonte
/proc/cpuinfo
.O JavaScript tem uma
sort()
função interna, você pode usá-lo assim:... oh, esqueci totalmente de mencionar, classifica em ordem lexicográfica, ie
10 < 9
e9 < -100
. Provavelmente é o que você espera de qualquer maneira.fonte
(jPL) Linguagem de programação jQuery
Você deve usar o jQuery para isso. Uma solução simples para esse problema é a seguinte:
fonte
$
, matrizes usandoa
e resultados dewindow.prompt
asp
.C
Esta solução combina a concisão e o acesso no nível do SO fornecido pela C com os poderosos e reutilizáveis componentes de software no GNU / Linux:
fonte
#!/usr/bin/sort
.Rubi
Bastante auto-explicativo.
Ou exija que a entrada seja "uma matriz de duplas":
Não usando
gets.chomp
para maldade extra. Também usando regex depois de seguir até, o que é algo que eu nem sabia que você poderia fazer (obrigado Jan Dvorak) para confundir ainda mais o OP!fonte
an array of doubles
.gets
vez degets.chomp
).Python3.3
O trolling consiste em fornecer uma solução perfeitamente funcional que faça exatamente o que o OP pretendia, mas de uma maneira que seja:
Em resumo, essa resposta aumentaria bastante a frustração de o aluno zombar de seus pedidos com respostas perfeitamente válidas de um certo ponto de vista.
(Não leia se considerar um desafio entender o código acima)
Devo acrescentar que o trolling também é aumentado pelo fato de o algoritmo de classificação implementado ser realmente
fonte
C - Estilo de codificação lento, difícil de usar e inaceitável
O algoritmo de classificação propriamente dito é conhecido como slowsort e possui uma complexidade (melhor simplicidade) de aproximadamente n ^ (log n / 2) . O algoritmo foi publicado por Andrei Broder e Jorge Stolfi em seu excelente artigo "Algoritmos pessimais e análise de simplicidade", que eu recomendo para boas risadas e alimento para reflexão.
No entanto, a classificação em si é inútil, por isso precisamos de uma maneira de o usuário inserir os dados que deseja classificar. Analisar duplas é complicado, então por que não introduzi-las byte a byte.
Para provar que funciona:
No final, temos:
fonte
Ruby, malvado Bogosort! (Bônus: bogosort por entrada do usuário)
As torções "más":
.map &:to_f
anexado à segunda linha, mas o OP pode não saber quechomp
então o último número tem uma nova linha misteriosa no finalstrip
para que haja um espaço em branco misterioso ao redor dos números se for inserido com espaçamento entre vírgulas (ex. O espaço em1.5, 2
)Ou então, e quanto a bogosorting por entrada do usuário ?! >: D
fonte
COBOL
Certo! "Até um macaco pode fazer isso!"
Aqui está um programa COBOL simples que classificará a entrada para você. Leia os comentários para ver exatamente como é trivial e extensível. Os benefícios reais disso são que ele é um mecanismo experimentado e verdadeiro, não depende de linguagens novas e relativamente não testadas, como Java e qualquer coisa baseada na Web ou da Microsoft. Ele é compilado com muita eficácia e procedimentos como esse são usados pelas empresas financeiras de maior sucesso na Fortune500 e por outros líderes do setor. Esse código foi revisado por muitos especialistas e é reconhecido como um excelente mecanismo de classificação.
fonte
OP nunca disse COMO classificá-los ... ou qual é a sua definição de duplas. Assumindo o tipo de dados,
double
mas interpretando-o como duplicado . Usando JavaScript aqui.Resultado: ordem alternada
[4, 11, 4, 9, 5, 7, 6, 7]
fonte
PHP
Aqui está uma implementação completa com tratamento de erros. É o mais rápido para qualquer um
array of doubles
.fonte
A próxima permutação em C ++ funciona retornando true quando a matriz é classificada e falsa (caso contrário). Portanto, você deve classificar a matriz e, em seguida, usá-la durante o processo, conforme descrito acima (para fazer um círculo completo de volta à matriz classificada).
fonte
next_permutation
como resposta, mas isso é muito mais limpo do que o que eu tinha em mente.[solução por direcionamento pontual]
Leia a norma relevante, IEC 60559: 1989, para aritmética binária de ponto flutuante para sistemas de microprocessadores , que você pode adquirir aqui . Na nota de rodapé de §5.10 Detalhes do predicado totalOrder , observe -se que:
Assim, vemos que é impossível escrever código para classificar duplas. É uma pergunta complicada. Ha, ha, muito esperto! Por favor, diga ao seu professor que estou gostando muito do curso dele.
[editar: nada exige que eu não assuma que o problema exige uma ordem total]
fonte
Um JavaScript maligno:
OP, não quero dar tudo a você, por isso vou deixar você descobrir como obter informações do usuário por conta própria (dica: use
prompt
).Depois de ter isso, aqui está uma função na qual você pode passar seu array para classificá-lo. Você só precisa fornecer a matriz, o menor valor na matriz e um incremento:
Aqui está um violino para vê-lo em ação com a entrada do usuário de exemplo [1.5, -3.5, 12, 10, -19.5].
Nota: Além de apresentar um desempenho insatisfatório, complexo e inextensível para o problema em questão, isso será especialmente frustrante se o OP não souber sobre matemática de ponto flutuante. Por exemplo, se a entrada do usuário for
[8.1, 5, -.8, 2.3, 5.6, 17.9]
e o OP escolher os valores diretos (ieminimumVal=-.8
eincrement=.1
), o programa será executado para sempre. Em uma nota relacionada, atualmente sou o orgulhoso proprietário de duas guias do navegador que não funcionam devido a esse problema :)Nota II: Eu me senti nojento mesmo escrevendo o código acima.
Nota III: MWA HAHAHAHA!
fonte
Aqui está uma resposta real que eu gosto para Java:
Nenhuma explicação confunde o OP , mas funciona e receberá votos de programadores mais experientes.
Outra resposta semelhante :
Indiretamente ao OP para fazer sua própria pesquisa, dando-lhe uma vaga resposta correta. Sem mais pesquisas, o OP ainda está confuso . Também gosto que o link aponte para documentação mais antiga.
fonte
Algoritmo genético / método de Monte Carlo para o problema de classificação em JAVA
O problema da classificação é conhecido pela ciência da computação há muito tempo e muitas boas soluções foram encontradas. Nos últimos anos, houve grandes avanços na biocomputação e ver como a biologia resolve problemas se mostrou de grande ajuda na solução de problemas difíceis. Esse algoritmo de classificação utiliza o melhor dessas idéias para usá-las na solução do problema de classificação. A ideia é muito simples. Você começa com uma matriz não ordenada e descobre como isso já está classificado. Você dá uma pontuação de sua "ordenação" e depois permuta a matriz com um componente aleatório - assim como na biologia, onde não está claro como as crianças serão, mesmo que você saiba tudo sobre os pais! Esta é a parte do algoritmo genético. Você cria a prole dessa matriz, por assim dizer. Então você vê se a prole é melhor classificada do que o pai (também conhecido como sobrevivência do mais apto!). Se for esse o caso, você continua com essa nova matriz como ponto de partida para criar a próxima permutação e assim por diante até que a matriz esteja totalmente classificada. O legal dessa abordagem é que ela demora mais, se a matriz já estiver um pouco classificada desde o início!
Extras
fonte
Pitão
Classifica o array (lista), pela soma dos 3 rd e 5 th casas decimais.
fonte
lambda x:
e substituindo-o porx
. Ainda assim, um programador iniciante nunca saberia disso, então parabéns!C ++
Isso funciona ... eventualmente.
Aqui está o meu algoritmo de classificação:
Aqui está o programa completo:
fonte
Aqui, deleite seus olhos:
Esse trecho de código exibe a matriz e solicita que o usuário insira o menor dobro da matriz. Em seguida, adiciona o número à lista de números classificados, remove o dobro da matriz e exibe os números restantes da matriz.
* Interpretação incorreta: ponto fraco, mas o OP não está exatamente esperando que o programa peça ao usuário para ajudar na classificação.
* Trapaça: o usuário é o responsável pela classificação.
* Desempenho: todo número da matriz requer uma ida e volta do servidor e exige que o usuário encontre o menor número manualmente. O desempenho não pode ficar muito pior.
* Inaceitável: acho que cobri isso. E boa sorte em reutilizá-lo. Na pior das hipóteses, o usuário pode se livrar de 90% do código e percorrer repetidamente para encontrar os menores valores e removê-los a cada vez, o que daria a ele um dos algoritmos de classificação menos eficientes.
* Criativo e mau: você me diz.
fonte
Javascript Design Inteligente Classificar
fonte
Python - req. # 1
Esse código classificará as dobras em ordem lexicográfica, em vez de aumentar a ordem numérica, criando uma árvore de prefixos de dígitos e, em seguida, repetindo-os recursivamente.
Funciona a
n log n
tempo e, de fato, é uma maneira inteligente de manter uma lista classificada, mas infelizmente para o OP, ele faz completamente a coisa errada.fonte
2, 1, 3, 8, 5
.Classifica a matriz de duplas. Em Java:
Por exemplo:
[0.0, 1.5, 123]
vai da representação binária não classificada de
011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000
para o elegantemente classificado
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111
fonte
Editar por @ kealist, eu acho que é melhor se comentado para fazer a divisão parecer plausível. Em Rebol ...
Brincando com a idéia de que eles realmente não sabem o que é um dobro, e podem acreditar que uma lista de duplos era apenas um monte de números multiplicados por dois.
fonte
Deliberadamente entendendo mal a pergunta:
Usando uma abordagem recursiva:
É garantido que a matriz classificada seja produzida em algum momento, para qualquer tipo de dado na matriz, mesmo qualquer tipo de ordem de classificação e até mesmo qualquer tipo de separador para a entrada, o que torna essa abordagem extremamente flexível. Sua principal desvantagem é que é um pouco lento para matrizes grandes, mas você pode resolver isso facilmente com multithreading.
fonte