প্রতিটি প্যানকেক লেপ


35

আপনার উপরে একটি প্লেট প্যানকেকের স্ট্যাক রয়েছে যাতে উপরে একটি সিরাপের গ্লোব রয়েছে যাতে এটি ঘন হয়ে যায়। প্রতিটি প্যানকেকের উভয় মুখ কমপক্ষে সিরাপ স্পর্শ না করা পর্যন্ত আপনি খেতে খুশি হবেন না, তবে এখনই শীর্ষ প্যানকেকের কেবল একটি মুখ রয়েছে।

আপনি জানেন যে সিরাপটি এমনকি একটিও প্যানকেকের মধ্য দিয়ে কখনও ভিজবে না, তবে এটি দুটি প্যানকেকের মধ্যে মুখোমুখি যোগাযোগের মাধ্যমে অনির্দিষ্টকালের জন্য স্থানান্তর করা যেতে পারে। একবার প্যানকেকের মুখটি সিরাপ ছোঁয়া গেলে এটি চিরতরে সিরাপযুক্ত প্রলিপ্ত হিসাবে বিবেচিত হয় এবং কোনও সিরাপবিহীন প্রলিপ্ত মুখ তৈরি করে যা এটি সিরাপকে স্পর্শ করে as প্লেটের উপরের দিক থেকে এবং পাশাপাশি সিরাপ স্থানান্তর করা সম্ভব।

আপনি এক বা একাধিক প্যানকেকের নীচে একটি স্প্যাটুলা andুকিয়ে এবং প্যানকেক বাছাইয়ের ক্ষেত্রে ঠিক একইভাবে ফ্লিপ করে প্রতিটি প্যানকেকের মুখটি সিরাপের সাথে আবরণে এগিয়ে যান । (দুর্ভাগ্যক্রমে এই স্পটুলা সিরাপ-প্রতিরোধী, এবং প্যানকেকের মুখগুলি স্পর্শ করে সিরাপ বিতরণে সহায়তা করে না)) দুঃখের বিষয় আপনি কোন প্যানকেকের মুখগুলি সিরাপ ছুঁয়েছে তার ট্র্যাকটি হারাতে পারেন তবে আপনি যে ফ্লিপগুলি তৈরি করেছেন তা মনে আছে।

আপনার অতীত ফ্লিপগুলি দেওয়া কি আপনি নির্ধারণ করতে পারবেন আপনার প্যানকেকগুলি এখনও সিরাপের সাথে লেপযুক্ত কিনা?

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম লিখুন যা প্যানকেকের সংখ্যার জন্য ইতিবাচক পূর্ণসংখ্যামূলক এন এবং আপনি এখন পর্যন্ত যে ফ্লিপগুলি করেছেন সেগুলির জন্য ধনাত্মক পূর্ণসংখ্যার (সমস্ত <= এন) একটি তালিকা লিখুন। তালিকার প্রতিটি সংখ্যা উল্লিখিত প্যানকেকের সংখ্যা উপস্থাপন করে। যদি প্যানকেকস লেপযুক্ত হয়ে থাকে তবে সত্যবাদী মান আউটপুট করুন এবং তা না হলে একটি মিথ্যা মান। ( সত্যবাদী / মিথ্যা সংজ্ঞা )

ইনপুটটি স্টিডিন বা কমান্ড লাইন থেকে আসা উচিত এবং আউটপুটটি স্টাডআউট (অথবা নিকটতম বিকল্প) এ যাওয়া উচিত। আপনার ইনপুটটির জন্য যদি অতিরিক্ত অতিরিক্ত বিন্যাসের প্রয়োজন হয় তবে তা ঠিক আছে: তালিকার [1, 1, 2, 2]পরিবর্তে 1 1 2 2

উদাহরণ

ধরে নিন এন = 2, সুতরাং উপরে একটি সিরাপ দিয়ে শুরু করে আমাদের কাছে একটি প্লেটে দুটি প্যানকেকের স্ট্যাক রয়েছে।

যদি তালিকাটি থাকে তবে এর 1 1 2 2অর্থ আমরা ...

  • উপরের প্যানকেকটি ফ্লিপ করুন - নীচের প্যানকেকের উপরের মুখটি আবরণ করুন
  • আবার শীর্ষে ফ্লিপ করুন - শীর্ষ প্যানকেকের মূল নীচের মুখটি আবরণ করুন
  • উভয় ফ্লিপ - প্লেট লেপ
  • আবার দুটি ফ্লিপ করুন - নীচের প্যানকেকের মূল নীচের মুখটি আবরণ করুন

যেহেতু সব চারটি করে মুখ আবরিত আউটপুট ভালো কিছু হবে Trueবা 1

যদি তালিকাটি থাকে তবে এর 1 2 2 1অর্থ আমরা ...

  • উপরের প্যানকেকটি ফ্লিপ করুন - নীচের প্যানকেকের উপরের মুখটি আবরণ করুন
  • উভয় ফ্লিপ - কিছুই লেপ
  • উভয় আবার ফ্লিপ - কিছুই লেপ
  • আবার শীর্ষে ফ্লিপ করুন - শীর্ষ প্যানকেকের মূল নীচের মুখটি আবরণ করুন

যেহেতু মুখ প্লেট স্পর্শ এখনো সিরাপ-মুক্ত হয় আউটপুট ভালো কিছু হবে Falseবা 0

নোট

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

স্কোরিং

এটি কোড-গল্ফ। বাইটস মধ্যে সংক্ষিপ্ত সমাধান ।


4
এটি একটি খুব, খুব সুন্দর চ্যালেঞ্জ। ;)
সোহম চৌধুরী

একটি ফাংশন যা একটি তালিকা পায় এবং একটি বুলিয়ান ফিরে আসে ঠিক আছে?
গর্বিত হাসেলেলার

9
যদি কেউ এই ভাষায় এটি প্রয়োগ করতে পারে তবে একটি বোনাস থাকা উচিত ।
grc

3
@grc এখন ঠিক সেই জন্য একটি অনুগ্রহ আছে!
ক্যালভিনের

2
প্যানকেক স্ট্যাকে আমার সমাধানটি Put syrup on the pancakes!
হ'ল:;

উত্তর:


9

সিজেম, 32 30 29 বাইট

q~2@#2b\{)/(W%)1$0=|@]s:~}/:&

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

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

$ cjam pancakes.cjam <<< '2 [1 1 2 2]'; echo
1
$ cjam pancakes.cjam <<< '2 [1 2 2 1]'; echo
0

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

q~                            " N, L := eval(input())                                     ";
  2@#2b                       " P := base(2 ** N, 2)                                      ";
       \{                }/   " for F in L:                                               ";
         )/                   "   P := split(P, F + 1)                                    ";
           (W%)               "   T, U, V := P[1:], reverse(P[0])[:-1], reverse(P[-1])[0] ";
               1$0=|          "   V |= U[0]                                               ";
                    @]s:~     "   P := map(eval, str([U, V, T]))                          ";
                           :& " print and(P)                                              ";

17
CJam? CRup এর মতো আরও
ইনগো বার্ক

12

হাস্কেল, 92 90 86 84 114 110 99 98

একটি সম্পূর্ণ প্রোগ্রামের প্রয়োজন তাই বিরক্তিকর। আমি ভাবছি কেন কারও এই প্রয়োজন হবে।

m(n:s)=all(<1)$foldl(\r@(p:s)n->reverse(take n s)++(p*r!!n):drop n s)[0..n]s
main=readLn>>=print.m

এই সমাধানটি পাশের একটি তালিকা দ্বারা প্যানকেকের গাদাকে প্রতিনিধিত্ব করে কাজ করে, যখন সংলগ্ন প্যানকেকস একই পক্ষটি ভাগ করে দেয়। প্রতিটি পাশই একটি সংখ্যা, এবং এর একটি শূন্য মান থাকে তবে একটি পক্ষের প্রলেপ দেওয়া হয়।

হিসাবে চালান:

*Main> main
[2,1,1,2,2]
True

1
পাইথন 2 ব্যবহার না করার জন্য +1;)
ক্যালভিনের

@ ক্যালভিনের শখগুলি লস
গর্বিত হাসেলেলার

আমার ভয় একটি পুরো প্রোগ্রাম প্রয়োজন বোধ করা হয় ... আছি
জন ডিভোরাক

1
@ জনডভোরাক আমি এটি দেখতে পাইনি ... আমি কেবল জিজ্ঞাসা করেছি প্রশ্নের মন্তব্যে কোনও ফাংশন ঠিক আছে কিনা? যদি তা না হয় তবে আমি এটি পরিবর্তন করব
গর্বিত হাসেলেলার

@ প্রভাডসকেলার এখন আপনাকে ওপি দ্বারা সুস্পষ্টভাবে বলা হয়েছে ... আমি শীঘ্রই একটি পরিবর্তন আশা করি।
জন ডিভোরাক

10

পাইথন, 92 বাইট

আমি মনে করি এটি কাজ করে:

s=[1]+[0,0]*input()
for f in input():x=f*2;s[0]=s[x]=s[0]|s[x];s[:x]=s[x-1::-1]
print all(s)

কোনটি সিরাপের সাথে লেপযুক্ত তা মনে রাখতে এটি প্যানকেক ফেসগুলির তালিকা (প্লেট অন্তর্ভুক্ত) ব্যবহার করে। তালিকার অংশটি বিপরীত করে প্যানকেকগুলি উল্টানো হয় তবে কোনও সিরাপ প্রথমে শীর্ষ মুখ এবং সদ্য প্রকাশিত মুখের মধ্যে স্থানান্তরিত হয়।

ব্যবহার:

$ python pancakes.py
2
1, 1, 2, 2
True

এটি একটি বিপরীত উপায়, সত্যিই চতুর উপায়। +1
সোহম চৌধুরী

দেখে মনে হচ্ছে আপনি "সবকিছুই সিরাপি" চেক থেকে প্লেট বাদ দিচ্ছেন। তোমার কি দরকার? সমস্ত প্যানকেক মুখ আবদ্ধ হয়ে গেলে, প্লেটটি একটি সিরাপি প্যানকেকের মুখটি স্পর্শ করবে, সুতরাং প্লেটটিও সিরাপি হবে।
ব্যবহারকারী 2357112 মনিকা 24

@ ব্যবহারকারী 2357112 হ্যাঁ, আপনি ঠিক বলেছেন। ধন্যবাদ!
grc

8

পাইথন 2: 75

জিআরসি এবং ফেয়ারসামের সমাধানগুলির সরলীকরণ।

n,b=input()
s=[1]+[0]*n
for x in b:s[:x+1]=s[x::-1];s[x]|=s[0]
print all(s)

2*n+1প্যানকেক প্রান্তের সিরাপের স্টোর সংরক্ষণ করা বাড়াবাড়ি কারণ স্পর্শকারী প্রান্তগুলি সর্বদা একই থাকে। এটি পরিবর্তে প্রতিটি n+1প্যানকেক জংশনের স্থিতি মনে রাখে । এইভাবে, সিরাপ স্থানান্তর স্বয়ংক্রিয়ভাবে গণ্য করা হয়।

একমাত্র আপডেটের দরকার হ'ল মোড়ের সিরাপ সংরক্ষণ করা xযখন কোনও ফ্লিপ এটি কেটে দেয়। এটি পোস্ট-ফ্লিপ সিরাপ 0ইন বা ইন-দ্বারা করা হয় x

দুবার ইনপুট নেওয়া চরিত্রের গণিতে প্রভাব ফেলবে না।

s=[1]+[0]*input()
for x in input():s[:x+1]=s[x::-1];s[x]|=s[0]
print all(s)

5

পাইথন 2, 93 বাইট

প্রথমে আমি আমার উত্তরটি পোস্ট করতে যাচ্ছিলাম, তবে তারপরে গ্র্যাক এক মিনিট আগে ইতিমধ্যে একটি খুব অনুরূপ পোস্ট করেছিল। তাই আমি কিছু উন্নতি নিয়ে আসতে চেষ্টা করেছি। আমি খুঁজে পেলাম কেবলমাত্র এর পরিবর্তে একটি অভিধান সংক্রান্ত তালিকার তুলনা ব্যবহার করা all()

সম্পাদনা: বিভিন্ন ইনপুট পদ্ধতি যা অক্ষর গণনা পরিবর্তন করে না চেষ্টা করে ব্যর্থ চেষ্টা করে একটি প্রবর্তিত ভুল সংশোধন করে।

n,F=input()
L=[1]+2*n*[0]
for f in F:f*=2;L[0]=L[f]=L[0]|L[f];L[:f]=L[~-f::-1]
print[1]*2*n<L

নমুনা ইনপুট / আউটপুট:

2, [1, 1, 2]

 

False



2

হাস্কেল, 129 125

t(m:l)=all(any(<1).(\i->foldr(\n->foldr($)[].map(n%))[i]l))[0..m]
n%i|i>n=(i:)|i<n=(n-i:)|1>0=(n:).(0:)
main=readLn>>=print.t

সম্ভবত এখনও পুরোপুরি গল্ফ হয়নি, তবে প্রলিপ্ত দিকগুলির তালিকা পরিচালনা না করে এটি কাজ করে। পরিবর্তে, প্রদত্ত প্যানকেকের প্রদত্ত দিকটি শুরুতে শীর্ষ দিকের যে কোনও জিনিসের সংস্পর্শে এসেছিল কিনা তা নির্ধারণের জন্য এটি পিছনের দিকে কাজ করে। foldrফ্লিপগুলির তালিকাটি কার্যকরভাবে পিছনে পিছনে পিছনে যায়, সুতরাং সেখানে নেই reverse

সুতরাং এখানে অ্যালগরিদমটি রয়েছে: আমরা সমস্ত প্রাসঙ্গিক দিকগুলিতে মানচিত্র তৈরি করি ( [0..m]) এবং আমাদের পক্ষটি প্রতিটি পদক্ষেপে পিছন থেকে শুরু করে সিরাপের উত্তরাধিকারী বলে একটি তালিকা তৈরি করে: প্রাথমিকভাবে তালিকাটি কেবলমাত্র [i], তবে nপ্যানকেকের একটি ফ্লিপ সহ প্রতিটি প্রবেশ হয়ে [n-i]যদি i<n, [n,0]যদি i==n, এবং [i]যদি i>n। সমস্ত পক্ষের ফলাফলের তালিকায় যদি একটি 0( any (<1)) থাকে তবে কেবল যদি প্রশ্নটির দিকটি আবদ্ধ থাকে তবে । allবাকিটি করে এবং mainএগুলি একটি চলমান প্রোগ্রামে রূপান্তর করে।

প্রোগ্রামটি এর ইনপুটটি একটি নতুন লাইন দ্বারা সমাপ্ত হয়ে stdinআকারে থেকে নেয় [n_pancakes, flip1, flip2, flip3, ...]


আকর্ষণীয় পদ্ধতির
গর্বিত হাসেলেলার

কীভাবে পরিবর্তে ব্যবহার তালিকাতে উত্তরাধিকারী তালিকা কোডে ফাংশন ব্যবহার করে, অর্থাত্ n%i|i>n=[i]|i<n=[n-i]|0<1=[n,0]এবং পরিবর্তে foldr($)[].map(n%)আছে (=<<).(%), সব উত্তরাধিকারী মানচিত্র এবং তাদের সঙ্গে যোগ দেবে।
গর্বিত হাসেলেলার 10

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