Sytuacja: jesteś nauczycielem w szkole średniej, który uczy swoją klasę komputerową pisania programów w języku C. Ponieważ jednak jest to dopiero początek tego terminu, nie nauczyłeś ich o znaczeniu wcięć i odstępów. Gdy zaznaczasz ich pracę, twoje oczy tak bardzo bolą, że krzyczysz w agonii i zdajesz sobie sprawę, że to nie może trwać dalej.
Zadanie: Zdecydowałeś się napisać program w dowolnym języku, który pobiera prawidłowy kod źródłowy C jako dane wejściowe i wyjściowe, które są ładnie sformatowane. Powinieneś zdecydować, co to jest ładnie sformatowany kod, ponieważ jest to konkurs popularności. Zachęcamy do wdrożenia jak największej liczby funkcji, poniżej podano kilka przykładów:
- Dodaj właściwe wcięcie z przodu każdej linii
- Dodaj spacje po
,
i inne operatory, np. Konwertujint a[]={1,2,3};
naint a[] = {1, 2, 3};
. Pamiętaj jednak, aby nie przetwarzać operatorów w obrębie literałów łańcuchowych. - Usuń końcowe spacje po każdej linii
- Rozdzielając wyrażenia na kilka wierszy, np. Uczeń może pisać
tmp=a;a=b;b=tmp;
lubint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
wszystkie w jednym wierszu, możesz podzielić je na różne wiersze. Uważajfor
jednak na pętle, mają one średniki, ale nie sądzę, że powinieneś je rozdzielić. - Dodaj nową linię po zdefiniowaniu każdej funkcji
- Kolejne inne funkcje, które możesz wymyślić, dzięki pomocy w zrozumieniu kodów uczniów.
Kryteria wygranej: To konkurs popularności, więc wygrywa odpowiedź z większością głosów pozytywnych. W przypadku remisu wygrywa odpowiedź z największą liczbą zaimplementowanych funkcji. Jeśli to jest remis, wygrywa najkrótszy kod.
Sugeruje się dołączenie do odpowiedzi listy zaimplementowanych funkcji, a także przykładowych danych wejściowych i wyjściowych.
Edycja: zgodnie z żądaniem w komentarzach tutaj jest przykładowe dane wejściowe, ale należy pamiętać, że jest to tylko w celach informacyjnych i zaleca się wdrożenie jak największej liczby funkcji.
Wejście:
#include <stdio.h>
#include<string.h>
int main() {
int i;
char s[99];
printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
/* Now we take the input: */
scanf("%s",s);
for(i=0;i<strlen(s);i++){if(s[i]>='a'&&s[i]<='z'){
s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}}printf("Your name in upper case is:\n%s\n",s);
return 0;}
Tak normalnie sformatowałbym ten kod: (Jestem leniwą osobą)
#include <stdio.h>
#include <string.h>
int main() {
int i;
char s[99];
printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
/* Now we take the input: */
scanf("%s",s);
for(i=0;i<strlen(s);i++) {
if(s[i]>='a'&&s[i]<='z') {
s[i]-=('a'-'A'); //this is same as s[i]=s[i]-'a'+'A'
}
}
printf("Your name in upper case is:\n%s\n",s);
return 0;
}
Tak myślę, że jest łatwiejszy do odczytania:
#include <stdio.h>
#include <string.h>
int main() {
int i;
char s[99];
printf("----------------------\n;;What is your name?;;\n----------------------\n"); //Semicolon added in the string just to annoy you
/* Now we take the input: */
scanf("%s", s);
for(i = 0; i < strlen(s); i++) {
if(s[i] >= 'a' && s[i] <= 'z') {
s[i] -= ('a' - 'A'); //this is same as s[i]=s[i]-'a'+'A'
}
}
printf("Your name in upper case is:\n%s\n", s);
return 0;
}
Również teraz, gdy zaczynam mieć odpowiedzi, odpowiedź z największą liczbą głosów zostanie zaakceptowana 5 dni po ostatniej odpowiedzi, tj. Jeśli w ciągu 5 dni nie będzie już nowych odpowiedzi, konkurs się zakończy.
źródło
s/\s+/ /
) i nazwać to dniemOdpowiedzi:
Ponieważ mówimy o wcięciach i białych znakach, musimy po prostu napisać kod w języku programowania, który jest rzeczywiście zaprojektowany wokół białych znaków , ponieważ musi to być najłatwiejsze, prawda?
Tak więc rozwiązaniem jest:
Oto w base64:
Dla tych, którzy mają problemy z wydrukowaniem kodu na papierze, tutaj jest wersja z adnotacjami (możesz znaleźć kompilator do tego na końcu odpowiedzi):
To jest wciąż w toku, choć mam nadzieję, że powinno przejść większość kryteriów!
Aktualnie obsługiwane funkcje:
{
i}
.;
\"
)for
blok)Przykładowe dane wejściowe (dodałem kilka komentarzy Quincunx opartych na przypadkach brzegowych, abyś mógł sprawdzić, czy zachowuje się poprawnie):
Przykładowe dane wyjściowe:
Zauważ, że ponieważ białe znaki nie obsługują EOF, sprawdzenie interpretera zgłasza wyjątek, który musimy stłumić. Ponieważ w białych znakach nie ma możliwości sprawdzenia EOF (o ile wiem, ponieważ jest to mój pierwszy program do białych znaków), jest to coś nieuniknionego, mam nadzieję, że rozwiązanie wciąż się liczy.
Oto skrypt, którego użyłem do skompilowania wersji z adnotacjami do właściwej białej spacji:
Biegać:
Zauważ, że ten, oprócz konwersji
S
,L
orazT
postacie, pozwalają także komentarze pojedynczego wiersza z#
, a może automatycznie konwertować cyfr i prostych literałów znakowych do ich reprezentacji spacji. Jeśli chcesz, możesz go używać do innych białych projektówźródło
for(i=0;i<10;i++)
;
wewnątrz(
/)
bloków). Myślę, że powinny one wystarczyć, aby uznać rozwiązanie za „użyteczne”.Vim w prosty sposób, technicznie używając tylko jednej postaci:=
Nie jestem guru vim, ale nigdy nie lekceważę jego mocy i niektórzy uważają to za język programowania. Dla mnie to rozwiązanie i tak jest zwycięzcą.
Otwórz plik w vimie:
W vim naciśnij następujące klawisze
gg=G
Wyjaśnienie:
gg przechodzi na początek pliku
= to polecenie naprawiające wcięcie
G nakazuje mu wykonanie operacji do końca pliku.
Możesz zapisać i wyjść z :wq
Możliwe jest
vim
uruchomienie polecenia z wiersza poleceń, więc można to również zrobić w jednym wierszu, ale pozostawiam to ludziom, którzy wiedząvim
lepiej niż ja.Przykład Vima prawidłowego pliku wejściowego (fibonacci.c) ze złym wcięciem.
Otwórz w vimie:
vim fibonacci.c
naciśnijgg=Gźródło
=GZZ
. (Vim golf ftw!)Ponieważ zostanie to wykorzystane, aby pomóc nauczycielowi lepiej zrozumieć kod ucznia, ważne jest, aby najpierw oczyścić dane wejściowe. Dyrektywy dotyczące procesorów wstępnych są niepotrzebne, ponieważ po prostu wprowadzają bałagan, a makra mogą również wprowadzać złośliwy kod do pliku. Nie chcemy tego! Zachowanie oryginalnych komentarzy napisanych przez studenta jest zupełnie niepotrzebne, ponieważ prawdopodobnie i tak są one całkowicie bezużyteczne.
Zamiast tego, ponieważ wszyscy wiedzą, że dobry kod wymaga dobrych komentarzy, oprócz poprawienia wcięcia i struktury, dlaczego nie dodać kilku bardzo przydatnych komentarzy wokół głównych punktów kodu, aby wynik był jeszcze bardziej zrozumiały! Z pewnością pomoże to nauczycielowi ocenić pracę, którą wykonał uczeń!
Więc z tego:
Wyprodukujmy to:
Czy to nie jest dużo lepsze, z wszystkimi przydatnymi komentarzami wokół wyrażeń?
Jest to więc rubinowe rozwiązanie wykorzystujące
cast
klejnot, którym jest parser C (tak, oszukuję) . Ponieważ to parsuje kod i drukuje go od nowa, oznacza to, że wynik będzie idealnie wcięty i spójny, np .:A także będzie zawierał bardzo przydatne komentarze na temat działania kodu, co będzie bardzo przydatne zarówno dla uczniów, jak i nauczyciela!
indent.rb
Gemfile
źródło
it is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
Bash, 35 znaków
Plik wejściowy musi mieć nazwę „input.c” i umieszczony w bieżącym katalogu roboczym.
Przykładowy wynik, po wprowadzeniu danych wejściowych w pierwotnym pytaniu:
Uruchomienie może potrwać kilka sekund w zależności od sprzętu, więc bądź cierpliwy :)
źródło
rm
?Rubin
Wynik:
Dane wyjściowe dla instrukcji case Edge @ SztupY:
Funkcje do tej pory:
[x]
Dodaj właściwe wcięcie z przodu każdej linii[x]
Dodaj spacje po,
i inne operatory, np. Konwertujint a[]={1,2,3};
naint a[] = {1, 2, 3};
. Pamiętaj jednak, aby nie przetwarzać operatorów w obrębie literałów łańcuchowych.[x]
Usuń końcowe spacje po każdej linii[x]
Rozdzielając wyrażenia na kilka wierszy, np. Uczeń może pisaćtmp=a;a=b;b=tmp;
lubint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
wszystkie w jednym wierszu, możesz podzielić je na różne wiersze. Uważajfor
jednak na pętle, mają one średniki, ale nie sądzę, że powinieneś je rozdzielić.[ ]
Dodaj nową linię po zdefiniowaniu każdej funkcji[ ]
Kolejne inne funkcje, które możesz wymyślić, dzięki pomocy w zrozumieniu kodów uczniów.źródło
Jest to napisane w języku python i oparte na standardach kodowania GNU.
Funkcje do tej pory:
Kod:
Przykładowe dane wejściowe (przekaż nazwę pliku jako argument):
Przykładowe dane wyjściowe:
To będzie miało błędy.
źródło
.Netto
Otwórz ten plik za pomocą Visual Studio
Wejście:
Wynik:
źródło