বৈদ্যুতিক গ্যারেজের দরজা কি খোলা?


24

আমার বৈদ্যুতিক গ্যারেজ দরজা এইভাবে কাজ করে:

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

ধরুন শুরুতে দরজাটি পুরোপুরি বন্ধ রয়েছে।

পূর্ণসংখ্যার একটি ইনপুট তালিকা দেওয়া হবে। এই পূর্ণসংখ্যাগুলি কন্ট্রোল বোতামের ধারাবাহিক পুশগুলির মধ্যে আমি যে সেকেন্ড অপেক্ষা করি are

আউটপুট দুটি জিনিস:

  • সমস্ত বাটনের ধাক্কা শেষ হয়ে গেলে এবং দরজাটি স্থিতিশীল অবস্থায় পৌঁছেছে এমন একটি শতাংশ দরজার স্থিতি নির্দেশ করে। %প্রতীক আউটপুট isচ্ছিক।
  • দরজাটি পরবর্তী বোতামে ধাক্কা দিয়ে কী দিক নির্দেশ করবে সে সম্পর্কে একটি স্পষ্ট ইঙ্গিত। এটি up/ down, U/ D, +/ -, 1/ 0অথবা আপনি যেটি চয়ন করুন।

আপনি ধরে নিতে পারেন দরজাটি একটি উন্মুক্ত বা বন্ধ ক্রিয়াকলাপটি সম্পূর্ণ করতে 10 সেকেন্ডেরও কম সময় নেয়।

উদাহরণ ইনপুট:

<empty list>  # button was pushed just once
20            # button was pushed twice with 20 seconds between
10
5
20 20
10 10
5 5
1 2 3
8 9 10 11
11 10 9 8 7

উপরের ইনপুটগুলির সাথে সম্পর্কিত প্রত্যাশিত ফলাফলগুলি

100% D
0% U
0% U
50% D
100% D
100% D
0% U
100% D
0% U
20% U

সর্বশেষ পরীক্ষার উদাহরণস্বরূপ

  • দরজা বন্ধ বন্ধ শুরু। বাটন ঠেলা হয়
  • 11 সেকেন্ড অপেক্ষা করুন। দরজাটি সম্পূর্ণরূপে খোলা শেষ। বাটন ঠেলাঠেলি করা হয়।
  • 10 সেকেন্ড অপেক্ষা করুন। দরজাটি সম্পূর্ণভাবে বন্ধ হয়ে যায়। বাটন ঠেলাঠেলি করা হয়।
  • 9 সেকেন্ড অপেক্ষা করুন। বাটন ঠেলাঠেলি করা হয়। দরজা 90% খোলা এ থামে।
  • 8 সেকেন্ড অপেক্ষা করুন। বাটন ঠেলাঠেলি করা হয়। দরজা বন্ধ হতে শুরু করে।
  • 7 সেকেন্ড অপেক্ষা করুন। বাটন ঠেলাঠেলি করা হয়। দরজা 20% খোলা থাকে। পরবর্তী দিকটি উপরে থাকবে।

আপনি গ্যারেজের দরজাটি অর্ধ-খোলা থামে, আপনি যদি বোতাম টিপেন, বন্ধ করার সময়? আমার না, কেবল খোলার জন্য।
বালিন্ট

আমার কাছে @ বিলিন্ট উভয় পথে।
ডিজিটাল ট্রমা

@ মালটিসেন এখন শতাংশের সাথে তাল মিলিয়ে চলুন।
ডিজিটাল ট্রমা

যদি ইনপুটটিতেও ভাসমান পয়েন্ট সংখ্যা (গুলি) থাকে তবে কি ভাসমান পয়েন্ট নম্বর আউটপুট হয়?
আর কাপ,

@ আর কেপ হ্যাঁ, ঠিক আছে।
ডিজিটাল ট্রমা

উত্তর:


6

লুয়া, 258 248 242 বাইট

u,s,p=1>0,0>1,0;io.read():gsub("%d+",function(a)if(not s)then p=u and p+a or p-a;if(p>=10 or p<=0)then s,p=1>0,p>0 and 10 or 0;end;u,s=not u,not s else s=0>1;end end)if(not s)then p=u and 10 or 0;u=not u;end;print(10*p.."% "..(u and"U"or"D"))

Ungolfed

u,s,p=true,false,0;                          -- Up direction, Stopped, Position
io.read():gsub("%d+",function(t)             -- For each number in input
    if(not s)then                            -- If door wasn't stopped
        p=u and p+t or p-t;                  -- Position = Moving up ? +t : -t
        if(p>=10 or p<=0)then                -- If door fully opened or closed
            s,p=true,p>0 and 10 or 0;        -- Then door stopped at 0 or 10
        end 
        u,s=not u,not s;                     -- Toggle direction and toggle stopped
    else 
        s=false;                             -- If stopped, nothing happened, un-stop.
    end 
end)
-------------------- Done pressing the button --------------------
if(not s)then                                -- If left off moving
    p=u and 10 or 0;                         -- Finish movement
    u=not u;                                 -- Toggle direction
end 
print(10*p.."% "..(u and"U"or"D"))           -- Output answer

আপনার পরীক্ষার কেসগুলি কীভাবে সঠিক হতে পারে তা আমি দেখছি না ...

20 20 -- Initial push, after 20, garage is at 100, push to start it down, after 20, garage is at 0, push to start it up, garage finishes up.
10 10 -- Same as above
1 2 3 -- 0 U Moving, wait 1, 1 D Stopped, wait 2, 0 U stopped, wait 3, 100 D stopped

ওপি ফিক্সড


আমি সবেমাত্র আমার এন্ট্রি শেষ করেছি এবং আমি আপনার ফলাফলগুলির সাথেও একমত।
নিল


3

জাভাস্ক্রিপ্ট (ES6), 109 106 বাইট

a=>a.map(e=>(s^=1)?(r-=e*(d=-d))>9?(s=0,r=10):r<1?(r=s=0):r:r,r=s=0,d=1)&&(s?r:5*++d)*10+(d-s?"% D":"% U")

@ ডিজিটালট্রামা অবশ্যই একটি অপ্টিমাইজেশন ত্রুটি হয়েছে। আমি এটি আবার চালু করেছি এবং এইভাবে আরও 3 টি বাইট সংরক্ষণ করতে পেরেছি!
নীল

3

রুবি, 152 বাইট

->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

পরীক্ষার কেস:

f=->v{u,s,a=!!1,!0,0;v.map{|w|!s ?(a=u ? a+w : a-w;a>=10 ?(s,a=!!1,10):a<=0 ?(s,a=!!1,0):0;u,s=!u,!s):s=!0};!s ?(a=(u=!u)?0:10):0;p"#{10*a}% #{u ??U:?D}"}

f[[]]            # => "100% D"
f[[20]]          # => "0% U"
f[[10]]          # => "0% U"
f[[5]]           # => "50% D"
f[[20,20]]       # => "100% D"
f[[10,10]]       # => "100% D"
f[[5,5]]         # => "0% U"
f[[1,2,3]]       # => "100% D"
f[[8,9,10,11]]   # => "0% U"
f[[11,10,9,8,7]] # => "20% U"

মজাদার দিকের নোট হিসাবে, আপনি এক বাইটের দামে অতিরিক্ত বন্ধনীগুলির প্রয়োজনীয়তা (আমার মনে হয়) এ পরিবর্তন ->v{করে মুছে ফেলতে পারেন ->*v{। এছাড়াও, আপনি স্পেস দরকার আগে: সেইসাথে পরে? এবং আপনি কি নিশ্চিত যে :a<=0পার্স করা যায় না (:a) <= 0?
ফান্ড মনিকার লসুইট

সুন্দর টিপ! যদিও ভারে অ্যাক্সেস সহ ভার করা উচিত। হিসাবে হিসাবে :a<=0, আমি ArgumentError: comparison of Symbol with 0 failedযদি এটি কাজ না করে একটি পেয়েছিলাম। আমি মনে করি কারণ এটি পার্স করেছে ?এবং জানে যে এটি কোনও টার্নারি অপারেটরে রয়েছে, এটি কেবল কাজ করে। নিয়মগুলি আসলেই অদ্ভুত। আমি SyntaxError: unexpected tLABELএবং NoMethodError: undefined method ইউ এর মতো সিনট্যাক্স ত্রুটি এড়াতে প্রয়োজনীয় জায়গাগুলিতে ফাঁকা স্থান বা বন্ধনী রেখেছি '' `।
br3nt

আপনি যদি কোনও উন্নতি দেখতে পান তবে নির্দ্বিধায় কোনও সম্পাদনা করুন। আমি পরিত্রাণ পেতে a=u ? a+w : a-wএবং এটি a=a+w*dযেখানে dআছে 1বা -1দিকের উপর নির্ভর করে এটিকে পরিবর্তন করতে সক্ষম হবেন আশা করেছিলাম তবে আমি এখনও এটি কার্যকর করি নি।
br3nt

আমি যা বুঝি সে থেকে কোডকে আরও ভাল করে সম্পাদনা করা সাধারণত নিরুৎসাহিত হয়; পরিবর্তে, আপনি মন্তব্য করা উচিত। উন্নতির জন্য আপনার ধারণা হিসাবে, আমি dunno; দেখে মনে হচ্ছে এটি কাজ করতে পারে, তবে আমি নিশ্চিত নই।
মনিকার মামলার তহবিল

2

পাইথন 3.5, 193 187 185 181 175 173 172 বাইট:

def G(*p):
 O=100;y=0;l=10;z,v='UG'
 for g in[*p,O]:
  if v=='G':Q=O*g//10;y=min(max(0,[Q,y-Q][z=='D']),O);l=min(10,g);z='UD'[z=='U']
  v='GS'[(O>y>0)*(v!='S')]
 print(y,z)

উদাহরণস্বরূপ 1,2,3,4,5বা এমনকি এমনকি কমা দ্বারা পৃথক করা সংখ্যার আকারে ইনপুট নেয় 1.2,3.4,7.8,9.2। আউটপুট কিনা পরবর্তী পদক্ষেপে দরজা সঙ্গে নিচে ঊর্ধ্বগামী হয় বা UবাD যথাক্রমে। সময়ের সাথে সাথে আরও গল্ফ করবে।

এটি অনলাইন চেষ্টা করুন! (আইডিয়ন) (এখানে ইনপুটটি কমা দ্বারা পৃথক সংখ্যার সমন্বিত একটি তালিকা আকারে নেওয়া হয়, যেমন [1,2,3,4,5]))


1

পিএইচপি, 128 120 বাইট

$d=$argv[]=10;
foreach($argv as$a)
  if($r){$p=min(max($p+$a*$d,0),100);$r=$p<1||99<$p;$d=-$d;}else$r=1;
echo"$p% ".DU[$d>0];

কোড বক্সে ফিট করার জন্য কোডটি এখানে গুটিয়ে দেওয়া হয়। সবকিছুকে একটি এক লাইনে রাখুন, পিএইচপি ওপেন মার্কারটি সামনে রাখুন এবং এটিকে একটি ফাইলে সংরক্ষণ করুন। অথবা কমান্ড লাইন ব্যবহার করে এটি চালানphp -d error_reporting=0 -r '...the code...' [arguments]

Ungolfed সোর্স কোড, পরীক্ষা স্যুট এবং ব্যবহারের উদাহরণ পাওয়া যাবে GitHub

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