একটি ফ্ল্যাট অনুমান করার খেলা


13

আমি খেলতে পছন্দ করি একটি খেলা আছে। এটি সীমাবদ্ধ আকারের গ্রিডে ঘটে (তবে এটি একটি গোলকের মতো জড়িয়ে থাকে)। সেই গ্রিডে, একটি এলোমেলো (পূর্ণসংখ্যার কেবল) পয়েন্ট নির্বাচন করা হয়। তারপরে, আমি, ব্যবহারকারীকে একটি সমন্বিত ইনপুট জিজ্ঞাসা করা হবে। যদি আমার ইনপুটটি এলোমেলো পয়েন্টের সাথে ঠিক মিলে যায় তবে আমাকে জানানো হয়েছে যে আমি জিতেছি। অন্যথায়, আমাকে আমার ইনপুট এবং এলোমেলো পয়েন্টের মধ্যে পয়েন্ট-ভিত্তিক দূরত্ব বলা হয়েছে। উদাহরণস্বরূপ, যদি আমি অনুমান করি (2,2)এবং এলোমেলো পয়েন্টটি ছিল (4,3)তবে দূরত্ব হবে sqrt[(3-2)^2 + (4-2)^2] = sqrt[5]

খেলোয়াড় পয়েন্টটির সঠিক অবস্থানে না আসা পর্যন্ত খেলা অব্যাহত থাকে।


উদ্দেশ্য উপরে বর্ণিত গেমের কার্যকরী সংস্করণ তৈরি করুন। এটি করতে আপনাকে অবশ্যই একটি সম্পূর্ণ প্রোগ্রাম তৈরি করতে হবে। আপনার প্রোগ্রামটি যা করা উচিত তা এখানে:

  1. দুটি ইনপুট অনুরোধ করুন: বোর্ডের উচ্চতা এবং প্রস্থ। উত্স বোর্ডের উপরের বাম দিকে রয়েছে। এই ইনপুটগুলি অতিক্রম করবে না 1024
  2. যে বোর্ডে একটি এলোমেলো পয়েন্ট নির্বাচন করুন; এটি অনুমান করা পয়েন্ট হবে।
  3. একটি টার্ন অনুকরণ করে ইনপুট গ্রহণ করুন। ইনপুটটি হয় স্থান দ্বারা পৃথক পূর্ণসংখ্যা বা দুটি পৃথক পূর্ণসংখ্যার ইনপুট। এই ইনপুটটির প্রতিক্রিয়া হিসাবে, প্রোগ্রাম দুটি কাজের মধ্যে একটি করবে:
    1. যদি ইনপুটটি নির্বাচিত এলোমেলো পয়েন্টের সাথে মেলে, তবে একটি বার্তা আউটপুট ব্যবহারকারীর বিজয়ের ইঙ্গিত দেয়। আমি আপনাকে "আপনি জিতেছি!" পরামর্শ দেব।
    2. অন্যথায়, ব্যবহারকারীর ইনপুট পয়েন্ট এবং এলোমেলো পয়েন্টের মধ্যে দূরত্ব আউটপুট করুন।
    উভয় ক্ষেত্রেই আপনাকে অবশ্যই টার্ন কাউন্টারটি বাড়িয়ে তুলতে হবে।
  4. একবার ব্যবহারকারী বিজয় অর্জন করার পরে, ব্যবহারকারী কতগুলি ঘুরেছে তার প্রদর্শন করুন। প্রোগ্রামটি তখন বের হয়।

বোনাসেস

বোনাসগুলি এই তালিকায় উপস্থিত হওয়ার সাথে সাথে প্রয়োগ করা হয়

  • -150 বাইটস যদি আপনার প্রোগ্রামটি কোনও ইনপুট পূর্ণসংখ্যা Dনেয় যা গেমটির মাত্রাটি বর্ণনা করে যা সংঘটিত হয়। উদাহরণস্বরূপ, যদি D = 3, তবে আপনি 3পূর্ণসংখ্যার একটি এলোমেলো পয়েন্ট তৈরি করেন , 3পূর্ণসংখ্যা ইনপুট নিন এবং এই পয়েন্টগুলির মধ্যে দূরত্ব আউটপুট করুন।
  • -50% (বা + 50% যদি score < 0) আপনি বোর্ডের একটি গ্রাফিকাল উপস্থাপনা (ASCII বা চিত্র) সরবরাহ করেন যা দেখায় যেখানে ব্যবহারকারী পূর্বে প্রদত্ত মাত্রাগুলির গ্রিড এবং টার্ন কাউন্টারে অনুমান করেছে। (আপনি যদি প্রথম বোনাসের জন্য যান তবে এই বোনাসটি কেবলমাত্র 2Dএবং 1Dমোডগুলিতে প্রযোজ্য you আপনি যদি 3D গ্রাফিকাল আউটপুট যোগ করেন তবে আপনি অতিরিক্ত -50% পাবেন get
  • -60 বাইটস যদি আপনি কোনও গেমমোড সরবরাহ করতে পারেন (শুরুতে কোনও ইনপুট দ্বারা নির্বাচিত; এটি যখন দেওয়া হয়, তখন 0নিয়মিত গেমমোড সম্পাদন করুন; যখন দেওয়া হয় 1, তখন এই গেমমোডটি সম্পাদন করুন) যেখানে পয়েন্টটি প্রতি একক ইউনিটকে ঘুরিয়ে দিয়ে এলোমেলো দিকের দিকে নিয়ে যায়

মোড়ানোর বিষয়ে আরও

মোড়ক কেবল তখনই ঘটে যখন তৃতীয় বোনাসে মুভিং পয়েন্টটি কোনও সীমানা জুড়ে চলে; এক্ষেত্রে মুভিংটি পয়েন্টটি সংশ্লিষ্ট পয়েন্টে রেপ করা হয়, যেমন:

...              ...
..R (move right) R..
...              ...

এই মোড়কের আচরণটি ব্যবহারকারীর অনুমানকে প্রভাবিত করে না, এই দিকটি দিক থেকে পরিবর্তিত হয়েছে তা বাদ দেয়।


লিডারবোর্ড

এই পোস্টের নীচে স্ট্যাক স্নিপেট উত্তরগুলি থেকে ক্যাটালগ তৈরি করে a) ভাষার প্রতি সংক্ষিপ্ত সমাধানের তালিকা হিসাবে এবং খ) সামগ্রিক লিডারবোর্ড হিসাবে।

আপনার উত্তরটি প্রদর্শিত হয়েছে তা নিশ্চিত করার জন্য, দয়া করে নীচের মার্কডাউন টেমপ্লেটটি ব্যবহার করে আপনার উত্তরটি শিরোনাম দিয়ে শুরু করুন:

# Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

# Ruby, <s>104</s> <s>101</s> 96 bytes

যদি আপনি নিজের শিরোনামে একাধিক সংখ্যা অন্তর্ভুক্ত করতে চান (যেমন আপনার স্কোর দুটি ফাইলের সমষ্টি বা আপনি আলাদাভাবে দোভাষী পতাকা দণ্ডের তালিকা করতে চান), নিশ্চিত করুন যে আসল স্কোরটি শিরোনামের শেষ সংখ্যা:

# Perl, 43 + 2 (-p flag) = 45 bytes

আপনি ভাষাটির নামটিকে একটি লিঙ্কও তৈরি করতে পারেন যা স্নিপেটে প্রদর্শিত হবে:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


7
গৌণ নিটপিক: আপনি সম্ভবত বোঝাতে চেয়েছেন এটি একটি গোলকের চেয়ে টরাসের মতো মোড়ানো wra বিচ্ছিন্নতা তৈরি না করেই একটি গোলকের উপরে 2 ডি গ্রিডটি মোড়ানো অসম্ভব।
অ্যালিস্টায়ার বুকসটন

2
এছাড়াও যদি বোর্ডটি মোড়ানো থাকে তবে অনুমান এবং টার্গেটের মধ্যে একটি প্রান্তটি পেরিয়ে একটি ছোট পথ হতে পারে।
অ্যালিস্টায়ার

1
@ এনবিজেড হ্যাঁ, আপনি পারেন।
কনপুর ও'ব্রায়েন

1
@ এনবিজেড 1 ইউনিট এটি একক দিকের।
কনর ও'ব্রায়েন

2
টপোলজি কী তা আমি এখনও নিশ্চিত নই। জিনিসগুলি পরিষ্কার করতে সহায়তা করার জন্য, বোর্ডটি থাকলে 10x10, র্যান্ডম পয়েন্টটি হয় (9,4)এবং আমার ধারণা (2,2), দূরত্বটি sqrt(13)নাকি sqrt(53)? (ভবিষ্যতের জন্য দ্রষ্টব্য: আপনি যদি অদ্ভুত কিছু করছেন তবে এলোমেলোভাবে অন্তর্ভুক্ত করবেন না কারণ এটি পরীক্ষার কেস সরবরাহ করা প্রায় অসম্ভব করে তোলে) ২. তৃতীয় বোনাসে, পয়েন্টটি সরানোর আগে বা পরে দূরত্বটি গণনা করা এবং আউটপুট নেওয়া উচিত?
পিটার টেলর

উত্তর:


8

CJam, -113 -139 -152 -157 -159 বাইট

l~]:B:mr{_ea:i~mr0a*W2mr#+*.+B:,.=_[l~].-:mh_p}g],(

প্রোগ্রামটি 51 বাইট দীর্ঘ এবং -150 বাইট এবং -60 বাইট বোনাসের জন্য যোগ্যতা অর্জন করে ।

গেম মোড এবং মাত্রাগুলির সংখ্যা কমান্ড-লাইন আর্গুমেন্ট হিসাবে পড়া হয়, STDIN থেকে প্রতিটি মাত্রার আকার the যেহেতু বিজয়ের বার্তা নির্বিচারে , প্রোগ্রামটি 0.0খেলাটি শেষ হয়ে গেছে তা নির্দেশ করার জন্য (লক্ষ্য থেকে দূরত্ব) মুদ্রণ করবে ।

টেস্ট রান

$ cjam game.cjam 0 3; echo
2 2 2
1 1 1
1.4142135623730951
1 1 0
1.7320508075688774
1 0 1
1.0
0 0 1
0.0
4
$ cjam game.cjam 1 3; echo
2 2 2
0 0 0
1.0
0 0 0
0.0
2

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

l~]       e# Read a line from STDIN, evaluate it and collect the result.
:B        e# Save the resulting array in B. The result is [B1 ... Bd],
          e# where Bk is the board size in dimension k.
:mr       e# Pseudo-randomly select a non-negative integer below Bk,
          e# for each k between 1 and d.
{         e# Do:
  _       e#   Copy the item on the stack. The original becomes a dummy value
          e#   that will be used to count the number of turns.
  ea      e#   Push the array of command-line arguments.
  :i~     e#   Cast each to integer and dump them on the stack.
          e#   This pushes m (game mode) and d (number of dimensions).
  mr      e#   Pseudo-randomly select a non-negative integer below d.
  0a*     e#   Push an array of that many zeroes.
  W2mr#   e#   Elevate -1 to 0 or 1 (selected pseudo-randomly).
  +       e#   Append the result (1 or -1) to the array of zeroes.
  *       e#   Repeat the array m times.
  .+      e#   Perform vectorized addition to move the point.
  B:,.=   e#   Take the k-th coordinate modulo Bk.
  _[l~]   e#   Push a copy and an evaluated line from STDIN.
  .-:mh   e#   Compute their Euclidean distance.
  _p      e#   Print a copy.
}g        e# While the distance is non-zero, repeat the loop.
],(       e# Get the size of the stack and subtract 1.
          e# This pushes the number of turns.

2
ডেনিস সবাইকে ছাড়িয়ে গেছে। আবার।
সীড্রাস

1
আপনি দূর্ঘটনাক্রমে 152 -152 পরিবর্তে স্কোর আপডেট লিডারবোর্ডে আপনি শেষ নির্বাণ
আমেরিকার হরিণবিশেষ

7

পাইথ, 91 (-150 -60) = -119

VvwaYOvw;JY#IqQ1=dOlY XYd@S[0 @Jd +@Yd?O2_1 1)1)=T[)VYaT^-Nvw2)=ZhZ=b@sT2Iqb0Bb;p"Won in "Z

পুরানো সমাধান: (54-150 = -96)

JYVQaYOvw;#=J[)VYaJ^-Nvw2)=ZhZ=b@sJ2Iqb0Bb;p"Won in "Z

সমস্ত ইনপুট একটি নতুন লাইনে স্থান নেয়।

  • প্রথম পূর্ণসংখ্যা গেম মোডের প্রতিনিধিত্ব করে ( হয় 1বা হয়0 )
  • প্রথম দ্বিতীয় পূর্ণসংখ্যার Dখেলার মাত্রা উপস্থাপন করে।
  • পরবর্তী Dইনপুটগুলি ক্ষেত্রের আকারকে উপস্থাপন করে
  • Dএই বিন্দু থেকে প্রতিটি ইনপুট অনুমান হয়

নমুনা প্লে (ইঙ্গিতগুলি আসল প্রোগ্রামে প্রদর্শিত হয় না):

  #Hint: Gamemode (1 or 0)
1
  #Hint: Dimensions
3
  #Hint: X-size
4
  #Hint: Y-size
4
  #Hint: Z-size
4
  #Hint: Guesses
  #Hint:[3, 2, 1]
3
2
2
1.0
  #Hint:[3, 2, 1]
3
2
1
1.0
  #Hint:[2, 2, 1]
2
2
1
1.0
  #Hint:[3, 2, 1]
3
2
1
Won in 4

দ্বিতীয় পদক্ষেপ জেতা উচিত নয়?
জেএনএফ

@ জেএনএফ পয়েন্টটি গেমমোড 1 (-60 বাইট বোনাস) এ স্থানান্তর করতে পারে
জাকুব

পবিত্র মলি, এটি কিছু দীর্ঘ পাইথ কোড। যদিও সত্যিই গল্ফ হয়নি। উদাহরণস্বরূপ আমি দুটি স্পেস দেখতে পাচ্ছি, এটি সরানো যেতে পারে। এছাড়াও: আপনি এর J=YmOvwvwপরিবর্তে ব্যবহার করতে পারেন VvwaYOvw;JYযা 2 বাইট সংক্ষিপ্ত। আমি অন্যান্য কোডটি সন্ধান করিনি, তবে আমার ধারণা আপনি সেখানে কয়েকটি জিনিসও ছোট করতে পারেন।
জাকুবে

@ জাকুব, আমি ধরে নিচ্ছিলাম যে ইঙ্গিতটি আমাদের বলছে যে পয়েন্টটি বর্তমানে রয়েছে
জেএনএফ


3

পিপ, 43 42 বাইট - 150 = -108

বোর্ডের মাত্রাগুলি কমান্ড-লাইন আর্গুমেন্ট হিসাবে গ্রহণ করে (ডি সহ অর্গসের সংখ্যা থেকে বোঝানো হয়)। স্টিডিনে স্থান-বিভাজিত সংখ্যা হিসাবে অনুমান করে।

YRR_MgWd:++i&RT$+(y-(q^s))**2Pd"Won in ".i

এই কোডটি পিপের অ্যারে-প্রোগ্রামিং বৈশিষ্ট্যগুলির ভারী সুবিধা গ্রহণ করে। সেমিডলাইন আরোগুলির অ্যারে এতে সঞ্চিত আছে g। আমরা উৎপন্ন বিন্দু randrange অপারেটর ম্যাপিং দ্বারা অনুমিত করা RRউপর g, এবং মধ্যে অনুসন্ধানের ফলাফলের তালিকায় হ্যাঁচকা টান yপরিবর্তনশীল। তারপরে লুপটি আসার সময় প্রধান আসে যেখানে শর্তটি নিম্নরূপ:

d:++i&RT$+(y-(q^s))**2

  ++i&                  Increment i, the guess counter; the result is always > 0, so the
                          short-circuiting & operator evaluates the next expression:
              q         Read a line from stdin
               ^s       Split on spaces
           y-(   )      Subtract from our chosen point itemwise
          (       )**2  Square, itemwise
        $+              Fold on +, summing the list of squares
      RT                Square root
d:                      Assign this distance to d

যদি দূরত্বটি ননজারো ছিল তবে লুপটির অভ্যন্তর এটি মুদ্রণ করবে। যদি এটি শূন্য হয়, আমরা লক্ষ্য বিন্দুতে আঘাত করেছি; লুপটি বন্ধ হয়ে যায়, এবং প্রোগ্রামটি বিজয় বার্তা এবং টার্নের সংখ্যা আউটপুট করে।

উদাহরণ রান:

C:\Users\dlosc> pip.py -f guessing.pip 10 5 6 4
5 2 3 2
3.1622776601683795
6 2 3 2
4.123105625617661
3 2 3 2
1.4142135623730951
3 1 3 2
2.23606797749979
3 2 2 2
1.7320508075688772
2 2 3 2
1
2 2 3 1
1.4142135623730951
2 3 3 2
Won in 8

2

আর, 134 - 150 = -16 বাইট

function(...){G=sapply(list(...),sample,1)
C=0
repeat{g=scan()
C=C+1
if(any(G!=g))cat(sqrt(sum((G-g)^2)))else{cat("Won in",C);break}}}

2

হাস্কেল, 240 - 150 = 90

import System.Random
r x=randomRIO(0,x-1)
m=map read.words
g=getLine
main=do g;(fmap m g::IO[Int])>>=mapM r>>=b 1
b c v=do i<-fmap(sqrt.fromIntegral.sum.map(^2).zipWith(-)v.m)g;if i==0 then putStrLn$"Won in "++show c else do print i;b(c+1)v

1

ডায়ালগ এপিএল , 77 71 - 210 = -139

S F M
P←?S
{P←S|P+(?D)⌽D↑Mׯ1 1[?2]
C+←1
P≢G←⎕:0⊣⎕←.5*⍨+/2*⍨P-G
C}⍣≢C←0

ঠিক আছে:

নোট করুন যে এটি সূচক উত্স 0 ( ⎕IO←0) এ চলে যা অনেকগুলি এপিএলগুলিতে ডিফল্ট।
বুলিয়ান মোডটিকে ডান আর্গুমেন্ট ( M) এবং মাত্রা মাপকে বাম আর্গুমেন্ট ( S) হিসাবে গ্রহণ করে।
মাত্রার সংখ্যা D, যা D←3ওপি অনুযায়ী কল করার আগে (যেমন ) সেট করতে হবে ।
P←?Sলক্ষ্যটি পরিসীমা 1 এ সীমার মধ্যে এলোমেলো পয়েন্ট পায় যদিও প্রতিটি মাত্রা সীমাবদ্ধ হয়
{... }⍣≢C←0ফলাফলটি পৃথক না হওয়া পর্যন্ত ফাংশনটি পুনরাবৃত্তি করে C, যা প্রাথমিকভাবে 0
?2এলোমেলো সংখ্যা 0 বা 1 পায়
¯1 1[... ]দুটি সংখ্যার তালিকা থেকে সূচক
মোড দ্বারা গুণিত হয়; তোলে 0যদি মোড 0
D↑সঙ্গে প্যাড 0মাত্রা সংখ্যা মেলে গুলি
(?D)⌽(মাত্রা -1 সংখ্যা মাধ্যমে 0) এলোমেলোভাবে ঘোরাতে তালিকা
P+নতুন গোল পয়েন্ট ইনক্রিমেন্ট কাউন্টার ইনপুট অনুমান সংরক্ষণ করে বর্তমান লক্ষ্য
S|বিশ্ব-আকারের মডুলাস সামঞ্জস্য করুন এবং যদি এটি লক্ষ্য পয়েন্ট থেকে আলাদা হয় তবে ... প্রতিটি মাত্রার স্কোয়ারের দূরত্বগুলি তাদের বর্গমূলের মুদ্রণের যোগফল দেয় যা 0 (অর্থাত্ প্রাথমিক মানের সাথে সমান, তাই) পুনরাবৃত্তি) ... অন্যথায়, অনুমানের সংখ্যাটি ফিরিয়ে দিন (যা 0 থেকে পৃথক হয়ে লুপিং থামায় এবং শেষ মানটি ফেরত দেয়)
P←
C+←1
P≢G←⎕:
P-G
2*⍨
+/
.5*⍨
⎕←
0⊣
C


@ ডেনিস আসলে, আমি যখন এটি একটি ফাংশন তৈরি করেছিলাম তখন আমি এটি ভেঙে ফেলেছিলাম, এখন এটি আবার একটি প্রোগ্রাম। আমি "প্রোগ্রামমিটি" হিসাবে অনেকগুলি বাইট সংরক্ষণ করেছি সূচক উত্স 0 এ স্যুইচ করে আমার ব্যয় করেছে, যা ওপি অনুমতি দেয়।
অ্যাডাম

1
ঠিক আছে. কৌতূহলের বাইরে: এটি কোন উপভাষা? প্রথম লাইনটি কী করণীয় তা আমার কোনও ধারণা নেই ...
ডেনিস

@ ডেনিস ডায়ালগ এটি একটি traditionalতিহ্যবাহী ফাংশন, প্রথম লাইনটি লাইন [0], অর্থাৎ ফাংশন শিরোনাম, তবে এটি অস্বাভাবিক দেখায় কারণ এটিতে বাম-আর্গ fn- নাম ডান-আর্গ রয়েছে, তবে কোনও ফলাফল নেই।
অ্যাডম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.