ডার্টস কোডগল্ফের সাথে দেখা করেছেন


11

আমি মনে করি সবাই ডার্টগুলির সাথে পরিচিত, কিছু লোক স্কোরগুলি বুঝতে পারে না তাই এখানকার লোকদের জন্য এটির একটি দরকারী লিঙ্ক।

বোর্ড

একটি ডার্টবোর্ডকে 20 টুকরো করে কাটা পাইয়ের সাথে তুলনা করা যেতে পারে। প্রতিটি টুকরা 4 বিভাগে বিভক্ত।

  • ডাবল নামে পরিচিত একটি ছোট বাইরের রিং (পয়েন্ট x2)
  • সিঙ্গেল নামে একটি বড় রিং (পয়েন্ট x1)
  • ট্রিপল নামে পরিচিত আরেকটি ছোট রিং (পয়েন্ট x3)
  • সিঙ্গেল নামে পরিচিত আরও একটি বড় রিং (পয়েন্ট x1)

বোর্ডের মাঝখানে আরও দুটি রিং রয়েছে, একটি সবুজ এবং লাল একটি (ক্লাসিক বোর্ড)

  • লাল রিং, বোর্ডের কেন্দ্রটিকে বুলসি বা ডাবল ষাঁড় বলা হয় এবং এটি 50 পয়েন্টের জন্য ভাল। এটি একটিকে একটি ডাবল হিসাবে গণ্য করে এবং এটি এর সাথে এটি চেকআউট করার অনুমতি দেয়।
  • সবুজ আংটি, যাকে বলদ বলা হয়, একক ষাঁড় বা কেবল 25 এবং একক হিসাবে গণনা করা হয়।

চ্যালেঞ্জ

3 ডার্ট বা কম এর সাথে সমস্ত চেকআউট সম্ভাবনা সন্ধান করুন।
ব্যবহারকারীর একটি পূর্ণসংখ্যা প্রবেশ করতে পারে এবং আপনাকে 3 ডার্ট (বা আরও কম) দিয়ে 0 তে স্কোর পাওয়া সম্ভব কিনা তা আপনাকে পরীক্ষা করতে হবে।

উদাহরণ

উদাহরণ 1:

Input: 170  
Output: T20, T20, Bullseye

উদাহরণ 2:

Input: 6  
Output: D3;  
        S3,S1,D1;  
        S2,D2;  
        S2,S2,D1;  
        D2,D1;  
        S4,D1;  
        D1,D1,D1;  
        S1,S1,D2;  
        T1,S1,D1;

উদাহরণ 3:

Input: 169
Output: No possible checkout!

বিধি

  • বেসিক ডার্ট নিয়ম, আপনার অবশ্যই একটি ডাবল (বোর্ড বা বুলসি এর বাইরের আংটি) দিয়ে শেষ করা উচিত
  • বাহ্যিক সম্পদের ব্যবহার নেই।
  • সম্ভাব্য চেকআউটগুলির হার্ড কোডিং অনুমোদিত, তবে মনে রাখবেন এটি কোডগল্ফ, এটি আপনার কোডটি ছোট করবে না;)
  • হিট করার জন্য ঘরগুলি সি + এন ফর্ম্যাটে প্রদর্শিত হবে যেখানে ট্রিপলের জন্য সি = টি, ডাবলের জন্য ডি এবং একক জন্য এস।
    • বুলসেয়কে বুলসি বা ডিবি, ডিবুল বা কিছু কিছু সিমুলার বলা যেতে পারে।

সম্ভাব্য চেকআউট

আপনাকে শুরু করতে, সর্বাধিক সম্ভাব্য
চেকআউটটি 170 16
সর্বনিম্ন সম্ভব চেকআউট 2 2

এছাড়াও

এটি কোনও প্রয়োজন নয়, সমস্ত স্কোরের জন্য সমস্ত সম্ভাব্য চেকআউট দেখানোর সম্ভাবনা যুক্ত করুন। মূলত কারণ আমি ভাবছি যে কতগুলি সংমিশ্রণ সম্ভব: পি

সংক্ষিপ্ত কোড সহ বিজয়ী হবেন।

শুভ কোডিং।


1
প্রথম তালিকাভুক্ত নিয়মটি ভুল (এবং প্রথম উদাহরণটিকে অকার্যকর করে তোলে) কারণ আপনি একটি ষাঁড়টিও শেষ করতে পারেন। আপনি কোনও প্রোগ্রাম, কোনও ফাংশন বা উভয়ই প্রত্যাশা করছেন কিনা তা স্পষ্ট করে বলা সহায়ক হবে; এবং আউটপুট বিন্যাসে কতটা নমনীয়তা রয়েছে।
পিটার টেলর

1
@ পিটারটেলর আমি এটি আরও পরিষ্কার করব, যেহেতু মাঝের সবুজ রিং এবং লাল রিংটিকে একক ষাঁড় এবং বুলসি বা ডাবল ষাঁড় বলা হয়।
টিউন প্রংক

1
চমৎকার প্রশ্নের জন্য +1। এটি এমন এক ধরণের বাস্তব সমস্যা যা কম্পিউটারগুলি সমাধানে ভাল। আপনি এস 2 ডি 1 ডি 1-তে একটি 6 ফেলে দিতে পারেন, যা আপনার উদাহরণ আউটপুট থেকে অনুপস্থিত (এটি সেখানে থাকা উচিত, যদি না আপনি S2 S2 D1 এবং D1 D1 D1 কে এক হিসাবে বিবেচনা করেন তবে সেগুলি স্পষ্টভাবে আলাদা হিসাবে তালিকাভুক্ত না হয়)) কিছু রয়েছে আউটপুট ফর্ম্যাট এবং ফলাফলগুলির গণনা সম্পর্কে ছোটখাটো অস্পষ্টতা যা আমি আমার উত্তরে সম্বোধন করব।
স্তর নদী সেন্ট

উত্তর:


2

সি ++ 248/228 230/214 অক্ষর

রেভ 0:

int f(int s){char m[4]="SDT";int t=0;for(int b=2;b<77;b+=1+(b==62)*12)for(int a=2;a<77;a+=1+(a==62)*12){int c=s-a/3*(a%3+1)-b/3*(b%3+1);if(((c+38)/40==1)|(c==50)&&(c%2==0)&(a>=b)){printf("%c%d %c%d D%d\n",m[a%3],a/3,m[b%3],b/3,c/2);t++;}}return t;}

Rev 1. একবারে সমস্ত ভেরিয়েবল ঘোষণা করে এবং অপ্রয়োজনীয় বন্ধনীগুলি বাদ দিয়ে কিছু অক্ষর সংরক্ষণ করা হয়েছে। দেখা যাচ্ছে যে সি ++ তে সমস্ত যুক্তি এবং বিটওয়াইজ এবং / অথবা তুলনার চেয়ে কম অগ্রাধিকার রয়েছে।

int f(int s){char m[4]="SDT";int a,b,c,t=0;for(b=2;b<77;b+=1+(b==62)*12)for(a=2;a<77;a+=1+(a==62)*12){c=s-a/3*(a%3+1)-b/3*(b%3+1);if(c>1&c<41|c==50&&c%2==0&a>=b){printf("%c%d %c%d D%d\n",m[a%3],a/3,m[b%3],b/3,c/2);t++;}}return t;}

আমি অন্যদের মতো প্রোগ্রামের চেয়ে একটি ফাংশন করেছি। এটি প্রাপ্ত সম্ভাবনার মোট সংখ্যা প্রদান করে। মোট বৈশিষ্ট্যটি বাদ দিয়ে এটি 230 থেকে 214 টি অক্ষরে হ্রাস করা যেতে পারে।

নমুনা আউটপুট, স্কোর 6:

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

ওপি যেমন করেছে তেমন একই সংমিশ্রণ হিসাবে আমি প্রথম এবং দ্বিতীয় ডার্টকে আলাদা গণনা করি (উদাহরণস্বরূপ:

টি 1 এস 1 ডি 1 = এস 1 টি 1 ডি 1) যদিও এর জন্য অতিরিক্ত 7 টি অক্ষর ব্যয় হয়। আমি সর্বদা উচ্চতর স্কোরকে প্রথমে তালিকাবদ্ধ করি (দ্বিগুণ এবং কাঁপানো উপেক্ষা করে) কারণ আমি বুঝতে পারি যে এটি খেলোয়াড়ের সাথে আরও প্রাসঙ্গিক (যিনি তার কৌশলটি পরিবর্তন করতে পারেন যদি তিনি প্রথম ডার্ট দিয়ে মিস করেন।) একই কারণে আমি ডার্টগুলিকে ক্রম অনুসারে তালিকাবদ্ধ করি দ্বিতীয় ডার্ট। আমি 3 য় ডার্টটিকে অন্য দুটির সাথে সম্পূর্ণ আলাদা বলে বিবেচনা করি, তাই আমি ডি 1 ডি 2 এবং ডি 2 ডি 1 কে আলাদা কেস হিসাবে বিবেচনা করি যেখানে ওপি সেগুলিকে একই হিসাবে তালিকাভুক্ত করেছে।

গণনা করার এই সিস্টেমের সাথে আমি মোট সম্ভাবনাগুলি পেয়েছি 42 মিম্বোবাসের মতোই ibilities বিভিন্ন প্রথম এবং দ্বিতীয় ডার্টকে বিভিন্ন সংমিশ্রণ হিসাবে গণনা করা হচ্ছে, এটি 83349 পর্যন্ত যায়।

অন্যরা যেমন করেছে তেমন সেটগুলি সহ আমি লুপের জন্য ব্যবহার করি নি (আমি সি ++ তে মোটামুটি নতুন এবং এটি সম্ভব কিনা তাও আমি জানি না)) পরিবর্তে আমি লুপের বর্ধনে 20 থেকে 25 অবধি লাফিয়ে শর্তাধীন গালাগালি করি আমি একটি একক লুপ থেকে ভেরিয়েবলটি একটি একক ডার্টের জন্য সমস্ত সম্ভাব্য স্কোরকে এনকোড করতে ব্যবহার করি, যেমন: এস 1 ডি 1 টি 1 এস 2 ডি 2 টি 2 ইত্যাদি মডিউলাস এবং বিভাগের সাথে ডিকোড করতে। এটি লুপগুলির জন্য আরও ঘোষণার ভার্বোসিতে বাঁচায়, যদিও এটি প্রকাশকে আরও জটিল করে তোলে।

এর ফলাফলটি হ'ল একটি অব্যবহৃত ডার্টকে টি 0 হিসাবে দেখানো হয়েছে, তবে আমি মনে করি এটি স্পষ্টভাবে কী বোঝাচ্ছে, বিশেষত (একই সংমিশ্রণ হিসাবে বিভিন্ন প্রথম এবং দ্বিতীয় ডার্টগুলি বিবেচনা করে) আমি শুরুতে তাদের সমস্তকে একসাথে তৈরি করতে সক্ষম হয়েছি আমার আউটপুট

অসম্পূর্ণ সংস্করণ এখানে। অন্যান্য কয়েকটি বৈশিষ্ট্য হ'ল & এর সাথে & ও অপারেটরগুলি নির্বাচন করে | এমনভাবে যাতে আমি বন্ধনী ছাড়াই চাই অগ্রাধিকার ক্রম দিতে।

int f(int s)
{
  char m[4] = "SDT";
  int a,b,c,t=0;
    for (b = 2; b < 77; b += 1 + (b == 62) * 12)
      for (a = 2; a < 77; a += 1 + (a == 62) * 12){
        c = s - a / 3 * (a % 3 + 1) - b / 3 * (b % 3 + 1);
        if (c>1 & c<41 | c == 50 && c % 2 == 0 & a >= b){
          printf("%c%d %c%d D%d\n", m[a % 3], a / 3, m[b % 3], b / 3, c / 2);
          t++;
        }
     }
   return t;
}


4

ম্যাটল্যাব ( 299 249 241 চর)

এটি আমার প্রথম মারাত্মক গল্ফিং। আমার প্রথম প্রয়াস (১৩6 টি অক্ষর) সঠিক ফলাফল দেয় তবে সঠিক বিন্যাসে নয়। এটি প্রতিটি ডার্টের জন্য পয়েন্টের সংখ্যা দেখে সমস্ত সম্ভাবনা দেয়। এর অর্থ একক 20 এবং ডাবল 10 এর পৃথক এন্ট্রি রয়েছে, তবে তারা উভয়ই 20 হিসাবে প্রদর্শিত হবে Of অবশ্যই শেষ ডার্টটি সর্বদা একটি ডাবল।

function f(x);u=[1:20 25].';y=[u;2*u; 3*u(1:end-1)];v=combvec([combnk(y,2);[y y];[zeros(62,1) y];[0 0]].',y(22:42).').';v(sum(v,2)==x,:)

দ্বিতীয় প্রয়াসে ফর্ম্যাটিংটি উন্নত হয়েছে, যা অবশ্যই অক্ষরের সংখ্যা বৃদ্ধি করেছে:

function f(x);h=.1;u=h+[1:20,25].';y=[u;2*u;3*u(1:20)];v=combvec([combnk(y,2);[y,y];h*ones(62,1),y];[h,h]].',y(22:42).').';t='SDT';r=@fix;strrep(arrayfun(@(x)[t(int8((x-r(x))/h)),num2str(h*r(x)/(x-r(x)))],v(sum(r(v),2)==x,:),'un',0),'S0','')

299 থেকে 249 টি অক্ষর থেকে উন্নত হয়েছে, একই সময়ে এমনকি আউটপুট বিন্যাসকেও উন্নত করে। এই উন্নত সংস্করণের জন্য উদাহরণস্বরূপ ক্ষেত্রেগুলির আউটপুটটি হ'ল:

চ (170):

'T20'    'T20'    'D25'

চ (6):

'S1'    'S3'    'D1'
'S1'    'T1'    'D1'
'S2'    'D1'    'D1'
'S2'    'S2'    'D1'
'D1'    'D1'    'D1'
''      'S4'    'D1'
''      'D2'    'D1'
'S1'    'S1'    'D2'
''      'S2'    'D2'
''      'D1'    'D2'
''      ''      'D3'

চ (169):

Empty cell array: 0-by-3

অতিরিক্ত:

আমার গণনার দক্ষতা অনুসারে ডার্ট গেমটি শেষ করার জন্য এক বিশাল মোট 42336 টি সম্ভাবনা রয়েছে।


ফলাফলটি কী সেলটি আঘাত করবে তা দেখানো উচিত, সুতরাং প্রথমটিতে এটি 60 60 50হওয়া উচিত বলে মন্তব্য করে T20 T20 Bullseye। আমি এই প্রশ্নের আরও পরিষ্কার করব। বেশ ভালই চলছে, প্রায় সেখানেই :)
তেওন প্রোঙ্ক

1
হ্যাঁ, আমি ইতিমধ্যে এটি নিজের দিকে ইঙ্গিত করেছি। এটিই প্রথম অসম্পূর্ণ প্রচেষ্টা। ;)
মিমমবস

ওফ সরি লোল, আমি কোড সম্পর্কে কৌতূহল ছিলাম এবং ফলাফলটি আমি এক্সডি উপরের গল্পটি পড়িনি
টিউন প্রোঙ্ক

এটি আরও ভাল হওয়া উচিত। কেবলমাত্র আমি ভাবতে পারি যে ষাঁড়টি এখনও 25 হিসাবে প্রদর্শিত হয়েছে But তবে আমি আশা করি এটি ঠিক আছে, অন্যথায় এটি হার্ড কোড করা ছাড়া অন্য কোনও সম্ভাবনা নেই, যা কেবল মজাদার নয়।
মিম্বুবস

25 হিসাবে একক ষাঁড়টি সত্যই গ্রহণযোগ্য, একমাত্র উপায় আপনি
যেভাবেই

2

রুবি (২0০ টি চর)

"শেষটি একটি দ্বিগুণ হওয়া উচিত" ছিল অনুপস্থিত টুকরো - কেন 168 এর ফলাফল না হওয়া উচিত তা বুঝতে পারিনি ...:

c=->n,d=3{d=d-1;r=[];n==0?[r]:(d>=0&&n>0?(o='0SDT';((1..20).map{|p|(1..3).map{|h|c.(n-p*h,d).map{|m|r<<["#{o[h]}#{p}"]+m}}};c.(n-50,d).map{|m|r<<['DB']+m};c.(n-25,d).map{|m|r<<[?B]+m})):1;r.select{|*i,j|j[?D]}.tap{|x|d!=2?1:puts(x.map{|i|"#{i.join(?,)};"})})}

গ। (170)

T20,T20,DB;

গ। (6)

S1,S1,D2;
S1,T1,D1;
S1,S3,D1;
D1,D1,D1;
D1,S2,D1;
D1,D2;
T1,S1,D1;
S2,D1,D1;
S2,S2,D1;
S2,D2;
D2,D1;
S3,S1,D1;
D3;
S4,D1;

1

পাইথন ২.7 (270 টি অক্ষর)

নিশ্চিত নয় যে পাইথন একটি ওয়ান-লাইনারকে অনুমতি দেবে, তবে তিনি এটি তিনটিতে আছেন।

def f(n):
 a={'%s%s'%('0SDT'[i],n):n*i for n in range(1,21)+[25] for i in [1,2,3] if n*i<75};a['']=0
 for r in [' '.join(h[:3]) for h in [(x,y,z,a[x]+a[y]+a[z]) for x in a for y in a for z in {k:a[k] for k in a if 'D' in k}] if h[3]==n and len(h[0])<=len(h[1])]:print r

বা যথাযথ 'চেকআউট' বার্তা সহ 278+ টি অক্ষর (উদাহরণস্বরূপ এখানে 290):

def f(n):
 a={'%s%s'%('0SDT'[i],n):n*i for n in range(1,21)+[25] for i in [1,2,3] if n*i<75};a['']=0;
 for r in [' '.join(h[:3]) for h in [(x,y,z,a[x]+a[y]+a[z]) for x in a for y in a for z in {k:a[k] for k in a if 'D' in k}] if h[3]==n and len(h[0])<=len(h[1])] or ['No Checkout']:print r

এখানে আমরা যাচ্ছি:

চ (170)

T20 T20 D25

চ (6)

S3 S1 D1
S2 S2 D1
S2 D1 D1
S1 S3 D1
S1 S1 D2
S1 T1 D1
 S2 D2
 S4 D1
  D3
 D2 D1
 D1 D2
T1 S1 D1
D1 S2 D1
D1 D1 D1

চ (169)

No Checkout

যে বিষয়গুলিতে আমি খুশি নই:

for x in a for y in a for z in

এটি মোট 10% এরও বেশি। ইটারটুলস ইত্যাদি ছাড়া আরও কি কমপ্যাক্ট উপায় আছে?

and len(h[0])<=len(h[1])

এটি দুটি ডার্ট ফিনিস (যেমন ['', 'এস 1', 'ডি 1'] এবং ['এস 1', '', 'ডি 1']) এর সদৃশগুলিকে প্রতিরোধ করতে ব্যবহৃত হয়। আমি বিষয়টি অর্ডার হিসাবে বিবেচনা করি (আরে - শেষ ডার্টটি ডাবল হতে হবে, সুতরাং স্পষ্টভাবে আদেশ করুন) তবে নন-থ্রো একটি বিশেষ ক্ষেত্রে।


1

05 এ বি 1 ই , 43 বাইট

20L25ª3Lâ¨Ðʒθ<}Uã«XâXìε˜2ô}ʒPOQ}εε`…TSDsèì

বেশ ধীর গতি .. তালিকার তালিকা হিসাবে আউটপুট, বা কোনও সমাপ্তি সম্ভব না হলে একটি খালি তালিকা। আমার ষাঁড়গুলি হ'ল S25এবং D25; যদি এটি অনুমোদিত না হয় তবে আমি এটি পরিবর্তন করতে পারি।

এটি অনলাইনে চেষ্টা করুন বা একবারে কয়েকটি পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

কয়েকটি ধাপ রয়েছে:

1) সমস্ত সম্ভাব্য একক, ডাবল এবং ট্রিপল ডার্টগুলির একটি তালিকা তৈরি করুন:

20L         # Create a list in the range [1,20]
   25ª      # Append 25 to this list
      3L    # Create a list in the range [1,3]
        â   # Create all possible pairs of these two lists
         ¨  # Remove the last pair (which is the Triple Bull)
            # Now we have a list of all possible darts:
            #  [[1,1],[1,2],[1,3],[2,1],...,[20,3],[25,1],[25,2]]

2) 3 টি ডার্ট পর্যন্ত সমস্ত সম্ভাব্য ফিনিশার (ডাবল দিয়ে শেষ) পান:

Ð           # Triplicate this list
 ʒ  }       # Filter the top copy by:
  θ         #  Where the last value
   <        #  Decremented by 1 is truthy (==1), so all doubles
     U      # Pop this filtered list of doubles, and store it in variable `X`
 ã          # Create all possible pairs of the list of darts with itself
  «         # Merge it with the list of darts
            # We now have a list containing all possible variations for 1 or 2 darts
 Xâ         # Then create all possible pairs of these with the doubles from variable `X`
   Xì       # And prepend the doubles themselves as well
            # Now we have all possible variations of 1 double; 1 dart + 1 double;
            # or 2 darts + 1 double
     ε   }  # Map each to:
      ˜     #  Deep-flatten the list
       2ô   #  And split it into parts of size 2
            #  (this is to convert for example a 2 darts + 1 double from
            #   [[[20,3],[5,1]],[1,2]] to [[20,3],[5,1],[1,2]])
            # Now we have a list of all possible finishers of up to 3 darts

3) কেবলমাত্র তাদের রাখুন যার জন্য মোট স্কোর ইনপুট-পূর্ণসংখ্যার সমান:

ʒ   }       # Filter this list by:
 P          #  Get the product of each inner-most lists
            #   i.e. [[20,3],[5,1],[1,2]] → [60,5,2]
  O         #  Take the sum of those
            #   i.e. [60,5,2] → 67
   Q        #  Check if this value is equal to the (implicit) input-integer
            # Now we only have the finishers left with a total value equal to the input

৪) ডেটা রূপান্তরিত ফলাফল-তালিকায় রূপান্তর করুন (যেমন [[20,3],[5,1],[1,2]]হয়ে ওঠে ["T20","S5","D2"]):

ε           # Map each of the remaining finishers of up to 3 darts to:
 ε          #  Map each inner list to:
  `         #   Push both values separately to the stack ([20,3] → 20 and 3)
   TSD     #   Push string "TSD"
       s    #   Swap to get the integer for single/double/triple at the top of the stack
        è   #   Use it to index into the string
            #   NOTE: 05AB1E has 0-based indexing with automatic wraparound,
            #   so the triple 3 will wrap around to index 0 for character "T"
         ì  #   Prepend this character in front of the dart-value
            # (after which the result is output implicitly as result)

0

Kotlin , 254 বাইট

দ্রষ্টব্য: অ্যালগরিদম লেভেল রিভার সেন্টের সি ++ উত্তরের উপর ভিত্তি করে।

{s:Int->val m="SDT"
var c=0
val r=(2..62).toList()+listOf(75,76)
for(t in r)for(o in r){val l=s-o/3*(o%3+1)-t/3*(t%3+1)
if((l>1&&l<41||l==50)&&l%2==0&&o>=t){println("${m[o%3]}${o/3},${m[t%3]}${t/3},D${l/2}")
c++}}
if(c<1)println("No possible checkout!")}

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

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