এন দরজা, কে বানর


14

এন দরজা এবং কে বানর আছে। প্রাথমিকভাবে, সমস্ত দরজা বন্ধ রয়েছে।

রাউন্ড 1: 1 ম বানর প্রতিটি দরজা পরিদর্শন করে এবং দরজা টগল করে (যদি দরজা বন্ধ থাকে তবে এটি খোলা হয়ে যায়; যদি এটি খোলা থাকে তবে এটি বন্ধ হয়ে যায়)।

দ্বিতীয় রাউন্ড : 1 ম বানর প্রতিটি দরজা পরিদর্শন করে এবং দরজা টগল করে। তারপরে ২ য় বানর প্রতি ২ য় দরজায় গিয়ে দরজা টগল করে g

। । ।

। । ।

রাউন্ড কে: 1 ম বানর প্রতিটি দরজা পরিদর্শন করে এবং দরজা টগল করে। । । । । । । । । । Kth বানর প্রতিটি kth দরজা পরিদর্শন এবং দরজা টগল।

ইনপুট: এনকে (একক স্থান দ্বারা পৃথক)

আউটপুট: দ্বার সংখ্যা যা খোলা আছে, প্রতিটি একক স্থান দ্বারা পৃথক করা হয়েছে।

উদাহরণ :

ইনপুট: 3 3

আউটপুট: 1 2

বাধা :

0 <এন <101

0 <= কে <= এন

দ্রষ্টব্য :

  • ধরে নিন এন দরজাগুলি 1 থেকে N পর্যন্ত এবং কে বানরগুলি 1 থেকে কেতে গণনা করা হয়েছে

  • সংক্ষিপ্ততম কোডের সাথে একটিটি জয়ী হয়। এছাড়াও, এন = 23, কে = 21 এর জন্য আউটপুট প্রদর্শন করুন


এই ধাঁধা দ্বারা অনুপ্রাণিত ?
ম্যাথ চিলার

আমার কেবল একটি প্রশ্ন আছে, যদি এন = কে, প্রতিটি প্রাথমিক নম্বর দরজা খোলা থাকে, তাই না?
ফেবিনআউট

@ ফ্যাবিনআউট কোনটি n=k=3আউটপুট দিলে 1 2আপনার ভুল হবে না ... এবং পাঁচটি আউটপুট 1 2 4একটি প্যাটার্ন রয়েছে তবে এর পরে খুব কম স্পষ্ট হবে।
ম্যাথ চিলার

@ ফ্যাবিনআউট এটি একটি খুব বিচিত্র প্রকারের ফিবোনাচি নম্বর সেট অনুসরণ করেছে, এটির অত্যন্ত উন্নত বিমূর্ত গণিত।
ম্যাথ চিলার

@ryingToGetProgrammingStraight আপনি ঠিক বলেছেন, আমার স্মৃতি উত্তরটি আমাকে বলেছিল মূল সংখ্যাগুলির তালিকা, যখন এটি বর্গ সংখ্যাগুলির তালিকা ছিল।
ফেবিনআউট

উত্তর:


14

এপিএল, 32 28 26

{(2|+/(⍳⍺)∘.{+/0=⍺|⍨⍳⍵}⍳⍵)/⍳⍺}/⎕

⎕:
      23 21
 1 2 4 8 9 16 18 23 

Explaination

  • {+/0=⍺|⍨⍳⍵}দরজা (বাম আর্গুমেন্ট) কে রাউন্ড (ডান আর্গুমেন্ট) এ টগল করা হয় এমন একটি ফাংশন যা এর কারণগুলির সংখ্যার সমান :

    • ⍳⍵ 1 থেকে সংখ্যার অ্যারে তৈরি করুন

    • ⍺|⍨সেই অ্যারের প্রতিটি আইটেম মডুলাস গণনা করুন

    • 0= 1 তে 0 এবং অন্য প্রতিটি কিছুর জন্য 0 তে পরিবর্তন করুন

    • +/ ফলাফল অ্যারে যোগফল

  • বাহ্যিক কার্য:

    • (⍳⍺), ⍳⍵1 থেকে N এবং 1-কে থেকে অ্যারে তৈরি করুন

    • ∘.{...}দুটি অ্যারের উপাদানগুলির প্রতিটি জোড়া জন্য, ফাংশনটি প্রয়োগ করুন। এটি টগল হওয়া সংখ্যার একটি ম্যাট্রিক্স দেয়, প্রতিটি সারি একটি দরজা উপস্থাপন করে এবং প্রতিটি কলাম একটি বৃত্তকে উপস্থাপন করে।

    • +/কলামগুলি যোগ করুন। এটি প্রতিটি দরজাটি সমস্ত রাউন্ডে টগল করা সময়ের সংখ্যার অ্যারে দেয়।

    • 2|মডুলাস 2, সুতরাং যদি কোনও দরজা খোলা থাকে তবে এটি 1 টি; যদি এটি বন্ধ থাকে তবে এটি 0

    • (...)/⍳⍺ শেষ অবধি, 1 থেকে N তে একটি অ্যারে তৈরি করুন এবং কেবল আগের পদক্ষেপে অ্যারেতে 1 রয়েছে এমনটি নির্বাচন করুন।

  • /⎕ অবশেষে, ইনপুট থেকে সংখ্যাগুলির মধ্যে ফাংশনটি .োকান।


সম্পাদনা

{(2|+⌿0=(,↑⍳¨⍳⍵)∘.|⍳⍺)/⍳⍺}/⎕
  • ,↑⍳¨⍳⍵সমস্ত "বানর" উত্পন্ন করুন (যদি কে = 4 হয়, তবে এটি হ'ল 1 0 0 0 1 2 0 0 1 2 3 0 1 2 3 4)

    • ⍳⍵1 থেকে (কে) পর্যন্ত অ্যারে

    • ⍳¨ তাদের প্রত্যেকের জন্য, 1 থেকে সেই সংখ্যায় অ্যারে তৈরি করুন

    • ,↑নেস্টেড অ্যারেটিকে ম্যাট্রিক্স ( ) এ রূপান্তর করুন এবং তারপরে একটি সরল অ্যারেতে আনার্যাভেল করুন ( ,)

  • (,↑⍳¨⍳⍵)∘.|⍳⍺1 থেকে (এন) প্রতিটি সংখ্যার জন্য , প্রতিটি বানরের সাথে এটিকে মোড করুন।

  • 0=1 তে 0 এবং অন্য প্রতিটি কিছুর জন্য 0 তে পরিবর্তন করুন। এটি টোগলগুলির একটি ম্যাট্রিক্স দেয়: সারি প্রতিটি বৃত্তে প্রতিটি বানর, কলামগুলি দরজা; 1 এর অর্থ একটি টগল, 0 অর্থ কোনও টগল নয়।

  • +⌿ প্রতিটি দরজা টোগল করা হয় এমন সংখ্যার অ্যারে পেতে সারিগুলিকে যোগ করুন

অন্যান্য অংশ পরিবর্তন করা হয় না


সম্পাদনা

{(≠⌿0=(,↑⍳¨⍳⍵)∘.|⍳⍺)/⍳⍺}/⎕

≠⌿যোগফল 2 ( 2|+⌿) এবং যোগ 2 এর পরিবর্তে XOR হ্রাস ( ) ব্যবহার করুন


এপিএলটি গল্ফ স্ক্রিপ্টের জন্য ডিজাইন করা হয়েছিল? ;-)
celtschk

@celtschk হ্যাঁ, আংশিকভাবে, এক উপায়ে। এটি সংক্ষেপে অ্যালগরিদম প্রকাশ করার জন্য ডিজাইন করা হয়েছিল।
লুসার droog

আপনি {}/কেবল এন এবং কে-কে ডিএফএন-তে যুক্তি হিসাবে গ্রহণের পরিবর্তে কেন একটি ডিএফএন হ্রাস ব্যবহার করবেন?
অ্যাডম

@ অ্যাডাম কারণ 1) এটি আমার অতীত; 2) এই প্রশ্নটি "প্রোগ্রাম বা ফাংশন" এবং I / O মানককরণের পূর্বে রয়েছে; 3) ওপি স্পষ্টভাবে বলেছে "একটি একক স্থান দ্বারা পৃথক"
টোয়নাট

যথেষ্ট উপযুক্ত, তবে কমপক্ষে আপনি একটি বাইট সংরক্ষণ করতে পারেনi←⍳⍺
অ্যাডাম

4

গল্ফস্ক্রিপ্ট, 33 টি অক্ষর

~:k;),1>{0\{1$)%!k@-&^}+k,/}," "*

যদি দরজাগুলি শূন্য দিয়ে শুরু করা হয় তবে এটি 3 টি অক্ষর বাঁচাতে পারে।

উদাহরণ ( অনলাইন ):

> 3 3
1 2

> 23 21
1 2 4 8 9 16 18 23

3

গণিত, 104 অক্ষর

{n,k}=FromDigits/@StringSplit@InputString[];Select[Range@n,OddQ@DivisorSum[#,If[#>k,0,k+1-#]&]&]~Row~" "

উদাহরণ:

[1]: = {n, কে} = ফ্রিডিজিটস / @ স্ট্রিংস্প্লিট @ ইনপুটস্ট্রিং []; [রেঞ্জ @ এন, ওড্ডকিউ @ ডিভাইডারসাম [#, যদি [#> কে, 0, কে + 1 - #] &] এবং] নির্বাচন করুন ] ~ সারি ~ ""

? 23 21

[1] = 1 2 4 8 9 16 18 23


1
: আপনি একটি ইনপুট স্ট্রিম অভিমানী, যেমন ইনপুট পার্স বন্ধ আরেকটি 15 অক্ষর কোপ করতে {n,k}=%~Read~{Number,Number}
টমাস

3

রুবি, 88

@ মান্যাটওয়ার্কের উত্তরের ভিত্তিতে

gets;~/ /
$><<(1..$`.to_i).select{|d|(1..k=$'.to_i).count{|m|d%m<1&&(k-m+1)%2>0}%2>0}*$&

এই ছদ্মবেশী গ্লোবালগুলি সর্বদা সিনট্যাক্স হাইলাইটিং বিরতি দেয়!


দুঃখিত, তবে 90 টি অক্ষর ( পুনর্বিবেচনা 2 ) এবং 86 টি অক্ষর ( পুনর্বিবেচনা 3 ) বগি বলে মনে হচ্ছে: 22, একটি নতুন সংখ্যা তাদের ফলাফলগুলিতে হাজির।
manatwork

@ মানাত ওয়ার্ক ভাল কল, আমি মনে করি আমি এটি এখন দুটি অক্ষরের ব্যয়ে স্থির করেছি। আমার মনে হচ্ছে এই countবিটটি আরও উন্নত হতে পারে, আমি চাই রুবি এর #sumমতো জিনিসের জন্য কোনও পদ্ধতি তৈরি করতে পারে:>
পল প্রেস্টিজ

কি দারুন! সত্যিই মুগ্ধ।
manatwork

3

পাইথন 3, 97 84

যদি কোনও বানর যদি একাধিক রাউন্ডে উপস্থিত হয় তবে এটি কোনও পরিবর্তন নয়। যদি কোনও বানর যদি একাধিকবার উপস্থিত হয় তবে এটি ঠিক এক রাউন্ডের সমান।

সুতরাং কিছু বানরকে ছেড়ে দেওয়া যেতে পারে এবং অন্যদের কেবল একবার দরজা স্যুইচ করতে হবে।

N,K=map(int,input().split())
r=set()
while K>0:r^=set(range(K,N+1,K));K-=2
print(*r)

এর জন্য আউটপুট 23 21:

1 2 4 8 9 16 18 23

সেট অপারেশনের চালাক ব্যবহার! আমার মনে হয় আপনি খাটো করতে পারেন range(2-K%2,K+1,2)থেকে range(K,0,-2)
xnor

বা আরও ভাল, forলুপটি একটি whileলুপের সাথে প্রতিস্থাপন করুন :while K>0:r^=set(range(K,N+1,K));K-=2
xnor

@ এক্সনর: ধন্যবাদ, দারুণ!
মনিকা

2

আর - 74

x=scan(n=2);cat(which(colSums((!sapply(1:x[1],`%%`,1:x[2]))*x[2]:1)%%2>0))

সিমুলেশন:

> x=scan(n=2);cat(which(colSums((!sapply(1:x[1],`%%`,1:x[2]))*x[2]:1)%%2>0))
1: 23 21
Read 2 items
1 2 4 8 9 16 18 23

2

জাভাস্ক্রিপ্ট 148 127

function e(n,k){b=array(n);d=[];function a(c){for(i=0;i<n;i+=c)b[i]=!b[i];c<k&&a(c+1)}a(1);for(i in b)b[i]&&d.push(i);return d}

এখানে একটি (ক্ষুদ্র বিট) পাঠযোগ্য সংস্করণ:

function e(n, k) {     //define N and K
     b = array(n); //declare all doors as closed
     d = [];     //create array later used to print results

     function a(c) {   //(recursive) function that does all the work
         for (i = 0; i < n; i += c)  //increment by c until you reach N and...
              b[i] = !b[i];  //toggle said doors
         c < k && a(c + 1)  //until you reach k, repeat with a new C (next monkey)
     }
     a(1); //start up A

     for (i in b) b[i] && d.push(i); //convert doors to a list of numbers
     return d //NO, i refuse to explain this....
}   //closes function to avoid annoying errors

ডেমো ভাজা

আমার লক্ষ করা উচিত যে এটি 0 থেকে গণনা শুরু হয় (প্রযুক্তিগতভাবে একটি বাই ত্রুটি)


আপনি যদি ২ য় লাইনটি পরিবর্তন করেন তবে আপনি আপনার ২ য় লাইনটি সরিয়ে ফেলতে পারেন b=Array(n);এটি আপনার অ্যারেটিকে সংজ্ঞায়িতভাবে পূর্ণ n দৈর্ঘ্যের হিসাবে আরম্ভ করবে। অপরিবর্তিত সত্য, সুতরাং প্রথম বানর পাস এটিকে সমস্ত সত্যে পরিণত করবে।
path411

@ path411 আপনাকে অনেক ধন্যবাদ! আমি অবাক হয়েছি আমি ভুলে গেছি কীভাবে "যথাযথ" অ্যারে ডিক্লেয়ারেশন কাজ করে! আপনি নির্দ্বিধায় অনুভব করতে পারেন+1
ম্যাথ চিলার

মজাদার. দেখে মনে হচ্ছে আপনার একমাত্র আমি এখন পর্যন্ত দেখেছি যে এন = 23, কে = 21 এর জন্য আমার মতো অনুরূপ উত্তর পেয়েছে। কেবলমাত্র
বাইরের

আমার কী দোষ হয়েছে তা নির্ধারণ করা হয়েছে এবং এটির একই সমস্যা রয়েছে। প্রতিটি রাউন্ডের জন্য, আপনি সমস্ত দরজা দিয়ে কেবল একটি বানর প্রেরণ করছেন। তবে, চ্যালেঞ্জের নির্দিষ্টকরণের অনুযায়ী, প্রতি রাউন্ডে $ i বানরগুলি চলতে হবে - যেখানে আপনি যে রাউন্ডে চলেছেন তার সংখ্যা $ i।
ইসজি

2

জাভাস্ক্রিপ্ট, 153

(function(g){o=[],f=g[0];for(;i<g[1];i++)for(n=0;n<=i;n++)for(_=n;_<f;_+=n+1)o[_]=!o[_];for(;f--;)o[f]&&(l=f+1+s+l);alert(l)})(prompt().split(i=l=s=' '))

এন = 23, কে = 21 এর আউটপুট:

1 2 4 8 9 16 18 23  

Chrome এ পরীক্ষিত, তবে কোনও অভিনব নতুন ECMAScript বৈশিষ্ট্য ব্যবহার করে না তাই কোনও ব্রাউজারে কাজ করা উচিত!

আমি জানি আমি অন্য এন্ট্রিগুলির বিরুদ্ধে কখনই জিততে পারি না এবং @TryingToGetProgrammingStrainght ইতিমধ্যে জাভাস্ক্রিপ্টে একটি এন্ট্রি জমা দিয়েছিল, তবে এন = 23, কে = 21 এর জন্য আমি একই ফলাফল পাচ্ছিলাম না কারণ অন্যরা যেভাবে পাচ্ছে তাই আমি ভেবেছিলাম আমার নিজের সংস্করণে যেতে হবে।

সম্পাদনা : টীকাগুলি উত্স (এটি আবার সন্ধানের জন্য, আমি আরও 3 টি অক্ষর সংরক্ষণ করার জন্য জায়গাগুলি সন্ধান করেছি, সম্ভবত এটি এখনও উন্নত হতে পারে ...)

(function(g) {
    // initialise variables, set f to N
    o = [], f = g[0];

    // round counter
    // since ++' ' == 1 we can use the same variable set in args
    for (; i < g[1]; i++)
        // monkey counter, needs to be reset each round
        for (n = 0 ; n <= i; n++)
            // iterate to N and flip each Kth door
            for (_ = n; _ < f; _ += n + 1)
                // flip the bits (as undef is falsy, we don't need to initialise)
                // o[_] = !~~o[_]|0; // flips undef to 1
                o[_] = !o[_]; // but booleans are fine
    // decrement f to 0, so we don't need an additional counter
    for (;f--;)
        // build string in reverse order
        o[f] && (l = f + 1 + s + l); // l = (f + 1) + ' ' + l
    alert(l)
    // return l // use with test
// get input from user and store ' ' in variable for use later
})(prompt().split(i = l = s = ' '))
// })('23 21'.split(i = l = s = ' ')) // lazy...

// == '1 2 4 8 9 16 18 23  '; // test

ভাল কাজ! আপনি যদি একটি পঠনযোগ্য এবং মন্তব্যযুক্ত সংস্করণও সরবরাহ করতেন তবে আমি সম্ভবত করব+1
ম্যাথ চিলার

উত্তর আপডেট হয়েছে! যেহেতু আমি আপনার উত্তরে মন্তব্য করতে পারি না, @ path411 এর মন্তব্যে যোগ করতে আপনি বি = [] সেট করতে পারেন এবং খালি সূচিগুলি এখনও অপরিজ্ঞাত এবং এটি আপনাকে আরও 6 টি অক্ষর বাঁচায়!
ডম হেস্টিংস

আমি ইতিমধ্যে এটি করেছি ....
ম্যাথ চিলার

1

রুবি - 65 টি অক্ষর

(1..n).each{|d|
t=0
(1..k).each{|m|t+=n-m+1 if d%m==0}
p d if t%2>0}

n = 23, k = 21 # => 1 2 4 8 9 16 18 23 

সিউডো-কোডে এখানে গণনা দেওয়া হল:

  • এস (ডি) কে রাউন্ডের পরে দরজা d কে কতবার স্পর্শ করা হয়েছে তা হতে দিন।
  • s (d) = যোগ (মি = 1.. মি = কে) (ডি% মি == 0? (এন-এম + 1): 0)
  • ডি (কে)% 2 = 1 (বা> 0) কে কে রাউন্ডের পরে খোলা হবে

আপনি যদি নিশ্চিত হন না যে s (d) এর জন্য অভিব্যক্তিটি সঠিক, তবে এটি এইভাবে দেখুন:

  • S (d, r) দ্বিগুণ হয়ে যাওয়ার পরে দ্বার d টি স্পর্শ করা হবে।
  • s (d, k) - s (d, k-1) = যোগ (মি = 1, .., এম = কে) (ডি% মি == 0? 1: 0)
  • s (d, k-1) - s (d, k-2) = যোগ (মি = 1, .., এম = (কে -1)) (ডি% মি == 0? 1: 0)
  • ...
  • s (d, 2) - s (d, 1) = d% 2 == 0? 1: 0
  • s (d, 1) = 1
  • s (d) এর জন্য উপরের মত প্রকাশের জন্য উভয় পক্ষের সমষ্টি করুন, যা s (d, k) এর সমান

খুব সংক্ষিপ্ত! কোথায় nএবং kথেকে আসা, যদিও? এবং আউটপুটটি ফাঁকের চেয়ে নতুন লাইনের দ্বারা পৃথক করা হয়েছে বলে মনে হচ্ছে।
পল প্রেসিডেজ

1

পাওয়ারশেল: 132

গল্ফ কোড:

$n,$k=(read-host)-split' ';0|sv($d=1..$n);1..$k|%{1..$_|%{$m=$_;$d|?{!($_%$m)}|%{sv $_ (!(gv $_ -Va))}}};($d|?{(gv $_ -Va)})-join' '

আন-গল্ফড, মন্তব্য কোড:

# Get number of doors and monkeys from user as space-delimited string.
# Store number of doors as $n, number of monkeys as $k.
$n,$k=(read-host)-split' ';

# Store a list of doors in $d.
# Create each door as a variable set to zero.
0|sv($d=1..$n);

# Begin a loop for each round.
1..$k|%{

    # Begin a loop for each monkey in the current round.
    1..$_|%{

        # Store the current monkey's ID in $m.
        $m=$_;

        # Select only the doors which are evenly divisible by $m.
        # Pass the doors to a loop.
        $d|?{!($_%$m)}|%{

            # Toggle the selected doors.
            sv $_ (!(gv $_ -Va))
        }
    }
};

# Select the currently open doors.
# Output them as a space-delimited string.
($d|?{(gv $_ -Va)})-join' '

# Variables cleanup - don't include in golfed code.
$d|%{rv $_};rv n;rv d;rv k;rv m;

# NOTE TO SELF - Output for N=23 K=21 should be:
# 1 2 4 8 9 16 18 23

ওহ, আমি দেখি আমার সমস্যা কী। আমি প্রশ্ন অনেকেই ভুল বুঝে ভাবেন - এই হল না 100 লকার সমস্যা। এই যে, একটি খাঁজ গ্রহণ! এর জন্য আরও কিছুটা কাজের প্রয়োজন হবে ...
ইসজি

1
খুব সুন্দর! চ্যালেঞ্জের প্রয়োজনীয়তাগুলি যথাযথভাবে পূরণ করার জন্য এটি ঠিক করা শেষ পর্যন্ত কেবলমাত্র 6 টি অক্ষরের লাভ অর্জন করেছে।
ইসজি

0

পাওয়ারশেল, 66 বাইট

ক্যারি সোভোল্যান্ডের উত্তরের ভিত্তিতে ।

param($n,$k)1..$n|?{$d=$_
(1..$k|?{($n-$_+1)*!($d%$_)%2}).Count%2}

পরীক্ষার স্ক্রিপ্ট:

$f = {

param($n,$k)1..$n|?{$d=$_
(1..$k|?{($n-$_+1)*!($d%$_)%2}).Count%2}

}

@(
    ,(3, 3   , 1,2)
    ,(23, 21 , 1, 2, 4, 8, 9, 16, 18, 23)
) | % {
    $n,$k,$expected = $_
    $result = &$f $n $k
    "$("$result"-eq"$expected"): $result"
}

আউটপুট:

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