N% 12 की गणना करें


27

एक अहस्ताक्षरित 32 बिट पूर्णांक के लिए nmodulo की गणना करें 12

नियम:

  • सभी के nबीच 0 और 23 के लिए काम करना चाहिए । अन्य नंबर वैकल्पिक।
  • केवल किसी भी ऑपरेटर का उपयोग करना चाहिए +-*, ~&^|या <<, >>जैसा कि आमतौर पर 32 बिट संकेतों पर परिभाषित किया गया है।
  • निरंतर संकेतों की मनमानी संख्या का उपयोग कर सकते हैं।
  • किसी भी प्रकार के बिंदुओं का उपयोग नहीं कर सकते हैं, जिसमें सरणियाँ, या कोई भी ifकथन शामिल है, जिसमें ऐसी बातें शामिल हैं जो संकलित करती हैं जैसे कि टर्नरी ऑपरेटर या "ऑपरेटर से अधिक"।

स्कोरिंग:

  • ऑपरेटर्स + -और बिटवाइज़ ऑपरेटर्स ~ & ^ | << >>(नहीं, और, एक्सओआर, या, बिट शिफ्ट्स) का स्कोर देते हैं 1, *एक स्कोर देते हैं 2
  • सबसे कम कुल स्कोर जीतता है।

6
आप सी / जावा के अलावा अन्य भाषाओं के उपयोगकर्ताओं के लिए ऑपरेटरों को परिभाषित करना चाह सकते हैं। मैं समझता हूं कि +-*जोड़ना, घटाना, गुणा करना; ~&^|बिट वाइज नहीं, और, XOR, OR; और << >>बिटशिफ्ट हैं।
लेवल रिवर सेंट

@steveverrill - धन्यवाद। यही वास्तव में इरादा है।
nbubis

क्या मैं उपयोग कर सकता हूं for i in x:y:z, .dostuff?
Οurous

क्या मैं एक अभिव्यक्ति में उपयोग करने के लिए एक मूल्य के बराबर चर सेट कर सकता हूं?
xnor

4
अधिकांश संकलक n % 12एक गुणन और हैकर की खुशी की तरह एक बदलाव का अनुकूलन करेंगे , इसलिए यह तुच्छ है, बस विधानसभा का उत्पादन और देखें
phuclv

जवाबों:


29

4

(भाषा अप्रासंगिक है)

n-((48&(11-n))>>2)

वू! ४ को मिला।

11-n यह सुनिश्चित करेगा कि सभी उच्च क्रम बिट्स सेट हैं अगर और केवल अगर n> = 12।

48&(11-n) == यदि n> 11 तो 48 और 0

(48&(11-n))>>2 == यदि n> 11 तो 12 और 0

n-((48&(11-n))>>2) जवाब है


1
आह, आप इस दृष्टिकोण के लिए मुझे हरा! मैं पोस्टिंग से कुछ ही पल दूर था n - (((11 - n) & 0xC0000000) >> 28)। अच्छा किया, मुझे नहीं लगता कि यह चार से कम में किया जा सकता है।
रनर ११

1
@ Runner112 हाँ, मैं उम्मीद कर रहा था कि कोई भी इसे मुझे नहीं हराएगा क्योंकि मैंने इसे पोस्ट किया था। अच्छी तरह से इसे अपने लिए खोजने पर किया जाता है, हालांकि
isaacg

1
बहुत बढ़िया :) 4 वास्तव में एक उपलब्धि है।
nbubis

11

4

लुकअप टेबल के साथ एक समाधान (यह दिखता है i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

यहां 4 ऑपरेशन के साथ एक और समाधान दिया गया है:

i - ((0xffff >> (i - 12)) & 12)

यह मानता है कि बिटशिफ्ट्स के गिनती के संचालन को अनुमानित रूप से 32 mod लिया जाता है, अर्थात x >> -1जैसा होता है x >> 31

5

लुकअप तालिका का उपयोग करते हुए एक और दृष्टिकोण:

i - (16773120 >> i & 1) * 12

7

बैश - १

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

जैसे

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
यह मान्य नहीं है क्योंकि यह पॉइंटर्स का उपयोग करता है।
जिज्ञासु ने २१'१४ को ४:४४

@curiousdannii आप किस संकेत की बात कर रहे हैं? stdinऔर stdoutधाराओं? बेशक, आंतरिक रूप से, वे संकेत हैं, लेकिन तब हम जावा को अयोग्य घोषित कर सकते हैं क्योंकि यह Integerबहुत सी चीजों के लिए आंतरिक रूप से वर्ग का उपयोग करता है ।
कोल जॉनसन

$ () प्रभावी रूप से एक सूचक के बराबर नहीं है?
जिज्ञासु ने

@curiousdannii - awk प्रलेखन कहते हैं कि वे अंतर्निर्मित चर हैं।

5

सी, थोड़ा-एंडियन - 2

यह शायद धोखा है लेकिन मुझे लगता है कि यह नियमों को संतुष्ट करता है ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

यह कैसे काम करता है?
nbubis

1
Sorta चीटिंग, चूंकि आप = 0 इसके बजाय उपयोग कर रहे हैं & 0x0, जिसे अतिरिक्त 2 ऑपरेशन के रूप में गिना जाना चाहिए। लेकिन रचनात्मकता के लिए +1 :)
nbubis

4

PHP - स्कोर 0

मुझे आश्चर्य है कि यह कैसे संभव है कि कोई भी मेरे साथ पहले नहीं आया !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
अच्छा लगा। मुझे लगता है कि कोई समस्या हो सकती है, क्योंकि सरणियाँ अस्वीकृत हैं। हालांकि वास्तव में अच्छा है।
AJMansfield

@AJMansfield एक तर्क दे सकता है कि इसमें सरणियाँ नहीं हैं लेकिन तार (हाँ, निम्न स्तर के तार बाइट सरणियाँ हैं)। :)
देखिए

1
@ असीम यह भी तर्क दे सकता है कि यह अमान्य है क्योंकि यह रैम का उपयोग करता है (हाँ, निम्न स्तर पर, राम तकनीकी रूप से अनुक्रमित सरणी है) (_ (ツ) _ / Str
स्टेन स्ट्रम

2

सी, स्कोर 5

23 से ऊपर काम करता है, इससे ऊपर की गारंटी नहीं है।

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4n> = 12 के लिए 4 रिटर्न देता है। इसे n में जोड़ें और आप कम से कम 4 महत्वपूर्ण बिट्स में सही उत्तर प्राप्त करें, फिर अन्य बिट्स को काटें।


बहुत बढ़िया!! अब देखते हैं कि किसी को 4 मिल सकता है ..
nbubis

2

जो भी भाषा: ५

जीतने के लिए नहीं जा रहा है, लेकिन मज़ा और शायद इसलिए भाग लेना क्योंकि यह समझना आसान है तो दूसरों:

n - ((n+20)>>5)*12

इसके बराबर है

n - (n>11)*12

यह समतुल्य है क्योंकि जब आप 20 से 12 जोड़ते हैं, तो आप 32 प्राप्त करते हैं, इस प्रकार 5 बिट बन जाता है। यह केवल तभी होता है जब n> 1 32 के रूप में सबसे छोटी संख्या होती है, जहां 5 बिट 1 हो जाता है।

यह भी ध्यान दें कि उच्च श्रेणी के लिए आसानी से विस्तार योग्य है, जैसा कि आप कर सकते हैं

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

35 तक एक सीमा तक पहुँचने के लिए


1

पायथन 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

है =एक ऑपरेटर?

उस स्थिति में स्कोर 6 है।

j-12*(j*357913942>>32)

BTW @steveverrill का समाधान सीधे पायथन में भी इस्तेमाल किया जा सकता है।

सीमा 0 के लिए काम करता है .. 23

तो क्या चल रहा है ? 357913942 से गुणा करें और 2 ^ 32 (या राइट शिफ्ट 32) से विभाजित करें


मुझे पसंद है कि आपने केवल एक बार गुणा करने के लिए एक फ़ंक्शन का उपयोग कैसे किया। लेकिन imho आपने केवल नाम m (()) के लिए गुणा का नाम बदल दिया, जो मेरे लिए इसका मतलब है कि आपने इसे दो बार उपयोग किया है।
पिन्ना_बे

निर्भर करता है कि नियमों की व्याख्या कैसे की जाती है, लेकिन आपके पास एक वैध बिंदु है
विलेम

1

सी - 6

(n - (((n * 0xAAAB) >> 19)) * 12 )

यह या तो सवाल का हिस्सा होना चाहिए या सिर्फ एक और जवाब होना चाहिए। मैं बाद का सुझाव देता हूं।
जॉस्टी

@ जॉस्टी - बदल गया।
nbubis

0

कोबरा - 2 (या 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

यह नियमों को थोड़ा झुका सकता है, लेकिन मैंने पूछा है और इसका उपयोग करने की अनुमति दी गई है।

यह किसी भी संख्या के लिए भी काम करता है।


0

कोना - 5

अवैध हो सकता है क्योंकि मुझे यकीन नहीं है कि मंजिल ऑपरेटर की अनुमति है, लेकिन मुझे दो *और एक ऋण मिला है :

mod:{x-(_0.08333*x)*12}

जो किसी भी पूर्णांक के लिए काम करना चाहिए।


मैं फ़्लोर ऑपरेशन के बारे में निश्चित नहीं हूं, लेकिन मुझे यकीन है कि पहला गुणा 32-बिट पूर्णांक के अलावा किसी अन्य चीज़ पर काम कर रहा है।
रनर १११

@ Runer112: ओपी का कहना है कि इनपुट 32 बिट होना चाहिए और ऑपरेटरों को परिभाषित किया जाता है क्योंकि वे सामान्य रूप से 32 बिट के साथ होते हैं; यह कोड में गैर-पूर्णांक मानों के बारे में कुछ नहीं कहता है।
काइल कानोस

जब तक मैं कुछ गलत समझ रहा हूँ, ०.०33३३३ * x ३२-बिट uints पर परिभाषित गुणन की तरह प्रतीत नहीं होता है, क्योंकि ०.० not३३३ एक ३२-बिट uint नहीं है।
Runer112

1
"निरंतर संकेतों की मनमानी संख्या का उपयोग कर सकते हैं।" - यानी मनमाने ढंग से तैरने का उपयोग नहीं कर सकते।
nbubis

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