জোসেফাস সমস্যা (গণনা করা)


29

চ্যালেঞ্জ

একটি ফাংশন লিখুন যা দুটি ধনাত্মক পূর্ণসংখ্যার এন এবং কে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং প্রতিটি কে- তৃতীয় ব্যক্তিকে গণনা করার পরে n এর বাইরে থাকা শেষ ব্যক্তির সংখ্যা প্রদান করে ।

এটি একটি কোড-গল্ফ চ্যালেঞ্জ, তাই সংক্ষিপ্ততম কোডটি জয়ী।

সমস্যাটি

n লোকেরা ( 1 থেকে n পর্যন্ত সংখ্যাযুক্ত ) একটি বৃত্তে দাঁড়িয়ে আছেন এবং প্রতিটি কে- তৃতীয়াংশ একক ব্যক্তি অবশিষ্ট না হওয়া পর্যন্ত গণনা করা হয় (সংশ্লিষ্ট উইকিপিডিয়া নিবন্ধটি দেখুন )। এই শেষ ব্যক্তির সংখ্যা নির্ধারণ করুন।

যেমন কে = 3 এর জন্য দু'জন লোক এড়িয়ে যাবে এবং তৃতীয়টি গণনা করা হবে। জন্য অর্থাত এন = 7 নম্বরে (বিস্তারিতভাবে অর্ডার 3 6 2 7 5 1 আউট গণনা করা হবে 1 2 3 4 5 6 7 1 2 4 5 7 1 4 5 1 4 1 4 ) এবং এইভাবে উত্তর 4

উদাহরণ

J(7,1) = 7      // people are counted out in order 1 2 3 4 5 6 [7]
J(7,2) = 7      // people are counted out in order 2 4 6 1 5 3 [7]
J(7,3) = 4      // see above
J(7,11) = 1
J(77,8) = 1
J(123,12) = 21

উত্তর:


5

গল্ফস্ক্রিপ্ট, 17 বাইট

{{@+\)%}+\,*)}:f;

লাগে n kস্ট্যাক এবং স্ট্যাক ফলাফলের ছেড়ে।

ব্যবচ্ছেদ

এই ব্যবহারের পুনরাবৃত্তি g(n,k) = (g(n-1,k) + k) % nসঙ্গে g(1, k) = 0পুনরাবৃত্তির সঙ্গে (Wikipedia নিবন্ধটি বর্ণনা অনুযায়ী) একটি ভাঁজ দ্বারা প্রতিস্থাপিত।

{          # Function declaration
           # Stack: n k
  {        # Stack: g(i-1,k) i-1 k
    @+\)%  # Stack: g(i,k)
  }+       # Add, giving stack: n {k block}
  \,*      # Fold {k block} over [0 1 ... n-1]
  )        # Increment to move from 0-based to 1-based indexing
}:f;

আপনি কি একটি ব্যাখ্যা যোগ করতে পারেন, দয়া করে?
শার্লক 9

@ শার্লক 9, আমি প্রায় 3.5 বছর কেটে যাওয়ার পরেও আমি কী করছি তা নির্ধারণ করতে পেরেছি। কে বলে যে গল্ফস্ক্রিপ্ট কেবল পঠনযোগ্য? ;)
পিটার টেলর

হুম। এস / পঠন / লিখুন /
পিটার টেলর

দুঃখিত। আমি কেবল দু-তিন দিন আগে গল্ফস্ক্রিপ্ট শিখতে শুরু করেছি এবং আমি যখনই আপনার কোডটি পড়ি তখন আমি ভাবতে থাকি যে আমি কিছু মিস করছি। ... ঠিক আছে, আমি এখনও কিছু অনুপস্থিত করছি, কিভাবে ভাঁজ করে {k block}উপর [0..n-1]আপনি পেতে g(0,k) 0 kদিয়ে শুরু করতে? দুঃখিত, আমি যদি এই প্রশ্নগুলি ভুল জায়গায় পোস্ট করি।
শার্লক 9

@ শার্লক 9, ভাঁজ যুগলভাবে কাজ করে, তাই এটির প্রথম জিনিসটি মূল্যায়ন করা হয় 0 1 block। খুব স্বাচ্ছন্দ্যে, এমনটি ঘটে g(1, k) (2-1) block। সুতরাং এটি g(1,k) 1বরং শুরু হয় g(0,k) 0। তারপর অবরুদ্ধ নির্বাহ পর পরবর্তী আইটেম অ্যারে (থেকে push কর্মের 2) এবং ইত্যাদি আবার ব্লক executes,
পিটার টেলর

14

মিনস্কি রেজিস্টার মেশিন (25 টি অবিরাম রাজ্য)

প্রযুক্তিগতভাবে কোনও ফাংশন নয়, তবে এটি একটি কম্পিউটিং দৃষ্টান্তে রয়েছে যা প্রতি সেঞ্চায় ফাংশন নেই ...

এটি আমার প্রথম এমআরএম ব্যাখ্যামূলক চ্যালেঞ্জের মূল পরীক্ষার ক্ষেত্রে সামান্য প্রকরণ : মিনস্কি রেজিস্টার মেশিন হিসাবে জোসেফাসের সমস্যা

নিবন্ধগুলিতে ইনপুট nএবং k; রেজিস্টার আউটপুট r; এটি r=i=t=0প্রবেশের সময় ধরে নেওয়া হয়। প্রথম দুটি থামার নির্দেশাবলী হ'ল ত্রুটির ঘটনা।


আমি মনে করি আপনাকে আপনার মেশিনটি সামান্য সামঞ্জস্য করতে হবে। আমি যদি এটি সঠিকভাবে পড়ি তবে আউটপুটটি শূন্য-সূচকযুক্ত, তাই না?
হাওয়ার্ড

আমি অন্যভাবে ভাবছিলাম: যদি k=1তা হয় r=0। হুম, আমাকে এই সম্পর্কে আবারও ভাবতে হবে ...
হাওয়ার্ড

আমি আপনার ডায়াগ্রাম পড়া, iকেবল থেকে গণনা করা হয় 2করার nসময় rরেজিস্টার যা ফলাফলের accumulates হয়।
হাওয়ার্ড

@ হওয়ার্ড, আমি প্রথম যখন এটি লিখেছিলাম তখন আমি যে মন্তব্যগুলি করেছি তা সন্ধান করেছি এবং আপনি ঠিক বলেছেন। উপস। এখন সংশোধন করা হয়েছে (আমি বিশ্বাস করি - আরও পরে আরও ভাল পরীক্ষা করা হবে) test
পিটার টেলর

7

পাইথন, 36

আমি উইকিপিডিয়া থেকে সূত্রটিও ব্যবহার করেছি:

J=lambda n,k:n<2or(J(n-1,k)+k-1)%n+1

উদাহরণ:

>>> J(7,3)
4
>>> J(77,8)
1
>>> J(123,12)
21


5

সি, 40 অক্ষর

উপরের লিঙ্কযুক্ত উইকিপিডিয়া নিবন্ধটি দেয় এটি কেবলমাত্র সূত্রটি:

j(n,k){return n>1?(j(n-1,k)+k-1)%n+1:1;}

বিভিন্নতার জন্য, এখানে একটি বাস্তবায়ন যা প্রকৃতপক্ষে সিমুলেশন (99 টি) চালায়:

j(n,k,c,i,r){char o[999];memset(o,1,n);for(c=k,i=0;r;++i)(c-=o[i%=n])||(o[i]=!r--,c=k);
return i;}

4
একটি অক্ষর সংরক্ষণ করুন: j(n,k){return--n?(j(n,k)+k-1)%-~n+1:1;}
উগোরেন

5

ডিসি, 27 বাইট

[d1-d1<glk+r%1+]dsg?1-skrxp

উইকিপিডিয়া নিবন্ধ থেকে পুনরাবৃত্তি ব্যবহার করে। ব্যাখ্যা:

# comment shows what is on the stack and any other effect the instructions have
[   # n
d   # n, n
1-  # n-1, n
d   # n-1, n-1, n
1<g # g(n-1), n ; g is executed only if n > 1, conveniently g(1) = 1
lk+ # g(n-1)+(k-1), n; remember, k register holds k-1
r%  # g(n-1)+(k-1) mod n
1+  # (g(n-1)+(k-1) mod n)+1
]
dsg # code for g; code also stored in g
?   # read user input => k, n, code for g
1-  # k-1, n, code for g
sk  # n, code for g; k-1 stored in register k
r   # code for g, n
x   # g(n)
p   # prints g(n)

4

জে, 45 অক্ষর

j=.[:{.@{:]([:}.]|.~<:@[|~#@])^:(<:@#)>:@i.@[

সিমুলেশন চালায়।

বিকল্প হিসাবে, সূত্রটি ব্যবহার করে (31 টি অক্ষর):

j=.1:`(1+[|1-~]+<:@[$:])@.(1<[)

আমি আশা করি হাওয়ার্ড এতে কিছু মনে করবে না যে আমি জেতে ডায়াডিক ক্রিয়া অনুসারে ইনপুট ফর্ম্যাটটি সামান্য সামঞ্জস্য করেছি

ব্যবহার:

   7 j 3
4
   123 j 12
21

4

গল্ফস্ক্রিপ্ট, 32 24 বাইট

:k;0:^;(,{))^k+\%:^;}/^)

ব্যবহার: এনকে দুটি পরামিতি স্ট্যাকের মধ্যে থাকবে এবং আউটপুট মানটি ছেড়ে দেয় leaves

(পিটার টেলরকে পুনরাবৃত্ত পদ্ধতির এবং অন্যান্য অনেক টিপসের পরামর্শ দেওয়ার জন্য ধন্যবাদ)

32 টি অক্ষরের পুরাতন (পুনরাবৃত্ত হওয়া) পদ্ধতি:

{1$1>{1$(1$^1$(+2$%)}1if@@;;}:^;

এটি আমার প্রথম গল্ফস্ক্রিপ্ট, সুতরাং দয়া করে আপনার সমালোচনা আমাকে জানান।


1
1-বিশেষ opcode হয়েছে (। একইভাবে 1+হয় )। স্টোরেজের জন্য আপনাকে বর্ণানুক্রমিক অক্ষর ব্যবহার করতে হবে না, সুতরাং আপনি ^পরিবর্তে উদাহরণস্বরূপ ব্যবহার করতে পারেন Jএবং এর পরে কোনও স্থানের প্রয়োজন হবে না। আপনি অনেক বেশী আছে $s চেয়ে ভালভাবে golfed প্রোগ্রামে স্বাভাবিক আছেন: বিবেচনা কিনা তাদের কিছু সমন্বয় ব্যবহার করে কমে যায় \@.
পিটার টেলর

@ পিটারটেলর এই দুর্দান্ত টিপসের জন্য আপনাকে অনেক ধন্যবাদ! সমস্ত গল্ফস্ক্রিপ্ট অপারেটরকে ধরে রাখা বেশ কঠিন এবং আমি এই দু'জনকে খুব সোজাসাপ্টা উপেক্ষা করেছি। কেবলমাত্র প্রথম দুটি পরামর্শ প্রয়োগ করে আমি কোডটি পাঁচটি সংক্ষিপ্ত করে পরিচালনা করতে পারি manage আমি $উল্লেখগুলি সরিয়ে দেওয়ার চেষ্টা করব ।
ক্রিশ্চিয়ান লুপাস্কু

1
এছাড়াও, পুনরাবৃত্তি আসলে গল্ফস্ক্রিপ্টের জিনিস নয়। এটিকে চারদিকে উল্টানোর চেষ্টা করুন এবং লুপ করুন। আমি এটিকে 19 অক্ষরে নামতে পারি (অনির্ধারিত কোড তবুও) to ইঙ্গিত: gউইকিপিডিয়া নিবন্ধ থেকে ফাংশনটি তালিকাভুক্ত করুন , এবং ব্যবহার ,এবং /
পিটার টেলর

1
{,{\2$+\)%}*)\;}:f;এটি কেন কাজ করে তা আপনি বুঝতে পেরেছেন তা নিশ্চিত করুন ;)
পিটার টেলর

1
একটি চূড়ান্ত কৌশল: kলুপের ভিতরে প্রবেশ করার জন্য 2 টি অক্ষর এবং তারপরে আরও 2 +টি অক্ষর ব্যবহার না করে শেষের দিকে ফেলে দেওয়ার জন্য, আমরা 17 টি অক্ষরে নামার জন্য এটি ভিতরে টানতে পারি : {{@+\)%}+\,*)}:f;আমি সন্দেহ করি যে উন্নতি করা যায়।
পিটার টেলর



2

হাস্কেল, 68

j n=q$cycle[0..n]
q l@(i:h:_)k|h/=i=q(drop(k-1)$filter(/=i)l)k|1>0=i

আসল সিমুলেশন করে। প্রদর্শন:

জিএইচসিআই> জে 7 1
7
জিএইচসিআই> জে 7 2
7
জিএইচসিআই> জ 7 3
4
জিএইচসিআই জে 7 11
1
জিএইচসিআই> জ 77 8
1
জিএইচসিআই> জ 123 12
21



1

সি, 88 টি অক্ষর

সিমুলেশন করে, সূত্র গণনা করে না।
সূত্রের চেয়ে অনেক বেশি লম্বা, তবে অন্যান্য সি সিমুলেশনের চেয়ে কম।

j(n,k){
    int i=0,c=k,r=n,*p=calloc(n,8);
    for(;p[i=i%n+1]||--c?1:--r?p[i]=c=k:0;);
    return i;
}

দ্রষ্টব্য:
1. মেমরি বরাদ্দ করে এবং কখনই প্রকাশ হয় না।
2. n*8পরিবর্তে বরাদ্দ n*4, কারণ আমি ব্যবহার করি p[n]। বরাদ্দ করতে পারে (n+1)*4, তবে এটি আরও অক্ষর।


1

সি ++, 166 বাইট

Golfed:

#include<iostream>
#include <list>
int j(int n,int k){if(n>1){return(j(n-1,k)+k-1)%n+1;}else{return 1;}}
int main(){intn,k;std::cin>>n>>k;std::cout<<j(n,k);return 0;}

Ungolfed:

#include<iostream>
#include <list>
int j(int n,int k){
    if (n > 1){
        return (j(n-1,k)+k-1)%n+1;
    } else {
        return 1;
    }
}
int main()
{
    int n, k;
    std::cin>>n>>k;
    std::cout<<j(n,k);
    return 0;
}

2
আপনি Jটের্নারি অপারেটরটি ব্যবহার করে ফাংশনে বাইটস সংরক্ষণ করতে পারেন ।
ইয়াতসি

intnআপনার গল্ফযুক্ত সংস্করণটি সংকলন করবে না
ফিলিপ

আপনি এর মধ্যে স্থান সরাতে পারবেন#include <list>
ফিলিপ নার্দি বাতিস্তা

1

জে, 8 বাইট

1&|.&.#:

       1&|.&.#: 10
    5

       1&|.&.#: 69
    11

        1&|.&.#: 123456
    115841

        1&|.&.#: 123245678901234567890x NB. x keeps input integral
    98917405212792722853

All credit to Roger Hui, co-inventor of J and all-round uber-genius
www.jsoftware.com for free j software across many platforms

Explanation
    (J works right-to-left)
     #:       convert input to binary
     &.       a&.b <=> perform b, perform a, perform reverse of b
     1&|.     rotate bitwise one bit left

So
    1&|.&.#: 10

    a. #:            convert input (10) TO binary -> 1 0 1 0
    b. 1&|.          rotate result 1 bit left -> 0 1 0 1
    c. due to the &. perform convert FROM binary -> 5 (answer)

1
দুইটা ইনপুট নেওয়ার কথা নয়?
এরিক আউটগল্ফার


1

প্রশ্ন, 34 বাইট

f:{$[x=1;1;1+mod[;x]f[x-1;y]+y-1]}

ব্যবহার:

q)f .'(7 1;7 2;7 3;7 11;77 8;123 12)
7 7 4 1 1 21


0

হাস্কেল, ২৯

উইকিপিডিয়া থেকে সূত্র ব্যবহার করে।

1#_=1
n#k=mod((n-1)#k+k-1)n+1

0

জাভাস্ক্রিপ্ট (ECMAScript 5), 48 বাইট

ECMAScript 5 ব্যবহার করা যেহেতু এই প্রশ্নটি জিজ্ঞাসা করার সময় জাভাস্ক্রিপ্টের সর্বশেষতম সংস্করণ ছিল।

function f(a,b){return a<2?1:(f(a-1,b)+b-1)%a+1}

ES6 সংস্করণ (অ-প্রতিযোগী), 33 বাইট

f=(a,b)=>a<2?1:(f(a-1,b)+b-1)%a+1

ব্যাখ্যা

এখানে খুব বেশি বলার কিছু নেই. আমি কেবল উইকিপিডিয়া নিবন্ধটি আমাকে ফাংশনটি বাস্তবায়ন করছি।



0

8 ম , 82 বাইট

কোড

: j >r >r a:new ( a:push ) 1 r> loop ( r@ n:+ swap n:mod ) 0 a:reduce n:1+ rdrop ;

এসইডি (স্ট্যাক এফেক্ট ডায়াগ্রাম) হ'ল:n k -- m

ব্যবহার এবং ব্যাখ্যা

অ্যালগোরিদম এর মতো একটি পূর্ণসংখ্যার অ্যারে ব্যবহার করে: লোকের মান যদি 5 হয় তবে অ্যারেটি [1,2,3,4,5] হবে

: j \ n k -- m
    >r                               \ save k
    >r a:new ( a:push ) 1 r> loop    \ make array[1:n]
    ( r@ n:+ swap n:mod ) 0 a:reduce \ translation of recursive formula with folding using an array with values ranging from 1 to n
    n:1+                             \ increment to move from 0-based to 1-based indexing
    rdrop                            \ clean r-stack
;

ok> 7 1 j . cr
7
ok> 7 2 j . cr
7
ok> 7 3 j . cr
4
ok> 7 11 j . cr
1
ok> 77 8 j . cr
1
ok> 123 12 j . cr
21

0

জে , 24 বাইট

1+1{1([:|/\+)/@,.1|.!.0#

এটি অনলাইন চেষ্টা করুন!

গতিশীল প্রোগ্রামিং সমাধানের উপর ভিত্তি করে একটি পুনরাবৃত্তি পদ্ধতি।

ব্যাখ্যা

1+1{1([:|/\+)/@,.1|.!.0#  Input: n (LHS), k (RHS)
                       #  Make n copies of k
                 1|.!.0   Shift left by 1 and fill with zero
    1          ,.         Interleave with 1
             /@           Reduce using
           +                Addition
        |/\                 Cumulative reduce using modulo
  1{                      Select value at index 1
1+                        Add 1



0

জাপট , 15 বাইট

_é1-V Å}h[Uõ] Ì

এটি অনলাইন চেষ্টা করুন!

0-ইনডেক্সিং কে দ্বারা বাইট সংরক্ষণ করা যায় , তবে এটি আসলে কোনও সূচক নয় তাই আমি এর বিপরীতে সিদ্ধান্ত নিয়েছি।

ব্যাখ্যা:

         [Uõ]      :Starting with the array [1...n]
_      }h          :Repeat n-1 times:
 é1-V              : Rotate the array right 1-k times (i.e. rotate left k-1 times)
      Å            : Remove the new first element
              Ì    :Get the last value remaining


0

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

param($n,$k)if($n-lt2){1}else{((.\f($n-1)$k)+$k-1)%$n+1}

গুরুত্বপূর্ণ! স্ক্রিপ্ট নিজেকে পুনরাবৃত্তি বলে। সুতরাং f.ps1বর্তমান ডিরেক্টরিতে স্ক্রিপ্টটি ফাইল হিসাবে সংরক্ষণ করুন । এছাড়াও আপনি স্ক্রিপ্ট ফাইল পরিবর্তে স্ক্রিপ্ট ব্লক পরিবর্তনশীল কল করতে পারেন (নীচের পরীক্ষার স্ক্রিপ্ট দেখুন)। এই কলগুলির দৈর্ঘ্য একই।

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

$f = {

param($n,$k)if($n-lt2){1}else{((&$f($n-1)$k)+$k-1)%$n+1}

}

@(
    ,(7, 1, 7)
    ,(7, 2, 7)
    ,(7, 3, 4)
    ,(7, 11, 1)
    ,(77, 8, 1)
    ,(123,12, 21)
) | % {
    $n,$k,$expected = $_
    $result = &$f $n $k
    "$($result-eq$expected): $result"
}

আউটপুট:

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