Ahora con BONUS para la colocación en tiempo de ejecución.
Escriba un programa para llenar un cuadro de texto con los identificadores utilizados en su programa mientras lo mantiene pequeño. Con todos los identificadores que ha utilizado (excluyendo los que creó) en su programa, llene un cuadro de 12x6 con tantos como pueda. Obtiene puntos adicionales para los identificadores que se cruzan (estilo de crucigrama), pero no se pueden unir de extremo a extremo.
Salida
Su programa debe imprimir (para stdout) un cuadro de 12x6 caracteres con sus identificadores empaquetados y un #
borde. El cuadro debe tener columnas etiquetadas con la letra AL y las filas 1-6 (espaciadas como en el ejemplo a continuación). Luego imprima una línea para cada identificador utilizado. Cada línea tendrá la ubicación de la primera letra, el identificador en sí y la puntuación. El puntaje es igual al número de letras en el identificador con un posible '+ bono' agregado. El identificador obtiene una bonificación de 5 puntos por cada letra compartida con un identificador de cruce. La línea final informa 'TOTAL:' y la suma de las puntuaciones del identificador. Un resultado de ejemplo para un posible programa de Python se vería así:
ABCDEFGHIJKL
##############
1 # pinsert #
2 # o #
3 # print #
4 # not #
5 # #
6 #import #
##############
C1 pop 3+5
D1 insert 6
C3 print 5+10
E3 in 2+10
E4 not 3+5
A6 import 6
TOTAL: 55
Notas:
- Los identificadores se pueden desacoplar (como
import
arriba). - No puedes unirte
pop
y estar enprint
línea conpoprint
. - La cadena
in
dentroinsert
no se puede usar. Unir palabras debe ser ortogonal. - Los identificadores se pueden colocar uno al lado del otro (como
pop
yinsert
arriba).
Su respuesta debe incluir la salida de su programa con su código fuente y un título que consista en el nombre del idioma y su puntaje.
Puntuación
Su puntaje para el desafío será el puntaje del rompecabezas al cuadrado dividido por el tamaño de su código fuente (en bytes). Por ejemplo: el acertijo anterior con un programa de 300 bytes marcaría 55*55/300 = 10.08
. La puntuación más alta gana.
Reglas
- Puede usar cualquier identificador en su programa que no haya definido. Las palabras clave, los nombres de clase, los nombres de métodos, los nombres de bibliotecas y los nombres de funciones integradas son ejemplos de identificadores elegibles.
- EDITADO: Solo puede usar bibliotecas estándar que se incluyen con la versión mínima de idioma. Los paquetes de idiomas extendidos y el uso de bibliotecas externas (ahora) están prohibidos. La gran variedad de bibliotecas con extensas listas de identificadores desequilibraría este desafío. Si no está seguro de cómo funciona esto con su idioma, deje una pregunta en los comentarios.
- Los identificadores deben constar solo de caracteres [a-zA-Z_] y tener al menos 2 caracteres.
- Solo puede usar cada identificador una vez en el rompecabezas.
- Los identificadores solo se pueden usar de izquierda a derecha o hacia abajo.
Bono Dinámico!
Si su código determina dónde colocar los identificadores en el tiempo de ejecución, la bonificación de letras compartidas será de 20 en lugar de 5. Puede enumerar qué identificadores se utilizarán, pero su código debe decidir dónde colocarlos en el cuadro. Su código también debe calcular e imprimir la lista de puntajes. Si sus ubicaciones dependen del orden de la lista de identificadores, emparejamientos codificados u otros atajos de ubicación no dinámicos, no es elegible para el Bono Dinámico.
En la salida de ejemplo anterior, la puntuación del rompecabezas para un programa de colocación en tiempo de ejecución sería 145. Entonces, si el código fuera de 800 bytes, la puntuación sería 145*145/800 = 26.28
.
Dynamic Bonus está diseñado para recompensar algoritmos inteligentes en lugar de cadenas de solución estáticas codificadas, y compensar el mayor tamaño del código fuente resultante.
EDICIONES:
- Las bibliotecas modificadas se utilizan solo para aquellas en la versión mínima de idioma.
- Se agregó la opción de bonificación dinámica.
fuente
xyzw
/rgba
/stpq
:)Respuestas:
STATA, 387 ^ 2/677 = 221.2
Me volví flojo y solo quería generar algo que funcionara antes de intentar obtenerlo con una puntuación óptima. Probablemente lo actualizaré más tarde a medida que incluya más palabras, y estoy abierto a sugerencias de cualquiera que use STATA (que no parece muy popular en CodeGolf). STATA es realmente bueno acerca de tener muchos comandos / parámetros de dos letras. Además, por lo general, la mayoría se puede acortar para guardar caracteres / ajustar mejor (es decir, la pantalla se puede mostrar, desplazar, mostrar, mostrar, mostrar o di). Además, la captura significa que suprime los mensajes de salida y error. Entonces, el ciclo while completo tiene 0 salidas.
genera
fuente
Python, 134 2 /349 = 50,02
Si he entendido las reglas correctamente, esto debería ser una presentación válida.
Realmente puede seguir incrementando su puntaje agregando más identificadores: el tamaño del programa aumenta linealmente (aproximadamente el doble de la longitud del identificador), mientras que el puntaje aumenta aproximadamente por el cuadrado de la longitud del identificador. Luego, el desafío es más cómo meter la mayoría de las palabras clave en el cuadrado en lugar de cómo escribir un programa corto para hacerlo.
fuente
stdout.write
lugar de esoprint
y qué pasa conformat(not False or iter([]))
el final? También podría agregar fácilmente como "está" al lado del "sys" y un "para" debajo "de" ...format
lecturaiter([i for i in [not False is sys]])
Perl,
728 2 /639 = 829,4Oh, bueno, esto no es válido, perdí que tengo que tener los identificadores en mi código.
Esto requiere un módulo de reflexión perl (
B::Keywords
). Se puede instalar en ubuntu consudo apt-get install libb-keywords-perl
. Con la semilla dada en el código anterior, genera la respuesta 728:Tenga en cuenta que las diferentes versiones de perl pueden tener diferentes RNG y diferentes listas de palabras clave, pero debería ser fácil encontrar una semilla con un resultado comparable.
fuente