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:
- zmodyfikuj dane wejściowe pliku, wprowadzając literówkę.
- Udawaj, że kompilacja kończy się niepowodzeniem z powodu napotkanej literówki.
- 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 arQay
są nieprawidłowe. Zapobiega to błędom takim jak take
zamiast się Take
zdarzać lub Array
zamiast 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.
Odpowiedzi:
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ę,
Ans
aby mógł zwrócić i wyświetlić dane wyjściowe.Zauważ, że wiele tokenów ma jeden bajt.
źródło
inString
,Ans
,sub
,Else
,Then
,End
,Disp
,Str1
... nie są tymi wszystkich 1 bajt na kalkulatorze?Ans
to nie to samo, co bajt reprezentowany przezAns
. Jedna zA*n*s
nich 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.