Su tarea, si la acepta, es escribir un programa que ayude a comprender mi propuesta sobre meta calculando al ganador de una competencia de código invertido en golf . Por supuesto, las respuestas a esta pregunta se tratarán como propuestas, por lo que su programa (si es correcto) puede calcular si su respuesta se convertirá en la respuesta aceptada.
Reglas
- El programa lee un archivo con varias líneas del siguiente formato (ver ejemplo a continuación): [Idioma] TAB [NumberOfCharacters] TAB [LinkToAnswer]
- El nombre del archivo se pasa como argumento a su programa o el archivo se redirige a la entrada estándar de su programa. Es su elección, mencione el método al dar la respuesta
- Se espera que el formato de entrada sea correcto. No hay necesidad de manejo de errores.
- El número de caracteres es positivo. Su programa debe manejar longitudes de hasta 65535. 64k debería ser suficiente para todos :-)
- El programa genera esas líneas en la salida estándar que cumplen con la idea de la meta propuesta, es decir
- gana el código más corto de un lenguaje de programación particular (fase de reducción)
- gana el código más largo entre todos los lenguajes de programación (fase de clasificación)
- en caso de empate, se imprimirán todas las respuestas con la misma longitud
- El orden de salida no es importante
- Aunque el código más largo gana, esto no es código de boliche . Su código debe ser lo más corto posible para su lenguaje de programación.
- Las respuestas sobre lenguajes de programación que rara vez no intentan acortar el código merecen un voto negativo, porque intentan evitar la intención de este tipo de preguntas. Si solo hay una respuesta para un lenguaje de programación específico, se consideraría un candidato ganador, por lo que podría comenzar a soplar su código.
Ejemplo de archivo de entrada (separado por pestañas individuales si hubiera algún problema con el formato):
GolfScript 34 http://short.url/answer/ags
GolfScript 42 http://short.url/answer/gsq
C# 210 http://short.url/answer/cs2
Java 208 http://short.url/answer/jav
C# 208 http://short.url/answer/poi
J 23 http://short.url/answer/jsh
Ruby 67 http://short.url/answer/rub
C# 208 http://short.url/answer/yac
GolfScript 210 http://short.url/answer/210
Salida esperada (el orden no es importante):
C# 208 http://short.url/answer/poi
C# 208 http://short.url/answer/yac
Java 208 http://short.url/answer/jav
Actualizar
Algunos programas se basan en el hecho de que hay un solo máximo (como el programa de caracteres C # 210). Derivado de la realidad, alguien también puede escribir un programa GolfScript con 210 caracteres. El resultado sería el mismo. He agregado un GolfScript a la entrada.
Actualización 2
Como sugerí, volví a etiquetar (todavía en código de golf también) y la fecha límite es 2014-03-06 (que parece una fecha arbitraria, pero volveré a Alemania después de viajar).
Resultados finales
Decidí votar de la siguiente manera:
- Las respuestas en las que no se puede confirmar el número de caracteres reciben un comentario para explicar el recuento.
- Las respuestas que se pueden reducir fácilmente obtienen un comentario, una sugerencia de edición y van al resultado con el valor de conteo más bajo. (Espero haberlo visto de antemano).
- Las respuestas que no se compilan obtienen un voto negativo. (Resulta que es una tarea difícil).
- Las respuestas que no son de golf reciben un voto negativo (como ya se describe en las reglas).
- Las respuestas que producen el resultado esperado obtienen un voto positivo. Debido a algunas respuestas que no funcionan como se esperaba, utilizo 4 archivos de entrada diferentes y compruebo el resultado esperado.
Finalmente, el ganador se determina al proporcionar la tabla de respuestas de calificación como entrada para mi programa de referencia (además de verificar el resultado manualmente). Si mi propia respuesta fuera la ganadora, la excluiría de la lista. En caso de varios ganadores, tendría que elegir solo uno. Por lo tanto, se pueden ganar algunos bonos:
- respuestas que aceptan más información de la esperada (por ejemplo, fuera de los rangos definidos)
- respuestas que usan una idea inteligente de hacerlo corto
Tomé una instantánea de las respuestas el 6 de marzo de 2014, 19:45 UTC + 1. El análisis está en curso. Comprobar todas las respuestas es más difícil de lo esperado ...
fuente
Respuestas:
Java - 556
El programa leerá de STDIN.
ArrayIndexOutOfBoundsException
cuando se encuentre una línea en blanco oNoSuchElementException
si la entrada finaliza sin una nueva línea final). Cada línea leída se agrega aTreeMap m
, que podría haberse definido comoTreeMap<String, TreeMap<Long, TreeMap<String,String[]>>>
(de izquierda a derecha: idioma, tamaño de código, URL, entrada).TreeSet<Long, TreeSet<String, String[]>> n
(de izquierda a derecha: tamaño de código, URL, entrada) dondefirstEntry()
se agregan los contenidos de cada idioma .lastEntry()
del agregadoTreeMap
contiene nuestro resultado; solo necesitamos imprimirlo.Pruebe ideone.com (cambió las últimas dos líneas de entrada para mostrar que todas las líneas se leen)
fuente
Perl, 195 bytes
Se espera la entrada en STDIN, el resultado se escribe en STDOUT:
Versión sin golf
fuente
GolfScript 210 http://short.url/answer/210
línea a la entrada y vea si la salida sigue siendo la misma. En realidad, creo que el tuyo no se ve afectado, porque estás usando [0] para el máximo, pero no tengo Perl disponible en este momento para intentarlo.%l
/%language
contiene los idiomas y sus valores mínimos. La estructura de datos%a
/%array
contiene solo esos pares de idiomas / URL, cuyo valor es el mínimo para este idioma. Luego, los valores mínimos se ordenan en orden descendente y el primero se usa como máximo global y como condición de filtro para%a
/%array
.Python
378377372Entrada en el stdin:
Y esto es lo que tenía antes de comenzar a comprimirlo, a 551 caracteres:
fuente
C # - 628
Aquí hay una alternativa más larga que usa
DataTable
:Originalmente pensé que podría haber obtenido una ligera reducción de código al usar max / min con
DataTable
, peroDataTable
desafortunadamente los tipos necesarios para construir (filas / columnas / vista) agregan mucha longitud. Soy nuevo en el código de golf, por lo que tal vez alguien podría reducirlo aún más. Sigue siendo un desafío divertido.fuente
dg -
286281260251218 bytesEjemplo:
Versión sin golf :
Q: ¿Qué diablos es dg?
R: Un lenguaje de programación que compila a bytecode CPython, al igual que Scala compila a JVM. Eso esencialmente significa que dg es una sintaxis alternativa para Python 3. También le permite usar todas las bibliotecas existentes.
Más información aquí (¡incluso un tutorial!): Https://pyos.github.io/dg
fuente
cat langs.dg | wc -c
consigo 218!Rebol - 314
sin golf
Ejemplo de uso:
fuente
C # - 515
Espera un nombre de archivo como argumento
Primero diseñé mi programa C # para que fuera sencillo, porque quería tener una especie de programa de referencia. Pero luego decidí también saltar al concurso y jugar golf. Esta es una de las versiones anteriores del código + algunos comentarios:
fuente
C # -
460359Después de darme cuenta de lo voluminosa
DataTable
que era mi solución, creé el siguiente ejemplo usando Linq. Utiliza la misma metodología que mi solución anterior.Golfed
Sin golf
Todavía soy bastante nuevo en Linq, así que estoy casi seguro de que esas expresiones se pueden reducir aún más.
De su pregunta, no está claro si hay una única solución de longitud máxima. Para mis respuestas, he usado la suposición de que hay un único punto máximo (es decir, si también hubo un máximo de GolfScript de 210, puede fallar en función del registro máximo único devuelto). La solución de Heiko tendría el mismo problema. Para solucionar esto, tendríamos que agregar otro paso que contuviera una lista de máximos vinculados para verificar los mínimos para cada idioma.
fuente
namespace System{using Linq;using IO;class p{static void Main(string[]i){var l=(from f in File.ReadAllLines(i[0])let s=f.Split('\t') select new Tuple<string, int, string>(s[0],Convert.ToInt16(s[1]),f)).ToList();foreach(var f in l.Where(a=>a.Item2==l.Where(b=>b.Item1==l.Single(c=>c.Item2==l.Max(d=>d.Item2)).Item1).Min(e=>e.Item2)))Console.WriteLine(f.Item3);}}}
Golfscript 100 ...
,C# 1 ...
,C# 200 ...
. Probablemente esto necesite un poco de retrabajoC ++ - 535
Solo generará las respuestas vinculadas para la posición más larga después de seleccionar solo las respuestas más cortas de cada idioma como posibles ganadores.
Golfizado (no tan ilegible como algunos idiomas):
fuente