Compilando inglés para tu jefe

16

Su jefe se enteró recientemente de este interesante lenguaje de programación llamado inglés . Él ha tenido esta idea "revolucionaria", ¡quiere codificar con usted para duplicar las tasas de producción! Como él no es un experto en tecnología, ¡quiere que escribas un compilador para que él también pueda codificar!

Ahora, eres un malvado programador perezoso y obviamente no escribirás un programa para compilar este lenguaje ridículamente complejo. En su lugar, se asegurará de que siempre haya un error en el código de su jefe, de modo que nunca llegue a la compilación real y se quede atascado reparando errores gramaticales en lugar de codificación.

El desafío es escribir un programa que pueda ejecutarse desde el terminal y acepte una ruta de archivo como argumento. El programa tiene que:

  1. modificar la entrada del archivo introduciendo un error tipográfico.
  2. Pretende fallar la compilación debido al encuentro del error tipográfico que introdujiste.
  3. Ejecutar el programa en copias del mismo archivo no debería introducir el mismo error tipográfico dos veces seguidas.

Para ilustrar el desafío, ejecute su programa en este archivo:

Take an array as input.
Sort the array.
Output the array.

debería dar salida a lo largo de las líneas de

Error on line 1:
'Take an arqay as input.'
         ^
arqay is not a valid identifier.

y el archivo que le dijo al programa que compilara ahora debería verse así:

Take an arqay as input.
Sort the array.
Output the array.

Aquí hay algunos detalles más sobre las especificaciones del programa:

Su programa puede suponer que intercambiar cualquier carácter en el programa que ingrese su jefe por un carácter aleatorio diferente causará un error gramatical. Su programa no debe usar caracteres no alfabéticos para crear errores en el código de su jefe. Su jefe nunca usaría un número o símbolo, y descubriría que algo está en marcha. Su programa solo debe introducir errores en las palabras del programa de su jefe. No cambie los espacios en las oraciones, ni la puntuación. Su programa no debe alterar el caso del programa que su jefe intenta compilar, lo que significa que errores como arQayno son válidos. Esto evita errores como en takelugar de Takesuceder, o en Arraylugar de array. Su programa debería generar el error indicando primero en qué línea se encuentra el error:

Error on line <insert line number here>:

Luego debe imprimir la línea con el error dentro de los 'símbolos. En la siguiente línea, debe colocar un ^símbolo debajo de la palabra con el error, y finalmente debe tener un texto que describa el error (esta parte depende de usted, puede decir lo que quiera allí siempre que describa un error).

Puede suponer que el archivo de entrada existe y que no está vacío. También puede suponer que el archivo de entrada no tiene errores gramaticales antes de agregar uno.

Bonificaciones:

-60 bytes si los errores que introduce su código no son completamente al azar, sino basados ​​en errores tipográficos como en esta pregunta.

-60 bytes para al menos 5 mensajes de error diferentes, alternando al azar.

-60 bytes si su programa tiene una probabilidad de 1 en 100 o menos de enviar algún mensaje desmotivador a su jefe.

EDITAR: El conteo de bytes de los mensajes no cuenta para su puntaje. (Gracias a Martin Büttner por esta buena idea)

Este es el código de golf, gana el conteo de bytes más corto Por favor, no muestre el contenido del mensaje de error, su jefe no estará contento si no puede entender los mensajes de error y le pedirá que los arregle.

rodolphito
fuente
¿Tengo que lidiar con líneas que no contienen letras?
Precioso
Solo puede crear un error tipográfico en caracteres alfabéticos, y puede suponer que el archivo de entrada es un archivo válido no vacío que existe.
rodolphito
77
No soy fanático de dejarnos los mensajes de error. Incluso si "no revelamos el mensaje de error", aún podrían marcar la diferencia de un puñado de bytes, de probablemente incluso dos docenas si vamos por el segundo bono. Eso puede ser bastante. Creo que para una competencia de golf justa, debe especificar 5 mensajes de error y un mensaje de desmotivación, o dejarnos restar la longitud de su cadena del recuento de bytes.
Martin Ender
Gracias por el consejo, había pensado en tener mensajes predefinidos, pero quería darles un poco más de libertad. Restar los recuentos de bytes de mensajes del puntaje es una gran idea.
rodolphito 01 de

Respuestas:

3

TI-BASIC, 77-34 (texto de error) = 43

En caso de que quiera hacer su calculadora TI-83/84;)

Como estándar para las funciones, la cadena del archivo debe estar dentro Anspara que pueda regresar y mostrar la salida.

Ans->Str1:If 1=inString(Ans,"A
Then:"B
Else:"A
End:Disp "ERROR ON LINE 1","'"+Ans+sub(Str1,2,-1+length(Str1))+"'"," ^ INVALID

Tenga en cuenta que muchos tokens son un byte.

Timtech
fuente
¿Dónde podría ejecutar este código?
rodolphito 01 de
Calculadora TI-83/84 o un emulador para uno.
Timtech
inString, Ans, sub, Else, Then, End, Disp , Str1... ¿No son aquellos en los 1 byte para la calculadora?
Ismael Miguel
44
¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿QUÉ????????????????? Eso es como decir que 8 bits no es 1 byte !!!!!!!!! Si presento un código en ensamblado, usando forma binaria, ¿también contarán los bytes como 1 macro de 5+ bytes? ¡Eso es simplemente estúpido! (Perdón por las palabras fuertes, ¡pero ES REALMENTE ESTÚPIDO!) Esto no representa su código. Quiero decir, Ansno es lo mismo que el byte representado por Ans. Uno es el A*n*sque produce cualquier resultado que desee la calculadora, el otro devuelve el valor de la última expresión aritmética. Teniendo esto en cuenta, creo que no aceptar el recuento REAL hace que esta sea una representación incorrecta del código.
Ismael Miguel
55
No parece modificar el archivo al azar, parece que siempre muestra un cambio en la línea 1 y cambia la primera letra a B si es A, o a A si no es así.
rodolphito