मेरे लिए एक सैंडविच बना दो


21

XKCD: सैंडविच

चुनौती: एक मेकफिल लिखें, जो इस व्यवहार को बढ़ावा देगा:

% 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फर्क क्यों पड़ता है।

विजेता का फैसला वोटों से होगा।



@ardnew, दुर्भाग्य से, मैंने विशेष रूप से एक मेकफाइल लिखने का अनुरोध किया, जो मुझे लगता है कि पैचिंग के आधार पर समाधानों को अमान्य करता है make
बदसूरत

पूरी तरह से सहमत, @ugoren। कि टिप्पणी को खारिज करने या समाधान का सुझाव देने के लिए उस टिप्पणी का मतलब नहीं था
ardnew

जवाबों:


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
बदसूरत

&& test -e ./a
लूजर ने

अर्घ, आप सही कह रहे हैं। इस संस्करण को नियमों का पालन करने का बेहतर काम करना चाहिए।
ब्रेडबॉक्स

1
आपके पास निश्चित रूप से सबसे उपयुक्त नाम, @breadbox
ardnew

9

एक काफी कॉम्पैक्ट समाधान जो दिशानिर्देश # 2 (127 वर्ण, कुछ अनावश्यक व्हाट्सएप सहित) को अनदेखा करता है। मैं खुद के बाद सफाई के ब्रेडबॉक्स के अभ्यास का पालन ​​करता हूं। Makefile के रूप में एक ही निर्देशिका में किसी भी अन्य फ़ाइल मत डालो! इसके अलावा, ध्यान दें कि मेकफाइल को बुलाया जाना चाहिए 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 को बहुत गंभीरता से नहीं लिया, सौंदर्यशास्त्र पहले आता है।

याद रखें कि यह एक makefile है; 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. आप देख क्यों 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

मुझे पूरा यकीन है कि और भी बहुत कुछ है जो मैं इसके साथ कर सकता हूं - उदाहरण के लिए अन्य इनपुट कमांड का जवाब देने के लिए इसे प्राप्त करें। मुझे रूट स्विच ऑब्सफैक्शन और वास्तविक सैंडविच मेकिंग पर काम करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.