সি কোড ইন্ডেন্টার


12

পরিস্থিতি: আপনি একজন উচ্চ বিদ্যালয়ের শিক্ষক, আপনার কম্পিউটারের ক্লাসটি সি প্রোগ্রাম লিখতে শেখাচ্ছেন। যাইহোক, যেহেতু এটি শব্দের মাত্র শুরু, আপনি এডেন্টেশন এবং স্পেসিংয়ের গুরুত্ব সম্পর্কে তাদের শেখান নি। আপনি যখন তাদের কাজ চিহ্নিত করছেন, আপনার চোখ এত আঘাত পেয়েছিল যে আপনি যন্ত্রণায় চিৎকার করছেন, এবং বুঝতে পারেন যে এটি আর চলতে পারে না।

কার্য: আপনি কোনও প্রোগ্রাম লেখার সিদ্ধান্ত নিয়েছেন, যে কোনও ভাষায়, একটি বৈধ সি উত্সকোডটিকে ইনপুট হিসাবে নেয় এবং এটিকে সুন্দর বিন্যাস করে আউটপুট দেয়। একটি দুর্দান্ত ফর্ম্যাট কোড কী তা আপনার সিদ্ধান্ত নেওয়া উচিত, কারণ এটি জনপ্রিয়তার প্রতিযোগিতা। আপনি যতটা বৈশিষ্ট্যগুলি প্রয়োগ করতে উত্সাহিত হন, নীচে কয়েকটি উদাহরণ দেওয়া হল:

  • প্রতিটি লাইনের সামনের দিকে যথাযথ ইনডেন্টেশন যুক্ত করুন
  • পরে স্পেস যোগ করুন ,এবং অন্যান্য অপারেটর, যেমন রূপান্তর int a[]={1,2,3};করার int a[] = {1, 2, 3};। স্ট্রিং আক্ষরিক মধ্যে অপারেটরদের প্রক্রিয়া না করার কথা মনে রাখবেন।
  • প্রতিটি লাইনের পরে ট্রেলিং স্পেসগুলি সরান
  • বিবৃতিগুলি কয়েকটি লাইনে বিভক্ত করা, যেমন শিক্ষার্থী লিখতে পারে tmp=a;a=b;b=tmp;বা int f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}সমস্ত এক লাইনে লিখতে পারে , আপনি এগুলিকে বিভিন্ন লাইনে আলাদা করতে পারেন। forলুপগুলি সম্পর্কে সচেতন থাকুন তবে সেগুলির মধ্যে সেমিকোলন রয়েছে তবে আমি সত্যিই ভাবি না যে আপনি তাদের বিভক্ত করুন।
  • প্রতিটি ফাংশন সংজ্ঞায়িত করার পরে একটি নতুন লাইন যুক্ত করুন
  • আপনি অন্য শিক্ষার্থীদের কোডগুলি বোঝার জন্য সহায়তা নিয়ে আসতে পারেন এমন আরও একটি বৈশিষ্ট্য।

জয়ের মানদণ্ড: এটি একটি জনপ্রিয়তার প্রতিযোগিতা, সুতরাং বেশিরভাগ আপভোটের উত্তর জিতল। টাই করার ক্ষেত্রে সর্বাধিক বৈশিষ্ট্যযুক্ত উত্তরটি জিততে পারে। যদি এটি আবার টাই হয় তবে সংক্ষিপ্ততম কোড জিতবে।

আপনার উত্তরে আপনি যে বৈশিষ্ট্যগুলি প্রয়োগ করেছেন তার একটি তালিকা, পাশাপাশি একটি নমুনা ইনপুট এবং আউটপুট অন্তর্ভুক্ত করার পরামর্শ দেওয়া হচ্ছে।

সম্পাদনা করুন: এখানে মন্তব্যে অনুরোধ করা হ'ল একটি নমুনা ইনপুট, তবে মনে রাখবেন যে এটি কেবলমাত্র রেফারেন্সের জন্য এবং আপনাকে যতটা সম্ভব বৈশিষ্ট্যগুলি প্রয়োগ করার পরামর্শ দেওয়া হচ্ছে।

ইনপুট:

#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;}

আমি সাধারণত এই কোডটি ফর্ম্যাট করব: (আমি একটি অলস ব্যক্তি)

#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;
}

আমি এইভাবে পড়া সহজ মনে করি:

#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;
}




এছাড়াও, এখন যেহেতু আমার উত্তর থাকতে শুরু করেছে, সর্বশেষ ভোটের গণনা সহ উত্তরটি শেষ উত্তরের 5 দিন পরে গৃহীত হবে, অর্থাৎ যদি 5 দিনের মধ্যে আরও নতুন উত্তর না পাওয়া যায় তবে এই প্রতিযোগিতাটি শেষ হবে।


2
ডাউন ভোটের কোনও কারণ?
ব্যবহারকারী 12205

1
আমি সমস্ত অপ্রয়োজনীয় শ্বেতস্থান ( s/\s+/ /) মুছে ফেলতে এবং একটি দিন কল করতে পারি
ratchet freak

1
@ র্যাচেট ফ্রিক আপনি করতে পারেন, তবে আমি মনে করি না এটি অনেক উত্তর দিয়ে উত্তর হবে।
ব্যবহারকারী 12205

1
@ কুইনকুনস অনুদান স্থাপনের জন্য ধন্যবাদ। আমি ভেবেছিলাম আমার প্রশ্ন চুষছে।
ব্যবহারকারী 12205

1
@ চাচাতো ভাই কোকেন: এটি একটি জনপ্রিয়তার প্রসঙ্গ। এগুলি কোনও মার্জিত বা মানক উপায়ে সমস্যার সমাধানের জন্য ডিজাইন করা হয়নি। আপনি সম্ভবত কল্পনা করতে পারেন এমন দুর্দান্ত পদ্ধতিতে সমস্যাটি সমাধান করার জন্য এগুলি তৈরি করা হয়েছে।
SztupY

উত্তর:


21

যেহেতু আমরা ইনডেন্টেশন এবং হোয়াইটস্পেসের কথা বলছি আমাদের কেবল একটি প্রোগ্রামিংয়ে কোড লিখতে হবে এমন একটি ভাষা যা প্রকৃতপক্ষে হোয়াইটস্পেসের আশেপাশে তৈরি করা হয়েছে , যেটি সহজ হতে হবে, তাই না?

সুতরাং সমাধানটি হ'ল:




















































































































































































































































































































































































































































এখানে এটি বেস 64 এ রয়েছে:

ICAgCQogICAgCgkJICAgIAkgCiAgICAKCQkgICAgCQkKICAgIAoJCSAgICAJICAKICAgIAoJCSAgICAJIAkKICAgIAoJCSAKIAogCQoKICAgCSAKICAgCQoJCQkgICAJCQkgCQkKCSAgCQoJICAJICAKICAgCQoJCQkgICAJIAkgCgkgIAkKCSAgCSAJCiAgIAkKCQkJICAgCSAgCQoJICAJCgkgIAkgCQogICAJCgkJCSAgIAkgICAgIAoJICAJCgkgIAkgCQogICAJCgkJCSAgIAkJCQkJIAkKCSAgCQoJICAJCSAKICAgCQoJCQkgICAJICAgCSAKCSAgCQoJICAJICAgIAogICAJCgkJCSAgIAkgCSAgIAoJICAJCgkgIAkgICAJCQogICAJCgkJCSAgIAkgCSAgCQoJICAJCgkgIAkgIAkgIAogICAJIAogICAJCgkJIAogCSAJCQkKICAgCQoJCQkJCiAgCgkKCiAgIAkgIAogICAJCgkJCQkKICAKCQoKICAgCSAJCgoJCgogICAJCSAKICAgCQkKICAgCQkKCQkJICAgCQoJICAJCQkgICAgCSAKICAgCQoJCSAKIAkgCQkJCiAgIAkKCQkJCQogIAoJCgogICAJICAgIAogICAJIAogICAJIAoJCSAKIAkgCQkJCiAgIAkKCQkJCQogIAoJCgogICAJICAgCQkKICAgCSAJCiAgIAkgCQoJCQkgICAJCgkgICAJCSAgICAJIAogICAJCgkJIAogCSAJCQkKICAgCQoJCQkJCiAgCgkKCiAgIAkgIAkgIAogICAJIAkKICAgCSAJCgkJCSAgIAkKCSAgCQkJICAgIAkgCiAgIAkKCQkgCiAJIAkJCQogICAJCgkJCQkKICAKCQoKICAgCQkKICAgCQoJCQkgICAJIAkgCgkgIAkKCSAgCQkgIAogICAJCgkJCSAgIAkJCQkgCQkKCSAgCQoJICAJCSAJCiAgIAkKCQkJICAgCQkJCQkgCQoJICAJCgkgIAkJCSAKICAgCQoJCQkgICAJCQkgCQkKCSAgCQoJICAJCQkJCiAgIAkKCQkJICAgCSAgIAkgCgkgIAkKCSAgCQkgCQkKICAgCQoJCQkgICAJIAkgCSAKCSAgCQoJICAJCQkgIAogICAJCgkJCSAgIAkgCQkJCQoJICAJCgkgIAkJCSAJCiAgIAkKCQkJICAgCSAJICAgCgkgIAkKCSAgCSAgCSAJCiAgIAkKCQkJICAgCSAJICAJCgkgIAkKCSAgCSAgCQkgCiAgIAkKCQkJCQogIAoJCgogICAJCSAgCiAgIAkgCiAgICAKCQkgCgkKCiAgIAkJIAkKICAgCQoJCQkJCiAgICAgCSAKICAgIAoJCSAgICAJCQogICAJCQoJCQkgICAJCgkgICAJCSAKCQoKICAgCQkJIAogICAJCQogICAJCQoJCQkgICAJCgkgIAkJCSAKIAkgCQkJCiAgIAkKCQkJCQogICAgIAkgCiAgICAKCQkgCgkKCiAgIAkJCQkKICAgCQoJCQkJCiAgICAgCSAJCgkJCQoJICAJIAkgCgoJCgogICAJICAJCQkKICAgCSAKICAgIAoJCSAKCQoKICAgCQkgCQkKICAgCQoJCQkJCiAgICAgCSAKICAgCSAKCQkgCgkKCiAgIAkJCSAgCiAgIAkgIAoJCQkgICAJIAkJCQkKCSAgCQoJICAJCQkJIAogICAJCgkJCQkKICAKCQoKICAgCQkJIAkKICAgCSAgCgkJCSAgIAkgCQkJCQoJICAJCgkgIAkJCQkJCiAgIAkKCQkJCQogIAoJCgogICAJCQkJIAogICAJCgkJCQkKICAgICAJIAogICAJCQoJCSAKCQoKICAgCQkJCQkKICAgCQoJCQkJCiAgICAgCSAKICAgCSAgCgkJIAoJCgogICAJICAJIAkKICAgCSAJCiAgIAkgCQoJCQkgICAJCgkgICAJCSAgICAJCgkJCQkKICAKCQoKICAgCSAgCQkgCiAgIAkgCQogICAJIAkKCQkJICAgCQoJICAJCQkgICAgCQoJCQkJCiAgCgkKCiAgIAkJCQogICAJIAkgCgkKICAgICAJCQoJCQkKICAgCSAgCQogCiAKCSAgCSAgIAogCiAKCQkgCSAgIAogICAJICAgICAKCQogICAgIAkgICAgIAoJCiAgICAgCQoJICAJCiAKIAkgIAkKCiAgIAkgICAKCgkKCiAgIAkgCSAJCiAgIAkKCQkJICAgCSAJIAoJICAJCgkgIAkJICAgCiAgIAkKCQkJICAgCSAgIAkgCgkgIAkKCSAgCQkgIAkKICAgCQoJCQkJCiAgCgkKCiAgIAkJICAgCiAgIAkgCiAgICAKCQkgCgkKCiAgIAkJICAJCiAgIAkgIAoJCQkgICAJIAkJCSAgCgkgIAkKCSAgCQkgCSAKICAgCSAKICAgCQoJCSAgICAJCgkJCQkKICAKCQoKICAgCQkgCSAKICAgCQoJCQkJCiAgCgkKCiAgIAkgCQkgCiAgIAkKCQkJICAgCSAJCQkJCgkgIAkKCSAgCSAgICAgCiAgIAkKCQkJCQogIAoJCgogICAJICAgICAKICAgCSAgCgkJCSAgIAkgCSAJIAoJICAJCgkgIAkgICAgCQogICAJCgkJCQkKICAKCQoKICAgCSAgICAJCiAgIAkKCQkJCQogICAgIAkgCiAgIAkKCQkgCgkKCiAgIAkgCQkJCiAgIAkKCQkJICAgCSAJIAoJICAJCgkgIAkgICAJIAogICAJCgkJCQkKICAKCQoKICAgCSAgIAkgCiAgIAkgCiAgICAKCQkgCgkKCiAgIAkKICAgCSAgCiAgIAkKCQkJCQkgICAgCQoJCgkgICAgCSAKCQkJCgkgIAkgCSAKICAgCSAKCQkJICAgCQoJICAJCgkgIAkgICAJCiAgIAkgCgkJCSAgIAkgCgkgIAkKCSAgCSAgCSAKICAgCSAKCQkJICAgCQkKCSAgCQoJICAJICAJCQogICAJIAoJCQkgICAJICAKCSAgCQoJICAJIAkgIAoKICAgCSAgIAkKCiAJIAkJCgogCiAJIAkJCgogICAJIAkgCgogCSAJIAoKIAogCSAJCQoKICAgCSAgCSAKCiAJIAkgCSAJCgogCiAJIAkJCgogICAJICAJCQoKIAkgCSAJCSAKCiAKIAkgCQkKCiAgIAkgCSAgCgogCSAJIAkJCQoKICAgCSAJCQoKIAogCQoKCgo=

যাদের এখানে একটি কাগজে কোড মুদ্রণ করতে সমস্যা রয়েছে তাদের জন্য টীকাগুলি সংস্করণ (উত্তরের শেষে আপনি এটির জন্য একটি সংকলক খুঁজে পেতে পারেন):

# heap structure:
# 1: read buffer
# 2: parser state
#   0: before indentation
#   1: after indentation
#   2: inside a string literal
#   3: inside a multiline comment
#   4: inside a single line comment
# 3: identation
# 4: old read buffer
# 5: parenthesis nesting amount

# -------------------
# initialize heap
# -------------------
SS 1 | SS 0 | TTS # [1] := 0
SS 2 | SS 0 | TTS # [2] := 0
SS 3 | SS 0 | TTS # [3] := 0
SS 4 | SS 0 | TTS # [4] := 0
SS 5 | SS 0 | TTS # [5] := 0
LSL 1 # goto L1

# -------------------
# sub: determine what to do in state 0
# -------------------
LSS 2 # LABEL L2
SS 1 | TTT | SS  59 | TSST | LTS 4 # if [1] == ; GOTO L4
SS 1 | TTT | SS  10 | TSST | LTS 5 # if [1] == \n GOTO L5
SS 1 | TTT | SS   9 | TSST | LTS 5 # if [1] == \t GOTO L5
SS 1 | TTT | SS  32 | TSST | LTS 5 # if [1] == ' ' GOTO L5
SS 1 | TTT | SS 125 | TSST | LTS 6 # if [1] == } GOTO L6
SS 1 | TTT | SS  34 | TSST | LTS 16 # if [1] == " GOTO L16
SS 1 | TTT | SS  40 | TSST | LTS 35 # if [1] == ( GOTO L35
SS 1 | TTT | SS  41 | TSST | LTS 36 # if [1] == ) GOTO L36

SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 4 # label L4 - ; handler
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 5 # label L5 - WS handler
LTL # return

LSS 6 # label L6 - } handler
# decrease identation by one
SS 3 | SS 3 | TTT | SS 1 | TSST | TTS # [3] := [3] - 1
SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 16 # label L16 - " handler
SS2 | SS 2 | TTS # [2] := 2
LST 7 # call L7
SS1 | TTT | TLSS # print [1]
LTL

LSS 35
SS 5 | SS 5 | TTT | SS 1 | TSSS | TTS # [5] := [5] + 1
SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS1 | TTT | TLSS # print [1]
LTL

LSS 36
SS 5 | SS 5 | TTT | SS 1 | TSST | TTS # [5] := [5] - 1
SS 2 | SS 1 | TTS # [2] := 1
LST 7 # call L7
SS1 | TTT | TLSS # print [1]
LTL

# -------------------
# sub: determine what to do in state 1
# -------------------
LSS 3 # LABEL L3
SS 1 | TTT | SS  10 | TSST | LTS 12 # if [1] == \n GOTO L12
SS 1 | TTT | SS 123 | TSST | LTS 13 # if [1] == { GOTO L13
SS 1 | TTT | SS 125 | TSST | LTS 14 # if [1] == } GOTO L14
SS 1 | TTT | SS  59 | TSST | LTS 15 # if [1] == ; GOTO L15
SS 1 | TTT | SS  34 | TSST | LTS 27 # if [1] == " GOTO L27
SS 1 | TTT | SS  42 | TSST | LTS 28 # if [1] == * GOTO L28
SS 1 | TTT | SS  47 | TSST | LTS 29 # if [1] == / GOTO L29
SS 1 | TTT | SS  40 | TSST | LTS 37 # if [1] == ( GOTO L37
SS 1 | TTT | SS  41 | TSST | LTS 38 # if [1] == ) GOTO L38
SS 1 | TTT | TLSS # print [1]
LTL # return

LSS 12 # LABEL L12 - \n handler
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 13 # LABEL L13 - { handler
SS 1 | TTT | TLSS # print [1]
SS 2 | SS 0 | TTS # [2] := 0
SS 3 | SS 3 | TTT | SS 1 | TSSS | TTS # [3] := [3] + 1
LTL # return

LSS 14 # LABEL L14 - } handler
SS 3 | SS 3 | TTT | SS 1 | TSST | TTS # [3] := [3] - 1
LST 7 # call L7
SS 1 | TTT | TLSS # print [1]
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 15 # LABEL L15 - ; handler
SS 1 | TTT | TLSS # print [1]
SS 5 | TTT | LTS 10 # if [5] == 0 GOTO L39
LTL

LSS 39
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 27 # label L27 - " handler
SS1 | TTT | TLSS # print [1]
SS2 | SS 2 | TTS # [2] := 2
LTL

LSS 28 # label L28 - * handler - this might start a comment
SS 4 | TTT | SS  47 | TSST | LTS 30 # if [4] == / GOTO L30
SS1 | TTT | TLSS # print [1]
LTL

LSS 29 # label L29 - / handler - this might start a comment
SS 4 | TTT | SS  47 | TSST | LTS 31 # if [4] == / GOTO L31
SS1 | TTT | TLSS # print [1]
LTL

LSS 30 # label L30 - /* handler
SS1 | TTT | TLSS # print [1]
SS2 | SS 3 | TTS # [2] := 3
LTL

LSS 31 # label L31 - // handler
SS1 | TTT | TLSS # print [1]
SS2 | SS 4 | TTS # [2] := 4
LTL

LSS 37
SS 5 | SS 5 | TTT | SS 1 | TSSS | TTS # [5] := [5] + 1
SS1 | TTT | TLSS # print [1]
LTL

LSS 38
SS 5 | SS 5 | TTT | SS 1 | TSST | TTS # [5] := [5] - 1
SS1 | TTT | TLSS # print [1]
LTL

# -------------------
# sub: print identation
# -------------------
LSS 7 # label L7 - print identation
SS 10 | TLSS # print \n
SS 3 | TTT # push [3]
LSS 9 # label L9 - start loop
SLS | LTS 8 # if [3] == 0 GOTO L8
SLS | LTT 8 # if [3] < 0 GOTO L8 - for safety
SS 32 | TLSS # print ' '
SS 32 | TLSS # print ' '
SS 1  | TSST # i := i - 1
LSL 9 # GOTO L9
LSS 8 # label L8 - end loop
LTL #

# -------------------
# sub: L21 - string literal handler
# -------------------
LSS 21
SS 1 | TTT | SS  10 | TSST | LTS 24 # if [1] == \n GOTO L24
SS 1 | TTT | SS  34 | TSST | LTS 25 # if [1] == " GOTO L25
SS 1 | TTT | TLSS # print [1]
LTL

LSS 24 # \n handler - this should never happen, but let's be prepared and reset the parser
SS 2 | SS 0 | TTS # [2] := 0
LTL # return

LSS 25 # " handler - this might be escaped, so be prepared
SS 4 | TTT | SS  92 | TSST | LTS 26 # if [4] == \ GOTO L26
SS 2 | SS 1 | TTS # [2] := 1
SS 1 | TTT | TLSS # print [1]
LTL

LSS 26 # \\" handler - escaped quotes don't finish the literal
SS 1 | TTT | TLSS # print [1]
LTL

# -------------------
# sub: L22 - multiline comment handler
# -------------------
LSS 22
SS 1 | TTT | SS  47 | TSST | LTS 32 # if [1] == / GOTO L32
SS 1 | TTT | TLSS # print [1]
LTL

LSS 32
SS 4 | TTT | SS  42 | TSST | LTS 33 # if [4] == * GOTO L33
SS 1 | TTT | TLSS # print [1]
LTL

LSS 33
SS 1 | TTT | TLSS # print [1]
SS 2 | SS 1 | TTS # [2] := 1
LTL
# -------------------
# sub: L23 - singleline comment handler
# -------------------
LSS 23
SS 1 | TTT | SS  10 | TSST | LTS 34 # if [1] == \n GOTO L34
SS 1 | TTT | TLSS # print [1]
LTL

LSS 34
SS 2 | SS 0 | TTS # [2] := 0
LTL

# -------------------
# main loop
# -------------------
LSS 1 # LABEL L1
SS 4 | SS 1 | TTT | TTS # [4] := [1]
SS 1 | TLTS # [1] := read

SS 2 | TTT | LTS 10 # if [2] == 0 GOTO L10
SS 2 | TTT | SS 1 | TSST | LTS 17 # if [2] == 1 GOTO L17
SS 2 | TTT | SS 2 | TSST | LTS 18 # if [2] == 2 GOTO L18
SS 2 | TTT | SS 3 | TSST | LTS 19 # if [2] == 3 GOTO L19
SS 2 | TTT | SS 4 | TSST | LTS 20 # if [2] == 4 GOTO L20

LSS 17
LST 3  # call L3
LSL 11 # GOTO L11

LSS 10 # label L10
LST 2  # call L2
LSL 11

LSS 18
LST 21
LSL 11

LSS 19
LST 22
LSL 11

LSS 20
LST 23

LSS 11 # label L11
LSL 1  # goto L1
LLL # END

এটি এখনও কাজ চলছে, যদিও আশা করা যায় এটি বেশিরভাগ মানদণ্ডে পাস করা উচিত!

বর্তমানে সমর্থিত বৈশিষ্ট্য:

  • {এবং }অক্ষরগুলির উপর ভিত্তি করে সনাক্তকরণ ঠিক করুন ।
  • এর পরে একটি নতুন লাইন যুক্ত করুন ;
  • স্ট্রিং লিটারালগুলিতে ইনডেন্টেশন অক্ষরগুলি হ্যান্ডেল করুন (এগুলির মুখোমুখি হওয়ার সময় স্ট্রিং লেটারালগুলি বন্ধ করা হয় না তা সহ \")
  • একক এবং বহুরেখা মন্তব্যের ভিতরে ইনডেন্টেশন অক্ষরগুলি পরিচালনা করুন
  • প্রথম বন্ধনী ( forব্লকের মতো ) এর ভিতরে থাকলে নতুন লাইন অক্ষর যুক্ত করবেন না

উদাহরণ ইনপুট (কুইকুনাক্সের মন্তব্যের ভিত্তিতে আমি কয়েকটি প্রান্তের কেস যুক্ত করেছি, যাতে আপনি এটি সঠিকভাবে আচরণ করে তা পরীক্ষা করতে পারেন):

    /* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#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;}

উদাহরণ আউটপুট:

[~/projects/indent]$ cat example.c | ./wspace indent.ws 2>/dev/null

/* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#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;;
}

দ্রষ্টব্য, যেহেতু শ্বেত স্পেস ইওএফ সমর্থন করে না ইন্টারপ্রেটার চেক করা একটি ব্যতিক্রম ছুঁড়েছে, যা আমাদের দমন করতে হবে। যেহেতু ইওএফ চেক করার জন্য হোয়াইটস্পেসের কোনও উপায় নেই (যতদূর আমি জানি এটি আমার প্রথম হোয়াইটস্পেস প্রোগ্রাম) এটি অনিবার্য কিছু, আশা করি সমাধানটি এখনও গণনা করবে।

এই স্ক্রিপ্টটি আমি টীকাযুক্ত সংস্করণটিকে যথাযথ শ্বেত স্পেসে সংকলন করতে ব্যবহার করেছি:

#!/usr/bin/env ruby
ARGF.each_line do |line|
  data = line.gsub(/'.'/) { |match| match[1].ord }
  data = data.gsub(/[^-LST0-9#]/,'').split('#').first
  if data
    data.tr!('LST',"\n \t")
    data.gsub!(/[-0-9]+/){|m| "#{m.to_i<0?"\t":" "}#{m.to_i.abs.to_s(2).tr('01'," \t")}\n" }
    print data
  end
end

চালানোর জন্য:

./wscompiler.rb annotated.ws > indent.ws

মনে রাখবেন যে এই যে, পৃথক্ রূপান্তর থেকে S, Lএবং Tঅক্ষর, সাথে একক লাইন মন্তব্যকে অনুমতি #, এবং স্বয়ংক্রিয়ভাবে তাদের হোয়াইটস্পেস উপস্থাপনা মধ্যে সংখ্যা এবং সহজ চরিত্র লিটারেল রূপান্তর করতে পারেন। আপনি চাইলে এটিকে অন্যান্য হোয়াইটস্পেস প্রকল্পের জন্য নির্দ্বিধায় ব্যবহার করুন


খারাপ না! :) তবে এটি আরও ভাল লাগবে যদি এটি লুপের জন্য তিনটি লাইনে ভাগ না করে (আমার মতে অন্তত ... এটি এখনও ভোটারদের সিদ্ধান্ত নিতে পারে)। অনুস্মারক হিসাবে, সি এর লুপের বাক্য গঠন রয়েছেfor(i=0;i<10;i++)
ব্যবহারকারী 12205

2
@ স্পেস: হোয়াইটস্পেস ঠিক উচ্চ-স্তরের ভাষা না হওয়ায় এই জাতীয় ব্যতিক্রম যুক্ত করা এত সহজ নয় that এটি বলেছে যে আমি এখনও দুটি বিষয় মন্তব্য এবং আক্ষরিক দিয়ে সমাধান করার চেষ্টা করি এবং লুপগুলি ঠিক করার জন্য পরিচালনা করার চেষ্টা করি (আমি মনে করি ;ভিতরে (/ )ব্লকগুলিকে উপেক্ষা করা যথেষ্ট হবে)। আমি মনে করি সমাধানগুলি "ব্যবহারযোগ্য" হিসাবে বিবেচনা করার জন্য সেগুলি যথেষ্ট হওয়া উচিত।
SztupY

1
@ স্পেস: আমি মনে করি আমি ব্যতিক্রমগুলি পরিচালনা করতে সক্ষম হয়েছি, সুতরাং এখন উত্পন্ন কোডটি সঠিকভাবে ইন্টেন্ট করা হয়েছে বলে মনে হচ্ছে। আপনার একের জন্য উদাহরণটি পরিবর্তন করা হয়েছে
SztupY

9

প্রযুক্তিগতভাবে কেবল একটি অক্ষর ব্যবহার করে সহজ উপায় ভিম করুন:=

আমি কোনও ভিম ​​গুরু নই, তবে আমি কখনই এর শক্তিটিকে কম বলে বিবেচনা করি না এবং কেউ কেউ এটিকে প্রোগ্রামিং ভাষা হিসাবে বিবেচনা করে। আমার জন্য এই সমাধানটি যাইহোক বিজয়ী।

ভিএম ফাইলটি খুলুন:

vim file.c

ভিমের মধ্যে নিম্নলিখিত কীগুলি টিপুন

gg=G

ব্যাখ্যা:

gg ফাইলের শীর্ষে যায়

= ইন্ডেন্টেশন ঠিক করার জন্য একটি কমান্ড

G এটি ফাইলের শেষে অপারেশন করতে বলে।

আপনি সংরক্ষণ এবং ছাড়তে পারেন :wq

vimকমান্ড-লাইন থেকে রান কমান্ড দেওয়া সম্ভব , সুতরাং এটি ওয়ান-লাইনারেও করা যেতে পারে, তবে আমি এটি তাদের vimচেয়ে বেশি জানি যারা আমার চেয়ে ভাল জানেন ।


উদাহরণস্বরূপ খারাপ ইন্ডেন্ট সহ একটি বৈধ ইনপুট ফাইল (ফাইবোনাকসি.সি.) উদাহরণ করুন।

/* Fibonacci Series c language */
#include<stdio.h>

int main()
{
int n, first = 0, second = 1, next, c;

            printf("Enter the number of terms\n");
scanf("%d",&n);
  printf("First %d terms of Fibonacci series are :-\n",n);

          for ( c = 0 ; c < n ; c++ )
   {
if ( c <= 1 )
         next = c;
 else
                                     {
next = first +    second;
              first = second;
        second = next;
      }
      printf("%d\n",next);
   }
 return 0;
}

ভিমে খুলুন: vim fibonacci.cটিপুনgg=G

/* Fibonacci Series c language */
#include<stdio.h>

int main()
{
  int n, first = 0, second = 1, next, c;

  printf("Enter the number of terms\n");
  scanf("%d",&n);
  printf("First %d terms of Fibonacci series are :-\n",n);

  for ( c = 0 ; c < n ; c++ )
  {
    if ( c <= 1 )
      next = c;
    else
    {
      next = first +    second;
      first = second;
      second = next;
    }
    printf("%d\n",next);
  }
  return 0;
}


এটি সংক্ষিপ্ত করা যেতে পারে =GZZ। (তেজ গলফ FTW!)
Doorknob

7

এটি যেহেতু শিক্ষককে শিক্ষার্থীর কোডটি আরও ভালভাবে বুঝতে সহায়তা করতে ব্যবহৃত হবে প্রথমে ইনপুটটি স্যানিটাইজ করা গুরুত্বপূর্ণ। প্রাক-প্রসেসরের দিকনির্দেশনা অপ্রয়োজনীয়, কারণ তারা কেবল বিশৃঙ্খলা অনুপ্রবেশ করে এবং ম্যাক্রোগুলি ফাইলটিতে দূষিত কোডও প্রবর্তন করতে পারে। আমরা তা চাই না! এছাড়াও, শিক্ষার্থীর লেখা মূল মন্তব্যগুলি ধরে রাখা সম্পূর্ণ অপ্রয়োজনীয়, কারণ তারা সম্ভবত যাইহোক সম্পূর্ণ অকেজো completely

পরিবর্তে, সবাই যেমন জেনে যায় যে ভাল কোডের ইনডেন্টেশন এবং কাঠামো ঠিক করা ছাড়াও ভাল মন্তব্যের প্রয়োজন হয়, কেন ফলাফলকে আরও বোধগম্য করার জন্য কোডের মূল পয়েন্টগুলির আশেপাশে কিছু উচ্চ দরকারী মন্তব্য যুক্ত করা হয় না কেন! এটি অবশ্যই শিক্ষার্থীকে যে কাজটি করেছে তা মূল্যায়নে শিক্ষককে অবশ্যই সহায়তা করবে!

সুতরাং এটি থেকে:

    /* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#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;}

আসুন এটি উত্পাদন করুন:

int main() {
    /* This will declare i. */
    int i;
    /* This will declare s[99]. */
    char s[99];
    /* This will call the function called printf with 1 parameters */
    printf("----------------------\n;;What is your name?;;\n----------------------\n\"");
    /* This will call the function called scanf with 2 parameters */
    scanf("%s", s);
    /* This will start a for loop, with initializator i = 0. It will loop until i < strlen(s), and will i++ at each iteration */
    for (i = 0; i < strlen(s); i++) {
        /* This will check, whether s[i] >= 'a' && s[i] <= 'z' is true or not. */
        if (s[i] >= 'a' && s[i] <= 'z') {
            s[i] -= 'a' - 'A';
        }
    }
    /* This will call the function called printf with 2 parameters */
    printf("Your \"name\" in upper case is:\n%s\n", s);
    /* This will return from the function. */
    return 0;
}

অভিব্যক্তিগুলির চারপাশে দরকারী সমস্ত মন্তব্য সহ এটি কি আরও ভাল নয়?


সুতরাং এটি মণি ব্যবহার করে একটি রুবি সমাধান castযা একটি সি পার্সার (হ্যাঁ, আমি প্রতারণা করছি) । যেহেতু এটি কোডটি বিশ্লেষণ করবে এবং এটিকে স্ক্র্যাচ থেকে পুনরায় মুদ্রণ করবে এর অর্থ ফলাফলটি পুরোপুরি ইন্ডেন্টেড এবং সামঞ্জস্যপূর্ণও হবে, যেমন:

  • ব্লক স্তরের উপর ভিত্তি করে কোড জুড়ে সঠিক ইন্ডেন্টেশন
  • অভিব্যক্তি, বিবৃতি, শর্তাদি ইত্যাদির আশেপাশে ধারাবাহিক সাদা স্থান ac
  • কোডের কাঠামোর ভিত্তিতে পুনরায় পাঠানো সম্পূর্ণ করুন
  • প্রভৃতি

এবং এতে কোড কীভাবে কাজ করে সে সম্পর্কে অত্যন্ত দরকারী মন্তব্য থাকবে যা শিক্ষার্থী এবং শিক্ষক উভয়ের জন্যই উপকারী হবে!

indent.rb

#!/usr/bin/env ruby
require 'cast'

code = ''
ARGF.each_line do |line|
  if line=~/\A#/
    code << "// #{line.strip}\n"
  else
    code << line
  end
end

class Comment < C::Literal
  field :val
  initializer :val
  def to_s
    "/* #{val} */"
  end
end

tree = C.parse(code)
tree.preorder do |n|
  break if n.kind_of?(Comment)
  if n.kind_of?(C::Declaration)
    dd = []
    n.declarators.each do |d|
      dd << "declare #{d.indirect_type ? d.indirect_type.to_s(d.name) : d.name}"
      dd.last << " and set it to #{d.init}" if d.init
    end
    unless dd.empty?
      n.insert_prev(Comment.new("This will #{dd.join(", ")}."))
    end
  end rescue nil
  n.parent.insert_prev(Comment.new("This will call the function called #{n.expr} with #{n.args.length} parameters")) if n.kind_of?(C::Call) rescue nil
  n.insert_prev(Comment.new("This will start a for loop, with initializator #{n.init}. It will loop until #{n.cond}, and will #{n.iter} at each iteration")) if n.kind_of?(C::For) rescue nil
  n.insert_prev(Comment.new("This will check, whether #{n.cond} is true or not.")) if n.kind_of?(C::If) rescue nil
  n.insert_prev(Comment.new("This will return from the function.")) if n.kind_of?(C::Return) rescue nil
end

puts tree

Gemfile

source "http://rubygems.org"
gem 'cast', '0.2.1'

3
+1 এর জন্যit is completely unnecessary to retain the original comments the student wrote, as they are probably completely useless anyway
সাইনোপসিস

সেই মন্তব্যগুলি আমার কাছে বর্ণনাতীত। তারা বিশৃঙ্খলার পরিচয় করিয়ে দেয় কারণ তারা কেবল নিম্নলিখিত লাইনটি পুনরায় চালু করে।
জাস্টিন

@ কুইন্টাঙ্কস আমি মনে করি আপনি ব্যঙ্গাত্মক ট্যাগটি মিস করেছেন। এটি একটি জনপ্রিয়তা প্রতিযোগিতা।
SztupY

5

বাশ, 35 টি অক্ষর

ইনপুট ফাইলটির নাম "ইনপুট.সি" রাখা উচিত এবং বর্তমান কার্যক্ষম ডিরেক্টরিতে রাখতে হবে।

sh <(wget -q -O- http://x.co/3snpk)

উদাহরণ আউটপুট, মূল প্রশ্নে ইনপুট খাওয়ানো হয়েছে: http://i.imgur.com/JEI8wa9.png

আপনার হার্ডওয়ারের উপর নির্ভর করে চালাতে কয়েক সেকেন্ড সময় নিতে পারে, তাই ধৈর্য ধরুন :)


আপনি জানেন যে এটি কোড-গল্ফ নয়, তাই না?
জাস্টিন

1
ফ্লাইতে এ্যাসটিলকে ডাউনলোড এবং সংকলনের জন্য +1 ওও আপনি কি কেবল ব্যবহারকারীদের সুবিধার্থে অ্যাসটিলকে সেখানে রেখে যাবেন না? তাহলে অপসারণ rm?
টমসডিং

যেহেতু এটি কোড-গল্ফ নয়, আমি মনে করি কেবল আপনার পেস্টবিনের বিষয়বস্তু এখানে রাখাই ভাল হবে, তবে তাত্ক্ষণিকভাবে আমি খেয়ালও করিনি যে আপনি আসলে কোনও বাহ্যিক কমান্ড দিয়ে কোডটি সঠিকভাবে ফর্ম্যাট করছেন
স্জটুপওয়াই

@ কুইনকুনস: এটি কিছুটা ট্রোল জবাব বলে বোঝানো হয়েছে: পি
দাঙ্গা

@ টমসমিডিং: আমি চাইব না যে আমার কোডের পার্শ্বপ্রতিক্রিয়া হোক, যেমন ব্যবহারকারীর ডিস্কের স্থানটি অপ্রত্যাশিতভাবে গ্রহণ করা ...
দাঙ্গা

3

চুনি

code = DATA.read

# first, we need to replace strings and comments with tilde escapes to avoid parsing them
code.gsub! '~', '~T'
lineComments = []
code.gsub!(/\/\/.*$/) { lineComments.push $&; '~L' }
multilineComments = []
code.gsub!(/\/\*.*?\*\//m) { multilineComments.push $&; '~M' }
strs = []
code.gsub!(/"(\\.|[^"])*"|'.'/) { strs.push $&; '~S' } # character literals are considered strings

# also, chop out preprocessor stuffs
preprocessor = ''
code.gsub!(/(^#.*\n)+/) { preprocessor = $&; '' }

# clean up newlines and excess whitespace
code.gsub! "\n", ' '
code.gsub! /\s+/, ' '
code.gsub!(/[;{}]/) { "#{$&}\n" }
code.gsub!(/[}]/) { "\n#{$&}" }
code.gsub! /^\s*/, ''
code.gsub! /\s+$/, ''

# fix for loops (with semicolons)
code.gsub!(/^for.*\n.*\n.*/) { $&.gsub ";\n", '; ' }

# now it's time for indenting; add indent according to {}
indentedCode = ''
code.each_line { |l|
    indentedCode += ('    ' * [indentedCode.count('{') - indentedCode.count('}') - (l =~ /^\}/ ? 1 : 0), 0].max) + l
}
code = indentedCode

# finally we're adding whitespace for more readability. first get a list of all operators
opsWithEq = '= + - * / % ! > < & | ^ >> <<'
opsNoEq = '++ -- && ||'
ops = opsWithEq.split + opsWithEq.split.map{|o| o + '=' } + opsNoEq.split
ops = ops.sort_by(&:length).reverse
# now whitespace-ize them
code.gsub!(/(.)(#{ops.map{|o| Regexp.escape o }.join '|'})(.)/m) { "#{$1 == ' ' ? ' ' : ($1 + ' ')}#{$2}#{$3 == ' ' ? ' ' : (' ' + $3)}" }

# special-cases: only add whitespace to the right
ops = ','.split
code.gsub!(/(#{ops.map{|o| Regexp.escape o }.join '|'})(.)/m) { "#{$1}#{$2 == ' ' ? ' ' : (' ' + $2)}" }
# special-cases: only add whitespace to the left
ops = '{'.split
code.gsub!(/(.)(#{ops.map{|o| Regexp.escape o }.join '|'})/m) { "#{$1 == ' ' ? ' ' : ($1 + ' ')}#{$2}" }

# replace the tilde escapes and preprocessor stuffs
stri = lci = mci = -1
code.gsub!(/~(.)/) {
    case $1
    when 'T'
        '~'
    when 'S'
        strs[stri += 1]
    when 'L'
        lineComments[lci += 1] + "\n#{code[0, $~.begin(0)].split("\n").last}"
    when 'M'
        multilineComments[mci += 1]
    end
}
code = (preprocessor + "\n" + code).gsub /^ +\n/, ''

puts code
__END__
    /* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */
#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;}

আউটপুট:

#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;
}

@ SztupY এর প্রান্ত কেস ইনপুট জন্য আউটপুট :

#include<stdio.h>
#include<string.h>

/* Hai Worldz. This code is to prevent formatting: if(this_code_is_touched){,then+your*program_"doesn't({work)}correctl"y.} */ 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;
}

এখন পর্যন্ত বৈশিষ্ট্যগুলি:

  • [x] প্রতিটি লাইনের সামনের দিকে যথাযথ ইনডেন্টেশন যুক্ত করুন
  • [x]পরে স্পেস যোগ করুন ,এবং অন্যান্য অপারেটর, যেমন রূপান্তর int a[]={1,2,3};করার int a[] = {1, 2, 3};। স্ট্রিং আক্ষরিক মধ্যে অপারেটরদের প্রক্রিয়া না করার মনে রাখবেন।
  • [x] প্রতিটি লাইনের পরে ট্রেলিং স্পেসগুলি সরান
  • [x]বিবৃতিগুলি কয়েকটি লাইনে বিভক্ত করা, যেমন শিক্ষার্থী লিখতে পারে tmp=a;a=b;b=tmp;বা int f(int n){if(n==1||n==2)return 1;else return f(n-1)+f(n-2);}সমস্ত এক লাইনে লিখতে পারে , আপনি এগুলিকে বিভিন্ন লাইনে আলাদা করতে পারেন। forলুপগুলি সম্পর্কে সচেতন থাকুন তবে সেগুলির মধ্যে সেমিকোলন রয়েছে তবে আমি সত্যিই ভাবি না যে আপনি তাদের বিভক্ত করুন।
  • [ ] প্রতিটি ফাংশন সংজ্ঞায়িত করার পরে একটি নতুন লাইন যুক্ত করুন
  • [ ] আপনি অন্য শিক্ষার্থীদের কোডগুলি বোঝার জন্য সহায়তা নিয়ে আসতে পারেন এমন আরও একটি বৈশিষ্ট্য।

3

এটি পাইথনে লেখা এবং জিএনইউ কোডিং স্ট্যান্ডার্ডের উপর ভিত্তি করে।

এখন পর্যন্ত বৈশিষ্ট্যগুলি:

  • ইনডেন্টিং ব্লক
  • বিভক্ত রেখাগুলি (এমন জিনিসগুলিকে বিভক্ত করতে পারে যা না হওয়া উচিত)
  • GNU- স্টাইল ফাংশন সংজ্ঞা

কোড:

import sys

file_in = sys.argv[1]

# Functions, for, if, while, and switch statements
def func_def(string):
    ret = ["", "", ""]
    func_name = ""
    paren_level = -1
    consume_id = False

    for x in string[::-1]:
        if x == "{":
            ret[2] = "{"
        elif ret[1] == "":
            if x == "(":
                paren_level -= 1
                func_name += x
            elif x == ")":
                paren_level += 1
                func_name += x
            elif paren_level == -1 and x.isspace():
                if consume_id:
                    ret[1] = func_name[::-1]
            elif paren_level == -1:
                consume_id = True
                func_name += x
            else:
                func_name += x
        else:
            # Return Type
            ret[0] += x
    else:
        ret[1] = func_name[::-1]

    ret[0] = ret[0][::-1]

    # Handle the case in which this is just a statement
    if ret[1].split("(")[0].strip() in ["for", "if", "while", "switch"]:
        ret = [ret[1], ret[2]] # Don't print an extra line

    return ret

with open(file_in) as file_obj_in:
    line_len = 0
    buffer = ""
    in_str = False
    no_newline = False
    indent_level = 0
    tab = " " * 4
    no_tab = False
    brace_stack = [-1]

    while True:
        buffer += file_obj_in.read(1)
        if buffer == "":
            break
        elif "\n" in buffer:
            if not no_newline:
                print(("" if no_tab else indent_level * tab) + buffer, end="")
                buffer = ""
                line_len = indent_level * 4
                no_tab = False
                continue
            else:
                buffer = ""
                line_len = indent_level * 4
                no_newline = False
                continue
        elif buffer[-1] == '"':
            in_str = not in_str
        elif buffer.isspace():
            buffer = ""
            continue

        if "){" in "".join(buffer.split()) and not in_str:
            for x in func_def(buffer):
                print(indent_level * tab + x)
            buffer = ""
            line_len = indent_level * 4
            no_newline = True
            indent_level += 1
            brace_stack[0] += 1
            brace_stack.append((brace_stack[0], True))
            continue
        elif buffer[-1] == "}" and not in_str:
            brace_stack[0] -= 1
            if brace_stack[-1][1]: # If we must print newline and indent
                if not buffer == "}":
                    print(indent_level * tab + buffer[:-1].rstrip("\n"))
                indent_level -= 1
                print(indent_level * tab + "}")
                buffer = ""
                line_len = indent_level * 4
            else:
                pass
            brace_stack.pop()
        line_len += 1

        if line_len == 79 and not in_str:
            print(indent_level * tab + buffer)
            buffer = ""
            line_len = indent_level * 4
            continue
        elif line_len == 78 and in_str:
            print(indent_level * tab + buffer + "\\")
            buffer = ""
            line_len = indent_level * 4
            no_tab = True
            continue

উদাহরণ ইনপুট (আর্গুমেন্ট হিসাবে একটি ফাইল নাম পাস):

#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;}

উদাহরণ আউটপুট:

#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;
}

এই হবে বাগ আছে।


0

নেট

ভিজ্যুয়াল স্টুডিও ব্যবহার করে সেই ফাইলটি খুলুন

ইনপুট:

#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;}

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন


2
এটি একটি ভাল ধারণা, তবে চ্যালেঞ্জটি একটি প্রোগ্রামিং প্রতিযোগিতা। আপনি কি এমন কোনও প্রোগ্রাম লিখতে পারেন যা ভিজ্যুয়াল স্টুডিওগুলির সাহায্যে এই ফাইলটি খোলে, তবে এটি সুন্দর মুদ্রণে সংরক্ষণ করে?
জাস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.