Nota: Esta pregunta fue editada severamente desde que la publiqué aquí por primera vez. Las reglas se movieron aquí , léalas antes de publicar cualquier respuesta para comprender el propósito de esto. Esta fue la primera pregunta creada en la categoría de trolling de código .
Imagine que un usuario perezoso en Stack Overflow hace esta pregunta:
Necesito un programa donde el usuario ingrese una matriz de dobles y el programa genere la matriz ordenada. ¿Podría por favor dar el código?
¿Cómo podrías crear un código que engañe a este usuario? Cree una pieza de código que parezca útil para un programador inexperto pero que es completamente inútil en la práctica.
El ganador es la respuesta más votada, excepto si la respuesta de alguna manera no es elegible (para conocer los requisitos de elegibilidad, consulte la descripción de la etiqueta en la wiki del código de trolling ). Si la respuesta más votada anteriormente es superada en el futuro en el número de votos votados después de ser aceptada, la nueva mejor respuesta se acepta y la anterior no se acepta. En caso de empate, elegiré el ganador a voluntad entre los empatados o simplemente esperaré un poco más.
Las respuestas que no tienen código no son elegibles. Pueden ser divertidos y obtener algunos votos positivos, pero no serán aceptados.
Las reglas se pueden encontrar en la descripción de la etiqueta .
Nota: Esta es una pregunta de arrastre de código . No tome en serio la pregunta y / o las respuestas. Más información aquí .
fuente
Respuestas:
A veces, a la comunidad aquí no le gusta ayudar con la tarea. Es por eso que obtienes tantas respuestas de broma. Pero me gusta ayudar. Aquí hay una solución completa en 'C' (ya que supongo que desea aprender "programación", no "secuencias de comandos" con Java o Ruby). He incluido muchos consejos que desearía haber sabido cuando estaba aprendiendo
fuente
1st, 2th, 3th, 4th...
and the downto operator: técnicas de programación en C muy avanzadas.sscanf(input, "%5s", &input[0])
, de lo contrario, podría haber errores de desbordamiento al analizar la entrada. Y la entrada debe declararsechar input[sizeof(int)+1]
, para compatibilidad con versiones anteriores de sistemas de 64 bits.i==1?"st":"th"
jajaja ...Aquí está en Java. Es una trampa total, inaceptable e irreparable porque crea una base de datos MySQL, inserta el número allí, realiza una selección con una cláusula ORDER BY y genera los números dados por MySQL. De hecho, es MySQL quien está haciendo la clasificación, no el programa.
fuente
C # - No hay matar como exagerar
En primer lugar, querido GiMmEtHaCoDeZ, intentemos desglosar tu tarea:
Como "Divide y vencerás" es una estrategia muy importante cuando trabajas con problemas de software, abordemos uno a la vez
1. lectura
Otro tema importante en el software es la versatilidad. Como no se especifica cómo el usuario ingresará los números, eso puede suceder a través de la consola, a través de un archivo, a través de un servicio web, etc. Quizás incluso algún método que no podamos pensar en este momento. Por lo tanto, es importante que nuestra solución pueda acomodar varios tipos de entrada. La forma más fácil de lograrlo será extraer la parte importante de una interfaz, digamos
donde
DoubleArrayReaderType
es una enumeración dada conTambién es importante hacer que el software sea comprobable desde cero, por lo que una implementación de la interfaz será
Luego, la pregunta lógica es cómo sabremos cargar lo apropiado
IDoubleArrayReader
en el código. Eso es fácil siempre que usemos una fábrica simple:Tenga en cuenta que, utilizamos la reflexión para cargar todos los lectores activos, por lo que cualquier extensión futura estará disponible automáticamente ahora, en el cuerpo principal del código que acabamos de hacer:
2. Procesamiento (clasificación)
Ahora tenemos que procesar, es decir, ordenar los números que hemos adquirido. Tenga en cuenta que los pasos son completamente independientes entre sí, por lo que para el subsistema de clasificación, no importa cómo se ingresaron los números. Además, el comportamiento de clasificación también es algo que está sujeto a cambios, por ejemplo, podríamos necesitar ingresar un algoritmo de clasificación más eficiente. Entonces, naturalmente, extraeremos el comportamiento de procesamiento solicitado en una interfaz:
Y el comportamiento de clasificación solo implementará la interfaz:
Por supuesto, necesitaremos una fábrica para cargar y administrar las instancias de procesamiento.
3. Escribir la salida
No hay mucho que decir aquí, ya que este es un proceso que refleja la entrada. De hecho, podríamos combinar las fábricas de lectura y escritura en una sola
DoubleArrayInputOutputFactory
, como esta:Poniendolo todo junto
Finalmente, nuestro programa principal solo usará toda esta genialidad que ya hemos construido, por lo que el código será:
donde, por ejemplo, podríamos definir
reader
,writer
yprocessor
usandofuente
Aún más interpretación literal:
es decir, "la matriz" ordenada.
fuente
sort.sh
y llamar comosh sort.sh "an array of doubles"
"an array of doubles"
se puede pasar al script como un argumento de línea de comandos.Perl
De todas las cosas que he hecho para CodeGolf.SE, esto probablemente tomó más tiempo, al menos unas horas.
La entrada es de la forma
[2,4,5,7,7,3]
y la salida es de la forma[2,3,4,5,7,7]
.No tengo tiempo para explicarte ahora ... vuelvo más tarde.De todos modos, hay algo llamado una matriz anónima en Perl. Es una matriz, pero no tiene nombre. Lo que sí sabemos, sin embargo, es una referencia (ubicación de memoria) que apunta a ella. Una serie de números entre corchetes crea una matriz anónima y le devuelve una referencia.
Esta respuesta se basa en una serie de matrices anónimas, cuyas referencias se almacenan en
@_
. La entrada se convierte en una matriz anónima. Luego creamos otras matrices anónimas, cada elemento de las cuales es una referencia a un elemento en la matriz anterior. En lugar de ordenar los elementos en la matriz, clasificamos los punteros a los elementos en esa matriz. Además, creamos una nueva matriz para cada paso (y más) en la operación de clasificación.fuente
$_
es una cadena vacía en ese punto. Almacené mi salida deseada en$\
, que es el separador de registro de salida.Pitón
Proporciona al usuario una matriz ordenada al eliminar todos los elementos que no están ordenados de la matriz de entrada.
El algoritmo pasa por la lista solo agregando cada elemento si no hace que la lista no esté ordenada. Por lo tanto, la salida es una lista ordenada, pero no una que contenga todos los elementos de la lista original. Si la operación solo comprueba si la lista está ordenada, es posible que no note que a la salida le faltan valores.
fuente
sys.stdin.read()
un error tipográfico o parte de la verdadera respuesta de trolling? Seguramente frustraría al OP dar la matriz como entrada y continuar esperando el resultado ...O(n)
algoritmo de ordenación. Agradable.Bash, 54 caracteres
Muchas respuestas usando lenguajes lentos e ineficientes como C y Python ... aceleremos un poco las cosas ofreciendo una solución en la madre de todos los lenguajes de script: Bash.
Sé lo que estás pensando: Bash ni siquiera puede manejar la aritmética de coma flotante, entonces, ¿cómo va a ordenar, verdad? Bueno, he aquí, mi implementación del poderoso algoritmo SleepSort:
El programa se proporciona con entrada como argumentos de línea de comandos. Ejecución de muestra:
Esto también tiene la ventaja de ser quizás el más corto de todos los algoritmos de trabajo presentados aquí. Así es: una línea poderosa de bash , que usa solo bash builtins y no llama a ningún binario externo (es decir, si no cuenta la salida detallada puramente opcional). A diferencia de los bogosorts, su tiempo de ejecución es determinista.
Consejo: Una optimización efectiva es dividir los números de entrada por un factor antes de ordenar. La implementación se deja al lector.
Editar:
Versión de golf de 54 caracteres acortada con una impresión menos bonita:
fuente
/proc/cpuinfo
.JavaScript tiene una
sort()
función incorporada, puede usarlo así:... oh, olvidé por completo mencionarlo, se ordena en orden lexicográfico, es decir,
10 < 9
y9 < -100
. Probablemente eso es lo que esperas de todos modos.fuente
(jPL) Lenguaje de programación jQuery
Usted debe usar jQuery para eso. Una solución simple a este problema es la siguiente:
fuente
$
, las matrices usandoa
y los resultados dewindow.prompt
asp
.C
Esta solución combina la concisión y el acceso a nivel de sistema operativo proporcionado por C con los componentes de software potentes y reutilizables en GNU / Linux:
fuente
#!/usr/bin/sort
.Rubí
Bastante autoexplicativo.
O requiera que la entrada sea en realidad "una matriz de dobles":
No usar
gets.chomp
para maldad extra. ¡También uso regex después de seguir hasta que es algo que ni siquiera sabía que podías hacer (gracias Jan Dvorak) para confundir aún más a OP!fuente
an array of doubles
.gets
lugar degets.chomp
).Python3.3
El trolling consiste en proporcionar una solución que funcione perfectamente y que haga exactamente lo que pretendía el OP, pero de una manera que es:
En resumen, esta respuesta aumentaría en gran medida la frustración del estudiante burlándose de sus solicitudes con respuestas perfectamente válidas desde un cierto punto de vista.
(No lea si considera un desafío comprender el código anterior)
Debo agregar que el trolling también se incrementa por el hecho de que el algoritmo de clasificación implementado es realmente
fuente
C: estilo de codificación lento, difícil de usar e inaceptable
El algoritmo de clasificación en sí se conoce como slowsort y tiene una mejor complejidad de caso (simplexidad) de alrededor de n ^ (log n / 2) . El algoritmo ha sido publicado por Andrei Broder y Jorge Stolfi en su gran artículo "Algoritmos pesimistas y análisis de simplexidad", que recomiendo para las buenas risas Y para pensar.
Sin embargo, la clasificación en sí misma es inútil, por lo que necesitamos una forma para que el usuario ingrese los datos que desea ordenar. Analizar los dobles es dolor, así que ¿por qué no ingresarlos byte por byte?
Para demostrar que funciona:
Al final tenemos:
fuente
Ruby, malvado Bogosort! (Bonificación: bogosort por entrada del usuario)
Los giros "malvados":
.map &:to_f
agregado a la segunda línea, pero OP podría no saber quechomp
así que el último número tiene una nueva línea misteriosa al finalstrip
lo que hay un misterioso espacio en blanco alrededor de los números si se ingresa con espacios entre comas (por ejemplo, el espacio en1.5, 2
)O, ¿qué tal bogosorting por entrada del usuario ? >: D
fuente
COBOL
¡Seguro! "¡Incluso un mono puede hacer esto!"
Aquí hay un programa COBOL simple que clasificará la entrada por usted. Lea los comentarios para ver exactamente qué tan trivial y extensible es. Los beneficios reales de esto son que es un mecanismo probado y verdadero, no se basa en lenguajes nuevos y relativamente no probados como Java y nada basado en la web o de Microsoft. Se compila de manera realmente efectiva, y las compañías financieras más exitosas de Fortune500 y otros líderes de la industria utilizan procedimientos como este. Este código ha sido revisado por muchos expertos y es reconocido como un excelente mecanismo de clasificación.
fuente
OP nunca dijo CÓMO ordenarlos ... o cuál es su definición de dobles. Asumiendo el tipo de datos
double
pero interpretándolo como duplicados . Usando JavaScript aquí.Resultado: orden alterna
[4, 11, 4, 9, 5, 7, 6, 7]
fuente
PHP
Aquí hay una implementación completa con manejo de errores. Es el más rápido para cualquiera
array of doubles
.fuente
La siguiente permutación en C ++ funciona devolviendo verdadero cuando la matriz está ordenada y falsa de lo contrario (después de permutar). Por lo tanto, se supone que debe ordenar la matriz y luego usarla en un do-while como se indicó anteriormente (por lo que hará un círculo completo de regreso a la matriz ordenada).
fuente
next_permutation
para mi respuesta, pero esto es mucho más limpio de lo que tenía en mente.[solución por mala dirección puntillosa]
Lea la norma pertinente, IEC 60559: 1989, Especificación para aritmética de coma flotante binaria para sistemas de microprocesador , que puede comprar aquí . En la nota al pie de página §5.10 Detalles del predicado totalOrder , se observa que:
Por lo tanto, vemos que es imposible escribir código para ordenar los dobles. Es una pregunta capciosa. ¡Ja, ja, muy listo! Dígale a su profesor que estoy disfrutando mucho su curso.
[editar: nada me obliga a no asumir que el problema exige un pedido total]
fuente
Un malvado JavaScript:
OP, no quiero darte todo, así que te dejaré descubrir cómo obtener la entrada del usuario por tu cuenta (pista: uso
prompt
).Una vez que tenga eso, aquí hay una función en la que puede pasar su matriz para ordenarla. Solo necesita proporcionar la matriz, el valor más bajo en la matriz y un incremento:
Aquí hay un violín para verlo en acción con el ejemplo de entrada del usuario [1.5, -3.5, 12, 10, -19.5].
Nota: además de ser de bajo rendimiento, complejo e inextensible para el problema en cuestión, esto será especialmente frustrante si el OP no sabe acerca de las matemáticas de coma flotante. Por ejemplo, si la entrada del usuario es
[8.1, 5, -.8, 2.3, 5.6, 17.9]
y el OP elige los valores directos (es decir,minimumVal=-.8
yincrement=.1
), el programa se ejecutará para siempre. En una nota relacionada, actualmente soy el orgulloso propietario de 2 pestañas del navegador que no funcionan debido a este mismo problema :)Nota II: me sentí asqueroso incluso al escribir el código anterior.
Nota III: MWA HAHAHAHA!
fuente
Aquí hay una respuesta real que me gusta para Java:
Sin explicación, confunde el OP , pero funciona y obtendrá votos positivos de programadores más experimentados.
Otra respuesta similar :
Indicar indirectamente al OP que haga su propia investigación mientras le da una respuesta vaga y correcta. Sin más investigación, el OP todavía está confundido . También me gusta que el enlace apunta a documentación anterior.
fuente
Algoritmo genético / método Monte Carlo para el problema de clasificación en JAVA
El problema de la clasificación es conocido por la ciencia de la computación desde hace mucho tiempo y se han encontrado muchas buenas soluciones. En los últimos años, ha habido grandes avances en la biocomputación y la observación de cómo la biología resuelve los problemas ha demostrado ser de gran ayuda para resolver problemas difíciles. Este algoritmo de clasificación toma la mejor de estas ideas para usarlas para resolver el problema de clasificación. La idea es bastante simple. Comienza con una matriz desordenada y descubre qué tan ordenado está esto. Le das una puntuación de su "clasificación" y luego permutas la matriz con un componente aleatorio, al igual que en biología, donde no está claro cómo se verán los niños, incluso si sabes todo sobre los padres. Esta es la parte del algoritmo genético. Creas la descendencia de esa matriz, por así decirlo. Luego verá si la descendencia está mejor clasificada que el progenitor (¡también conocida como supervivencia del más apto!). Si este es el caso, continúe con esta nueva matriz como punto de partida para construir la próxima permutación y así sucesivamente hasta que la matriz esté completamente ordenada. Lo bueno de este enfoque es que toma menos tiempo, ¡si la matriz ya está un poco ordenada desde el principio!
Extras
fuente
Pitón
Ordena la matriz (lista) por la suma de los 3 ° y 5 ° lugares decimales.
fuente
lambda x:
y reemplazándolo porx
. Aún así, un programador principiante nunca lo sabría, ¡así que felicitaciones!C ++
Esto funciona ... eventualmente.
Aquí está mi algoritmo de clasificación:
Aquí está el programa completo:
fuente
Aquí, deleita tus ojos:
Este código muestra la matriz y le pide al usuario que ingrese el doble más pequeño de la matriz. Luego agrega el número a la lista de números ordenados, elimina el doble de la matriz y muestra los números restantes de la matriz.
* Interpretación errónea: punto débil, pero el OP no espera exactamente que el programa le pida al usuario que lo ayude a ordenar.
* Hacer trampa: el usuario es quien realiza la clasificación real.
* Rendimiento: cada número de la matriz requiere un viaje de ida y vuelta del servidor, y requiere que el usuario encuentre el número más pequeño manualmente. El rendimiento no puede empeorar mucho.
* Inaceptable: creo que tengo eso cubierto. Y buena suerte en reutilizarlo. Lo peor es lo peor, el usuario podría deshacerse del 90% del código y recorrer repetidamente para encontrar los valores más pequeños y eliminarlos cada vez, lo que le daría uno de los algoritmos de clasificación menos eficientes.
* Creativo y malvado: me cuentas.
fuente
Clasificación de diseño inteligente de Javascript
fuente
Python - req. # 1
Este código ordenará los dobles en orden lexicográfico en lugar de aumentar el orden numérico, creando un árbol de prefijos de dígitos y luego iterando a través de ellos de forma recursiva.
Funciona a
n log n
tiempo, y de hecho es una forma inteligente de mantener una lista ordenada de lo contrario, pero desafortunadamente para el OP, hace completamente lo incorrecto.fuente
2, 1, 3, 8, 5
.Ordena el conjunto de dobles. En Java:
Por ejemplo:
[0.0, 1.5, 123]
va desde la representación binaria sin clasificar de
011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000
a los elegantemente clasificados
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111
fuente
Editar por @kealist, supongo que es mejor si se comenta para que la división parezca plausible. En Rebol ...
Jugando con la idea de que en realidad no saben qué es un doble, y podrían creer que una lista de dobles era solo un grupo de números multiplicados por dos.
fuente
Deliberadamente malinterpreta la pregunta:
Usando un enfoque recursivo:
Se garantiza que la matriz ordenada se superará en algún momento, para cualquier tipo de datos en la matriz, incluso cualquier tipo de orden de clasificación, e incluso cualquier tipo de separador para la entrada, lo que hace que este enfoque sea extremadamente flexible. Su principal inconveniente es que es un poco lento para matrices grandes, pero puede resolverlo fácilmente con subprocesos múltiples.
fuente