Situasi: Anda adalah seorang guru sekolah menengah, mengajar kelas komputasi Anda bagaimana menulis program C. Namun, karena ini baru permulaan istilah, Anda belum mengajari mereka tentang pentingnya lekukan dan jarak. Ketika Anda menandai pekerjaan mereka, mata Anda sangat sakit sehingga Anda menjerit kesakitan, dan menyadari bahwa ini tidak dapat berlangsung.
Tugas: Anda telah memutuskan untuk menulis sebuah program, dalam bahasa apa pun, yang menggunakan kode sumber C yang valid sebagai input dan output yang diformat dengan baik. Anda harus memutuskan kode apa yang diformat dengan baik, karena ini adalah kontes popularitas. Anda disarankan untuk mengimplementasikan sebanyak mungkin fitur, berikut ini beberapa contohnya:
- Tambahkan lekukan yang tepat di bagian depan setiap baris
- Tambahkan spasi setelah
,
dan operator lain, mis. Konversiint a[]={1,2,3};
keint a[] = {1, 2, 3};
. Ingatlah untuk tidak memproses operator dalam string literal. - Hapus spasi tambahan setelah setiap baris
- Memisahkan pernyataan menjadi beberapa baris, misalnya siswa dapat menulis
tmp=a;a=b;b=tmp;
atauint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
semua dalam satu baris, Anda dapat memisahkannya menjadi beberapa baris yang berbeda. Waspadalah terhadapfor
loop, mereka memiliki titik koma di dalamnya tetapi saya benar-benar tidak berpikir Anda harus membaginya. - Tambahkan baris baru setelah mendefinisikan setiap fungsi
- Fitur lain yang bisa Anda dapatkan dengan bantuan Anda memahami kode siswa Anda.
Kriteria kemenangan: Ini adalah kontes popularitas, jadi jawaban dengan sebagian besar kemenangan menang. Dalam kasus seri, jawaban dengan fitur paling banyak diimplementasikan akan menang. Jika itu adalah seri lagi maka kode terpendek menang.
Anda disarankan untuk memasukkan dalam jawaban Anda daftar fitur yang telah Anda terapkan, serta sampel input dan output.
Sunting: Seperti yang diminta dalam komentar di sini adalah input sampel, namun perlu diingat bahwa itu hanya untuk referensi dan Anda disarankan untuk menerapkan sebanyak mungkin fitur.
Memasukkan:
#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;}
Ini adalah bagaimana saya biasanya memformat kode ini: (Saya orang yang malas)
#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;
}
Inilah yang menurut saya lebih mudah dibaca:
#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;
}
Juga, sekarang saya mulai memiliki jawaban, jawaban dengan penghitungan suara tertinggi akan diterima 5 hari setelah jawaban terakhir, yaitu jika tidak ada lagi jawaban baru dalam 5 hari, kontes ini akan berakhir.
sumber
s/\s+/ /
) dan menyebutnya sehariJawaban:
Karena kita berbicara tentang lekukan dan spasi putih, kita hanya perlu menulis kode dalam pemrograman bahasa yang sebenarnya dirancang di sekitar spasi putih , karena itu harus paling mudah, bukan?
Jadi solusinya adalah:
Ini dia di base64:
Bagi mereka yang memiliki masalah mencetak kode di atas kertas di sini adalah versi beranotasi (Anda dapat menemukan kompiler untuk ini di akhir jawaban):
Ini masih dalam proses, meskipun mudah-mudahan itu akan melewati sebagian besar kriteria!
Fitur yang didukung saat ini:
{
dan}
.;
\"
)for
blok)Input contoh (saya menambahkan beberapa kasus tepi berdasarkan komentar Quincunx, sehingga Anda dapat memeriksa apakah itu berperilaku baik):
Contoh output:
Perhatikan, itu karena spasi putih tidak mendukung EOF memeriksa intepreter melempar pengecualian, yang perlu kita tekan. Karena tidak ada cara di spasi putih untuk memeriksa EOF (sejauh yang saya tahu karena ini adalah program spasi putih pertama saya) ini adalah sesuatu yang tidak dapat dihindari, saya harap solusinya masih diperhitungkan.
Ini adalah skrip yang saya gunakan untuk mengkompilasi versi beranotasi ke spasi kosong yang tepat:
Untuk berlari:
Perhatikan bahwa ini, selain mengubah
S
,L
danT
karakter, juga memungkinkan komentar satu baris#
, dan dapat secara otomatis mengkonversi angka dan literal karakter sederhana ke dalam representasi spasi putih mereka. Jangan ragu untuk menggunakannya untuk proyek spasi putih lainnya jika Anda mausumber
for(i=0;i<10;i++)
;
di dalam(
/)
blok sudah cukup). Saya pikir itu harus cukup untuk mempertimbangkan solusi "dapat digunakan".Vim cara mudah, secara teknis hanya menggunakan satu karakter:=
Saya bukan seorang guru vim, tetapi saya tidak pernah meremehkan kekuatannya dan beberapa menganggapnya sebagai bahasa pemrograman. Bagi saya solusi ini adalah pemenangnya.
Buka file dalam vim:
Dalam vim tekan tombol-tombol berikut
gg=G
Penjelasan:
gg pergi ke bagian atas file
= adalah perintah untuk memperbaiki indentasi
G memintanya untuk melakukan operasi hingga akhir file.
Anda dapat menyimpan dan keluar dengan :wq
Dimungkinkan untuk
vim
menjalankan perintah dari command-line, jadi ini juga bisa dilakukan dalam satu-liner, tapi saya serahkan itu pada orang-orang yangvim
lebih tahu daripada saya.Misalnya, file input yang valid (fibonacci.c) dengan indentasi buruk
Buka di vim:
vim fibonacci.c
tekangg=Gsumber
=GZZ
. (Vim golf ftw!)Karena ini akan digunakan untuk membantu guru memahami kode siswa dengan lebih baik, penting untuk membersihkan input terlebih dahulu. Arahan pra-prosesor tidak diperlukan, karena mereka hanya mengganggu kekacauan, dan makro juga dapat memasukkan kode berbahaya ke dalam file. Kami tidak menginginkan itu! Juga, sama sekali tidak perlu untuk mempertahankan komentar asli yang ditulis siswa, karena mereka mungkin sama sekali tidak berguna.
Alih-alih, karena semua orang tahu kode yang baik membutuhkan komentar yang baik, selain dari memperbaiki lekukan, dan struktur, mengapa tidak menambahkan beberapa komentar yang sangat berguna di sekitar poin utama dari kode untuk membuat hasilnya lebih mudah dimengerti! Ini pasti akan membantu guru dalam menilai pekerjaan yang telah dilakukan siswa!
Jadi dari ini:
Mari kita hasilkan ini:
Bukankah ini jauh lebih baik, dengan semua komentar yang bermanfaat di sekitar ungkapan?
Jadi ini adalah solusi ruby memanfaatkan
cast
permata, yang merupakan pengurai C (Ya, saya curang) . Karena ini akan mem-parsing kode, dan mencetak ulang dari awal, itu berarti hasilnya akan indentasi sempurna dan juga konsisten, misalnya:Dan juga itu akan berisi komentar yang sangat berguna tentang cara kerja kode, yang akan sangat berguna bagi siswa dan guru!
indent.rb
Gemfile
sumber
it is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
Bash, 35 karakter
File input harus dinamai "input.c" dan ditempatkan di direktori kerja saat ini.
Contoh output, yang telah diberi input dalam pertanyaan awal:
Mungkin butuh beberapa detik untuk berjalan tergantung pada perangkat keras Anda, jadi bersabarlah :)
sumber
rm
?Rubi
Keluaran:
Output untuk input edge case dari SztupY:
Fitur sejauh ini:
[x]
Tambahkan lekukan yang tepat di bagian depan setiap baris[x]
Tambahkan spasi setelah,
dan operator lain, mis. Konversiint a[]={1,2,3};
keint a[] = {1, 2, 3};
. Ingatlah untuk tidak memproses operator dalam string literal.[x]
Hapus spasi tambahan setelah setiap baris[x]
Memisahkan pernyataan menjadi beberapa baris, misalnya siswa dapat menulistmp=a;a=b;b=tmp;
atauint f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}
semua dalam satu baris, Anda dapat memisahkannya menjadi beberapa baris yang berbeda. Waspadalah terhadapfor
loop, mereka memiliki titik koma di dalamnya tetapi saya benar-benar tidak berpikir Anda harus membaginya.[ ]
Tambahkan baris baru setelah mendefinisikan setiap fungsi[ ]
Fitur lain yang bisa Anda dapatkan dengan bantuan Anda memahami kode siswa Anda.sumber
Ini ditulis dalam python dan berdasarkan pada Standar Pengkodean GNU.
Fitur sejauh ini:
Kode:
Input contoh (berikan nama file sebagai argumen):
Contoh output:
Ini akan memiliki bug.
sumber
.Bersih
Buka file itu menggunakan Visual Studio
Memasukkan:
Keluaran:
sumber