এটি ক্যান্টরের সেট এর মধ্যেই আছে?


20

চ্যালেঞ্জ

এই চ্যালেঞ্জের জন্য, আপনাকে কোনও নির্ধারিত নম্বর ক্যান্টোর সেটে রয়েছে কিনা তা নির্ধারণ করার কথা। সুতরাং প্রথমে ক্যান্টর সেটটি সংজ্ঞায়িত করা যাক।

প্রথমে 0 এবং 1 এর মধ্যে সংখ্যাগুলি দিয়ে শুরু করুন এই সীমার বাইরে যে কোনও সংখ্যা ক্যান্টর সেটে নেই। এখন, আসুন সংখ্যাগুলিকে তিনটি সমান ভাগে ভাগ করুন: [0,1 / 3], [1 / 3,2 / 3], [2/3, 1] প্রথম এবং শেষ অংশগুলির সীমার মধ্যে নেই এমন কোনও নম্বর ক্যান্টর সেটে নেই। এখন, আপনি [0,1 / 3] এবং [2/3, 1] বিভাগগুলির জন্য এই প্রক্রিয়াটি পুনরাবৃত্তি করেন। তারপরে আপনি কী বাকী তা পুনরাবৃত্তি করুন। আপনি চিরকাল এই কাজটি চালিয়ে যান। শেষ পর্যন্ত, বাকি সমস্ত সংখ্যা ক্যান্টোর সেটে রয়েছে। এখানে প্রথম ছয়টি পুনরাবৃত্তির চিত্র রয়েছে:

ক্যান্টোর ডায়াগ্রাম


ইনপুট

দুটি পূর্ণসংখ্যা xএবং y
0 < y < 2^15
0 <= x <= y
সবচেয়ে বড় সাধারণ ডিনোমিনেটর xএবং yএটি 1 হয়, যদি না 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 আপনার জন্য প্রদত্ত পরিসরটি দেখুন। আমি বলতে যাচ্ছি যে ভগ্নাংশটি সরল আকারে যদি না হয়x == 0
TheNumberOne

কিছু পরীক্ষার ক্ষেত্রে যেখানে x! = 1 ভাল হবে। এছাড়াও, আপনার স্নিপেট বলেছে যে 1/3 ক্যান্টারের সেটে নেই।
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]&
নেজিনিসিস

এই জাতীয় নিয়মটি 1পর্যায়ক্রমিক অংশে পিছনের বিষয়গুলিও ছিটকে দেয় , যা ভুল উত্তর দেয়। উদাহরণস্বরূপ, 7/8 এর বেস -3 সম্প্রসারণ .21212121 ...., বা {{2,1}}; তবে প্রস্তাবিত নিয়মটি এতে পরিবর্তিত হবে {{2}}, যা 1গুলি মুক্ত কিন্তু হওয়া উচিত নয়।
গ্রেগ মার্টিন

Touche। কীভাবে #==0||FreeQ[RealDigits[#,3]/.{{x___,1},_}:>{x},1]&? যদি এটি শেষ হয় এবং ননজারো RealDigits[#,3]ফর্মের হয় {{__Integer},-1}এবং যদি এটি পুনরাবৃত্তি করে তবে তা ফর্মের হবে {{___Integer,{__Integer}},-1}, তাই না? আমি মোবাইলে রয়েছি তাই এখনই পরীক্ষা করা শক্ত। যদি এটি কাজ করে তবে ইনফিক্স স্বরলিপি ব্যবহার করেও RealDigitsকাজ করতে পারে।
নেজিনিসিস


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 এর এক্স / y এবং 1 - x / y = (y - x) / y উভয়ের মধ্যে সংক্ষিপ্ততম দশমিক প্রসারণ পরীক্ষা করতে পারি , যেখানে x / y একটি ডান প্রান্ত iff (y - x) / y একটি বাম প্রান্ত। তাদের অন্তত একটি কোন থাকে 1 এর, এক্স / 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

জাভাস্ক্রিপ্ট (ES6), 65 67

2 বাইট সম্পাদনা করুন THX @ লুক

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

জাভাস্ক্রিপ্ট (ES6), 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 আমরা একটি খুঁজে পেয়েছি কিনা তা ট্র্যাক করে রাখে।
  • q বেস 3 এ বর্তমান সংখ্যা।
  • !z|!qzমিথ্যা হলে সত্য (আমরা কোনও 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 দিয়ে দুটি পূর্ণসংখ্যার আর্গুমেন্ট পাস করুন।

যেমন দ্বারা অনুমোদিত আউটপুট, প্রস্থান কোড (truthy জন্য falsy জন্য 0, 1) এ ফিরিয়ে দেওয়া হয় PPCG ইনপুট / আউটপুট পদ্ধতি

আমি সন্দেহ করি যে রেজেক্স আরও গল্ফ করা যেতে পারে, এমনকি এমনকি গ্রেপ -z ব্যবহারের পক্ষে টিআর কমান্ডটি সরিয়ে ফেলতে পারে, তবে এটিই সবচেয়ে সংক্ষিপ্ততম আমি এনে আসতে সক্ষম হয়েছি। (দুর্ভাগ্যক্রমে, গ্রেপ-জিএস গ্রেপ-পি এর সাথে সামঞ্জস্যপূর্ণ নয়, এবং পার্ল-স্টাইলের রেজিক্সগুলি পেতে -P বিকল্পটি? সিনট্যাক্সের জন্য প্রয়োজনীয়?)

টেস্টবেড প্রোগ্রাম এবং আউটপুট:

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.

টিআর এবং গ্রেপ অংশ:

একটি ছোটখাটো সমস্যা হ'ল, যদিও ডিসি বড় আকারের ইচ্ছামত পরিচালনা করে, ডিসি যখন একটি বড় সংখ্যা প্রিন্ট করে, তখন এটি ব্যাকস্ল্যাশের সাথে শেষ প্রান্তটি ছাড়া প্রতিটি লাইন এবং প্রতিটি লাইনের পরে একটি নতুন লাইন সহ 69 টি-অক্ষরের রেখায় বিভক্ত হয়ে যায়।

টিআর কমান্ড কোনও ব্যাকস্ল্যাশ এবং নতুনলাইন মুছে ফেলে। এটি কেবল একটি লাইন ছেড়ে দেয়।

এরপরে গ্রেপ কমান্ডটি পার্ল-স্টাইলের রেজেক্স (-P বিকল্প, যা একটি জিএনইউ এক্সটেনশন) ব্যবহার করে। রেখাটি মেলে যদি রেখার মধ্যে 1 থাকে যা কমপক্ষে y 0 এর পরে না থাকে বা কমপক্ষে y 2 এর পরে স্ট্রিংটি শেষ করে।

ক্যান্টর সেটে না থাকায় এক্স / ওয়াই সনাক্ত করার জন্য ঠিক এটির প্রয়োজন কারণ কারণ যুক্তিযুক্ত সংখ্যা x / y এর বেস -3 উপস্থাপনার পুনরাবৃত্তি অংশটি দশমিক বিন্দুর পরে # y + 1 থেকে শুরু হিসাবে দেখা যেতে পারে , এবং সর্বাধিক y অঙ্ক দীর্ঘ।


1

সিজেএম (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সত্য হয় বা পরবর্তী অঙ্কটি যদি একটি 1হয় তবে আমরা লুপিং এবং আউটপুটটি থামিয়ে দেব j

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