निर्धारित करें कि एक पूर्णांक 3 से विभाज्य है


20

अपने लक्ष्य निर्धारित करने के लिए एक नंबर 3 से विभाज्य है अगर सशर्त, का उपयोग किए बिना है। इनपुट से 0 255 से रचनात्मकता को प्रोत्साहित किया एक अहस्ताक्षरित 8 बिट संख्या हो जाएगा!

आपको केवल उपयोग करने की अनुमति है

  • समानता / असमानता ( ==, !=, >, <, >=, <=)

  • अंकगणित ( +, -, x)

  • लॉजिकल ऑपरेटर्स ( !नहीं, &&और, || या)

  • बिटवाइज़ ऑपरेटर्स ( ~नहीं, &और, |या, ^XOR, <<, >>, >>>गणित और तार्किक छोड़ दिया और सही बदलाव)

  • स्थिरांक (यह बेहतर होगा यदि आप इन छोटे को रखे)

  • परिवर्तनशील कार्य

0अगर गलत है तो आउटपुट 1

मानक परमाणु कोड-गोल्फ नियम लागू होते हैं। यदि आपके कोई प्रश्न हैं, तो कृपया उन्हें टिप्पणियों में छोड़ दें। उदाहरण के तरीके यहाँ । एक टोकन स्थिरांक और चर को छोड़कर उपरोक्त में से किसी है।


@GregHewgill मेरे टाइपो, यह 8 बिट संख्या होनी चाहिए।
qwr

2
क्या हमें केवल उपरोक्त ऑपरेटरों का उपयोग करने की अनुमति है? अन्यथा, मोडुलो इस तरह से बहुत आसान बना देगा।
जोस्टी

इसके अलावा, टेबल लुकअप के बारे में कैसे?
ग्रेग हेविल जिल

3
क्या आप बिना किसी शर्त के स्पष्ट कर सकते हैं? क्या यह IF स्टेटमेंट तक सीमित है, या यह लूप जैसी चीजों पर भी लागू होता है?
रुसलान

1
@Ruslan आपको केवल उपरोक्त का उपयोग करने की अनुमति है।
क्वीर

जवाबों:


31

सी - 2 टोकन

int div3(int x) {
    return x * 0xAAAAAAAB <= x;
}

2 अप करने के लिए काम करने के लिए लगता है 31 -1।

करने के लिए क्रेडिट zalgo("nhahtdh")गुणक उलटा विचार के लिए।


1
+1। कैसे <=काम करता है पर थोड़ा चकित था , और याद किया कि 0xAAAAAAAB unsigned intटाइप किया जाता है, इस प्रकार गुणा का परिणाम अहस्ताक्षरित है।
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@DigitalTrauma असमानता ऑपरेटरों को प्रतिबंधित किया जाता है, न कि प्रतिबंधित
aditsu

@aditsu ऊप्स! मैं और अधिक ध्यान से कभी कभी पढ़ने की जरूरत है! +1 महान जवाब!
डिजिटल ट्रामा

@aditsu, क्षमा करें मैं noob हूँ, यह वास्तव में कैसे काम करता है?
Kartik_Koro

2
@Kartik_Koro 0xAAAAAAAB * 3 == 1 अतिप्रवाह के कारण, इसलिए किसी भी int x, x * 0xAAAAAAAB * 3 == x के लिए। इसके अलावा y * 3 अलग y के लिए अलग-अलग मान है, इसलिए y = x * 0xAAAAAAAB होना चाहिए केवल y ऐसी है कि y * 3 == एक्स। यदि x 3 का गुणक है, तो y को x / 3 होना चाहिए, अन्यथा इसे अतिप्रवाह के माध्यम से काम करना होगा। जांच करने के लिए एक आसान तरीका एक्स के साथ y तुलना करने के लिए है। यह भी देखें en.wikipedia.org/wiki/Modular_multiplicative_inverse
aditsu

17

अजगर, 3 2 टोकन

जानवर बल समाधान है, लेकिन यह काम करता है।

0x9249249249249249249249249249249249249249249249249249249249249249>>x&1

1 टोकन कम करने के लिए हावर्ड के लिए धन्यवाद।


वाह! आपका समाधान शायद कम से कम (3 टोकन) है, लेकिन मैं अन्य उत्तर भी प्रोत्साहित करने के लिए चाहते हैं।
qwr

11
यहां तक कि एक 2 टोकन समाधान है: 0x9......>>x&1
हॉवर्ड

6

सी - 5 (?) 4 टोकन

int div3_m2(uint32_t n) {
    return n == 3 * (n * 0xAAAAAAABull >> 33);
}

के लिए काम करता है किसी भी अहस्ताक्षरित 32-बिट संख्या

इस कोड बनाता गुणक उलटा सापेक्ष 2 का उपयोग 32 गुणा आपरेशन में परिवर्तित विभाजन आपरेशन करने के लिए एक भाजक की।

संपादित करें

मेरे समाधान (2 मिनट बाद पोस्ट) में एडिट्स के समाधान के समान भावना है। उस के उपयोग के लिए उसे श्रेय ==1 टोकन द्वारा मेरे समाधान में सुधार करता है।

संदर्भ


1
यह अविश्वसनीय है। मैं प्रसिद्ध व्युत्क्रम स्कवॉयर ट्रिक से जादू की संख्याओं के बारे में जानता था, लेकिन मुझे नहीं पता था कि इसका उपयोग एक मनमाने ढंग से विभाजक के लिए किया जा सकता है। यह है Bull: P
qwr

हां, 0xAAAAAAAB = (2 ^ 33 + 1) / 3 और 171 = (2 ^ 9 + 1) / 3। मैंने सबसे छोटा निरंतर उठाया जो चाल करता है। हम्म, वास्तव में यह भी 86 के साथ काम करने लगता है = (2 ^ 8 + 2) / 3
aditsu

चूहे, यहां तक कि 43 = (2 ^ 7 + 1) / 3 काम करता है, यकीन नहीं मैं इसे कैसे याद किया। अब संपादित किया गया।
ad16

4

सी - 15 (?) टोकन

int div3_m1(unsigned int n) {
    n = (n & 0xf) + (n >> 4);
    n = (n & 0x3) + (n >> 2);
    n = (n & 0x3) + (n >> 2);
    return n == 0 || n == 3;
}

4 n 1 (mod 3) के बाद से, हमारे पास 4 n mod 1 (mod 3) है। अंकों जोड़ने पर शासन अंक संक्षेप तक सीमित नहीं है, लेकिन यह भी हमें मनमाने ढंग से अंक के दृश्यों में नंबर तोड़ने के लिए और उन सभी को योग करते हुए सर्वांगसमता बनाए रखने के लिए अनुमति देता है।

आधार 10, भाजक = 9 में एक उदाहरण

1234 ≡ 12 + 34 ≡ 1 + 2 + 3 + 4 ≡ 123 4 ≡ 1 (आधुनिक 9)

कार्यक्रम बनाता है में सभी बयान इस संपत्ति के लिए उपयोग करें। यह वास्तव में एक पाश कि बयान चलाता है करने के लिए सरल किया जा सकता n = (n & 0x3) + (n >> 2);जब तक n < 4, के बाद से बयान बस कम से कम महत्वपूर्ण अंकों पर आधार -4 में नंबर टूट जाता है और 2 भागों को जोड़ने।


+1: दिलचस्प है 512 अप करने के लिए N के लिए इस काम करता है (वास्तव में एन = 590), लेकिन मैं काफी यकीन है कि क्यों नहीं कर रहा हूँ।
पॉल आर

@PaulR: यह नहीं होगा (ध्यान दें कि मैं गणना में इसके प्रयोग किया जाता) कैरी की वजह से बड़ा संख्या के लिए काम करते हैं। इसके अलावा बार-बार लाइनों पर ध्यान दें।
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

हाँ, मैं सिर्फ यह सुनिश्चित कारण है कि यह 9 बिट मूल्यों के लिए काम करता है, क्योंकि यह केवल 8 बिट का परीक्षण किया जा रहा है नहीं कर रहा हूँ?
पॉल आर

9-बिट संख्या के लिए पहले जोड़ के बाद यह सबसे अधिक 5 बिट्स हो जाता है, पहले n = (n & 0x3) + (n >> 2);परिणाम के बाद 3 बिट्स तक कम हो जाता है और पुनरावृत्ति के कारण यह केवल 2 बिट्स stackoverflow.com/a/3421654/995714
phuclum

1
ओह मैं एक गलती की है। एक 5-बिट संख्या एक 4 बिट संख्या + एक 6-बिट संख्या हो सकती है। लेकिन अगर n <= 588 शीर्ष 4 बिट्स और कहा कि 6-बिट संख्या के नीचे 2 बिट्स जोड़ने में कोई केवल 4 बिट राशि का उत्पादन। फिर एक 2-बिट संख्या में है कि परिणाम को जोड़ने। अंतिम योग में 3 बिट्स में 589 और 590 परिणाम, लेकिन संयोग से वे 3 से विभाज्य नहीं हैं, इसलिए परिणाम सही है
phuclv

2

अजगर (2 टोकन?)

1&66166908135609254527754848576393090201868562666080322308261476575950359794249L>>x

या

1&0x9249249249249249249249249249249249249249249249249249249249249249L>>x

या

1&0b1001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001>>x

2
हॉवर्ड की टिप्पणी का डुप्लीकेट
aditsu

@aditsu ... महान दिमाग एक जैसा लगता है? मैं कसम खाता हूं कि मैंने यह पोस्ट करने से पहले नहीं देखा था।
atı

2

जावास्क्रिप्ट - 3 टोकन

function div3(n) {
    var a = n * 0.3333333333333333;
    return (a | 0) == a;
}

यह गाली तथ्य यह है कि एक नंबर पर बिटवाइज़ ऑपरेटर्स का उपयोग कर जावास्क्रिप्ट में एक पूर्णांक के लिए यह ट्रंकेटस।


: 4 टोकन होना चाहिए =, *, |,==
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1
मुझे नहीं लगता कि चर असाइनमेंट टोकन के रूप में मायने रखता है।
टिलो

1

सी - 4 टोकन

int div3(int x) {
    return ((x * 43) >> 7) * 3 == x;
}

383 तक काम करता है।

पिछला संस्करण (बड़े स्थिरांक):

int div3(int x) {
    return ((x * 171) >> 9) * 3 == x;
}

1535 तक काम करता है


1

दे घुमा के - ???

निश्चित नहीं है कि यह कैसे स्कोर किया जाए।

seq 0 85 | awk '{print $1 * 3}' | grep -w [number] | wc -l

जैसे

$ seq 0 85 | awk '{print $1 * 3}' | grep -w 11 | wc -l
0

$ seq 0 85 | awk '{print $1 * 3}' | grep -w 12 | wc -l
1

$seq 0 85 | awk '{print $1 * 3}' | grep -w 254 | wc -l
0

$seq 0 85 | awk '{print $1 * 3}' | grep -w 255 | wc -l
1

1

Befunge 93 - 5 टोकन

निश्चित - विभाजन हटा दिया गया।

v      @._1.@
         \   
         0   
         +   
         3   
>&>3-:0\`|   
  ^      <   

इनपुट मिलता है, 3 को घटाता रहता है जब तक कि यह 0 से छोटा नहीं हो जाता है, पॉइंटर अप ('|') को निर्देशित करें, फिर 3 जोड़ता है। यदि मान 0 है, तो पॉइंटर सही चलता है (" 1. @" आउटपुट '1') और बाएं चलता है ("@"। आउटपुट '0')। '@' कार्यक्रम को समाप्त करता है।


1

बैच - 7 टोकन

मुझे लगता है

@echo off
for /L %%a in (0,3,%1) do set a=%%a
if %a%==%1 echo 1

रिटर्न 1दिए गए नंबर (stdin) के रूप में तीन से विभाज्य है यदि।


छोरों की अनुमति है?
सर्जियोल

1

रूबी, 6 (?) टोकन

मैं वास्तव में कैसे टोकन गिनती करने के लिए यकीन नहीं है। ओपी, क्या आप मुझे स्कोर कर सकते हैं?

मुझे लगता है कि यह 6 है ... 1, 0, 0, *, 255,x

ध्यान दें कि *गुणा पूर्णांक नहीं है।

def div3(x)
  ([1,0,0]*255)[x]
end

प्रश्न में सूचीबद्ध ऊपर ओपी के अर्थ में एक टोकन का केवल एक ही नहीं होगी?
C5H8NNaO4

@ C5H8NNaO4 तो क्या हुआ? 0?
ऐसा नहीं है कि चार्ल्स

@ C5H8NNaO4 स्थिरांक के लिए 4 हो सकता है?
नहीं कि चार्ल्स

1

अजगर ०

मैंने ईयरलर पोस्ट किया लेकिन मैंने सशर्त इस्तेमाल किया। यहां केवल कीवर्ड के लिए कोई सशर्त और कोई टोकन का उपयोग नहीं किया गया है

def g(x): return ([[lambda : g(sum(int(y) for y in list(str(x)))),lambda: 0][[False,True].index(x in[0,1,2,4,5,7,8])], lambda: 1][[False,True].index((lambda y: y in[3,6,9])(x))])()

उस ट्रिक का उपयोग करता है जिसमें 3 के कई अंकों में अंक होते हैं जो 3 में जोड़ते हैं

संपादित करें: अनावश्यक लैंबडा को हटाया

def g(x):return([[lambda: g(sum(int(y) for y in list(str(x)))),lambda:0][[False,True].index(x in[0,1,2,4,5,7,8])], lambda:1][[False,True].index(x in[3,6,9])])()

संपादित करें: आगे गोल्फ (117 चार्ट) अभी भी कोई टोकन नहीं है

exec"g=`x:(((`:g(sum(int(y)for y in str(x)),`:0)[x in[0,1,2,4,5,7,8]],`:1)[x in[3,6,9]])()".replace('`','lambda ')

अजगर की निफ्टी गेटिटेम लॉन्गर के लिए 132 चार पर सीधी पहुँच प्राप्त की

exec"g={0}x:((({0}:g(sum(int(y)for y in str(x))),{0}:0{1}0,1,2,4,5,7,8]),{0}:1{1}3,6,9]))()".format('lambda ',').__getitem__(x in[')

http://www.codeskulptor.org/#user34_uUl7SwOBJb_0.py


[]हालांकि, ऐरे एक्सेस की अनुमति नहीं है।
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

यह है? इन नियमों के बाद, codegolf.stackexchange.com/tags/atomic-code-golf/info
डायलन Madisetti

ठीक है, सवाल टैग विकि में नियम का उपयोग नहीं करता है। सवाल के संचालन पर प्रतिबंध है। शब्द पर ध्यान दें only
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

@ खैर n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳ यह एक अच्छी बात अजगर उस के लिए एक देशी विशेषता भी है है
डायलन Madisetti

0

अजगर - 25 टोकन

चीजों को शुरू करने के लिए, मेरे पास एक लंबा समाधान है जो मेरी पहली पोस्ट में लिंक में से किसी एक उत्तर का कार्यान्वयन है। nइनपुट है।

a = (n>>7)-((n&64)>>6)+((n&32)>>5)-((n&16)>>4)+((n&8)>>3)-((n&4)>>2)+((n&2)>>1)-(n&1)
print(a==0 or a==3)

orके बराबर है ||


0

जावास्क्रिप्ट - 3 टोकन

अपने ब्राउज़र के कंसोल पर इसका परीक्षण करें:

a = prompt().split('');
sum = 0;

do {
  sum = a.reduce(function(p, c) {
     return parseInt(p) + parseInt(c); 
  });

  a = sum.toString().split('');

} while(a.length > 1)

alert([3, 6, 9].indexOf(+sum) > -1)

आप उस निष्कर्ष पर किस तरह से पहुंचे? मैं 37 टोकन के बारे में गिनते हैं।
nyuszika7h

"टोकन स्थिरांक और चर को छोड़कर उपरोक्त में से कोई भी है"। आपने 37 की गिनती कैसे की?
विलियम बारबोसा

1
ओह मैं समझा। ओपी परमाणु-कोड-गोल्फ के सूचना पृष्ठ से असहमत लगता है ।
nyuszika7h

दरअसल, अब मुझे यकीन नहीं है कि मैं सही हूं या नहीं। मेरा स्कोर परमाणु कोड गोल्फ फिडल के अनुसार 70+ होगा।
विलियम बारबोसा

1
समस्या टोकन की संख्या के बारे में नहीं है, लेकिन उन कार्यों के बारे में है जो आप उपयोग कर रहे हैं। मुझे नहीं लगता कि स्ट्रींग, पार्सइंट, लूप्स, एरेज़ आदि की अनुमति है।
aditsu

0

जावास्क्रिप्ट
टोकन के बारे में निश्चित नहीं है #

function mod3 (i) { return {'undefined':'100','0':'0'}[[0][i]][i.toString (3).split('').pop ()]}

या यदि 0 के लिए आउटपुट 1 होने की अनुमति है;

function mod3 (i) { return '100'[i.toString (3).split('').pop ()]}


2
मुझे कहना है, मुझे यकीन नहीं है कि इस चुनौती पर क्या नियम लागू होते हैं। क्या फंक्शंस और प्रॉपर्टीज की अनुमति है?
C5H8NNaO4

0

Tcl , 83 बाइट्स

proc T n {while \$n>9 {set n [expr [join [split $n ""] +]]};expr {$n in {0 3 6 9}}}

इसे ऑनलाइन आज़माएं!


Outgolf विफल: 96 बाइट्स proc T n {set n [expr [join [split [expr [join [split $n ""] +]] ""] +]];expr {$n in {0 3 6 9}}} यह ऑनलाइन कोशिश करो!
sergiol

एक और असफल: ** 87 बाइट्स ** proc T n {expr {[expr [join [split [expr [join [split $n ""] +]] ""] +]] in {0 3 6 9}}} यह ऑनलाइन कोशिश करो!
sergiol
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.