Situation: Sie sind Gymnasiallehrer und bringen Ihrer Computerklasse das Schreiben von C-Programmen bei. Da dies jedoch erst der Anfang des Semesters ist, haben Sie ihnen nicht die Bedeutung von Einrückungen und Abständen beigebracht. Während Sie ihre Arbeit markieren, schmerzen Ihre Augen so sehr, dass Sie vor Qual schreien und feststellen, dass dies nicht weitergehen kann.
Aufgabe: Sie haben sich entschieden, ein Programm in einer beliebigen Sprache zu schreiben, das einen gültigen C-Quellcode als Eingabe und Ausgabe verwendet, der gut formatiert ist. Sie sollten entscheiden, was ein gut formatierter Code ist, da es sich um einen Beliebtheitswettbewerb handelt. Es wird empfohlen, so viele Funktionen wie möglich zu implementieren. Nachfolgend einige Beispiele:
- Fügen Sie vor jeder Zeile die richtige Einrückung hinzu
- Fügen Sie Leerzeichen nach
,
und andere Operatoren hinzu, z . B. Konvertierenint a[]={1,2,3};
nachint a[] = {1, 2, 3};
. Denken Sie jedoch daran, Operatoren nicht innerhalb von String-Literalen zu verarbeiten. - Entfernen Sie nach jeder Zeile nachfolgende Leerzeichen
- Wenn Sie Anweisungen in mehrere Zeilen aufteilen, z. B. kann der Schüler
tmp=a;a=b;b=tmp;
oderint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
alle in einer Zeile schreiben , können Sie sie in verschiedene Zeilen aufteilen. Achten Sie jedoch auffor
Schleifen, in denen Semikolons enthalten sind, aber ich glaube nicht, dass Sie sie aufteilen sollten. - Fügen Sie nach dem Definieren jeder Funktion eine neue Zeile hinzu
- Weitere Funktionen, mit denen Sie die Codes Ihrer Schüler nachvollziehen können.
Gewinnkriterien: Dies ist ein Beliebtheitswettbewerb, daher gewinnt die Antwort mit den meisten positiven Stimmen. Bei einem Unentschieden gewinnt die Antwort mit den meisten implementierten Funktionen. Wenn dies erneut ein Gleichstand ist, gewinnt der kürzeste Code.
Es wird empfohlen, in Ihre Antwort eine Liste der von Ihnen implementierten Funktionen sowie eine Beispieleingabe und -ausgabe aufzunehmen.
Bearbeiten: Wie in den Kommentaren angefordert, handelt es sich hier um eine Beispieleingabe. Beachten Sie jedoch, dass dies nur als Referenz dient. Es wird empfohlen, so viele Funktionen wie möglich zu implementieren.
Eingang:
#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;}
So würde ich diesen Code normalerweise formatieren: (Ich bin eine faule Person)
#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;
}
Das ist meiner Meinung nach leichter zu lesen:
#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;
}
Da ich nun Antworten habe, wird die Antwort mit der höchsten Stimmenzahl 5 Tage nach der letzten Antwort akzeptiert. Wenn also innerhalb von 5 Tagen keine neuen Antworten mehr vorliegen, endet dieser Wettbewerb.
quelle
s/\s+/ /
) und es einen Tag nennenAntworten:
Da es sich um Einrückungen und Leerzeichen handelt, müssen wir den Code nur in einer Programmiersprache schreiben, die eigentlich auf Leerzeichen ausgelegt ist , da dies am einfachsten sein muss, oder?
Die Lösung lautet also:
Hier ist es in base64:
Für diejenigen, die Probleme haben, den Code auf Papier auszudrucken, ist hier die kommentierte Version (einen Compiler finden Sie am Ende der Antwort):
Dies ist noch in Arbeit, obwohl es hoffentlich die meisten Kriterien erfüllen sollte!
Derzeit unterstützte Funktionen:
{
und}
.;
\"
)for
Block)Beispieleingabe (Ich habe einige Randfälle hinzugefügt, die auf dem Kommentar von Quincunx basieren, damit Sie überprüfen können, ob es sich richtig verhält):
Beispielausgabe:
Beachten Sie, dass der Interpreter eine Ausnahme auslöst, die wir unterdrücken müssen, da Whitespace die EOF-Prüfung nicht unterstützt. Da es im Whitespace keine Möglichkeit gibt, nach EOF zu suchen (soweit ich weiß, dass dies mein erstes Whitespace-Programm ist), ist dies etwas Unvermeidbares. Ich hoffe, dass die Lösung weiterhin zählt.
Dies ist das Skript, mit dem ich die mit Anmerkungen versehene Version in einen korrekten Leerraum kompiliert habe:
Laufen:
Beachten Sie, dass dies, abgesehen von der Konvertierung der Zeichen
S
,L
undT
, auch einzeilige Kommentare mit zulässt#
und automatisch Zahlen und einfache Zeichenliterale in ihre Leerraumdarstellung konvertieren kann. Wenn Sie möchten, können Sie es auch für andere Whitespace-Projekte verwendenquelle
for(i=0;i<10;i++)
;
inside(
/)
blocks würde ausreichen). Ich denke, diese sollten ausreichen, um die Lösung als "brauchbar" zu betrachten.Vim der einfache Weg, technisch nur mit einem Zeichen:=
Ich bin kein Vim-Guru, aber ich unterschätze niemals seine Macht und manche betrachten es als Programmiersprache. Für mich ist diese Lösung sowieso ein Gewinner.
Öffne die Datei in vim:
Drücken Sie innerhalb von vim die folgenden Tasten
gg=G
Erläuterung:
gg geht an den Anfang der Datei
= ist ein Befehl zum Beheben der Einrückung
G Weist ihn an, den Vorgang bis zum Ende der Datei auszuführen.
Sie können mit speichern und beenden :wq
Es ist möglich, den
vim
Befehl von der Befehlszeile aus ausführen zu lassen , dies kann also auch in einem Einzeiler erfolgen, aber das überlasse ich Leuten, die esvim
besser wissen als ich.Vim Beispiel eine gültige Eingabedatei (fibonacci.c) mit falschem Einzug.
In vim öffnen:
vim fibonacci.c
drückengg=Gquelle
=GZZ
. (Vim golf ftw!)Da dies verwendet wird, um dem Lehrer zu helfen, den Code des Schülers besser zu verstehen, ist es wichtig, die Eingabe zuerst zu bereinigen. Pre-Prozessor-Direktiven sind nicht erforderlich, da sie nur Unordnung verursachen und Makros auch schädlichen Code in die Datei einschleusen können. Das wollen wir nicht! Es ist auch völlig unnötig, die ursprünglichen Kommentare des Schülers beizubehalten, da sie wahrscheinlich sowieso völlig unbrauchbar sind.
Stattdessen, da jeder weiß, dass guter Code gute Kommentare benötigt, abgesehen von der Korrektur der Einrückung und der Struktur, sollten Sie einige äußerst nützliche Kommentare um die Hauptpunkte des Codes hinzufügen, um das Ergebnis noch verständlicher zu machen! Dies wird dem Lehrer definitiv dabei helfen, die geleistete Arbeit des Schülers einzuschätzen!
Also daraus:
Lassen Sie uns das produzieren:
Ist es nicht viel besser mit all den nützlichen Kommentaren rund um die Ausdrücke?
Das ist also eine Rubinlösung , die den
cast
Edelstein verwendet, der ein C-Parser ist (Ja, ich betrüge) . Dadurch wird der Code analysiert und neu gedruckt. Dies bedeutet, dass das Ergebnis perfekt eingerückt und auch konsistent ist. Beispiel:Außerdem enthält es nützliche Kommentare zur Funktionsweise des Codes, die sowohl für die Schüler als auch für die Lehrer sehr nützlich sind!
indent.rb
Gemfile
quelle
it is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
Bash, 35 Zeichen
Die Eingabedatei muss den Namen "input.c" haben und im aktuellen Arbeitsverzeichnis abgelegt sein.
Beispielausgabe, nachdem die Eingabe in der ursprünglichen Frage eingegeben wurde:
Je nach Hardware kann es einige Sekunden dauern, bis das Programm ausgeführt wird. Seien Sie also geduldig :)
quelle
rm
?Rubin
Ausgabe:
Ausgabe für @ SztupYs Edge Case-Eingabe:
Bisherige Features:
[x]
Fügen Sie vor jeder Zeile die richtige Einrückung hinzu[x]
Fügen Sie Leerzeichen nach,
und andere Operatoren hinzu, z . B. Konvertierenint a[]={1,2,3};
nachint a[] = {1, 2, 3};
. Denken Sie jedoch daran, Operatoren nicht innerhalb von String-Literalen zu verarbeiten.[x]
Entfernen Sie nach jeder Zeile nachfolgende Leerzeichen[x]
Wenn Sie Anweisungen in mehrere Zeilen aufteilen, z. B. kann der Schülertmp=a;a=b;b=tmp;
oderint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
alle in einer Zeile schreiben , können Sie sie in verschiedene Zeilen aufteilen. Achten Sie jedoch auffor
Schleifen, in denen Semikolons enthalten sind, aber ich glaube nicht, dass Sie sie aufteilen sollten.[ ]
Fügen Sie nach dem Definieren jeder Funktion eine neue Zeile hinzu[ ]
Weitere Funktionen, mit denen Sie die Codes Ihrer Schüler nachvollziehen können.quelle
Dies ist in Python geschrieben und basiert auf den GNU Coding Standards.
Bisherige Features:
Code:
Beispieleingabe (Dateiname als Argument übergeben):
Beispielausgabe:
Dies wird Fehler haben.
quelle
.Netz
Öffnen Sie diese Datei mit Visual Studio
Eingang:
Ausgabe:
quelle