একটি স্যান্ডউইচ তৈরী করে দেও


21

এক্সকেসিডি: স্যান্ডউইচ

চ্যালেঞ্জ: একটি Makefile লিখুন, যা এই আচরণের দিকে পরিচালিত করবে:

% make me a sandwich
What? Make it yourself
% sudo make me a sandwich
Okay

নিয়মাবলী:

  1. লিনাক্স মেশিনে কাজ করা উচিত, যেখানে ব্যবহারকারী রুট নয় তবে ব্যবহারের অনুমতি দেয় sudo
  2. Okayকোনও সংক্ষিপ্ত মেক কমান্ডকে বলা উচিত নয় (উদাঃ sudo make sandwich)।
  3. দ্বিতীয় কমান্ডের কারণে কাজ করা উচিত sudo, এটি নয় যে এটি দ্বিতীয় অনুরোধ।

নির্দেশিকা:

  1. এটি সংক্ষিপ্ত রাখুন (সর্বোপরি, এটি একটি কোড গল্ফ সাইট)।
  2. এটি যদি সত্যিই একটি স্যান্ডউইচ তৈরি করে তবে খুব ভাল।
  3. কেন sudoপার্থক্য তৈরি করে চালাকি করে লুকানোর চেষ্টা করুন ।

বিজয়ী ভোট দ্বারা সিদ্ধান্ত নেওয়া হবে।



@ আর্নডিউ, দুর্ভাগ্যক্রমে, আমি বিশেষত একটি মেকফিল লেখার জন্য অনুরোধ করেছি, যা আমি মনে করি, প্যাচিংয়ের ভিত্তিতে সমাধানগুলি বাতিল করে দেয় make
উগোরেন

সম্পূর্ণরূপে একমত, @ ইউগোরেন। এই মন্তব্যটির অর্থ চ্যালেঞ্জটি বরখাস্ত করার বা কোনও সমাধানের পরামর্শ দেওয়ার জন্য নয়
আর্দনিউ

উত্তর:


12

ঠিক আছে, আমি কামড় দেব। এটি অগত্যা নির্দেশিকা # 3 মেনে চলবে না, তবে এটি অন্য দুটি নির্দেশিকাতে একটি সুষ্ঠু কাজ করে। এটি নিজের পরেও পরিষ্কার হয়ে যায়, যেমন কোনও ভাল স্যান্ডউইচ-প্রস্তুতকারকের উচিত।

.SILENT:

%:%.c
        $(CC) -o $@ $^ && rm -f $^

default:
        echo 'The makings for a sandwich are here.'

a.c:
        echo '#include <stdio.h>' > a.c
        echo 'int main() {' >> a.c
        echo '  char *txt[] = { "What? Make it yourself.", "Okay." };' >> a.c
        echo '  int n = 0;' >> a.c
        echo '  while (getchar() != EOF) n ^= 1;' >> a.c
        echo '  puts(txt[n]); return 0; }' >> a.c

me.c:
        echo '#include <stdio.h>' > me.c
        echo '#include <unistd.h>' >> me.c
        echo 'int main() {' >> me.c
        echo '  char *txt[] = { "/dev/null", "sandwich" };' >> me.c
        echo '  puts(txt[!getuid()]); return 0; }' >> me.c

sandwich:
        ./me | ./a | tee `./me`
        rm -f me a

clean:
        rm -f sandwich

(আমার প্রথম জমা দেওয়ার চেয়ে কম বগি এবং আশা করি কিছুটা কম বিরক্তিকর)


দেখে মনে হচ্ছে এটি নিয়ম # 2 লঙ্ঘন করে - sudo make me sandwich
উগোরেন


আরগ, আপনি ঠিক বলেছেন। এই সংস্করণটি নিয়মগুলি পর্যবেক্ষণের জন্য আরও ভাল কাজ করা উচিত।
ব্রেডবক্স

1
আপনার অবশ্যই অবশ্যই সবচেয়ে উপযুক্ত নাম, @ ব্র্যাডবক্স
আর্দনেউ হয়েছে

9

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

me: ; echo echo Okay >$@
a: ; chmod u=x me
sandwich: ; ./me 2>/dev/null || echo 'What? Make it yourself'; rm -f [!M]*
.SILENT:

ব্যবহার:

$ make me a sandwich
What? Make it yourself
$ sudo make me a sandwich
Okay
$ sudo make me sandwich  
What? Make it yourself
$ sudo make a sandwich
chmod: cannot access `me': No such file or directory
make: *** [a] Error 1
$ sudo make sandwich  
What? Make it yourself

এটি যেভাবে গাইডলাইন # 3 এর সাথে আচরণ করে আমি পছন্দ করি। মাত্র একটি প্রেস Shiftপার্থক্য করে।


3

এই সমাধানটি গাইডলাইন # 2 অনুসরণ করে না - বা অস্পষ্টভাবে স্যান্ডউইচ-আকারের গণনা হচ্ছে? আমি শুরুতে এক ধরণের প্যালিনড্রোম থিমে গিয়েছিলাম, তবে আমি কেবল পঙ্গু অবস্থায় অবলম্বন না করে লাইনগুলিকে প্রতিসাম্য তৈরি করার অনেকগুলি উপায় খুঁজে পেতে পারি real code # ecod laer। আমি গাইডলাইন # 1টিকে খুব গুরুত্ব সহকারে নিই না, নান্দনিকতা প্রথমে আসে।

মনে রাখবেন এটি একটি মেকফাইল; 3 ধারাবাহিক লাইন দিয়ে শুরু if, rmএবং echoএকটি ট্যাব দিয়ে শুরু। অন্যান্য ইন্ডেন্টেড লাইনগুলি স্পেস দিয়ে শুরু হয়।

me : mr ; env | grep -q DO_US || rm -- mr || SU_OD q- perg | vne ; rm : em
                            .SILENT:##:TNELIS.
                              . = a.  .a = .
$(.:.=):;:>$@
sandwich:
    if expr>/dev/null $$(id -u); then echo 'What? Make it yourself'; fi
    rm f- a me mr 2>/dev/null
    echo Okay
mr : ; true : ; touch me : em f- mr || rm -f me : em hcuot ; : eurt ; : rm

ব্যবহার (আদেশগুলি যে কোনও আদেশে জারি করা যেতে পারে):

$ sudo make me a sandwich     
Okay
$ sudo make me sandwich  
make: *** [sandwich] Error 1
$ sudo make a sandwich 
make: *** [sandwich] Error 1
$ sudo make sandwich  
make: *** [sandwich] Error 1
$ make me a sandwich
What? Make it yourself
make: *** [sandwich] Error 1

গাইডলাইন # 3 হিসাবে, এটি চতুরভাবে গোপন করা হয়নি, কিছুটা অদ্ভুতভাবে। কিছু ইঙ্গিত:

দুটি পৃথক পরীক্ষা রয়েছে: একটি অনুসন্ধান SUDO_USERএবং id -uপ্রিন্ট 0 এর একটি পরীক্ষা 0 আপনি দেখতে পাচ্ছেন কেন মূলের জন্য মুদ্রিত What?হয় না ? আপনি কিভাবে অভাব কি SUDO_USERকারণ Okayনা ছাপা হবে?


2

আলাদা এবং সরল কৌশলটি ব্যবহার করে এখানে প্রথমে যাচ্ছি:

.SILENT:

reset_command:
    @rm -f command

me a sandwich: reset_command
    @echo $@ >> command
    -@make `cat command | tr "\n" "_"` 2>/dev/null

me_a_sandwich_: reset_command
    @if [ `whoami` == "root" ]; then echo "Okay"; else echo "What? Make it yourself."; fi

আমি নিশ্চিত যে আমি এর সাথে আরও অনেক কিছু করতে পারি - উদাহরণস্বরূপ অন্যান্য ইনপুট কমান্ডগুলিতে প্রতিক্রিয়া জানাতে এটি পান। আমাকে রুট সুইচ অবলম্বন এবং আসল স্যান্ডউইচ তৈরির কাজ করতে হবে।

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