জোসেফাস তিনটি ইনপুট নিয়ে সমস্যা


22

এই সাইটে একটি প্রশ্ন রয়েছে যা এই প্রশ্নের অনুরূপ, তবে আমি একটি বাঁক যোগ করেছি।

আপনি তিনটি ইনপুট আছে, বৃত্তে মানুষের সংখ্যা এন , -th ব্যক্তি আউট প্রতিটি পদে পদে, গণনা করে কুই -th যে ব্যক্তি প্রাণে বেঁচে যান। চেনাশোনাতে থাকা লোকেরা 1 থেকে n নাম্বারযুক্ত

উদাহরণস্বরূপ, 20 জনের একটি চেনাশোনাতে, 20 তম ব্যক্তি বেঁচে থাকা প্রথম ব্যক্তিটিকে সরানো হয়, 19 তম বেঁচে থাকা দ্বিতীয় ব্যক্তি সরানো হয় এবং আরও অনেক কিছু। সাধারণত, জোসেফাসের সমস্যাটি হ'ল শেষ ব্যক্তিকে সরিয়ে ফেলা নির্ধারণ করা , এখানে প্রথম বেঁচে যাওয়া বলা হয় ।

সংক্ষিপ্ততম প্রোগ্রাম বা ফাংশনটি লিখুন যা এই তিনটি ইনপুটগুলির সাথে, Q -th ব্যক্তির সংখ্যা বেঁচে থাকার জন্য প্রদান করে।

যদি স্পষ্টতার সাথে কোনও সমস্যা থাকে তবে দয়া করে আমাকে জানান।

কিছু উদাহরণ:

>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46

সম্পাদনা: ধরে নিন সমস্ত ইনপুট বৈধ। এটি হ'ল কেউ 0 বা কোনও নেতিবাচক সংখ্যার জন্য জিজ্ঞাসা করবে না এবং 5 জনের চেনাশোনাতে 20 তম বেঁচে থাকার জন্য কেউ জিজ্ঞাসা করবে না (যা, 1 ≤ q ≤ n)

সম্পাদনা করুন: আমি 2 ডিসেম্বর শুরুতে মধ্যরাত ইউটিসি + 7 এ একটি উত্তর গ্রহণ করব।


1
প্রশ্নের সমাধান না করে দয়া করে উত্তর হিসাবে নিজের সমাধান পোস্ট করুন।
ডুরকনব

বুঝেছি. সে সম্পর্কে দুঃখিত
শার্লক 9

1
স্পষ্টতার জন্য, যদি q=1এটি লিঙ্কযুক্ত জোসেফাস প্রশ্নের ঠিক একই হয়, তাই না?
অ্যাডমবর্কবার্ক

@ টিমমিড ঠিকঠাক
শার্লক 9

উত্তর:


5

পাইথ, 16 বাইট

eu.<PGvzh-QvwShQ

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষা স্যুট

ইনপুট ফর্ম হয় k<newline>n<newline>q

ব্যাখ্যা:

eu.<PGvzh-QvwShQ   implicit: z = first input line (string)
                             Q = second input line (integer)
              hQ   Q + 1
             S     the range [1, 2, ..., Q+1]
 u      h-Qvw      apply the following statement (Q-input()+1) times to G=^
    PG                remove the last number of G
  .<  vz              and rotate eval(z) to the left
e                  print the last number of the resulting list  

7

পিট, 280 273 কোডেল

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা করুন: আমি এটিকে আরও কিছুটা নীচে ফেলেছি এবং আমি মনে করি এটি আরও গল্ফ করতে পারি তবে এটি এখনও আসেনি। আপাতত, আমি এটি ঠিক কাজ করে খুশি এবং বাম-কোণে নীচে এটি সাইন করার জন্য আমার কাছে জায়গা ছিল। আমার আরও কোডেল সংরক্ষণ করতে হবে এমন দুটি ধারণা হ'ল pop, push 1, add, out num) লুপের পরে স্ট্যাক ম্যানিপুলেশনে কোডেলগুলি সংরক্ষণ করার জন্য নীচের বাম কোণায় আবার নকল করতে শেষ নির্দেশাবলী (পপ এন, আউটপুট আর + 1) পরিবর্তন করতে হবে ।

উপরের ছবিটি আমার কোডে প্রতি কোডে 8 পিক্সেল। সাধারণভাবে, এটি আমার পাইথন উত্তরের মতো একই অ্যালগরিদম তবে কে , কিউ , এন এর ক্রমযুক্ত ইনপুটগুলির সাথে । অনুশীলনে, স্ট্যাক ম্যানিপুলেশনের একটি দুর্দান্ত কাজও রয়েছে। আপনি এখানে চিত্রটি খোলার মাধ্যমে এবং এটির সাথে কোডটি চালিয়ে চেষ্টা করতে পারেন ।

ব্যাখ্যা

এটি সমাধানের একটি ধাপে ধাপে অলগফোলিং।

in num    get k
dup       Stack: k k
push 1
subtract  Stack: k k-1
in num    get q
dup       Stack: k k-1 q q
dup       Stack: k k-1 q q q
push 4
push 2
roll      Stack: k q q k-1 q
mod       Stack: k q q r
in num    get n
# note: the loop will return to the following codel
dup       Stack: k q q r n n
push 4
push 3
roll      Stack: k q r n n q
greater   1 or 0
pointer   Here the loop begins. If q>n, the pointer moves clockwise.
          Else, it points straight ahead

LOOP:     Stack: k i r n (i=q at the start of the loop)
push 4
push 2
roll      Stack: r n k i
push 1
add       Stack: r n k i=i+1
push 2
push 1
roll      Stack: r n i k
dup       Stack: r n i k k
push 5
push 4
roll      Stack: n i k k r
add       Stack: n i k m=r+k
push 3
push 2
roll      Stack: n k m i
dup       Stack: n k m i i
push 3
# here it turns the corner
push 1
roll      Stack: n k i m i
mod       Stack: n k i r=m%i
push 4
# here it turns the corner and avoids the black codels
push 1
roll      Stack: r n k i
dup       Stack: r n k i i
push 5
push 3
roll      Stack: k i i r n
dup       Stack: k i i r n n
# and we meet up with the dark green codel once more
push 4
push 3
roll      Stack: k i r n n i
greater   Stack: k i r n (0 or 1)
pointer   if else again

# else    Stack: k i r n
push 2    
push 1
roll      Stack: k i n r
# and turn the corner
push 1
add       Stack: k i n r+1
out num   print r+1
# turn the corner into the end pattern (the shape with the black edges)
END

আপনি খালি জায়গা গণনা করছেন না? পিটকে কীভাবে স্কোর করবেন সে সম্পর্কে কোথাও কোনও মেটা পোস্ট রয়েছে? সম্ভবত সেখানে থাকা উচিত।
স্পার

@ স্পার, আমি খালি জায়গা গণনা করছি। এটি 13 কোডেলের 21 বাই একটি কোডেল চিত্র, সুতরাং স্কোরটি 273 কোডেল।
শার্লক 9

আহ, আমি ভুল হিসাব করেছিলাম দুঃখিত।
স্পার

4

সিজেম, 22 20 19 বাইট

q~_,@a@*{m<)\}%\~=)

এই হিসাবে ইনপুট পড়া q k nসিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

q~                   Read and evaluate all input. This pushes q, k, and n.
  _,                 Push A := [0 ... n-1].
    @a               Rotate on top of the stack and wrap it in an array.
      @*             Rotate the original n on top and repeat [k] n times.
        {    }%      For each of the n k's:
         m<            Rotate A k units to the left.
           )\          Pop the last element and swap it with A.
               \~    Swap the resulting array with q and apply bitwise NOT.
                 =)  Select the corresponding element and add 1 to it.

3

গল্ফস্ক্রিপ্ট, 58 56 55 35 31 30 বাইট

ধরে নিচ্ছি তিনটি ইনপুট ইতিমধ্যে স্ট্যাকের মধ্যে রয়েছে এন , কে , কিউ

~1$(1$%3$),@),-{\2$+\%}%\)])\;

এই সমাধানটি ধরে নিয়েছে আমার চূড়ান্ত উত্তর ছাড়া আমার সমস্ত কিছু থেকে মুক্তি পাওয়া দরকার।

কিভাবে এটা কাজ করে

দেখুন j(n,k,q)আরো বিস্তারিত জন্য আমার পাইথন 3 দ্রবণে।

~                                   Read the inputs n, k, q
 1$(                                Duplicate k, decrement
    1$                              Duplicate q
      %                             (k-1)%q
       3$),                         Create array [0..n+1]
           @),                      Create array [0..q+1]
              -                     Subtract the second array from the first,
                                        leaving only [q+1..n+1]
               {      }%            Map the following statement onto [q+1..n+1].
                                        The numbers from this array will be denoted i.
                \                   Swap i and r
                 2$+                Duplicate k, add to r
                    \               Swap r and i
                     %              r mod i
                        \)          Swap the leftover array from map with r, increment
                          ]         Put the whole stack into an array
                           )        Remove the last member of the array, r
                            \;      Pop the array, leaving only the result

সম্পাদনা 1: ব্যবহৃত @ ডুরকনব্বের পরামর্শ (অ্যারেতে সমস্ত ইনপুটগুলি পেতে একটি + যুক্ত করা হয়েছে)

পূর্বে,

\.(2$2$*1$4$%-{.5$3$*>!}{~)2$*1$/~)}while 4$3$*\-)\;\;\;\;

সম্পাদনা 2: উইকির নিয়ম অনুসারে, যুক্ত Added এবং কোডটি সংক্ষিপ্ত করে। ধন্যবাদ @ ডেনিস

পূর্বে,

[\.(2$2$*1$4$%-{.5$3$*>!}{~)2$*1$/~)}while 4$3$*\-)]+)\;

সম্পাদনা 3: একটি সংক্ষিপ্ত অ্যালগরিদম প্রয়োগ করা হয়েছে।

পূর্বে,

~\.(2$2$*1$4$%-{.5$3$*>!}{~)2$*1$/~)}while 4$3$*\-)]-1=

সম্পাদনা 4: আমি %মানচিত্র হিসাবে ব্যবহার করতে পারলাম তা নির্ধারণ করা।

পূর্বে,

~1$(1$%{1$4$<}{\)\2$+1$%}while)])\;

5 সম্পাদনা করুন: গৌণ সম্পাদনা। পরিবর্তিত 2$করতে @করতে [0..q-1]এবং 3$করতে 2$পুনরুদ্ধার করতে k। একটি কামড় সংরক্ষণ

পূর্বে,

~1$(1$%3$),2$),-{\3$+\%}%\)])\;

1
\;\;\;\;])\;(অ্যারে, ডান-আনসন, অদলবদল এবং পপ মোড়ানো) দিয়ে প্রতিস্থাপন করা যেতে পারে ।
ডুরকনব

স্পষ্টতার জন্য আমার কোড সম্পাদনা করুন ডেনিস।
শার্লক 9

ঠিক আছে @ ডেনিস। Programs যুক্ত করে এবং কেবল প্রোগ্রাম এবং ফাংশনগুলিকে অনুমতি দেওয়ার জন্য প্রশ্নটি সম্পাদনা করে। তোমার অন্য কোনো পরামর্শ আছে?
শার্লক 9

না, সব ভাল। :)
ডেনিস

2

জাভাস্ক্রিপ্ট (ES6), 56 বাইট

(n,k,q)=>{r=(k-1)%q;for(i=q;i<n;r=(r+k)%++i);return r+1}

Ungolfed

মূলত @ শেরলক 9 এর পাইথন উত্তরের একটি জাভাস্ক্রিপ্ট অভিযোজন ।

(n,k,q)=>{
  r=(k-1)%q;
  for(i=q;i<n;r=(r+k)%++i);
  return r+1
}

পরীক্ষা

n = <input type="number" id="N" value="100" /><br />
k = <input type="number" id="K" value="9" /><br />
q = <input type="number" id="Q" value="12" /><br />
<button onclick="result.innerHTML=(

(n,k,q)=>{r=(k-1)%q;for(i=q;i<n;r=(r+k)%++i);return r+1}

)(+N.value,+K.value,+Q.value)">Go</button><br />
<pre id="result"></pre>


আমি ফোন না আপনার ungolfed সংস্করণ ungolfed: পি
ফান্ড মনিকা এর মামলা

1

গণিত, 50 বাইট

<<Combinatorica`
Tr@Position[Josephus@##2,1+#2-#]&

একটি বেনামী ফাংশন। ক্রমে ইনপুট নেয় q,n,k


1

সি, 81 73 বাইট

বন্ধ ভিত্তি করে @ user81655 এর আমার পাইথন উত্তর জাভাস্ক্রিপ্ট বাস্তবায়ন।

সম্পাদনা: সরানো i

int j(int n,int k,int q){int r=(k-1)%q;for(;q<n;r=(r+k)%++q);return r+1;}

পরীক্ষা

#include <stdio.h>
int j(int n,int k,int q){int r=(k-1)%q;for(;q<n;r=(r+k)%++q);return r+1;}
int main()
{
    printf("%d\n", j(20,3,9));
    return 0;
}

সি এর কিছু সংস্করণে, আপনি intপ্যারামিটারের নামগুলির আগে ড্রপ করতে পারেন ।
মনিকার লসুইট

1

পাইথন 3, 72 66 62 বাইট

62 বাইটে একটি গতিশীল প্রোগ্রামিং ফাংশন। উইকিপিডিয়ায় অ্যালগরিদম থেকে অভিযোজিত এই পৃষ্ঠায় যখন Q = 1 (অর্থাত্ i = 1, r = 0) তখন এই অ্যালগরিদমের প্রত্যক্ষ বাস্তবায়ন হত তবে আমি দেখতে পাচ্ছি যে এটি এখন সরানো হয়েছে।

সম্পাদনা 1: আমি i4 বাইট সংরক্ষণ করতে সরিয়েছি । ব্যাখ্যা অপরিবর্তিত রয়েছে।

সম্পাদনা 2: বাইট গণনায় আর্থিক হিসাব। আমি \r\nEOL এর জন্য ব্যবহার করছিলাম এবং কখন এতে 3 বাইট যুক্ত হবে তা লক্ষ্য করিনি। আমি সেই অনুযায়ী আমার বাইট গণনা কমিয়েছি।

def j(n,k,q):
 r=(k-1)%q
 while q<n:q+=1;r=(r+k)%q
 return r+1

এটি কীভাবে কাজ করে

def j(n,k,q):
 i=q;r=(k-1)%q              We start with the smallest possible circle to have a q-th
                                survivor, a circle of q people.
 while i<n:i+=1;            Iterate from q to n
                r=(r+k)%i   Every time you add people to the circle, r increases by k, 
                                modulo the current size of the circle i.
 return r+1                 Return the result.

@ ডেনিসকে আমাকে মনে করিয়ে দেওয়ার জন্য ধন্যবাদ যে আমাকে আমার কোডটি ব্যাখ্যা করা উচিত (কেবলমাত্র নিখুঁতভাবে, কারণ তিনি তার উত্তরে একটি অন্তর্ভুক্ত করেছেন)। যদি কিছু অস্পষ্ট থাকে তবে দয়া করে আমাকে জানান।

সম্পাদনা:

পূর্বে,

একটি পুনরাবৃত্তি ফাংশন যা গ্রাহাম, নুথ এবং পাতাসনিক দ্বারা কংক্রিট গণিত থেকে অভিযোজিত । যদিও এই অ্যালগরিদম দীর্ঘতর, বৃহত্তর এন এবং ছোট কে এর জন্য এটি দ্রুত ।

def t(n,k,q):
 m=k-1;z=q*k-m%q
 while z<=n*m:z=-(-z*k//m)
 return n*k-z+1

1
দেখে মনে হচ্ছে আপনি অনুলিপি-পেস্ট করাতে কিছু কেটে দিয়েছেন, একটি ঝুলন্ত রয়েছে +
xnor

1

পিএইচপি, 71 বাইট

@ শেরলক 9 এর উত্তরগুলির ভিত্তিতে অ্যালগরিদমের জন্য তার পাইথন উত্তরটি দেখুন।

function a($n,$k,$q){for($r=($k-1)%$q;$q<$n;$r=($r+$k)%++$q);echo$r+1;}

বিকল্পভাবে, এখানে অ্যালগরিদম ছাড়াই আমার আসল নির্বোধ পদ্ধতি। এটি কোন অ্যারে ব্যবহার করে যা লোক খুঁজে পাওয়া যায় তা চিহ্নিত করতে।

91 বাইট

function a($n,$k,$q){for($r=--$i;$q<=$n;++$i%$k||$c[$r]=$q++)while($c[$r=++$r%$n]);echo$r;}

1

হাস্কেল, 48 47 43 বাইট

(n!k)q=1+foldl(mod.(k+))(mod(k-1)q)[q+1..n]

জোসেফাস ফাংশনের রোসটা কোড পৃষ্ঠাতে একটি হাস্কেল অ্যালগরিদমের ভিত্তিতে দুটি ইনপুট রয়েছে। গল্ফিং পরামর্শ স্বাগত।

সম্পাদনা করুন: পয়েন্টফ্রি সংস্করণের পরামর্শ দিয়ে প্রথম অ্যালগরিদমকে গল্ফ করতে সহায়তা করার জন্য এবং কীওয়ার্ডটি বিদ্যমান আছে তা আমাকে জানাতে দিয়ে দ্বিতীয় অ্যালগরিদমকে গল্ফিংয়ের সহায়তার জন্য নিমিকে ধন্যবাদ জানাইuntil

(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)

আমার পাইথন উত্তরের শেষে অ্যালগরিদমের একটি সংস্করণ গ্রাহাম, নুথ এবং পাতাসনিকের কংক্রিট গণিত থেকে অভিযোজিত। যদিও এই অ্যালগরিদমটি 62 বাইটে বেশি, এবং প্রথমটির চেয়ে কম গল্ফ করা হয়নি, এটি বড় nএবং ছোটের পক্ষে দ্রুত k

Ungolfed:

প্রথম অ্যালগরিদম

jos_g num step q = 1 + foldl (\x -> mod (x + step) ) (mod (step-1) q) [q+1..num]

দ্বিতীয় অ্যালগরিদম

jos_gkp num step q
    -- ceiling throws a type-related fit with ceiling(z*k/(k-1))
    -- better to use - div (-z * k) (k - 1)
    | m <- step-1 = 1 + num*step - until (>num*m)(\z-> -div (-z*k) m) (q*step - mod m q) 

তাহলে আপনি কী নতুন ভাষা শিখতে এই প্রশ্নটি বেছে নিয়েছেন? 6-10 টি উত্তর উত্তর আপনার: পি
মেগো

@ মেগো আমি আড্ডায় এটি উল্লেখ করেছি: ডিআই জিজ্ঞাসা করেছিল যে আমাকে অন্যভাবে পোস্ট করা উচিত এবং তারা বলেছিল যে এগিয়ে যাও go হ্যাঁ। আমার বন্ধুরা আমাকে বলেছে যে এটি আমার "হ্যালো, ওয়ার্ল্ড!" নতুন ভাষার জন্য: ডি
শার্লক 9

আমি বলছি না এটি খারাপ জিনিস। আমি শুধু আনন্দিত, এটাই।
মেগো

@ Sherlock9: আপনি ব্যবহার করতে পারেন untilএকটি (বেশী বা কম) 2nd আলগোরিদিম পাইথন সংস্করণের সরাসরি অনুবাদের জন্য: (n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
নিমি

Youশ্বর আপনাকে মঙ্গল করুন, @ নিমিমি: ডিআই যুগে যুগে সমস্যাটি নিয়ে আমার মাথা বেঁধেছিল, চেষ্টা করছে foldlএবং অসীম তালিকা এবং সমস্ত ধরণের সামগ্রী রয়েছে। আপনার সাহায্যের জন্য ধন্যবাদ!
শার্লক 9

1

গেমমেকার ল্যাঙ্গুয়েজ (জিএমএল), 88 বাইট

@ ব্যবহারকারী 81655 এর উত্তরের ভিত্তিতে

r=argument0
k=argument1
q=argument2
r=(k-1)mod q;for(i=q;i<n;r=(r+k)mod ++i){}return r+1

1

জেলি , 14 13 বাইট

Rµṙ⁴ṖµL>⁵µ¿⁴ị

TryItOnline!

কিভাবে?

Rµṙ⁴ṖµL>⁵µ¿⁴ị - Main link: n, k, q
 µ            - monadic chain separation
R             - range(n): [1,2,3,...,n] - the circle of people
     µ   µ¿   - while
      L       -     length
       >      -     greater than
        ⁵     -     5th program argument (3rd input), i.e. q
  ṙ           -         rotate left by
   ⁴          -         4th program argument (2nd input) i.e. k
    Ṗ         -         pop - remove the rightmost person
            ị - get index
           ⁴  - 4th program argument (2nd input), i.e. k

0

রুবি, 53 48 বাইট

একটি ল্যাম্বদা।

->n,k,q{r=(k-1)%q;(q+=1;r=(r+k)%q)while q<n;r+1}

কিভাবে এটা কাজ করে

def j(n,k,q)
  r=(k-1)%q   # r starts at j[q,k,q]
  while q<n
    q+=1
    r=(r+k)%q # Every time you add people to the circle, r increases by k, 
              # modulo the current size of the circle q.
  end
  r+1         # Return the result.
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.