कूदना और दौड़ना


18

मैथ्यू को पहेलियां हल करना पसंद है। जब भी वह एक हल करने का प्रबंधन करता है वह खुशी से चारों ओर छोड़ देता है। हाल ही में उन्हें वास्तव में ऐसा करने की आवश्यकता है क्योंकि एक उल्का बौछार ने क्रेटर और छेद को जमीन में खोल दिया है जिसमें वह गिरना नहीं चाहेंगे।

आपको परिदृश्य का एक हिस्सा दिया जाता है जिसे मैथ्यू पार करना चाहता है, उम्मीद है कि अंत में स्वस्थ आ जाएगा। जमीन को मीटर में दिया जाता है, जिसमें प्रत्येक मीटर या तो सामान्य जमीन या एक छेद होता है। जब वह दौड़ रहा होता है तो वह एक मीटर प्रति कदम पार करने का प्रबंधन करता है; विकल्प कूद रहा है जो प्रति चरण चार मीटर को पार करता है। मैथ्यू पहले ग्राउंड मीटर पर बाईं ओर से शुरू होता है और अंतिम एक तक पहुंचना चाहता है (इससे परे नहीं, हालांकि - बस परिदृश्य में दिए गए पिछले मीटर से परे एक अंतहीन छेद की कल्पना करें)।

इनपुट

इनपुट को मानक इनपुट पर एकल लाइन के रूप में दिया जाता है, जिसे लाइन ब्रेक द्वारा समाप्त किया जाता है। रेखा में या तो डैश ( -) या अंडरस्कोर ( _) होते हैं , क्रमशः एक ग्राउंड या होल मीटर का प्रतिनिधित्व करते हैं। एक नमूना इनपुट हो सकता है:

----__--___---

दिए गए परिदृश्य कम से कम एक और अधिकतम 30 मीटर लंबे और हमेशा जमीन से शुरू होते हैं।

उत्पादन

आउटपुट मानक आउटपुट पर दिया जाता है और मैथ्यू के लिए आंदोलन कमांड की एक श्रृंखला का प्रतिनिधित्व करता है, या तो रन ( R) या कूद ( J)। जैसा कि ऊपर उल्लेख किया गया है, एक रन कमांड मैथ्यू को एक मीटर चलाने का कारण बनता है जबकि कूदते हुए उसे ठीक चार मीटर आगे ले जाता है। निम्नलिखित आंदोलन के ऊपर दिए गए उदाहरण के लिए संभव है:

RRJRJRR

जो लगभग इस प्रकार दिखता है:

आंदोलन का चित्रण RRJRJRR

यदि परिदृश्य के माध्यम से कोई सुरक्षित मार्ग नहीं है, तो एक एकल विस्मयादिबोधक चिह्न ( !) मुद्रित किया जाना चाहिए।

नमूना इनपुट

--------
----__--___---
-_______
-_-_-_-_-_-
-

नमूना आउटपुट

JRRR
RRJRJRR
!
!

(अंतिम आउटपुट रिक्त है क्योंकि कोई भी आंदोलन आवश्यक नहीं है, लेकिन मुझे लगता है, मार्कडाउन इसे पार्स नहीं कर सकता है)

ध्यान दें

केवल एक ही संभव पथ आवश्यक है, इसलिए प्रोग्राम आउटपुट को नमूना आउटपुट के बिल्कुल अनुरूप नहीं होना चाहिए। जब तक कोई समाधान दिया जाता है यदि यह मौजूद है और हर आंदोलन कमांड जमीन पर चला जाता है और अंतिम मीटर अंततः पहुंच जाता है, तो आउटपुट वैध है।

मानक त्रुटि पर अतिरिक्त आउटपुट को अनदेखा किया जाता है।

जीतने की स्थिति

सबसे कम कोड जीतता है, जैसा कि गोल्फ में प्रथागत है। एक टाई के मामले में, पहले वाला समाधान जीत जाता है।

परीक्षण के मामलों

समान परीक्षण मामलों वाले दो परीक्षण स्क्रिप्ट हैं:

मंगलाचरण दोनों मामलों में है: <test script> <my program> [arguments]जैसे ./test ruby jumprun.rbया ./test.ps1 ./jumprun.exe

एक और नोट

यह कार्य 2011-डब्ल्यू 24 के दौरान मेरे विश्वविद्यालय में आयोजित एक गोल्फ प्रतियोगिता का हिस्सा था। हमारे प्रतियोगियों के स्कोर और भाषाएँ इस प्रकार थीं:

  • 104 - हास्केल
  • 131 - हास्केल
  • 154 - सी
  • 170 - सी
  • 275 - VB.NET
  • 286 - आम लिस्प

हमारे अपने समाधान थे

  •   92 - रूबी
  • 124 - पॉवरशेल

@ जोय मुझे टेस्ट रन करने की कोशिश में एक त्रुटि मिलती है ./test.sh perl jump.pl- साथ ./test.sh: line 42: syntax error near unexpected token 'done', - के तहत, बैश 3.2.48 के साथ
swilliams

@ जॉय मैंने अपना कैश साफ़ कर दिया, फिर से डाउनलोड किया और यह अब बहुत अच्छा है। धन्यवाद।
swilliams

समाधानों को देखते हुए, यह वास्तव में बहुत तुच्छ था। क्षमा याचना।
जॉय

1
मुझे लगता है कि पीछे की ओर दौड़ना / कूदना अनुमत नहीं है? अगर ऐसा होता, तो यह भूस्खलन की तरह होता - जैसे - - हल करने योग्य।
कीथ रान्डेल

कीथ: थोड़ा बहुत देर हो चुकी है अब कार्य को बदलने के लिए, मुझे लगता है।
जॉय

जवाबों:


7

पर्ल, 53 वर्ण

s/-...(?=(-|-...)*-$)/J/g;y/-/R/;/_/?$_="!":s/.$//

इसके साथ चलाएं perl -p jumpnrun.pl। मैंने -pविकल्प के लिए 3 वर्णों की गणना की है, जो कि लंबाई perl jumpnrun.plऔर के बीच का अंतर है perl -p jumpnrun.pl

मैं पर्ल में वह धाराप्रवाह नहीं हूं, इसलिए मुझे पूरा यकीन है कि इसे और छोटा किया जा सकता है। यह हॉवर्ड के समाधान के समान एक regexp का उपयोग करता है ।


3

रूबी, 93 90 79 70 वर्ण

मैंने सोचा कि एक रेगेक्स समाधान काफी ठीक और कॉम्पैक्ट होगा (मिलान करने वाले को काम करने दें)। दुर्भाग्य से सभी किनारे-मामलों और विशेष उपचारों ने इसे एक लंबा बना दिया - कम से कम मैंने 100 ;-) को नहीं छुआ।

puts gets.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R)=~/^([JR]*)R$/?$1:?!

यह प्रदान की गई स्क्रिप्ट के सभी टेस्टकेस पास करता है।

पिछली स्क्रिप्ट की तुलना में कई पात्रों को सहेजा (अब एक कॉल gsubपर्याप्त है)।

संपादित करें 1: परीक्षण स्क्रिप्ट के बाद बदल गया puts z!=?-??!:''है z!=?-&&$><<?!परीक्षण मामले 1 के लिए कोई आउटपुट की अनुमति दी।

संपादन 2: पिछला संस्करण था

z=gets.chop
z.chars{z.sub!(/^(-|-...)((-|-...)*-)$/){$><<($1==?-??R:?J);$2}}
z!=?-&&$><<?!

मेरा मूल विचार इस तरह की लुक-बैक और लुक-फॉरवर्ड रणनीति का उपयोग करके वर्णों को प्रतिस्थापित करना था: पैटर्न था ^(?<=[RJ]*)(-|-...)(?=(-|-...)*-$)और मैं तब 'आर' के साथ 'और' को 'जे' से बदलूंगा। दुर्भाग्य से रूबी चर-लंबाई को देखने की अनुमति नहीं देता है और पहले भाग के लिए दूसरे कैप्चरिंग समूह ने कोड को और भी लंबा कर दिया है।

तो फिर मैंने पुनरावृत्ति दृष्टिकोण किया: यदि मैं ^(-|-...)अंतिम चरण तक कूदने या अन्य चरणों की श्रृंखला के बाद शुरू कर सकता हूं या कूद सकता (-|-...)*-$हूं तो मैं संबंधित पत्र को प्रिंट करता हूं, पहले एक / चार वर्णों को हटा देता हूं और फिर से शुरू करता हूं। यहां तक ​​कि अभिव्यक्ति के अंदर विकल्पों को स्विच करके आरजे बनाम जेआर प्राथमिकता को ट्यून किया जा सकता है (वर्तमान में यह आरजे पसंद करता है)।

संपादन 3: एकल घटाव को विभाजित करना

puts (z=gets.chop.gsub(/(-...|-)(?=(-|-...)*-$)/){$1==?-??R:?J})=~/_/??!:z.chop

में दो

puts (z=gets.chop.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R))=~/_/??!:z.chop

एक और कुछ चर दिया। अंत में मैं इस अंत मुद्दे से छुटकारा पाने में कामयाब रहा लेकिन एक लागत पर: असफल-पता लगाने में कुछ और पात्रों की लागत होती है।


आप अंतिम पंक्ति को बदलकर 3 वर्णों को सहेज सकते हैं z!=?-&&$><<?!। इसके अलावा, महान समाधान, +1!
वेंटरो

@ वेंटरो मैंने कहा था कि कोई भी पहला परीक्षण "क्योंकि -" ;-) के लिए बिल्कुल भी असफल नहीं होने के कारण विफल हो गया था
हावर्ड

हम्म, ऐसा प्रतीत होता है कि मेरी पॉवरशेल स्क्रिप्ट में एक छोटा बग है। यह स्पष्ट रूप से टेस्ट 2 के लिए कोई इनपुट स्वीकार नहीं करता है और टेस्ट 1 के लिए इसे स्वीकार नहीं करेगा। यह ... अजीब है, कम से कम कहने के लिए। मैं ठीक करने की कोशिश करूँगा।
जॉय

ठीक है, परीक्षण स्क्रिप्ट को तय किया जाना चाहिए और अब परीक्षण 1 के लिए वास्तव में खाली परिणाम को अस्वीकार नहीं करना चाहिए। ठीक है, अब इसे ठीक किया जाना चाहिए।
जॉय

@ जोये डंके। नन ने एसआईडी 90 ;-)
हावर्ड

1

पर्ल - 71 60

$_=<>;y/-/R/;s/R...(?=(R(...)?)*R$)/J/g;print/_/?"!":s/.$//r

अब सभी टेस्टेस को पास करता है। :) मुड़ता है कि मैं बहुत जल्दी अंतिम चरित्र को हटा रहा था ... और मेरा मूल रेगेक्स का आधा हिस्सा पूरी तरह से बेमानी था।

$ _ = $ ARGV [0]; y / - / R /? S / (R ... (? R)) (R * (= = R)) / J $ 2 / g; चॉप; प्रिंट / / "!": $ , $ /

फिर भी एक और रेगेक्स समाधान, पोस्ट में 5 टेस्टेसिस पास करता है।

के साथ -Eऔर sayइसके बजाय एक-लाइनर के रूप में चलाकर छोटा किया जा सकता है print, लेकिन तब पर्ल एक स्विच के रूप में इनपुट की व्याख्या करने की कोशिश करता है ... ( Unrecognized switch: -_-_-_-_-_-)


प्रश्न में कहा गया है कि इनपुट स्टड पर दिया गया है। उपयोग करने के बजाय स्टड से पढ़ने के लिए अपने समाधान को बदलते समय $ARGV, यह अभी भी परीक्षण स्क्रिप्ट से 108 टेस्टकेस को विफल करता है।
वेंचरो

@ वेंटरो ओह उफ़ ... मुझे लगता है कि मुझे पता है कि ऐसा क्यों होता है, मैं जल्द ही इसे ठीक कर दूंगा ... यही कि मुझे सभी
टेस्टस्कूलों के

खैर, स्क्रिप्ट का इरादा लोगों को आसानी से वैधता और विनिर्देश के पालन की जांच करने की अनुमति देना था :-)
जॉय

@ समस्या यह थी कि मैं किसी भी तरह 'टेस्ट स्क्रिप्ट' को 'संदर्भ कार्यान्वयन' के साथ भ्रमित करने में कामयाब रहा जब तक कि वेंटरो ने अपनी टिप्पणी पोस्ट नहीं की ... :) स्क्रिप्ट अब लगभग तय हो
चुकी है

1

पायथन - 89 93 97 93 वर्ण

सिर्फ इसलिए कि।

import re;i=re.sub('...(?<!---)-','J',input()[1:]);print('!'if'_'in i else re.sub('-','R',i))

केवल दस परीक्षण मामलों में विफल रहता है (उन मामलों को ध्यान में रखते हुए जहां कई वैध समाधान हैं)। मैं बाद में इसे पूरी तरह से ठीक कर दूंगा।


काम कर रहे रेगेक्स में से एक को उधार लेना, यह समाप्त होता है

import re;i=re.sub('-...(?=(-|-...)*-$)','J',input());print('!'if'_'in i else re.sub('-','R',i))

96 अक्षरों के साथ।


1
परीक्षण मामलों में से केवल 728 पास करता है। मैंने परीक्षण स्क्रिप्ट को एक कारण के लिए रखा, वास्तव में।
जॉय

@ जॉय: लगता है कि मैं इनपुट से अग्रणी चरित्र को ट्रिम करना भूल गया। मुझे मूर्ख। अब इसे सुधारा गया है।
JAB

अभी भी केवल 766/849 टेस्टकेस पास हुए हैं।
वेंचरो

1

हास्केल, 90 वर्ण:

मेरा पहला समाधान - लंबा, लेकिन गतिशील प्रोग्रामिंग का उपयोग करते हुए, रैखिक समय में काम करता है। :) 150 वर्ण :

x!y="!"
q '-'=max
q c=(!)
s i=r where r=zipWith3 q i(0&'R')$3&'J';n&c="":replicate n"!"++map(c#)r
c#"!"="!"
c#s=c:s
main=interact$reverse.last.s.init

दूसरा समाधान - बहुत धीमा (घातांक समय), लेकिन बहुत कम: 90 वर्ण

s"-\n"=""
s('-':t)=max('R'#s t)$'J'#s(drop 3 t)
s _="!"
c#"!"="!"
c#s=c:s
main=interact s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.