Compilando inglês para seu chefe


16

Seu chefe aprendeu recentemente dessa interessante linguagem de programação chamada inglês . Ele teve essa ideia "revolucionária", ele quer codificar com você para duplicar as taxas de produção! Como ele não é um especialista em tecnologia, ele quer que você escreva um compilador para que ele possa codificar também!

Agora, você é um programador preguiçoso e obviamente não escreverá um programa para compilar essa linguagem ridiculamente complexa. Em vez disso, você garantirá que sempre haja um erro no código do seu chefe, para que ele nunca chegue à compilação real e fique preso corrigindo erros gramaticais em vez de codificar.

O desafio é escrever um programa que possa ser executado no terminal e aceitar um caminho de arquivo como argumento. O programa deve:

  1. modifique a entrada do arquivo introduzindo um erro de digitação.
  2. Finja falhar na compilação devido ao erro de digitação que você introduziu.
  3. A execução do programa em cópias do mesmo arquivo não deve introduzir o mesmo erro de digitação duas vezes seguidas.

Para ilustrar o desafio, execute seu programa neste arquivo:

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

deve produzir algo ao longo das linhas de

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

e o arquivo que você pediu para o programa compilar agora deve ter a seguinte aparência:

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

Aqui estão mais alguns detalhes sobre as especificações do programa:

Seu programa pode assumir que a troca de qualquer caractere no programa que seu chefe insira por um caractere aleatório diferente causará um erro gramatical. Seu programa não deve usar caracteres não alfabéticos para criar erros no código do seu chefe. Seu chefe nunca usaria um número ou símbolo e descobriria que algo está acontecendo. Seu programa deve introduzir apenas erros nas palavras do programa de seu chefe. Não altere os espaços nas frases ou na pontuação. Seu programa não deve alterar o caso do programa que seu chefe tenta compilar, significando erros como arQayinválidos. Isso evita erros como em takevez de Takeacontecer, ou em Arrayvez de array. Seu programa deve gerar o erro primeiro declarando em que linha está o erro:

Error on line <insert line number here>:

Em seguida, deve imprimir a linha com o erro dentro dos 'símbolos. Na próxima linha, ele deve colocar um ^símbolo sob a palavra com o erro e, finalmente, deve ter algum texto descrevendo o erro (esta parte é sua, você pode dizer o que quiser lá, desde que descreva um erro).

Você pode assumir que o arquivo de entrada existe e não está vazio. Você também pode assumir que o arquivo de entrada não possui erros gramaticais antes de adicionar um.

Bônus:

-60 bytes se os erros introduzidos pelo código não forem completamente aleatórios, mas baseados em erros de digitação, como nesta pergunta.

-60 bytes para pelo menos 5 mensagens de erro diferentes, alternando aleatoriamente.

-60 bytes se o seu programa tiver uma chance de 1 em 100 ou menos para enviar alguma mensagem desmotivacional para o seu chefe.

EDIT: A contagem de bytes das mensagens não conta para a sua pontuação. (Obrigado a Martin Büttner por esta boa ideia)

Isso é código-golfe, a menor contagem de bytes ganha. Por favor, não jogue o conteúdo da mensagem de erro, seu chefe não ficará feliz se ele não entender as mensagens de erro e solicitará que você as corrija.


Tenho que lidar com linhas que não contêm letras?
Οurous

Você só pode criar um erro de digitação em caracteres do alfabeto e pode assumir que o arquivo de entrada é um arquivo válido não vazio que existe.
Rodolphito 1/11

7
Não sou fã de deixar as mensagens de erro por nossa conta. Mesmo se "não dermos a mensagem de erro", eles ainda podem fazer a diferença de um punhado de bytes, provavelmente de duas dúzias, se quisermos o segundo bônus. Isso pode ser bastante. Penso que, para um concurso de golfe justo, você deve especificar 5 mensagens de erro e uma mensagem desmotivacional ou subtrair o comprimento de suas strings da contagem de bytes.
Martin Ender

Obrigado pela dica, pensei em ter mensagens predefinidas, mas queria dar um pouco mais de liberdade com isso. Subtrair a contagem de bytes da mensagem a partir da pontuação é uma ótima idéia.
Rodolphito 1/11

Respostas:


3

TI-BASIC, 77 - 34 (texto do erro) = 43

Caso ele queira usar sua calculadora TI-83/84;)

Como padrão para funções, a sequência de arquivos deve estar dentro Anspara poder retornar e exibir a saída.

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

Observe que muitos tokens têm um byte.


Onde eu poderia executar esse código?
Rodolphito 1/11

Calculadora TI-83/84 ou um emulador para um.
Timtech

inString, Ans, sub, Else, Then, End, Disp , Str1... não esses são todos 1 byte para a calculadora?
Ismael Miguel

4
O QUE????????????????? É como dizer que 8 bits não são 1 byte !!!!!!!!! Se eu apresentar um código no assembly, usando o formato binário, eles também contarão os bytes como 1 macro de mais de 5 bytes? Isso é claramente estúpido! (desculpe as palavras fortes, mas É REALMENTE ESTÚPIDO!) Isso não representa o seu código. Quero dizer, Ansnão é o mesmo que o byte representado por Ans. Uma é a A*n*sque produz qualquer resultado que a calculadora deseja, a outra retorna o valor da última expressão aritmética. Levando isso em consideração, acho que não aceitar a contagem REAL torna essa uma representação incorreta do código.
Ismael Miguel

5
Parece não modificar o arquivo aleatoriamente, parece que sempre exibe uma alteração na linha 1 e altera a primeira letra para B se for A ou para A se não for.
Rodolphito 3/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.