Compiler l'anglais pour votre patron

16

Votre patron a récemment entendu parler de ce langage de programmation intéressant appelé anglais . Il a eu cette idée "révolutionnaire", il veut coder avec vous pour doubler les cadences de production! Comme il n'est pas un connaisseur de la technologie, il veut que vous écriviez un compilateur pour qu'il puisse aussi coder!

Maintenant, vous êtes un mauvais programmeur paresseux et vous n'écrirez évidemment pas de programme pour compiler ce langage ridiculement complexe. Au lieu de cela, vous allez vous assurer qu'il y a toujours une erreur dans le code de votre patron, afin qu'il n'atteigne jamais la compilation réelle et qu'il soit bloqué en corrigeant les erreurs de grammaire au lieu de coder.

Le défi consiste à écrire un programme qui peut être exécuté à partir du terminal et accepte un chemin de fichier comme argument. Le programme doit:

  1. modifier l'entrée du fichier en introduisant une faute de frappe.
  2. Faites semblant d'échouer la compilation en raison de la faute de frappe que vous avez introduite.
  3. L'exécution du programme sur des copies du même fichier ne doit pas introduire la même faute de frappe deux fois de suite.

Pour illustrer le défi, exécuter votre programme sur ce fichier:

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

devrait produire quelque chose le long des lignes de

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

et le fichier que vous avez demandé au programme de compiler devrait maintenant ressembler à:

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

Voici quelques détails supplémentaires sur les spécifications du programme:

Votre programme est autorisé à supposer que l'échange d'un caractère dans le programme que votre patron entre pour un autre caractère aléatoire entraînera une erreur de grammaire. Votre programme ne doit pas utiliser de caractères non alphabétiques pour créer des erreurs dans le code de votre patron. Votre patron n'utiliserait jamais un chiffre ou un symbole, et il découvrirait que quelque chose se prépare. Votre programme ne doit introduire que des erreurs dans les mots du programme de votre patron. Ne modifiez pas les espaces dans les phrases, ni la ponctuation. Votre programme ne doit pas modifier le cas du programme que votre patron essaie de compiler, ce qui signifie que des erreurs comme ne arQaysont pas valides. Cela empêche les erreurs comme takeau lieu de se Takeproduire, ou Arrayau lieu de array. Votre programme doit générer l'erreur en indiquant d'abord à quelle ligne l'erreur se trouve:

Error on line <insert line number here>:

Il devrait ensuite imprimer la ligne avec l'erreur à l'intérieur des 'symboles. Sur la ligne suivante, il devrait placer un ^symbole sous le mot avec l'erreur, et enfin il devrait avoir un texte décrivant l'erreur (cette partie dépend de vous, vous pouvez y dire ce que vous voulez tant qu'elle décrit une erreur).

Vous pouvez supposer que le fichier d'entrée existe et qu'il n'est pas vide. Vous pouvez également supposer que le fichier d'entrée ne contient aucune erreur grammaticale avant d'en ajouter une.

Bonus:

-60 octets si les erreurs introduites par votre code ne sont pas complètement aléatoires, mais basées sur une faute de frappe comme dans cette question.

-60 octets pour au moins 5 messages d'erreur différents, en alternance aléatoire.

-60 octets si votre programme a 1 chance sur 100 ou moins d'envoyer un message démotivant à votre patron.

EDIT: Le nombre d'octets des messages ne compte pas dans votre score. (Merci à Martin Büttner pour cette bonne idée)

C'est le golf par code, le nombre d'octets le plus court gagne. Veuillez ne pas jouer au contenu du message d'erreur, votre patron ne sera pas content s'il ne comprend pas les messages d'erreur et vous demandera de les corriger pour lui.

rodolphito
la source
Dois-je traiter des lignes qui ne contiennent pas de lettres?
1urous
Vous pouvez uniquement créer une faute de frappe en caractères alphabétiques et vous pouvez supposer que le fichier d'entrée est un fichier non vide valide qui existe.
rodolphito
7
Je ne suis pas fan de nous laisser les messages d'erreur. Même si nous «ne jouons pas le message d'erreur», ils pourraient encore faire une différence d'une poignée d'octets, probablement même de deux douzaines si nous optons pour le deuxième bonus. Cela peut être beaucoup. Je pense que pour un concours de golf équitable, vous devez spécifier 5 messages d'erreur et un message démotivant, ou laissez-nous soustraire leur longueur de chaîne du nombre d'octets.
Martin Ender
Merci pour l'astuce, j'avais pensé à avoir des messages prédéfinis, mais je voulais donner un peu plus de liberté avec ça. Soustraire le nombre d'octets de message de la partition est une excellente idée.
rodolphito

Réponses:

3

TI-BASIC, 77-34 (texte d'erreur) = 43

Au cas où il voudrait faire sur sa calculatrice TI-83/84;)

En standard pour les fonctions, la chaîne de fichier doit être dans Ansafin qu'elle puisse retourner et afficher la sortie.

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

Notez que de nombreux jetons sont d'un octet.

Timtech
la source
Où pourrais-je exécuter ce code?
rodolphito
Calculatrice TI-83/84 ou un émulateur pour un.
Timtech
inString, Ans, sub, Else, Then, End, Disp , Str1... ne sont pas ceux tout 1 octet pour la calculatrice?
Ismael Miguel
4
QUOI????????????????? C'est comme dire que 8 bits ne sont pas 1 octet !!!!!!!!! Si je présente un code en assembleur, en utilisant une forme binaire, comptera-t-il aussi les octets comme 1 macro de 5+ octets? C'est tout simplement stupide! (désolé les mots forts, mais c'est vraiment stupide!) Cela ne représente pas votre code. Je veux dire Ansn'est pas le même que l'octet représenté par Ans. L'un est celui A*n*squi produit le résultat souhaité par la calculatrice, l'autre renvoie la valeur de la dernière expression arithmétique. Compte tenu de cela, je pense que le fait de ne pas accepter le compte REAL en fait une mauvaise représentation du code.
Ismael Miguel
5
Il ne semble pas modifier aléatoirement le fichier, il semble qu'il affiche toujours un changement dans la ligne 1 et change la première lettre en B si c'est A, ou en A sinon.
rodolphito