সংখ্যা রেঞ্জগুলিতে লেটার গ্রেড বরাদ্দ করতে কীভাবে শেল স্ক্রিপ্ট লিখবেন?


19

আমি এমন একটি স্ক্রিপ্ট তৈরি করতে চাই যা আপনাকে 0-100 এর মধ্যে একটি সংখ্যার জন্য অনুরোধ জানায় এবং তারপরে সংখ্যার ভিত্তিতে গ্রেড দেয়।

আমি এটি বাশ চাই।

PS3='Please enter your choice: '
(Something here)

do
case $
    "0-59")
        echo "F"
        ;;
    "60-69")
        echo "D"
        ;;
    "70-79")
        echo "C"
        ;;
    "Quit")
        break
        ;;
    *) echo invalid option;;
esac
done

উত্তর:


20

ব্রেভিটি বনাম পঠনযোগ্যতা: একটি মধ্য গ্রাউন্ড

যেমনটি আপনি দেখেছেন, এই সমস্যাটি এমন সমাধানগুলিকে স্বীকৃতি দেয় যা মাঝারিভাবে দীর্ঘ এবং কিছুটা পুনরাবৃত্তিযোগ্য তবে অত্যন্ত পঠনযোগ্য ( টেরডন এবং এবি এর বাশ উত্তর), সেইসাথে যেগুলি খুব স্বল্প কিন্তু স্বজ্ঞাত এবং অনেক কম স্ব-দলিলকরণ (টিমের অজগর) এবং ব্যাশ উত্তর এবং গ্লেন জ্যাকম্যানের পার্ল উত্তর )। এই সমস্ত পদ্ধতির মূল্যবান।

কমপ্যাক্টনেস এবং পঠনযোগ্যতার মধ্যে ধারাবাহিকতার মাঝখানে আপনি কোড সহ এই সমস্যাটিও সমাধান করতে পারেন। এই পদ্ধতির প্রায় দীর্ঘ সমাধান হিসাবে প্রায় পঠনযোগ্য, ছোট, রহস্য সমাধানের দৈর্ঘ্য কাছাকাছি।

#!/usr/bin/env bash

read -erp 'Enter numeric grade (q to quit): '
case $REPLY in [qQ]) exit;; esac

declare -A cutoffs
cutoffs[F]=59 cutoffs[D]=69 cutoffs[C]=79 cutoffs[B]=89 cutoffs[A]=100

for letter in F D C B A; do
    ((REPLY <= cutoffs[$letter])) && { echo $letter; exit; }
done
echo "Grade out of range."

এই ব্যাশ সমাধানে, পাঠযোগ্যতা বাড়ানোর জন্য আমি কয়েকটি ফাঁকা লাইন অন্তর্ভুক্ত করেছি, তবে আপনি যদি এটি আরও ছোট করতে চান তবে আপনি সেগুলি সরিয়ে ফেলতে পারেন।

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

  • এটি আরও স্বজ্ঞাত।
  • গ্রেডগুলির মধ্যে সীমানা পরিবর্তন করা (বা অতিরিক্ত গ্রেড যুক্ত করা) সহজ।
  • এটি স্বয়ংক্রিয়ভাবে নেতৃস্থানীয় এবং অনুসরণযোগ্য স্পেসগুলির সাথে ইনপুট গ্রহণ করে (কীভাবে (( ))কাজ করে তার একটি ব্যাখ্যার জন্য নীচে দেখুন )।

এই তিনটি সুবিধাই উত্থাপিত হয় কারণ এই পদ্ধতিটি ব্যবহারকারীর ইনপুটটিকে সংবিধানের অঙ্কগুলি ম্যানুয়ালি পরীক্ষার পরিবর্তে সংখ্যাগত ডেটা হিসাবে ব্যবহার করে।

কিভাবে এটা কাজ করে

  1. ব্যবহারকারীর কাছ থেকে ইনপুট পড়ুন। তারা প্রবেশ করানো পাঠ্যে ( -e) প্রবেশ করিয়ে তীরচিহ্নগুলি ব্যবহার করতে দিন এবং \একটি পালানোর চরিত্র হিসাবে ব্যাখ্যা করবেন না ( -r)।
    এই স্ক্রিপ্টটি কোনও বৈশিষ্ট্য সমৃদ্ধ সমাধান নয় - সংশোধন করার জন্য নীচে দেখুন - তবে এই দরকারী বৈশিষ্ট্যগুলি কেবল এটি দুটি অক্ষরকে আরও দীর্ঘায়িত করে। আমি সবসময় ব্যবহার করার প্রস্তাব -rদিয়ে read, যদি না আপনি জানেন আপনি ব্যবহারকারীর সরবরাহ জানানোর প্রয়োজন বোধ করি \পালাতে।
  2. যদি ব্যবহারকারী লিখে থাকেন qবা Q, ছেড়ে দিন।
  3. একটি সহযোগী অ্যারে ( declare -A) তৈরি করুন । প্রতিটি অক্ষরের গ্রেডের সাথে সম্পর্কিত সর্বোচ্চ সংখ্যাসূচক গ্রেডের সাথে এটিকে আস্তরণ করুন।
  4. লেটার গ্রেডগুলি সর্বনিম্ন থেকে সর্বোচ্চে লুপ করুন , ব্যবহারকারী-প্রদত্ত সংখ্যাটি প্রতিটি বর্ণের গ্রেডের সংখ্যার পরিসরে পড়ার মতো যথেষ্ট কম কিনা তা পরীক্ষা করে।
    সঙ্গে (( ))গাণিতিক মূল্যায়ন পরিবর্তনশীল নামের সাথে প্রসারিত করা প্রয়োজন হবে না $। (বেশিরভাগ অন্যান্য পরিস্থিতিতে আপনি যদি তার নামের পরিবর্তে কোনও ভেরিয়েবলের মান ব্যবহার করতে চান তবে আপনাকে এটি করতে হবে ))
  5. এটি যদি সীমার মধ্যে পড়ে তবে গ্রেডটি প্রিন্ট করুন এবং প্রস্থান করুন
    সংক্ষিপ্ততা জন্য, আমি শর্ট সার্কিট ব্যবহার এবং অপারেটর ( &&বরং একটি তুলনায়) if- then
  6. যদি লুপটি শেষ হয়ে যায় এবং কোনও ব্যাপ্তি মিলে না যায় তবে অনুমান করা সংখ্যাটি খুব বেশি (100 এরও বেশি) এবং ব্যবহারকারীকে বলুন যে এটির সীমার বাইরে ছিল।

অদ্ভুত ইনপুট সহ এটি কীভাবে আচরণ করে

পোস্ট করা অন্যান্য সংক্ষিপ্ত সমাধানগুলির মতো , এই স্ক্রিপ্টটি কোনও সংখ্যা অনুমান করার আগে ইনপুটটি পরীক্ষা করে না। পাটিগণিত মূল্যায়ন ( (( ))) স্বয়ংক্রিয়ভাবে সামনের এবং হোয়াইটস্পেস trailing পটির, তাই যে কোন সমস্যা নেই, কিন্তু:

  • যে সংখ্যার মোটেও দেখতে পঠিত নয় এমন ইনপুট 0 হিসাবে ব্যাখ্যা করা হয়।
  • ইনপুট সহ যা সংখ্যার মতো দেখাচ্ছে (যেমন এটি যদি একটি অঙ্ক দিয়ে শুরু হয়) তবে এতে অবৈধ অক্ষর রয়েছে, স্ক্রিপ্টটি ত্রুটিগুলি নির্গত করে।
  • মাল্টি অঙ্ক ইনপুট দিয়ে শুরু 0হয় হচ্ছে হিসেবে ব্যাখ্যা মধ্যে অকট্যাল । উদাহরণস্বরূপ, স্ক্রিপ্টটি আপনাকে 77 ডিগ্রি সেন্টিগ্রেড বলে দেবে, যখন 077 ডি একটি ডি যদিও কিছু ব্যবহারকারী এটি চাইতে পারে তবে সম্ভবত এটি না এবং এটি বিভ্রান্তির কারণ হতে পারে।
  • প্লাস দিকে, যখন একটি গাণিতিক এক্সপ্রেশন দেওয়া হয়, এই স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে এটিকে সরল করে এবং সম্পর্কিত চিঠি গ্রেড নির্ধারণ করে। উদাহরণস্বরূপ, এটি আপনাকে বলবে 320/4 একটি বি।

একটি প্রসারিত, সম্পূর্ণ বৈশিষ্ট্যযুক্ত সংস্করণ

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

#!/usr/bin/env bash
shopt -s extglob

declare -A cutoffs
cutoffs[F]=59 cutoffs[D]=69 cutoffs[C]=79 cutoffs[B]=89 cutoffs[A]=100

while read -erp 'Enter numeric grade (q to quit): '; do
    case $REPLY in  # allow leading/trailing spaces, but not octal (e.g. "03") 
        *( )@([1-9]*([0-9])|+(0))*( )) ;;
        *( )[qQ]?([uU][iI][tT])*( )) exit;;
        *) echo "I don't understand that number."; continue;;
    esac

    for letter in F D C B A; do
        ((REPLY <= cutoffs[$letter])) && { echo $letter; continue 2; }
    done
    echo "Grade out of range."
done

এটি এখনও একটি বেশ কমপ্যাক্ট সমাধান।

এটি কোন বৈশিষ্ট্যগুলি যুক্ত করে?

এই প্রসারিত স্ক্রিপ্টের মূল বিষয়গুলি হ'ল:

  • ইনপুট বৈধতা। টেরডনের স্ক্রিপ্টটি ইনপুটটি চেক করে , তাই আমি অন্য একটি উপায় দেখায়, যা কিছু সংক্ষিপ্ততাকে ত্যাগ করে তবে আরও দৃust় হয় , ব্যবহারকারীকে নেতৃত্বাধীন এবং অনুসরণ করার জায়গাগুলিতে প্রবেশ করতে দেয় এবং অ্যাক্টাল হিসাবে অভিহিত বা নাও হতে পারে এমন অভিব্যক্তিটিকে অনুমতি দিতে অস্বীকার করে (এটি শূন্য না হলে) ।if [[ ! $response =~ ^[0-9]*$ ]] ...
  • আমি ব্যবহার করেছি caseসঙ্গে globbing বর্ধিত পরিবর্তে [[সঙ্গে =~ রেগুলার এক্সপ্রেশন ম্যাচিং (হিসাবে অপারেটর terdon এর উত্তর )। এটি (এবং কীভাবে) এটিও সেইভাবে করা যেতে পারে তা দেখানোর জন্য আমি এটি করেছি। গ্লোবস এবং রিজেক্সপস হ'ল পাঠ্যগুলির সাথে মেলে এমন নিদর্শনগুলি নির্দিষ্ট করার দুটি উপায় এবং এই অ্যাপ্লিকেশনটির জন্য দুটি পদ্ধতিই ভাল।
  • এবি বাশ স্ক্রিপ্টের মতো , আমি পুরো জিনিসটি একটি বাহ্যিক লুপে আবদ্ধ করে রেখেছি ( cutoffsঅ্যারের প্রাথমিক তৈরি ব্যতীত )। এটি সংখ্যার জন্য অনুরোধ করে এবং যতক্ষণ না টার্মিনাল ইনপুট উপলব্ধ থাকে এবং ব্যবহারকারী এটি ছাড়তে বলেনি ততক্ষণ সংশ্লিষ্ট চিঠি গ্রেড দেয়। আপনার প্রশ্নের কোডটির চারপাশে do... বিচার করে doneদেখে মনে হচ্ছে আপনি এটি চান that
  • সহজ প্রস্থান করার জন্য, আমি কোন কেস-অবশ বৈকল্পিক গ্রহণ qবা quit

এই স্ক্রিপ্টটিতে কয়েকটি কনস্ট্রাক্ট ব্যবহার করা হয়েছে যা নবীনদের সাথে অপরিচিত হতে পারে; তারা নীচে বিস্তারিত।

ব্যাখ্যা: ব্যবহার continue

আমি যখন বাইরের whileলুপের বাকী শরীরের উপর দিয়ে যেতে চাই, তখন আমি continueকমান্ডটি ব্যবহার করি । আরও ইনপুট পড়তে এবং অন্য পুনরাবৃত্তি চালানোর জন্য এটি এটিকে আবার লুপের শীর্ষে নিয়ে আসে।

প্রথমবার আমি এটিটি করার পরে, আমি কেবলমাত্র লুপটি আছি বাহ্যিক whileলুপ, সুতরাং আমি continueকোনও যুক্তি ছাড়াই কল করতে পারি । (আমি একটি caseনির্মাণে আছি , তবে এটি breakবা এর কাজকর্মকে প্রভাবিত করে না continue))

        *) echo "I don't understand that number."; continue;;

তবে দ্বিতীয়বার, আমি একটি অভ্যন্তরীণ forলুপে আছি যা নিজেই বাহ্যিক whileলুপের ভিতরে বাসা বাঁধে। যদি আমি continueকোনও যুক্তি না দিয়ে ব্যবহার করি তবে এটি সমতুল্য হবে continue 1এবং forবাইরের whileলুপের পরিবর্তে অভ্যন্তরীণ লুপটি চালিয়ে যাবে ।

        ((REPLY <= cutoffs[$letter])) && { echo $letter; continue 2; }

সুতরাং সেই ক্ষেত্রে আমি continue 2ব্যাশ সন্ধান করতে এবং পরিবর্তে দ্বিতীয় লুপটি চালিয়ে যেতে ব্যবহার করি।

ব্যাখ্যা: caseগ্লোব সহ লেবেল

caseকোন লেটার গ্রেড বিন কোন সংখ্যায় পড়ে তা নির্ধারণ করার জন্য আমি ব্যবহার করি না (যেমন এবি এর বাশ উত্তরে )। তবে caseব্যবহারকারীর ইনপুটটি বিবেচনা করা উচিত কিনা তা সিদ্ধান্ত নিতে আমি ব্যবহার করি :

  • একটি বৈধ সংখ্যা, *( )@([1-9]*([0-9])|+(0))*( )
  • ছাড়ার আদেশ, *( )[qQ]?([uU][iI][tT])*( )
  • অন্য কিছু (এবং এইভাবে অবৈধ ইনপুট), *

এগুলি শেল গ্লোবস

  • প্রত্যেকটি এর পরে একটি )খোলার সাথে মিলে যায় না (যা মিল হয় caseযখন চালানো কমান্ডগুলি থেকে কোনও প্যাটার্নকে আলাদা করার জন্য সিনট্যাক্স।
  • ;;হয় caseএকটি paticular ক্ষেত্রে ম্যাচের জন্য চালানোর জন্য (এবং কোনো পরবর্তী মামলা তাদের চলমান পরে পরীক্ষা করা উচিত) কমান্ড শেষে ইঙ্গিত 's সিনট্যাক্স।

সাধারণ শেল গ্লোব্বিং *শূন্য বা আরও বেশি অক্ষরের ?সাথে মিল রাখতে, ঠিক একটি অক্ষরের সাথে এবং [ ]ব্র্যাকেটে অক্ষরের শ্রেণি / ব্যাপ্তি সরবরাহ করে । তবে আমি বর্ধিত গ্লোব্বিং ব্যবহার করছি , যা এর বাইরে চলে যায়। bashইন্টারেক্টিভভাবে ব্যবহার করার সময় বর্ধিত গ্লোববিং ডিফল্টরূপে সক্ষম হয় তবে স্ক্রিপ্ট চালানোর সময় ডিফল্টরূপে অক্ষম থাকে। shopt -s extglobস্ক্রিপ্ট উপরের কমান্ড এটা চালু করে।

ব্যাখ্যা: বর্ধিত গ্লোব্বিং

*( )@([1-9]*([0-9])|+(0))*( ), যা সংখ্যার ইনপুট জন্য পরীক্ষা করে এটি একটি ক্রমের সাথে মেলে:

  • শূন্য বা আরও বেশি স্থান ( *( ))। *( )কনস্ট্রাক্ট ম্যাচ শূন্য বা বন্ধনীর মধ্যে প্যাটার্ন, শুধু একটি স্থান এখানে যার আরও অনেক কিছু।
    প্রকৃতপক্ষে দুই ধরণের অনুভূমিক সাদা স্থান, স্থান এবং ট্যাব রয়েছে এবং প্রায়শই এটি ট্যাবগুলিও মেলাতে পছন্দনীয়। তবে আমি এখানে এটি নিয়ে উদ্বিগ্ন হচ্ছি না, কারণ এই স্ক্রিপ্টটি ম্যানুয়াল, ইন্টারেক্টিভ ইনপুট এবং জিএনইউ পাঠ্যরেখাকে সক্ষম -eকরার জন্য পতাকাটির জন্য লেখা হয়েছে read। এটি তাই বাম এবং ডান তীরচিহ্নগুলি সহ ব্যবহারকারী তাদের পাঠ্যে পিছনে পিছনে সরে যেতে পারে তবে এটির ট্যাবগুলিকে আক্ষরিকভাবে প্রবেশ করা থেকে বিরত করার পার্শ্ব প্রতিক্রিয়া রয়েছে।
  • @( )উভয়ের ( |) এর একটি ঘটনা ( ):
    • একটি ননজারো ডিজিট ( [1-9]) এর পরে শূন্য বা *( )যেকোন অঙ্কের ( [0-9]) বেশি ( )।
    • এক বা একাধিক ( +( )) 0
  • শূন্য বা আরও বেশি স্পেস ( *( )), আবার।

*( )[qQ]?([uU][iI][tT])*( )প্রস্থান কমান্ডের জন্য যা পরীক্ষা করে এটির একটি অনুক্রমের সাথে মেলে:

  • শূন্য বা আরও বেশি স্থান ( *( ))।
  • qবা Q( [qQ])।
  • Ptionচ্ছিকভাবে - যেমন: শূন্য বা একটি সংঘটন ( ?( )) - এর:
    • uবা U( [uU]) এর পরে iবা I( [iI]) এর পরে tবা T( [tT])
  • শূন্য বা আরও বেশি স্পেস ( *( )), আবার।

বৈকল্পিক: বর্ধিত নিয়মিত এক্সপ্রেশন সহ বৈধকরণ ইনপুট

আপনি যদি শেল গ্লোব না দিয়ে কোনও নিয়মিত অভিব্যক্তির বিরুদ্ধে ব্যবহারকারীর ইনপুট পরীক্ষা করতে পছন্দ করেন তবে আপনি এই সংস্করণটি ব্যবহার করতে পছন্দ করতে পারেন যা একই কাজ করে তবে ব্যবহার করে [[এবং =~( টেরডনের উত্তরের মতো ) পরিবর্তে caseএবং প্রসারিত গ্লোব্বিং।

#!/usr/bin/env bash
shopt -s nocasematch

declare -A cutoffs
cutoffs[F]=59 cutoffs[D]=69 cutoffs[C]=79 cutoffs[B]=89 cutoffs[A]=100

while read -erp 'Enter numeric grade (q to quit): '; do
    # allow leading/trailing spaces, but not octal (e.g., "03")
    if [[ ! $REPLY =~ ^\ *([1-9][0-9]*|0+)\ *$ ]]; then
        [[ $REPLY =~ ^\ *q(uit)?\ *$ ]] && exit
        echo "I don't understand that number."; continue
    fi

    for letter in F D C B A; do
        ((REPLY <= cutoffs[$letter])) && { echo $letter; continue 2; }
    done
    echo "Grade out of range."
done

এই পদ্ধতির সম্ভাব্য সুবিধাগুলি হ'ল:

  • এই বিশেষ ক্ষেত্রে, সিনট্যাক্সটি কিছুটা সহজ, কমপক্ষে দ্বিতীয় প্যাটার্নে যেখানে আমি ছাড়ার আদেশটি পরীক্ষা করি check এর কারণ হল আমি সেট করতে সক্ষম নয় ছিল nocasematchশেল বিকল্প, এবং তারপর সব ক্ষেত্রে রুপভেদ qএবং quitস্বয়ংক্রিয়ভাবে আচ্ছাদনে ঢাকা।

    shopt -s nocasematchকমান্ড এটিই করে। shopt -s extglobকমান্ড globbing এই সংস্করণে ব্যবহার করা হয় না যেমন বাদ দেওয়া হয়।

  • নিয়মিত অভিব্যক্তি দক্ষতা বাশের এক্সটগলবগুলিতে দক্ষতার চেয়ে বেশি সাধারণ।

ব্যাখ্যা: নিয়মিত প্রকাশ

=~অপারেটরের ডানদিকে নির্দিষ্ট নিদর্শনগুলির জন্য , এখানে নিয়মিত প্রকাশগুলি কীভাবে কাজ করে তা এখানে।

^\ *([1-9][0-9]*|0+)\ *$, যা সংখ্যার ইনপুট জন্য পরীক্ষা করে এটি একটি ক্রমের সাথে মেলে:

  • সূচনা - অর্থাৎ, বাম প্রান্ত - রেখার ( ^)।
  • শূন্য বা আরও বেশি ( *প্রয়োগিত পোস্টফিক্স) স্পেস। কোনও স্থানকে সাধারণত \নিয়মিত অভিব্যক্তিতে ছাড়ানো প্রয়োজন হয় না , তবে [[সিনট্যাক্স ত্রুটি রোধ করার জন্য এটি প্রয়োজন ।
  • একটি সাবস্ট্রিং ( ( )) যা এর এক বা অন্য ( |):
    • [1-9][0-9]*: একটি ননজারো ডিজিট ( [1-9]) এর পরে *কোনও অঙ্কের শূন্য বা আরও বেশি ( , প্রয়োগ পোস্টফিক্স) [0-9])
    • 0+: এর এক বা একাধিক ( +, প্রয়োগ পোস্টফিক্স) 0
  • শূন্য বা আরও বেশি স্থান ( \ *), আগের মতো।
  • শেষ - অর্থাৎ ডান প্রান্ত - রেখার ( $)।

caseলেবেলগুলির বিপরীতে যা পুরো এক্সপ্রেশনটির পরীক্ষা করা হচ্ছে তার বিপরীতে মেলে, =~যদি তার বাম-হাতের এক্সপ্রেশনটির কোনও অংশ তার ডান হাতের এক্সপ্রেশন হিসাবে দেওয়া প্যাটার্নটির সাথে মিলে যায় তবে সত্য ফিরে আসে। এই অবস্থা হলো কেন ^এবং $নোঙ্গর, শুরুতে এবং লাইনের শেষে উল্লেখ, এখানে প্রয়োজন হয়, এবং পদ্ধতি প্রদর্শনে কিছু চিহ্নগুলি সিন্টেক্সের মিলা না caseএবং extglobs।

প্রথম বন্ধনী তৈরি করতে প্রয়োজন হয় ^এবং $এর অসম্বন্ধ প্রদানকারীর সাথে যুক্ত হন [1-9][0-9]*এবং 0+। অন্যথায় এটি সংশ্লেষ হবে ^[1-9][0-9]*এবং 0+$, এবং কোনও ননজারো ডিজিট দিয়ে শুরু হওয়া বা কোনও 0(বা উভয়ই, যার মধ্যে এখনও অ-অঙ্কগুলি অন্তর্ভুক্ত থাকতে পারে) দিয়ে শেষ হওয়া কোনও ইনপুট মিলবে ।

^\ *q(uit)?\ *$প্রস্থান কমান্ডের জন্য যা পরীক্ষা করে এটির একটি অনুক্রমের সাথে মেলে:

  • লাইনের সূচনা ( ^)।
  • শূন্য বা আরও বেশি স্থান ( \ *, উপরের ব্যাখ্যাটি দেখুন)।
  • চিঠি q। বা Q, যেহেতু shopt nocasematchসক্ষম রয়েছে।
  • Ptionচ্ছিকভাবে - যেমন শূন্য বা একটি সংঘটন (পোস্টফিক্স ?) - স্ট্রিংয়ের ( ( )):
    • u, তার পরে i, অনুসরণ করে t। বা, যেহেতু shopt nocasematchসক্ষম করা uহতে পারে U; স্বাধীনভাবে, iহতে পারে I; এবং স্বাধীনভাবে, tহতে পারে T। (এটি হ'ল সম্ভাবনাগুলি সীমাবদ্ধ নয়uit এবং UIT))
  • শূন্য বা আরও বেশি স্পেস আবার ( \ *)।
  • লাইনের শেষ ( $)।

3
আমাকে সত্য বলুন .. কতটা সময় লেগেছে? ;)
হিমাইল

4
@ হাইমাইল আমি পুরোপুরি নিশ্চিত নই, যেহেতু আমি এটি সারা দিন অনেকগুলি ছোট্ট অংশে লিখেছিলাম (পোস্টের ঠিক আগে একটি সম্পূর্ণ পঠন-মাধ্যমে এবং সম্পাদনাগুলি)। আমি নিশ্চিত যে এটি শুরু করার আগে আমার যা ভাবা হয়েছিল তার চেয়ে বেশি সময় নিয়ে শেষ হয়েছে, যদিও আমি যদি ভাবছিলাম যে এটি কতটা সময় নিয়ে যাচ্ছে। :)
এলিয়াহ কাগন

6
আরও বেশি করে লিখুন, আপনার উত্তরগুলির একটি বই আমার দরকার।
গ্রিজেশ চৌহান

টিএল; ডিআর কিন্তু যাইহোক আমাকে হাসিয়ে দিয়েছে!
ফাব্বী

শিরোনাম থেকে ব্যাখ্যা পর্যন্ত সবকিছু ভাল good আমি প্রথমে এটি বুঝতে পেরেছিলাম তবে আমি এটি আবার পড়তে পেরেছি কারণ আমি চেয়েছিলাম
সুমিত দেশমুখ

23

আপনার ইতিমধ্যে প্রাথমিক ধারণা আছে। আপনি যদি এটিকে কোড করতে চান bash(এটি একটি যুক্তিসঙ্গত পছন্দ যেহেতু এটি উবুন্টু এবং অন্যান্য লিনাক্সের ডিফল্ট শেল), আপনি ব্যাবহার করতে পারবেন না caseকারণ এটি ব্যাপ্তি বুঝতে পারে না। পরিবর্তে, আপনি if/ else:

#!/usr/bin/env bash

read -p "Please enter your choice: " response

## If the response given did not consist entirely of digits
if [[ ! $response =~ ^[0-9]*$ ]]
then
    ## If it was Quit or quit, exit
    [[ $response =~ [Qq]uit ]] && exit
    ## If it wasn't quit or Quit but wasn't a number either,
    ## print an error message and quit.
    echo "Please enter a number between 0 and 100 or \"quit\" to exit" && exit
fi
## Process the other choices
if [ $response -le 59 ]
then
    echo "F"
elif [ $response -le 69 ]
then
    echo "D"
elif  [ $response -le 79 ]
then
    echo "C"
elif  [ $response -le 89 ]
then
    echo "B"
elif [ $response -le 100 ]
then
    echo "A"
elif [ $response -gt 100 ]
then
    echo "Please enter a number between 0 and 100"
     exit
fi

4
-geআপনি ব্যবহার করছেন যেহেতু সম্ভবত এই পরীক্ষাগুলির একগুচ্ছ হ্রাস করা যেতে পারে elif। আর ভালোবাসা নেই (( $response < X ))?
মুড়ু

2
@ মুরু সত্য, ধন্যবাদ। আমি সংখ্যা রেঞ্জের কথা ভেবে আটকে গিয়েছিলাম কিন্তু এর কোনও কারণ ছিল না। হিসাবে (( $response < X )), নিশ্চিত করুন, কিন্তু আমি এই পরিষ্কার খুঁজে পেতে এবং ও.পি. স্পষ্টত ব্যাশ স্ক্রিপ্টিং কাছে নতুন।
টেরডন

12
#!/bin/bash

while true
do
  read -p "Please enter your choice: " choice

  case "$choice"
   in
      [0-9]|[1-5][0-9])
          echo "F"
          ;;
      6[0-9])
          echo "D"
          ;;
      7[0-9])
          echo "C"
          ;;
      8[0-9])
          echo "B"
          ;;
      9[0-9]|100)
          echo "A"
          ;;
      [Qq])
          exit 0
          ;;
      *) echo "Only numbers between 0..100, q for quit"
          ;;
  esac
done

এবং আরও কমপ্যাক্ট সংস্করণ ( থেক্স @ এলিয়াকাগান ):

#!/usr/bin/env bash

while read -erp 'Enter numeric grade (q to quit): '; do
    case $REPLY in
        [0-9]|[1-5][0-9])   echo F ;;
        6[0-9])             echo D ;;
        7[0-9])             echo C ;;
        8[0-9])             echo B ;;
        9[0-9]|100)         echo A ;;

        [Qq])               exit ;;
        *)                  echo 'Only numbers between 0..100, q for quit' ;;
    esac
done

1
সেগুলি অবশ্যই চরিত্রের ব্যাপ্তি? অর্থাৎ [0-59]0,1,2,3,4,5 বা 9 এবং এর থেকে কোনও চরিত্রের অর্থ। আমি দেখতে পাচ্ছি না যে এটি কীভাবে সংখ্যার মানগুলির জন্য কাজ করতে পারে ।
স্টিল্ড্রাইভার

3
আপনাকে সারাক্ষণ FGITW থাকতে হবে না। আপনাকে সময় দেবে, ভাল উত্তর লিখুন। টেরডন বা এলিয়াহ কাগন কীভাবে কাজ করে তা দেখুন।
মুড়ু

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

9

সমস্ত উবুন্টু ইনস্টলগুলির পাইথন রয়েছে, সুতরাং এখানে পাইথন স্ক্রিপ্টের একটি লাইন রয়েছে। আপনার যদি এটি বাশ হওয়ার দরকার হয় তবে আমি শেল স্ক্রিপ্ট হিসাবে সমতুল্যও লিখেছি

print (chr(75-max(5,int('0'+raw_input('Enter the number: ')[:-1]))))

চালানোর জন্য, এটি একটি ফাইলে সংরক্ষণ করুন (উদাহরণস্বরূপ grade.py) এবং তারপরে এটি দিয়ে টার্মিনালে এটি চালান:

python grade.py

এটি আপনি দেখতে পাবেন:

Enter the number: 65
E

কিভাবে কাজ করে?

  1. ইনপুট নিন - 65
  2. শুরুতে একটি 0 যুক্ত করুন - 065
  3. শেষ চরটি সরান - 06
  4. 75 যে সংখ্যাটি বিয়োগ - 70
  5. কোনও অক্ষরে রূপান্তর করুন (এ 65, বি এর 66) - E
  6. এটি মুদ্রণ - E

আমার সর্বনাম তিনি / তাঁর


আমি আপনার ধারণা পছন্দ। +1
এবি

ব্যবহার করবেন না input(), পরিবর্তে এটি কল করবেন eval(), raw_input()পরিবর্তে ব্যবহার করুন..আপনার গ্রেডিং ঠিক নেই যেমন 90+গ্রেড প্রিন্ট করা হবে B.. ব্যবহার chr(74 - max(4, num))....
হিমাইল

well..your সমাধান সুন্দর এবং পরিবর্তন also..just python2 কাজ করবে input()করার raw_input()python2..thats জন্য এটি ..
heemayl

print chr(75-max(5,int('0'+raw_input('Enter the number: ')[:-1])))
হিমাইল

তারপর আপনি আপনার মূল কোড too..your modifed কোড হিসেবে এটি বর্তমানে দাঁড়িয়েছে ভুল যদিও যেমন পরিবর্তন করতে হবে python3নেই raw_input().. আমি প্রস্তাব raw_input()আপনার প্রারম্ভিক এক জন্য যেমন আপনি ব্যবহার এটি চালানোর জন্য বলেছি python2..
heemayl

6

এখানে আমার আধা- পরীক্ষামূলক বাশ সমাধান, যা 101 টি এন্ট্রি সহ একটি অ্যারেকে জনপ্রিয় করে তোলে এবং তারপরে তাদের বিরুদ্ধে ব্যবহারকারীর ইনপুট চেক করে। এমনকি বাস্তব-বিশ্বের ব্যবহারের জন্যও এটি যুক্তিসঙ্গত - যদি আপনার দুর্দান্ত পারফরম্যান্সের প্রয়োজন হয় তবে আপনি ব্যাশ ব্যবহার করবেন না, এবং একশ (বা আরও) কার্যাদি এখনও দ্রুত fast তবে এটি কোনওভাবে আরও বড় পরিসরে (দশ মিলিয়নের মতো) প্রসারিত হলে যুক্তিসঙ্গত হওয়া বন্ধ হবে।

#!/usr/bin/env bash
p(){ for i in `seq $2 $3`; do g[$i]=$1; done; }
p A 90 100; p B 80 89; p C 70 79; p D 60 69; p F 0 59
while read -r n && [[ ! $n =~ ^[qQ] ]]; do echo ${g[$n]}; done

সুবিধাদি:

  • এটি আসলে তেমন রহস্যময় নয়। যদিও এটি সংক্ষিপ্ত সমাধানগুলির চেয়ে দীর্ঘতর এবং দীর্ঘ সমাধানের মতো স্ব-ডকুমেন্টিং নয় ... এটি যথাযথভাবে স্ব-ডকুমেন্টিং রয়েছে , যদিও এখনও সিদ্ধান্তটি ক্ষুদ্রতম দিকটিতে রয়েছে।
  • এটি গ্রেড রেঞ্জগুলি পরিবর্তন করতে বা গ্রেডগুলি যুক্ত / অপসারণের জন্য সহজ পরিবর্তনের অনুমতি দেয়।
  • এটা একটা লুপ এবং এর দেনা-পাত্তনা মিটান পরিচালনা q, quit, বা কিছু দিয়ে শুরু q/Q
  • ইতিবাচক চিন্তাভাবনা করতে সহায়তা করতে প্রথমে উচ্চতর গ্রেডগুলির তালিকাবদ্ধ করুন। :)
  • হুঁ, এটি কাজ করে, আপনি এটি দেখার পরেও তা বোধগম্য রাখে এবং এর জন্য প্রয়োজনীয় বৈশিষ্ট্যগুলি রয়েছে। আপনি আসলে এটি ব্যবহার করতে পারে!

অসুবিধা:

  • আপনি অ-সংখ্যাসূচক ইনপুট রাখলে এটি আপনাকে এফ দেয় ... তবে এটি আসলে এত খারাপ নয়, তাই না? যদি আপনি একটি নন-নম্বর দেন যেখানে একটি সংখ্যার প্রয়োজন হয়, সম্ভবত আপনি কোনও এফ প্রাপ্য!
  • দ্ব্যর্থক, সম্ভবত অকট্যাল ইনপুট অকট্যাল হিসাবে গণ্য হবে (যেহেতু gএকটি হল এক-মাত্রিক সূচীবদ্ধ অ্যারে )। পুরানো প্রবাদটি যেমন চলে যায়, "এটি কোনও বাগ নয়, এটি একটি বৈশিষ্ট্য!" ভাল হয়ত.
  • সীমার বাইরে থাকা ইনপুট বা কোনও সংখ্যার নয়, খালি লাইনটি মুদ্রণের কারণ ঘটায়। যদিও এর সাথে সত্যিকারের কোনও ভুল নেই: এটি আপনাকে জানায় যে চিঠি গ্রেডটি আপনার ইনপুটটির সাথে কী মিলছে, এবং ভুল ইনপুটটির জন্য একটিও নেই।
  • একটি নেতিবাচক নম্বর দিন, এবং এটি ... ভাল, এটি একটি ইস্টার ডিম বলুন
  • টিমের অজগর সমাধানের তুলনায় এখনও উল্লেখযোগ্যভাবে দীর্ঘ । হ্যাঁ, আমি সত্যিই স্পিন করতে পারছি না যা কোনও সুবিধার মতো মনে হয়।

কিন্ডা শীতল, হাহ? (ঠিক আছে, আমিও তাই মনে করি।)

কিভাবে এটা কাজ করে

  1. pফাংশন পি একটি সংখ্যাসূচকভাবে সূচীবদ্ধ অ্যারে opulates gএর তার দ্বিতীয় তার প্রথম আর্গুমেন্ট ছোটো থেকে Radès, ইনডেক্স এ তৃতীয় যুক্তি দেওয়া (চিঠি) মান সহ।
  2. p প্রতিটি বর্ণের গ্রেডের জন্য এর সংখ্যার পরিসীমা নির্ধারণ করতে বলা হয়।
  3. ব্যবহারকারীর ইনপুট যতক্ষণ না পাওয়া যায় ততক্ষণ পড়া চালিয়ে যান এবং q(বা Q) দিয়ে শুরু হয় না , gঅ্যারেটি পরীক্ষা করে নিন যার জন্য বর্ণের গ্রেডটি প্রবেশ করা সংখ্যার সাথে সামঞ্জস্য করে এবং সেই চিঠিটি মুদ্রণ করে।

এই শর্তযুক্ত সম্পর্কে কি? [[ $n =~ ^(0|[1-9]+[0-9]*)$ ]]
হেলিও

6

পাইথন 2 এ তৈরি করার পরে , আমি এটি ব্যাশে তৈরি করার সিদ্ধান্ত নিয়েছি।

#! /bin/bash

read -p "Enter the number: " i
i=0$i
x=$((10#${i::-1}))
printf "\x$(printf %x $((11-($x>5?$x:5)+64)))\n"

চালানোর জন্য, এটি একটি ফাইলে সংরক্ষণ করুন (উদাহরণস্বরূপ গ্রেড.শ), এটি দিয়ে এক্সিকিউটেবল করুন chmod +x grade.shএবং তারপরে চালান ./grade.sh

এটি আপনি দেখতে পাবেন:

Enter the number: 65
E

কিভাবে কাজ করে?

  1. ইনপুট নিন - 65
  2. শুরুতে একটি 0 যুক্ত করুন - 065(এবং 10#এটি 10 ​​টি বেস করে রাখে)।
  3. শেষ চরটি সরান - 06
  4. 75 যে সংখ্যাটি বিয়োগ - 70
  5. কোনও অক্ষরে রূপান্তর করুন (এ 65, বি এর 66) - E
  6. এটি মুদ্রণ - E

আমার সর্বনাম তিনি / তাঁর


খুব চালাক, খুব ভাল
কোস

@ কোস ধন্যবাদ :) আমি সন্দেহ করি এটি ওপিতে কাজ করবে কারণ তাঁর পরিসীমা সম্ভবত তিনি পোস্ট করেছেন এমন নয়। আমি আশা করি সেগুলি সরলতার জন্য।
টিম

5

এবং এখানে আমার অজানা সংস্করণ:

awk '{
  if($_ <= 100 && $_ >= 0) {
      sub(/^([0-9]|[1-5][0-9])$/, "F", $_);
      sub(/^(6[0-9])$/, "D", $_);
      sub(/^(7[0-9])$/, "C", $_);
      sub(/^(8[0-9])$/, "B", $_);
      sub(/^(9[0-9]|100)$/, "A", $_);
      print
    }
    else {
      print "Only numbers between 0..100"
    }
}' -

বা ওয়ান-লাইনার হিসাবে:

awk '{if($_ <= 100 && $_ >= 0) { sub(/^([0-9]|[1-5][0-9])$/, "F", $_); sub(/^(6[0-9])$/, "D", $_); sub(/^(7[0-9])$/, "C", $_); sub(/^(8[0-9])$/, "B", $_);sub(/^(9[0-9]|100)$/, "A", $_);   print} else { print "Only numbers between 0..100"}}' -

4

এখানে আরও একটি "রহস্যজনক" উত্তর

perl -E '
    print "number: "; 
    $n = <>; 
    say qw/A A B C D E F F F F F/[11-($n+1)/10]
       if $n=~/^\s*\d/ and 0<=$n and $n<=100
'

ব্যাখ্যা

  • perl -E: -Eমত -e, একটি কমান্ড লাইন আর্গুমেন্ট হিসাবে একটি স্ক্রিপ্ট পাস করার অনুমতি দেয়। পার্ল ওয়ান-লাইনার চালানোর এটি একটি উপায়। বিপরীতে -e, -Eসমস্ত optionচ্ছিক বৈশিষ্ট্যগুলিকে সক্ষম করে (যেমন say, যা মূলত printএকটি পিছনের নতুন লাইনের সাথে একটি)
  • print "number: "; : ব্যবহারকারীকে একটি নম্বর লিখতে অনুরোধ করুন।
  • $n = <>;: হিসাবে যে সংখ্যাটি সংরক্ষণ করুন $n

পরের বিটটি কিছুটা ভাঙা দরকার। হোয়াইটস্পেসে qw/string/ব্রেক stringকরে তৈরি করা একটি তালিকা মূল্যায়ন করে । সুতরাং, qw/A A B C D E F F F F F/আসলে এই তালিকা:

0 : A
1 : A
2 : B
3 : C
4 : D
5 : E
6 : F
7 : F
8 : F
9 : F
10 : F

সুতরাং, say qw/A A B C D E F F F F F/[11-($n+1)/10]সমতুল্য

my @F=("A","A","B","C","D","E","F","F","F","F","F");
print "$F[11-($n+1)/10]\n"

এখন, পার্ল অ্যারের শেষ থেকে গণনা করা উপাদানগুলি পুনরুদ্ধার করতে নেতিবাচক সূচকগুলি ব্যবহারের অনুমতি দেয়। উদাহরণস্বরূপ, $arrray[-1]অ্যারের শেষ উপাদানটি মুদ্রণ করবে। তদ্ব্যতীত, ভাসমান পয়েন্ট অ্যারে সূচকগুলি (উদাহরণস্বরূপ 10.7) স্বয়ংক্রিয়ভাবে পরবর্তী নিম্নতর পূর্ণসংখ্যায় (10.7, বা 10.3 বা যা কিছু হয় 10 এ) কেটে নেওয়া হয়)

এই সমস্ত ফলাফল সূচক 11-($n+1)/10সর্বদা অ্যারের উপযুক্ত উপাদান (গ্রেড) যাও মূল্যায়ন।


4
রহস্যজনক উত্তরগুলি সমস্ত দুর্দান্ত, তবে দয়া করে একটি ব্যাখ্যা অন্তর্ভুক্ত করুন।
মুরু

1

আপনি বাশ সমাধানের জন্য জিজ্ঞাসা করলেও আমি অজগরকে মনে করি, এটি একটি স্বল্প উপায়ে মার্জিতভাবে করা যেতে পারে। ভুল ইনপুট এবং 0 থেকে 100 এর মধ্যে একটি সংখ্যার "রূপান্তর" এর ক্ষেত্রে A থেকে F (বা অন্য কোনও) বর্ণগুলিতে উভয় হ্যান্ডলিংয়ের ত্রুটিগুলি Coverেকে রাখা:

#!/usr/bin/env python3
try:
    n = int(input("number: ")); n = n if n>0 else ""
    print("FEDCBA"[[n>=f for f in [50,60,70,80,90,101]].count(True)])
except:
    print("invalid input")

ব্যাখ্যা

  1. প্রথমে আমাদের ব্যবহারকারীর কাছ থেকে নম্বরটি নেওয়া দরকার:

    n = int(input("number: "))
  2. আমরা এই সংখ্যাটি বেশ কয়েকটি শর্তের জন্য বৈধ হওয়ার জন্য পরীক্ষা করি:

    n>=50, n>=60, n>=70, n>=80, n>=90

    এই পরীক্ষার প্রতিটি জন্য, ফলাফল হয় হয় Falseবা হয় True। অতএব (কোডটি কিছুটা সংক্ষেপ করে):

    [n>=f for f in [50,60,70,80,90]].count(True)]

    থেকে একটি চিত্র উত্পাদন করা হবে 0থেকে5

  3. এরপরে, আমরা এই চিত্রটি স্ট্রিংয়ের সূচক হিসাবে ব্যবহার করতে পারি , আউটপুট হিসাবে একটি অক্ষর তৈরি করতে

    "ABCDEF"[3] 

    "D" আউটপুট দেবে (যেহেতু প্রথম অক্ষর = "এ")

  4. 101তালিকার অতিরিক্তটি হ'ল সংখ্যাকে অতিক্রম করার ক্ষেত্রে একটি ত্রুটি উত্পন্ন করা (সূচি-) 100, যেহেতু "ABCDEF"[6]এটি বিদ্যমান নেই। একই ক্ষেত্রে হয় n = n if n>=0 else "", যা 0 এর নিচে একটি সংখ্যা প্রবেশ করানো হলে একটি (মান-) ত্রুটি তৈরি করবে
    , সেই সাথে যদি ইনপুটটি কোনও চিত্র না হয় তবে ফলাফলটি হবে:

    invalid input

পরীক্ষাগুলো:

number: 10
F

number: 50
E

number: 60
D

number: 70
C

number: 80
B

number: 90
A

number: 110
invalid input

number: -10
invalid input

number: Monkey
invalid input
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.