বল কোথায় নামবে?


17

একটি স্ট্রিং দেওয়া হয়েছে যেখানে প্রথম রেখায় ফাঁকা স্থান এবং একটি সময়কাল ( ., "বল") রয়েছে, তারপরে ফাঁকা স্থান, ফরোয়ার্ড স্ল্যাশ ( /) এবং ব্যাকস্ল্যাশস ( \) যুক্ত রেখাগুলি নির্ধারণ করে, বলটি তার প্রারম্ভিক অবস্থান থেকে পড়ার পরে বলটি কোন কলামে প্রবেশ করবে । প্রতিটি /এটি 1 টি কলাম দ্বারা বাম \দিকে সরায় এবং প্রত্যেকে এটি 1 কলাম দ্বারা ডানদিকে নিয়ে যায়।

নমুনা ইনপুট

    .
  /   \  \
    /   /
 \   \/  \
   \   /\
    \ /\  \
     \    /

নমুনা আউটপুট

বলটি 5 কলামে শুরু হয়, /3 লাইনটি হিট হয় , তারপরে তিনটি \চূড়ান্ত অবস্থানের জন্য 5 থেকে 7 লাইনগুলিতে:

7

নোট করুন যে কলামগুলি 1-সূচকযুক্ত, বেশিরভাগ পাঠ্য সম্পাদক কনভেনশনগুলির সাথে সঙ্গতিপূর্ণতার জন্য।

এজ মামলা

যদি বলটি /প্রথম কলামে আঘাত করে, এটি চিরকালীন অস্তিত্বহীন কলামে আটকে আছে Your আপনার প্রোগ্রামটি মুদ্রণের মাধ্যমে এটি সঠিকভাবে পরিচালনা করা উচিত 0

যদি বলটি কোনও \/প্যাটার্নের উভয় পাশে আঘাত করে , তবে ফলাফলটি অনির্ধারিত। আপনার প্রোগ্রামটি কোনও আউটপুট ছাড়াই অবসান করার অনুমতি দেওয়া হয়েছে, অসীমভাবে লুপ করবেন না, বা কোনও ত্রুটি বার্তা (আমার সমাধান প্রিন্টগুলি -1) মুদ্রণ করবেন, তবে এটি বৈধ আউটপুট বলে মনে করা যেতে পারে এমন কোনও কিছুই মুদ্রণ করা উচিত নয়।

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

প্রতিটি বা .শেষ লাইনের পরে বা পরে প্রতিটি লাইনে ফাঁকা জায়গা থাকতে পারে বা নাও থাকতে পারে । আপনার প্রোগ্রামটি যেমন প্যাডিং উপলব্ধ হচ্ছে তার উপর নির্ভর করা উচিত নয়। অনুরূপ নোটে, প্রথম লাইনের পরে কোনও লাইন থাকতে পারে এবং নাও থাকতে পারে।/\

আপনি ধরে নিতে পারেন যে প্রথম লাইনে শূন্য বা আরও বেশি স্থান এবং ঠিক এক থাকবে .। পরবর্তী লাইনগুলিতে শূন্য বা আরও বেশি স্পেস এবং শূন্য বা আরও বেশি স্ল্যাশ থাকবে।

বাস্তবায়ন বিশদ

আপনার প্রোগ্রামটি কোনও ফাইল থেকে পড়তে পারে (কমান্ড-লাইন আর্গুমেন্ট হিসাবে নির্দিষ্ট) বা আপনার সুবিধার্থে স্ট্যান্ডার্ড ইনপুট থেকে পড়তে পারে।

আপনার প্রোগ্রামটি অবশ্যই একক সংখ্যাকে স্ট্যান্ডার্ড আউটপুটে আউটপুট দেয়। (হ্যাঁ, একটি পেছনের নতুন লাইন ঠিক আছে Yes হ্যাঁ, সংখ্যার একাধিক সংখ্যা থাকতে পারে))

পরীক্ষার মামলা

ইনপুট:

.

আউটপুট:

1

মনে রাখবেন যে এখানে ইনপুটটি হ'ল এক বাইট। এটি হ্যান্ডেল করতে সক্ষম হওয়া উচিত এটি সবচেয়ে ছোট ক্ষেত্রে।

 

ইনপুট:

 .
 \
  \
   \
    \

আউটপুট:

 6

মনে রাখবেন যে এই স্ল্যাশগুলির পরে কোনও স্থান নেই।

 

ইনপুট:

  .
  /
 /\\  /  \
//\ \/// //
\\/ \/\ /\/

আউটপুট:

0

 

ইনপুট:

  .
/ / /
 \\\
  /\\
 /   \

আউটপুট:

1

 

ইনপুট:

   .


 \
       /
/

      \

আউটপুট:

4

 

ইনপুট:

 .
 \

\/\/\/

আউটপুট:

(anything but a nonnegative number)

মন্তব্য বন্ধ

এই প্রশ্নটি একটি (মহাকর্ষ-ভিত্তিক) বিলিয়ার্ড-বল-টাইপ কম্পিউটারের অনুকরণের মতো, তবে উল্লেখযোগ্যভাবে সহজ, সুতরাং আশা করি এটি আরও আগ্রহ অর্জন করবে।

পাইথনে আমার 169-চরিত্রের সমাধান রয়েছে। আমি নিশ্চিত যে এখানে প্রতিভাবান গল্ফাররা সেই রেকর্ডটি টুকরো টুকরো করে ফেলতে পারে। : ^)

এটি , তাই অক্ষরের মধ্যে সংক্ষিপ্ত উত্তরটি মাসের শেষে গৃহীত হবে!


এটি সামান্য ভিন্ন আমদানির ফর্ম্যাট এবং কেবল একটি থ্রো সহ এ মেরে বাগেটেলের সাথেও খুব মিল । আপনি চাইলে আমার পরীক্ষার স্ক্রিপ্টগুলি ধার এবং পরিবর্তন করতে পারেন।
গ্যারেথ

ঠিক আছে, গুলি করুন, এই প্রশ্নের শিরোনামটি এটির জন্য আমার পক্ষে যথেষ্ট সন্দেহজনক ছিল না। এর জন্যে দুঃখিত.
ফ্রেসটিল

ঠিক আছে, এই প্রশ্নটি আড়াই বছর আগে হয়েছিল।
গ্যারেথ

আমি প্রস্তাব দিচ্ছি যে শেষ উদাহরণে আউটপুটটি "বল আটকে গেছে" হওয়া উচিত।
মুকুল কুমার

এটা মাসের শেষে হিসাবে এখনো গণনা করে> <।
আলেকজান্ডার-ব্রেট

উত্তর:


5

পাইথন, 143 বি

import sys
for l in sys.stdin:
 a=l.find('.')
 if a>-1:F=a
 elif F>-1: 
    if'\\/'in l[F-1:F+2]:z
    F+={'\\':1,'/':-1}.get((l+' '*F)[F],0)
print F+1

স্পেস / ট্যাব ইন্ডেন্টেশন ট্রিক ব্যবহার করে। আমি এখানে বিশেষত চালাক কিছু করি নি। Fবর্তমান সূচক lহয়, বর্তমান লাইন; zঅপরিজ্ঞাত তাই এটি একটি ব্যতিক্রম ছুঁড়ে, যা অবশ্যই \/পরিস্থিতি সামাল দিয়ে ইতিবাচক পূর্ণসংখ্যার নয় ।


2

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

¶¡ð«ć'.ksvU…/ \yXD>‚èJD„\/Qiõqëнk<X+]>

মাল্টি-লাইন স্ট্রিং হিসাবে ইনপুট। আউটপুট \/যদি বল আটকে আছে।

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

ব্যাখ্যা:

¶¡                       # Split the (implicit) input-string on newlines
                         # (work-around instead of `|`, because it will stop at empty lines)
  ð«                     # Add a trailing space to each line (work-around because indexing
                         # -1 in 05AB1E will wrap around to the other side)
    ć                    # Extract head; pop and push the remainder-lines and first line
                         # separated to the stack
     '.k                '# Get the 0-based index of "." in this first line
s                        # Swap to get the remainder-list of lines
v                        # Loop over each line `y`:
 U                       #  Pop and store the top value (the index) in variable `X`
       X                 #  Push the current index `X`
        D>               #  Duplicate it, and increase the copy by 1
                        #  Pair to [X, X+1]
      y    è             #  Index both of those into the current line `y`
            JD           #  Join the two characters together, and duplicate it
              \/Qi      #  If it's equal to "\/":
                   q     #   Stop the program
                         #   (after which the string is output implicitly as result)
                  ë      #  Else:
                   н     #   Only leave the first character (at index `X`)
  …/ \              k    #   Get its 0-based index in string "/ \"
                     <   #   Decrease it by 1
                      X+ #   And add it to `X`
]                        # After the loop:
 >                       # Increase the top of the stack (`X`) by 1
                         # (after which it's output implicitly as result)

1

সিজেম, 61 বাইট

qN/('.#)\_:,0+:e>f{' e]" /"f#0\+}{1$1$=\@2$-_@=@[\]$[W1]#/z}/

সম্পর্কিত নিয়মটি \/যদি প্রত্যাহার করা হয় (এবং আমাদের এটি পরিচালনা করার প্রয়োজন নেই), এটি 41 বাইটে সংক্ষিপ্ত করা যেতে পারে :

qN/('.#)\_:,:e>f{' e]" /"f#0\+0+}{1$=-}/

1

জাভা 10, 213 208 190 বাইট

s->{int r=s.indexOf('.'),c;for(var x:s.split("\n")){for(;r>x.length()-2;x+=" ");c=x.charAt(r);if(c==46)continue;r/=c>47&x.charAt(r+1)==47?0:1;r+=c<33?0:c<48?-1:1;if(r<0)return 0;}return-~r;}

যখন আমরা ক এর ভিতরে আটকে থাকি তখন শূন্য ত্রুটি দ্বারা বিভাগ বিভক্ত করে \/

-5 বাইটস @ এডজিনার্ডকে ধন্যবাদ

ব্যাখ্যা:

এখানে চেষ্টা করুন।

s->{                             // Method with String parameter and integer return-type
  int r=s.indexOf('.'),          //  Get the index of the dot on the first line
      c;                         //  Temp integer
  for(var x:s.split("\n")){      //  Split the input by newlines, and loop over the lines:
    for(;r>x.length()-2;x+=" "); //   Append trailing spaces if necessary
    c=x.charAt(r);               //   Get the character at the current index of this line
    if(c==46)                    //   If this is the first line (the char is the dot)
      continue;                  //    Continue to the next iteration of the loop
    r/=c>47&x.charAt(r+1)==47?   //   If we're stuck in a `\/`
        0                        //    Divide by 0 to exit the function with an error
       :1;                       //   Else: divide by 1 as no-op
    r+=c<33?                     //   If the current character is a space:
        0                        //    `r` remains at the same index
       :c<48?                    //   Else if it's a `/`:
        -1                       //    Index `r` is decreased by 1
       :                         //   Else (if it's a `\`):
        1;                       //    Index `r` is increased by 1
    if(r<0)                      //   If `r` is now -1:
      return 0;}                 //    Return 0
  return-~r;}                    //  After the loop: return the index `r` + 1

2
আমি জাভা মোটেই জানি না, তবে কোনও ত্রুটি -১০ ফেরার চেয়ে সংক্ষিপ্ততর ঘটায় না?
এডিগার্ড

@ এডজিনার্ড ধন্যবাদ, এটি সত্যই 5 টি বাইট সঞ্চয় করে। :)
কেভিন ক্রুইজসেন

1

পাইথন 3 , 124 বাইট

import sys
for l in sys.stdin:i=('.'in l)*l.find('.')or(i<0)*i-2*('\\/'in l[i-1:i+2])or' \\'.find((l+i*' ')[i])+i
print(i+1)

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

পাইথন 2 এও কাজ করে।

ব্যাখ্যা

for l in sys.stdin:i=          # Change value i for each line in the input
('.'in l)*l.find('.')          # Set i to (0-indexed) dot position if present
or(i<0)*i                      # Keep i fixed if it is below zero
-2*('\\/'in l[i-1:i+2])        # Set i to -2 if \/ trap is encountered
or' \\'.find((l+i*' ')[i])+i   # Else: move position based on character
print(i+1)                     # Print final 1-indexed position

0

জে , 95 বাইট

[:>[:(<"1@|.@}.([:(1&{+_*0>[:*/2-/\])(]+{~ ::])^:(<3))&.>/@,2<@i.~{.)[:(0,'/ \'<:@i.]);._1 LF,]

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

_বল আটকে গেলে অনন্ত ফেরায়। সেই বিশেষ কেসটি পরিচালনা করে অনেকগুলি বাইট হারিয়েছে। অন্যথায় এটি কম বা কম সারিগুলির সাধারণ হ্রাস। অবশ্যই আরও গল্ফ করা যেতে পারে।

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