গল্ফার অ্যাডভেঞ্চার - অধ্যায় 1: দানি


13

গল্ফার অ্যাডভেঞ্চার

এটিই প্রথম চ্যালেঞ্জ! পরে আরও চ্যালেঞ্জ আসবে যার জন্য পূর্ববর্তী চ্যালেঞ্জ থেকে ডেটা প্রয়োজন হবে :)

অধ্যায় 1: দানি

আসুন এক মিনিট কল্পনা করুন .. আপনি একজন শক্তিশালী Godশ্বর, আপনার ক্ষমতা সীমাহীন তবে একটি জিনিস প্রয়োজন: আত্মা। প্রতিটি আত্মা এখানে একটি বাইট দ্বারা প্রতিনিধিত্ব করা হয়, আপনি ব্যবহার প্রতিটি বাইট একটি আত্মার আত্মত্যাগ করে। সুতরাং লক্ষ্যটি হ'ল কমপক্ষে আত্মার ত্যাগ করার সময় সবচেয়ে বড় পরিমাণের লোককে বাঁচানো।

আপনার প্রথম চ্যালেঞ্জটি হল একটি ছোট্ট গ্রামটিকে বাঁচানো, আপনি যদি তার চ্যালেঞ্জটি সমাধান করেন তবে শয়তান পুরো গ্রামটিকে ধ্বংস করতে রাজি নয়।

চ্যালেঞ্জ :

আপনার কাছে একটি উল্লম্ব ফুলদানি রয়েছে যাতে ঠিক 10 টি জিনিস থাকতে পারে (এয়ার অন্তর্ভুক্ত)। আপনি যদি সেই দানিটিতে কোনও জিনিস রাখেন তবে মাধ্যাকর্ষণ সেই জিনিসটিকে নীচে নেমে আসবে। যদি দানিটি ইতিমধ্যে পূর্ণ হয় (এবং আপনি যদি এটি "বায়ু পূর্ণ" হিসাবে বিবেচনা করেন তবে এটি সর্বদা পূর্ণ থাকে), ইনপুটটি ফুলদানির শীর্ষে উপাদানটি প্রতিস্থাপন করবে।

অনুমোদিত জিনিসগুলির সেটটি এখানে:

  • বায়ু 0 /
  • একটি রক 1 / -
  • একটি পাতা 2 / ~
  • একটি বোমা 3 / x

যদি "এ বোমা" এর উপরে কোনও শিলা বা কোনও পাতা থাকে তবে এটি বিস্ফোরিত হবে এবং তার উপরে থাকা জিনিসটি ধ্বংস করবে destroy

ইনপুট হ'ল আপনি ফুলদানিতে প্রতিবার যে জিনিস রাখবেন সেগুলির তালিকা।

উদাহরণ: 11231: আপনি 2 টি শিলা রাখবেন, তারপরে একটি পাতা, তারপরে একটি বোমা এবং শেষ পর্যন্ত একটি শেষ শিলা।

ফুলদানি স্থির থাকে, আপনি নিম্নলিখিত নিয়ম দিয়ে গণনা শুরু করতে পারেন:

  • রক সংগ্রহকারীতে 1 ইউনিট যুক্ত করে
  • পাতা সংগ্রহকারীকে 2 দ্বারা গুণ করে
  • বোমা সংগ্রহকারী দ্বারা হ্রাস 1
  • বায়ু কিছুই করে না

(আপনার ফুলদানির শীর্ষ থেকে গণনা শুরু করতে হবে)

ইনপুট হিসাবে "11231" ব্যবহার করে আমরা সিমুলেশনটি এখানে পেয়েছি:

|-|  |-|  |~|  |x|  |-|  | |  | |  | |  | |  | |  | |
| |  |-|  |-|  |~|  |x|  |-|  | |  | |  | |  | |  | |
| |  | |  |-|  |-|  |~|  |x|  |-|  | |  | |  | |  | |
| |  | |  | |  |-|  |-|  |~|  |x|  |-|  | |  | |  | |
| |  | |  | |  | |  |-|  |-|  |~|  |x|  |-|  | |  | |
| |  | |  | |  | |  | |  |-|  |-|  |~|  |x|  |-|  | |
| |  | |  | |  | |  | |  | |  |-|  |-|  |~|  |x|  | |
| |  | |  | |  | |  | |  | |  | |  |-|  |-|  |~|  |~|
| |  | |  | |  | |  | |  | |  | |  | |  |-|  |-|  |-|
| |  | |  | |  | |  | |  | |  | |  | |  | |  |-|  |-|

এবং আউটপুট 2 হবে (হিসাবে গণনা করা ((0 x 2) + 1) + 1) ফুলদানির সমস্ত রাজ্য মুদ্রণের প্রয়োজন নেই!

বেস প্রোগ্রাম (পাইথন 3)

এটি কীভাবে কাজ করে তা বুঝতে আপনি এটি সম্পাদন করতে পারেন।

def printVase(vase):
  for i in vase:
    if i == 1:
      print("|-|")
    elif i == 2:
      print("|~|")
    elif i == 3:
      print("|x|")
    else:
      print("| |")

def updateVase(vase):
  changed = False
  for i in range(len(vase), -1, -1):
    if i < len(vase) - 1:
      if vase[i+1] == 3 and vase[i] in [1,2]:
        vase[i], vase[i+1] = 0, 0
        changed = True
      if not vase[i+1] and vase[i] in [1, 2, 3]:
        vase[i], vase[i+1] = vase[i+1], vase[i]
        changed = True
  return changed

userInput = input("Vase : ")
vase = [0 for i in range(0, 10)]
oldVase = vase
while updateVase(vase) or userInput != "":
  if userInput != "":
    vase[0] = int(userInput[0])
  userInput = userInput[1::]
  printVase(vase)
  input()

accumulator = 0
for i in vase:
  if i == 1:
    accumulator += 1
  if i == 2:
    accumulator *= 2
  if i == 3:
    accumulator -= 1
print(accumulator)

গল্ফযুক্ত সংস্করণ (পাইথন 3, কোনও দানি প্রদর্শন নয়): 360 বাইট = 360 পয়েন্ট

def u(v):
  c=0
  for i in range(len(v),-1,-1):
    if i<len(v)-1:
      if v[i+1]==3 and v[i]in[1,2]:v[i],v[i+1],c=0,0,1
      if not v[i+1]and v[i]in[1,2,3]:v[i],v[i+1],c=v[i+1],v[i],1
  return c
l,v=input(),[0 for i in range(0, 10)]
while u(v)or l!="":
  if l!="":v[0],l=int(l[0]),l[1::]
a=0
for i in v:
  if i==1:a+=1
  if i==2:a*=2
  if i==3:a-=1
print(a)

আপনার প্রোগ্রামটি সঠিকভাবে কাজ করে কিনা তা পরীক্ষা করতে চাইলে আপনি এই ইনপুটটি পরীক্ষা করতে পারেন: 12122111131

সঠিক উত্তরটি হল 43 :) (ধন্যবাদ এমিগিনা)

এখন পয়েন্টগুলির জন্য:

  • (x) পয়েন্টগুলি যেখানে: x হল আপনার প্রোগ্রামটি লেখার জন্য প্রয়োজনীয় বাইটের পরিমাণ। আপনি যদি পরবর্তী চ্যালেঞ্জ পোস্ট হওয়ার পরে উত্তর দেন তবে এই চ্যালেঞ্জের জন্য পয়েন্টগুলি আপনার পয়েন্টের মোট পরিমাণে যুক্ত হবে না।

লক্ষ্যটি পুরো চ্যালেঞ্জের সময় ন্যূনতম পরিমাণের পয়েন্ট রাখা হয় :) আপনি যদি চ্যালেঞ্জের কোনও একটি অংশ এড়িয়ে যান তবে আপনার বাদ দেওয়া অংশের জন্য ডিফল্টরূপে (ডাব্লুএক্স + 1) পয়েন্ট থাকবে (যেখানে ডাব্লুএক্স সবচেয়ে খারাপ স্কোর) যে চ্যালেঞ্জ জন্য)।

পরবর্তী চ্যালেঞ্জের জন্য প্রয়োজনীয় ডেটা:

আউটপুট যখন ইনপুট = 10100000200310310113030200221013111213110130332101

বর্তমান চ্যাম্পিয়ন: এমিগনা

সৌভাগ্য সবার !


2
"ঠিক 10 জিনিস থাকতে পারে" এর সাথে কী রয়েছে? "বায়ু" একটি জিনিস হিসাবে গণনা করা হয়? ইনপুটটিতে এমনটি গ্যারান্টিযুক্ত যে ফুলদানিতে কেবলমাত্র 10 টি জিনিস থাকবে (আমি রেফারেন্স প্রয়োগের জন্য এটি পোষাক দেখছি না)? এছাড়াও পরবর্তী চ্যালেঞ্জের জন্য ডেটা তৈরি করে এমন ইনপুটটিতে 10 টিরও বেশি জিনিস রয়েছে বলে মনে হয় (এমনকি যদি বায়ু কিছুই নয় এবং বোমাগুলি বাতাসের উপরে পরবর্তী জিনিসটি 14 টি জিনিস থাকবে তবে)।
জোনাথন অ্যালান

1
একটি ইনপুট আপনার গল্ফযুক্ত অ্যালগরিদমে 333একটি দানি তৈরি করে [0, 0, 0, 0, 0, 0, 0, 3, 3, 3]এবং এর ফলে স্কোর তৈরি করে -3তবে এটি কি আপনার স্পেসিফিকেশন অনুযায়ী [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]স্কোর হওয়া উচিত না -1?
লাইকনি

2
@ লাইকনি আমি উল্লেখ করতে ভুলে গেছি যে বোমা যখন অন্যটির উপরে থাকে তখন বোমা ফেটে না, ধন্যবাদ!
Sygmei

1
10100000200310310113030200221013111213110130332101 এর আউটপুট 22 বলে মনে হচ্ছে, তাই না?
এরিক আউটগল্ফার

2
12122111131 এর মতো একটি জটিল পরীক্ষার কেস যুক্ত করা ভাল ধারণা হতে পারে।
এমিগানা

উত্তর:


5

পাইথন 2 - 208 191 185 180 172 164 156 বাইট

t=filter(bool,map(int,input()))
i=a=0
n=len(t)
while 0<n-1>i<11:
 if(t[i]>=3>t[i+1]):del t[i:i+2];i,n=0,n-2
 i+=1
for x in t[9::-1]:a+=a+x%2*(2-x-a)
print a

ব্রেকডাউন হ'ল এটি বায়ু এবং বোমাগুলি সরিয়ে দেয় যদি এটি স্ট্যাকের উপরে থাকে তবে গণনা করা হয়।

সম্পাদনা: বাইট সংরক্ষণ করতে আমি পাইথন 2 এ অদলবদল করেছিলাম, তবে এখন ইনপুটটি '3312123' এর মতো ব্রেসগুলিতে রাখা উচিত

সম্পাদনা 2: আমিও সঞ্চয়ের গণনায় গর্বিত

সম্পাদনা 3: আপনার সমস্ত পরামর্শের জন্য ধন্যবাদ আমি কখনই ভাবিনি যে আমি এটি এত কম পাব


প্রথম উত্তর! আমি পাইথনের সাথেও ভাবছিলাম তবে আজ খুব অল্প সময়ের মধ্যে। ভাবেন আপনি যেভাবেই হোক আমার পদ্ধতিকে মারতে পারতেন।
এলপিড্রো

দয়া করে মন্তব্য করার জন্য ধন্যবাদ :) প্রথমবার আমি একটি কোড গল্ফ করছি এবং আমি এটি বেশ মজাদার বলেছি।
পেরিস ডুয়াদি

4 টি বাইট সংরক্ষণ করার t[:10][::-1]পরিবর্তে ব্যবহার করুন reverse()এবং সম্ভবত ব্রাইটকেটটিতে পাইথন 2 ব্যবহার করতে পারেন print? আমার জন্য আরও 5 টি প্রাণ রক্ষা
পেয়েছে

আমার জন্য পাইথন 2 নেই যেহেতু এটির কাজ করার জন্য আমাকে ইনপুট () লাগাতে হবে, আরও 5 টি প্রাণ মারা যাবে। [[- - 1]
প্যারিস ডুয়াদি

বিটিডব্লিউ, আমি প্রশ্নের মধ্যে এমন কিছু দেখিনি যা বলে যে ইনপুটটি 'উদ্ধৃতিতে মোড়ানো হতে পারে। শুধু বলেছেন "ইনপুট জিনিসগুলির তালিকা"। পাইথন 2 এ কাজ করে :)
এলপেড্রো



3

পাইথন 2, 150 146 বাইট

v=[]
s=0
for c in input():
 v=v[:9]
 if'0'==c:1
 elif 3 in v[-1:]and c in'21':v=v[:-1]
 else:v+=[int(c)]
for x in v[::-1]:s+=s+x%2*(2-x-s)
print s

পয়েন্ট সূত্রের জন্য এবং 4 টি বাইট সংরক্ষণের জন্য পেরিস ডুডিকে ধন্যবাদ।


আপনি কি আমার সূত্রটি পয়েন্ট গণনা করার জন্য নিয়েছেন? যেভাবেই হোক দুর্দান্ত সমাধান, আপনি আমাকে মারলেন এবং এটি অনেক পরিষ্কার। এছাড়াও আপনি করে কিছু বাইট সংরক্ষণ করতে পারবেন for c in input()সরাসরি
প্যারিস Douady

2

জাভাস্ক্রিপ্ট, 267 264 249 আত্মত্যাগ করেছে

r='replace'
f=t=>{t=t[r](/0/g,'');while(/3[12]/.test(t.substring(0,10)))t=t[r](/3[12]/,'');
a=t.length-1;x=(t.substring(0,9)+(a>8?t[a]:'')).split('').reverse().join('');
c='c=0'+x[r](/1/g,'+1')[r](/2/g,';c*=2;c=c')[r](/3/g,'-1');eval(c);return c}

সম্পাদিত সংস্করণ, কারণ পূর্ববর্তীটি বড় ইনপুটগুলির জন্য ভুল ছিল was string.prototype.replace()অ্যারে-অ্যাক্সেসড ফাংশন কলটি তৈরি করে এটি আরও কিছুক্ষণ গল্ফ করে । ব্যাখ্যা:

f=t=>{                                  Function declaration, input t
t=t.replace(/0/g,'');                   Remove air
while(/3[12]/.test(t.substring(0,10)))  Look for bombs; not double bombs, and only in the first 10 chars
    t=t.replace(/3[12]/,'');            Detonate bombs. If this makes a new bomb fall into the vase, or
                                        a double bomb is now a single bomb, it'll detonate that bomb too.
x=(t.substring(0,9)+                    Fill the vase, take the first 9 items
    (t.length>9?t[t.length-1]:''))      If we have more than 9 items, then add the last one
    .split('').reverse().join('');      Flip the instruction string.
c='c=0'+x.replace(/1/g,'+1')            Replace each item with the proper instruction to the ACC
         .replace(/2/g,';c*=2;c=c')
         .replace(/3/g,'-1');
eval(c);return c}                       Eval to get the value of ACC and return it.

f('11231');আয় 2এটি অনলাইনে চেষ্টা করুন


10100000200310310113030200221013111213110130332101 ভাল ফলাফল ফেরায় না :) আপনি যদিও কাছেই
রয়েছেন

@ সিগমিই আমি জানি, এবং আমি এটি থেকে ক্রেপগুলি ডিবাগিং করছি, তবে কেন তা খুঁজে পাচ্ছি না। আপনি কি আমাকে
স্টেনবার্গ

1

হাস্কেল, 221 202 181 177 166 আত্মার বাইট

g(0:r)=r++[0]
g(3:x:r)|0<x,x<3=0:0:g r|1<3=3:g(x:r)
g(x:r)=x:g r
g r=r
v%(x:r)=g(init v++[x])%r
v%[]|v==g v=foldr([id,(+)1,(*)2,(-)1]!!)0v|1<3=g v%[]
(([0..9]>>[0])%)

আদর্শের উপর চেষ্টা করুন । পূর্ণসংখ্যা তালিকা হিসাবে আইটেম নেয়।

ব্যবহার:

*Prelude> (([0..9]>>[0])%) [1,2,1,2,2,1,1,1,1,3,1]
43

(সম্পাদনা: পুরাতন) ব্যাখ্যা:

g [] = []                             -- g simulates gravity in the vase
g ('0':r) = r ++ "0"                  -- the first 0 from the bottom is removed
g ('3':x:r) | elem x "12" = "00"++g r -- if a 1 or 2 is on a bomb, explode 
            | True = '3' : g(x:r)     -- else continue
g (x:r) = x : g r                     -- no air and no bomb, so check next item

c x = [id,(+)1,(*)2,(-)1]!!(read[x])  -- map 0, 1, 2, 3 to their score functions

f v w (x:r) =                         -- v is the current vase state, w the previous one
               init v++[x]            -- replace last vase element with input
             g(init v++[x])           -- simulate one gravity step
           f(g(init v++[x]))v r       -- repeat, w becomes v
f v w[] | v==w =                      -- if the input is empty and vase reached a fixpoint
                 foldr c 0 v          -- then compute score 
        | True = f (g v) v []         -- else simulate another gravity step


vase input = f "0000000000" "" input  -- call f with empty vase, previous vase state and
                                      -- the input as string of numbers

সাবাশ :) ! শেষ তিনটি কী "?
Sygmei

@ সিগমিই এটি দুটি স্ট্রিং f "0000000000" "", আপনার কেবল তাদের মধ্যে কোনও ফাঁকির প্রয়োজন নেই। আমি কোডটিতে একটি ব্যাখ্যা যুক্ত করেছি।
লাইকনি

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