Kompilowanie angielskiego dla twojego szefa

16

Twój szef ostatnio nauczył się tego interesującego języka programowania o nazwie angielski . Ma ten „rewolucyjny” pomysł, chce z tobą napisać kod, by podwoić wydajność produkcji! Ponieważ nie jest on obeznany z technologią, chce, abyś napisał kompilator, aby mógł również kodować!

Teraz jesteś złym leniwym programistą i oczywiście nie napiszesz programu do skompilowania tego absurdalnie złożonego języka. Zamiast tego upewnisz się, że kod szefa zawsze zawiera błąd, aby nigdy nie dotarł do właściwej kompilacji i utknął naprawiając błędy gramatyczne zamiast kodować.

Wyzwanie polega na napisaniu programu, który można uruchomić z terminala i akceptuje ścieżkę do pliku jako argument. Program musi:

  1. zmodyfikuj dane wejściowe pliku, wprowadzając literówkę.
  2. Udawaj, że kompilacja kończy się niepowodzeniem z powodu napotkanej literówki.
  3. Uruchomienie programu na kopiach tego samego pliku nie powinno wprowadzać tej samej literówki dwa razy z rzędu.

Aby zilustrować wyzwanie, uruchom program na tym pliku:

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

powinien wypisać coś wzdłuż linii

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

a plik, który poleciłeś programowi skompilować, powinien wyglądać następująco:

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

Oto kilka szczegółów na temat specyfikacji programu:

Twój program może założyć, że zamiana dowolnej postaci w programie, którą Twój szef wprowadza na inną losową postać, spowoduje błąd gramatyczny. Twój program nie powinien używać znaków innych niż alfabetyczne do tworzenia błędów w kodzie szefa. Twój szef nigdy nie użyłby liczby ani symbolu, a dowiedziałby się, że coś się dzieje. Twój program powinien wprowadzać tylko błędy do słów w programie twojego szefa. Nie zmieniaj spacji w zdaniach ani interpunkcji. Twój program nie powinien zmieniać wielkości liter programu, który szef próbuje skompilować, co oznacza, że ​​błędy takie jak arQaysą nieprawidłowe. Zapobiega to błędom takim jak takezamiast się Takezdarzać lub Arrayzamiast array. Twój program powinien wypisać błąd, najpierw określając, w której linii znajduje się błąd:

Error on line <insert line number here>:

Następnie powinien wydrukować linię z błędem w 'symbolach. W następnym wierszu powinien umieścić ^symbol pod słowem z błędem, a na końcu powinien zawierać tekst opisujący błąd (ta część zależy od ciebie, możesz powiedzieć co chcesz, pod warunkiem, że opisuje błąd).

Możesz założyć, że plik wejściowy istnieje i nie jest pusty. Możesz również założyć, że plik wejściowy nie zawiera błędów gramatycznych, zanim go dodasz.

Bonusy:

-60 bajtów, jeśli błędy, które wprowadza kod, nie są całkowicie losowe, ale oparte na literówkach, jak w tym pytaniu.

-60 bajtów dla co najmniej 5 różnych komunikatów o błędach, losowo na przemian.

-60 bajtów, jeśli twój program ma szansę 1 na 100 lub mniejszą na wysłanie jakiegoś komunikatu demotywacyjnego do twojego szefa.

EDYCJA: Liczba bajtów wiadomości nie wlicza się do wyniku. (Podziękowania dla Martina Büttnera za ten dobry pomysł)

To jest golf golfowy, wygrywa najmniejsza liczba bajtów. Nie graj w golfa w treść komunikatu o błędzie, twój szef nie będzie szczęśliwy, jeśli nie zrozumie komunikatów o błędach i poprosi cię o ich naprawienie.

rodolphito
źródło
Czy mam do czynienia z wierszami, które nie zawierają liter?
Οurous
Możesz utworzyć literówkę tylko w literach alfabetu i możesz założyć, że plik wejściowy jest poprawnym niepustym plikiem, który istnieje.
rodolphito,
7
Nie jestem fanem pozostawiania nam komunikatów o błędach. Nawet jeśli „nie gramy w błąd w komunikacie o błędzie”, nadal mogą zrobić różnicę w garści bajtów, prawdopodobnie nawet o dwa tuziny, jeśli wybieramy drugą premię. To może być całkiem sporo. Myślę, że dla uczciwego konkursu golfowego powinieneś podać 5 komunikatów o błędach i komunikat demotywacyjny lub odejmijmy ich długość od liczby bajtów.
Martin Ender
Dzięki za wskazówkę, myślałem o tym, żeby mieć predefiniowane wiadomości, ale chciałem dać trochę więcej swobody. Odjęcie liczby bajtów wiadomości od wyniku jest świetnym pomysłem.
rodolphito,

Odpowiedzi:

3

TI-BASIC, 77–34 (tekst błędu) = 43

Na wypadek, gdyby chciał skorzystać z kalkulatora TI-83/84;)

Standardowo dla funkcji ciąg pliku powinien znajdować się, Ansaby mógł zwrócić i wyświetlić dane wyjściowe.

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

Zauważ, że wiele tokenów ma jeden bajt.

Timtech
źródło
Gdzie mogę uruchomić ten kod?
rodolphito
Kalkulator TI-83/84 lub emulator dla jednego.
Timtech
inString, Ans, sub, Else, Then, End, Disp , Str1... nie są tymi wszystkich 1 bajt na kalkulatorze?
Ismael Miguel
4
CO????????????????? To tak, jakby powiedzieć, że 8 bitów nie jest 1 bajtem !!!!!!!!! Jeśli przedstawię kod w asemblerze, używając postaci binarnej, czy będą one również liczyć bajty jako 1 makro ponad 5 bajtów? To jest po prostu głupie! (przepraszam za mocne słowa, ale NAPRAWDĘ GŁUPIE!) To nie reprezentuje twojego kodu. Mam na myśli, że Ansto nie to samo, co bajt reprezentowany przez Ans. Jedna z A*n*snich daje wynik, którego chce kalkulator, druga zwraca wartość ostatniego wyrażenia arytmetycznego. Biorąc to pod uwagę, myślę, że nieakceptowanie PRAWDZIWEJ liczby powoduje, że jest to niewłaściwa reprezentacja kodu.
Ismael Miguel
5
Plik nie wydaje się losowo modyfikować pliku, wygląda na to, że zawsze wyświetla zmianę w wierszu 1 i zmienia pierwszą literę na B, jeśli jest to A, lub na A, jeśli nie.
rodolphito,