क्या यह कैंटर के भीतर है?


20

चुनौती

इस चुनौती के लिए, आपको यह निर्धारित करना चाहिए कि क्या कोई नंबर कैंटर सेट में है। तो पहले, चलो कैंटर सेट को परिभाषित करते हैं।

सबसे पहले, 0 और 1. के बीच की संख्या से शुरू करें। इस सीमा के बाहर की कोई भी संख्या कैंटर सेट में नहीं है। अब, संख्याओं को तीन समान भागों में विभाजित करते हैं: [0,1 / 3], [1 / 3,2 / 3], [2/3, 1]। पहले और अंतिम भागों की श्रेणियों के अंदर न होने वाली कोई भी संख्या कैंटर सेट में नहीं है। अब, आप इस प्रक्रिया को खंडों [0,1 / 3] और [2/3, 1] के लिए दोहराते हैं। फिर आप बचे हुए को दोहराते हैं। आप ऐसा हमेशा करते रहते हैं। अंत में, शेष सभी संख्याएँ कैंटर सेट में हैं। यहाँ पहले छह पुनरावृत्तियों का एक चित्र है:

कैंटर आरेख


इनपुट

दो पूर्णांक xऔर y। जब तक 1
0 < y < 2^15
0 <= x <= y
का सबसे बड़ा सामान्य भाजक xऔर yहै x == 0


उत्पादन

अगर x/yकैंटर सेट में है तो सच्चाई ।
अगर x/yकैंटर सेट में नहीं है तो झूठा ।


उदाहरण

अब, चलो संख्याओं के कुछ उदाहरण देखते हैं जो कैंटर सेट में हैं।

1/3 -> true  

यह एक सीमा पर है, और सीमाओं को कभी भी हटाया नहीं जाता है।

1/4 -> true  

1/4यह खंड के मध्य तीसरे में कभी नहीं होता है, हालांकि यह सीमा पर कभी भी नहीं होता है। यदि आप इसका अनुसरण करते हैं, तो आप वास्तव में पाएंगे कि यह किसी अनुभाग के पहले और अंतिम तिहाई में होने के बीच वैकल्पिक है।

1/13 -> true  

1/13 पहले, पहले और अंतिम खंडों के बीच वैकल्पिक।

1/5 -> false

1/5 1/9 और 2/9 के बीच, उपरोक्त आरेख में तीसरी पंक्ति के पहले खाली ब्लॉक में आता है।

अन्य परीक्षण मामले:

0/4 -> true
3/10 -> true
3/4 -> true
10/13 -> true
1/1 -> true
12/19 -> false
5/17 -> false
3/5 -> false
1/7 -> false
1/2 -> false

आप इस स्निपेट के साथ अन्य संख्याएँ आज़मा सकते हैं:


उद्देश्य

सबसे कम बाइट वाला व्यक्ति जीतता है।


क्या हम गारंटी देते हैं कि इनपुट (0,0) नहीं है? क्या अंश को सरलतम रूप में दिया गया है?
xnor

1
@xnor y के लिए दी गई श्रेणी को देखें। मैं यह कहने जा रहा हूँ कि अंश सरलतम रूप में है जब तकx == 0
TheNumberOne

कुछ परीक्षण मामले जहां x! = 1 अच्छा होगा। इसके अलावा, आपका स्निपेट कहता है कि 1/3 कैंटर सेट में नहीं है।
xnor

@xnor जोड़ा और तय;)
TheNumberOne

6
कैंटर मिल सकता है?
mbomb007

जवाबों:


13

मैथेमेटिका, 54 बाइट्स

If[Last@#===1,Most@#,#]&@RealDigits[#,3][[1]]~FreeQ~1&

x/yइनपुट, जहां y > 0और 0 ≤ x ≤ y, और लौटने Trueया के रूप में एक अंश लेने का कार्य False

कैंटर में 0 और 1 के बीच की वास्तविक संख्या ठीक उसी समय होती है जब उसके आधार -3 में से कोई भी अंक 1 के बराबर नहीं होता है; अपवाद यह है कि एक अंश जिसका हर 3 की शक्ति है (जिसका आधार -3 विस्तार इसलिए समाप्त होता है) को 1 में समाप्त होने की अनुमति है।

RealDigits[#,3][[1]]भिन्नात्मक इनपुट के आधार -3 विस्तार में सभी अंकों को देता है #, जैसे कि {1, 0, 2, {0, 1, 0, 2}}: अंतिम सूची विस्तार का आवधिक हिस्सा है, जबकि पूर्णता से पहले पूर्णांक अंक हैं। यदि बेस -3 विस्तार समय-समय पर सही है, तो आउटपुट जैसा है {{0, 1, 0, 2}}; यदि बेस -3 विस्तार समाप्त हो जाता है, तो फॉर्म की तरह है {1, 0, 2}

इसलिए हम यह जांचना चाहते हैं ~FreeQ~1, कि क्या सूची नि: शुल्क है 1या नहीं। हालाँकि, समाप्त होने वाली विस्तार चीज़ के कारण, हम सूची के अंतिम तत्व को हटाना चाहते हैं यदि यह बराबर हो 1; वही If[Last@#===1,Most@#,#]पूरा करता है। ( ===एक संभावित सूची की तुलना करने के लिए आवश्यक है 1: ==अकेले उस स्थिति में बिना मूल्यांकन के रहता है।)


4
मुझे आश्चर्य है कि गणितज्ञ के पास नहीं है, IsCantorNumberलेकिन यह निर्धारित करने के लिए एक फ़ंक्शन है कि कुछ बकरी है
ब्रेन गाइडर

3
खैर, मुझे पता नहीं, जो वास्तविक जीवन में अधिक आते हैं: बकरियाँ या भग्न? ;)
ग्रेग मार्टिन

FreeQ[RealDigits[#,3][[1]]/.{{x___,1}}:>{x},1]&
ngenisis

इस तरह का नियम 1आवधिक भाग में अनुगामी एस से अलग होगा, जो गलत उत्तरों की ओर जाता है। उदाहरण के लिए, 7/8 का आधार -3 विस्तार .21212121 ...., या है {{2,1}}; लेकिन सुझाया गया नियम इसे बदल देगा {{2}}, जो कि मुफ्त है, 1लेकिन ऐसा नहीं होना चाहिए।
ग्रेग मार्टिन

ट्च। कैसे के बारे में #==0||FreeQ[RealDigits[#,3]/.{{x___,1},_}:>{x},1]&? यदि यह समाप्त हो रहा है और नॉनजरो RealDigits[#,3]फॉर्म का होगा {{__Integer},-1}और अगर यह दोहरा रहा है तो यह फॉर्म का होगा {{___Integer,{__Integer}},-1}, है ना? मैं मोबाइल पर हूं इसलिए अभी परीक्षण करना कठिन है। यदि यह काम करता है, तो इसके लिए infix संकेतन का उपयोग करके RealDigitsभी काम किया जा सकता है।
ngenisis


7

जेली , 22 17 16 15 बाइट्स

,ạµ%⁹×3µÐĿ:⁹Ḅ3ḟ

सत्य के लिए प्रिंट 3 , झूठे के लिए कुछ भी नहीं।

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

पृष्ठभूमि

कैंटर सेट की एक प्रसिद्ध संपत्ति यह है कि इसमें ठीक 0 और 1 के बीच की संख्याएँ होती हैं जिन्हें उनके टर्नरी विस्तार में 1 के बिना लिखा जा सकता है ।

ध्यान दें कि कुछ संख्याएँ - सेट के निर्माण में शामिल बंद अंतरालों के ठीक किनारों - या तो एकल (अनुगामी) 1 या अनुगामी 2 अनुगामी राशि के साथ लिखा जा सकता है । उदाहरण के लिए, 1 = 1 3 = 0.22222… 3 और 1/3 = 0.1 3 = 0.022222… 3 , जैसे 0.5 10 = 0.499999… 10

विशेष किनारों से बचने के लिए, हम 1 की जाँच कर सकते हैं, जो x / y और 1 - x / y = (y - x) / y दोनों में सबसे छोटा दशमलव विस्तार है , जहाँ x / y एक सही किनारा है iff (y - x) / y एक बाएं किनारे है। यदि उनमें से कम से कम एक में 1 नहीं है , तो x / y कैंटर सेट के अंतर्गत आता है।

यह काम किस प्रकार करता है

,ạµ%⁹×3µÐĿ:⁹Ḅ3ḟ  Main link. Left argument: x. Right argument: y

 ạ               Absolute difference; yield y - x.
,                Pair; yield [x, y - x].
       µ         Begin a new, monadic chain with argument [a, b] := [x, y - x].
  µ     ÐĿ       Repeatedly execute the links in between until the results are no
                 longer unique, updating a and b after each execution. Return the
                 array of all unique results.
   %⁹              Compute [a % y, b % y].
     ×3            Compute [3(a % y), 3(b % y)].
                 This yields all unique dividends of the long division of x by y in
                 base 3.
          :⁹     Divide all dividends by y to get the corresponding ternary digits.
            Ḅ    Unbinary; turn [1, 1] into 3, other pairs into other numbers.
             3ḟ  Remove all occurrences of the resulting numbers from [3], leaving
                 an empty array if and only if one pair [a, b] is equal to [1, 1].

3सच है true+1।
मैजिक ऑक्टोपस Urn

3

जावास्क्रिप्ट (ईएस 6), 65 67

2 बाइट संपादित करें thx @Luke को बचाया

n=>d=>(z=>{for(q=0;~-q*n*!z[n];n=n%d*3)z[n]=1,q=n/d|0})([])|q!=1|!n

कम गोल्फ वाला

n=>d=>{
  z = []; // to check for repeating partial result -> periodic number
  for(q = 0; q != 1 && n != 0 && !z[n]; )
    z[n] = 1,
    q = n / d | 0,
    n = n % d * 3
  return q!=1 | n==0
}

परीक्षा

f=
n=>d=>(z=>{for(q=0;~-q*n*!z[n=n%d*3];q=n/d|0)z[n]=1})([])|q!=1|!n
  

console.log(
'Truthy: 1/3 1/4 1/13 0/4 3/10 3/4 10/13 1/1\nFalsey: 1/5 12/19 5/17 3/5 1/7 1/2'.replace(/(\d+).(\d+)/g,(a,x,y)=>a+':'+f(x)(y))
)  


मुझे लगता है कि आप की जगह ले सकता n=n%d*3के साथ q=n/d|0और उसके बाद की जगह z[n]के साथz[n=n%d*3]
ल्यूक

2

जावास्क्रिप्ट (ईएस 6), 55 बाइट्स

y=>f=(x,z,n=~y,q=x/y|0)=>n?!z|!q&&f(x%y*3,z|q==1,n+1):1

हर में पहला और अंश दूसरे में करी करके उपयोग करें। मानक रूप अब एक बाइट है:

f=(x,y,z,n=~y,q=x/y|0)=>n?!z|!q&&f(x%y*3,y,z|q==1,n+1):1

व्याख्या

यदि कोई अंश कैंटर सेट में नहीं है, तो उसे किसी बिंदु पर मध्य वर्गों में से एक में गिरना चाहिए; इसलिए, आधार 3 में इसके निरूपण में एक शून्य शून्य अंक के बाद किसी बिंदु पर 1 होना चाहिए। यह कैसे काम करता है:

  • z हम 1 पाया है कि क्या का ट्रैक रखता है।
  • q आधार 3 में वर्तमान अंक है।
  • !z|!qसच है अगर zगलत है (हमें 1 नहीं मिला है) या qगलत है (वर्तमान अंक 0 है)।

यदि nहम शून्य से पहले शून्य तक दौड़ते हैं, तो 1 के बाद एक गैर-शून्य अंक प्राप्त होता है, अंश कैंटर सेट में होता है और हम वापस लौट जाते हैं 1


2

दे घुमा के + जीएनयू उपयोगिताओं, 62 बाइट्स

dc -e3o9d$2^$1*$2/p|tr -cd 012|grep -P "1(?!(0{$2,}|2{$2,})$)"

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

इसे arg1 <= arg2 और 0 <arg2 के साथ दो पूर्णांक तर्क पास करें।

आउटपुट को एक्सेप्ट कोड (0 सत्यता के लिए, 1 सत्य के लिए) में लौटा दिया जाता है, जैसा कि अनुमति है पीपीसीजी I / O विधियों झूठा के सत्य के

मुझे संदेह है कि रेगेक्स को और आगे बढ़ाया जा सकता है, शायद यहां तक ​​कि grep -z का उपयोग करने के पक्ष में tr कमांड को समाप्त कर सकता है, लेकिन यह सबसे छोटा है जिसके साथ मैं आने में सक्षम हूं। (दुर्भाग्य से, grep -z grep -P के साथ असंगत है, और -प्रणाली शैली regexes प्राप्त करने के लिए विकल्प? सिंटैक्स के लिए आवश्यक है।)

परीक्षण कार्यक्रम और आउटपुट:

for x in '1 3' '1 4' '1 13' '1 5' '0 4' '3 10' '3 4' '10 13' '1 1' '12 19' '5 17' '3 5' '1 7' '1 2'
  do
    printf %-6s "$x "
    ./cantor $x >/dev/null && echo F || echo T
  done

1 3   T
1 4   T
1 13  T
1 5   F
0 4   T
3 10  T
3 4   T
10 13 T
1 1   T
12 19 F
5 17  F
3 5   F
1 7   F
1 2   F

व्याख्या

डीसी भाग (तर्क x और y हैं):

3o     Set output base to 3.
9      Push 9 on the stack.
d      Duplicate the top of the stack. (The extra 9 on the stack isn't actually used, but I need some delimiter in the code here so that the 9 doesn't run into the number coming up next.  If I used a space as a no-op, then I'd need to quote it for the shell, adding an extra character.)
$2^    Raise 9 to the y power. This number in base 3 is 1 followed by 2y 0's.
$1*$2/ Multiply the base-3 number 10....0 (with 2y 0's in it) by x and then divide by y (truncating). This computes 2y digits (after an implied ternary point) of x/y.  That's enough digits so that the repeating part of the rational number is there at least twice.
p      Print the result, piping it to tr.

tr और grep हिस्सा:

एक छोटी सी समस्या यह है कि, हालांकि dc मनमाने ढंग से बड़े पूर्णांकों को संभालता है, जब dc एक बड़ी संख्या को प्रिंट करता है, तो यह 69-वर्ण रेखाओं में टूट जाएगा, प्रत्येक पंक्ति के साथ एक बैकस्लैश के साथ अंतिम छोर को छोड़कर, और प्रत्येक पंक्ति के साथ एक नई रेखा के साथ।

Tr कमांड किसी भी बैकस्लैश और नईलाइन को हटा देती है। यह सिर्फ एक लाइन छोड़ता है।

Grep कमांड तब perl-style regex (-P विकल्प, जो GNU एक्सटेंशन है) का उपयोग करता है। यदि रेखा में कम से कम y 0 या उसके बाद कम से कम y 2 है जो तब स्ट्रिंग को समाप्त करता है, तो regex मेल खाता है।

कैंटर सेट में नहीं होने के कारण x / y की पहचान करने के लिए वास्तव में यही आवश्यक है, क्योंकि तर्कसंगत संख्या x / y के आधार -3 प्रतिनिधित्व के दोहराव वाले भाग को अंकन के बाद अंक # y + 1 के रूप में शुरू किया जा सकता है। , और अधिकांश y अंकों पर लंबा है।


1

CJam (19 बाइट्स)

{_@3@#*\/3b0-W<1&!}

ऑनलाइन टेस्ट सूट

यह एक अनाम ब्लॉक (फ़ंक्शन) है जो स्टैक और पत्तियों पर 0या स्टैक पर दो तर्क लेता है 1। यह आधार द्वारा अंशों x/yको yआधार 3अंकों में परिवर्तित करने और सही iff को वापस करने के द्वारा काम करता है, जिसमें वे नहीं होते हैं 1या केवल 1एक प्रत्यय का हिस्सा होता है 1 0 0 0 ...

{            e# Begin a block
  _@3@#*\/3b e#   Base conversion
   0-W<      e#   Remove all zeros and the final non-zero digit
   1&!       e#   True iff no 1s are left
}

1

अजगर , 14 बाइट्स

gu*3hS,G-QGQE0

मेरे सी समाधान के आधार पर। yपहली इनपुट लाइन xपर , दूसरी पर।

                Q = y
 u         QE   G = x
                loop y times
  *3                x = 3 *
    hS,G                min(x,
        -QG                 y-x)
g            0  return x >= 0

यदि x/yकैंटर सेट के भीतर है, के xबीच रहता है 0और y। अन्यथा, एक बिंदु पर xअधिक से अधिक हो जाता है y, फिर शेष पुनरावृत्तियों में नकारात्मक अनंत को विचलन करता है।

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


0

बैच, 91 बाइट्स

@set/ai=%3+1,n=%1*3%%%2,f=%1*3/%2%%2,f^|=j=!((%2-i)*n)
@if %f%==0 %0 %n% %2 %i%
@echo %j%

के पहले y-1आधार 3 अंकों का परीक्षण करता है x/yiपरीक्षण किए गए अंकों की गिनती है। nकी अगली मूल्य है xjयह सत्य है यदि nशून्य तक पहुँचता है (क्योंकि विस्तार समाप्त हो जाता है) या हमने y-1अंको को खोजे बिना अंक का परीक्षण किया है 1fयदि jसही है या यदि अगला अंक a है तो सही है 1, जिस बिंदु पर हम लूपिंग और आउटपुट को रोकते हैं j

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