กระโดดและวิ่ง


18

แมทธิวชอบไขปริศนา เมื่อใดก็ตามที่เขาจัดการเพื่อแก้ปัญหาหนึ่งเขาข้ามไปรอบ ๆ อย่างมีความสุข เมื่อเร็ว ๆ นี้เขาต้องการทำเช่นนี้เนื่องจากฝนดาวตกได้เปิดหลุมอุกกาบาตและพื้นดินซึ่งเขาไม่อยากตก

คุณจะได้รับส่วนหนึ่งของภูมิประเทศที่แมทธิวต้องการข้ามหวังว่าจะได้สุขภาพที่ดีในตอนท้าย พื้นดินมีหน่วยเป็นเมตรโดยแต่ละเมตรจะเป็นพื้นดินปกติหรือเป็นหลุม เมื่อเขาวิ่งเขาจะข้ามหนึ่งเมตรต่อหนึ่งก้าว; ทางเลือกคือการกระโดดซึ่งข้ามสี่เมตรต่อขั้นตอน แมทธิวเริ่มต้นที่ด้านซ้ายสุดของมาตรกราวด์แรกและต้องการไปยังจุดสุดท้าย (แต่ไม่เกิน - ลองจินตนาการถึงหลุมที่ไม่มีที่สิ้นสุดเกินกว่ามาตรวัดสุดท้ายที่กำหนดในแนวนอน)

อินพุต

อินพุตถูกกำหนดเป็นบรรทัดเดียวบนอินพุตมาตรฐานสิ้นสุดโดยตัวแบ่งบรรทัด เส้นประกอบด้วยขีดกลาง ( -) หรือขีดล่าง ( _) แทนเส้นมิเตอร์หรือรูเมตรตามลำดับ ตัวอย่างอินพุตอาจเป็น:

----__--___---

ภูมิทัศน์ที่กำหนดมีอย่างน้อยหนึ่งตัวและที่ความยาวไม่เกิน 30 เมตรและเริ่มต้นด้วยพื้นดินเสมอ

เอาท์พุต

เอาต์พุตถูกกำหนดบนเอาต์พุตมาตรฐานและแสดงชุดของคำสั่งการเคลื่อนไหวให้กับ Matthew ทั้งrun ( R) หรือjump ( J) ตามที่ระบุไว้ข้างต้น คำสั่งเรียกใช้ทำให้แมทธิววิ่งหนึ่งเมตรในขณะที่กระโดดพาเขาไปข้างหน้าสี่เมตร สำหรับตัวอย่างที่ให้ไว้ข้างต้นการเคลื่อนไหวต่อไปนี้เป็นไปได้:

RRJRJRR

ซึ่งมีลักษณะโดยประมาณดังนี้:

ภาพประกอบของการเคลื่อนไหว RRJRJRR

หากไม่มีเส้นทางที่ปลอดภัยผ่านภูมิทัศน์เครื่องหมายอัศเจรีย์ ( !) ควรจะพิมพ์ออกมา

อินพุตตัวอย่าง

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

ตัวอย่างผลลัพธ์

JRRR
RRJRJRR
!
!

(เอาต์พุตสุดท้ายว่างเปล่าเนื่องจากไม่จำเป็นต้องเคลื่อนย้าย แต่ฉันเดาว่า Markdown ไม่สามารถแยกวิเคราะห์ได้)

บันทึก

จำเป็นต้องใช้พา ธ เดียวที่เป็นไปได้เท่านั้นดังนั้นผลลัพธ์ของโปรแกรมไม่จำเป็นต้องสอดคล้องกับเอาต์พุตตัวอย่าง ตราบใดที่มีการแก้ปัญหาหากมันมีอยู่และทุกคำสั่งการเคลื่อนไหวจะเคลื่อนที่ไปที่กราวด์และถึงมิเตอร์สุดท้ายในที่สุดผลลัพธ์ก็จะถูกต้อง

เอาต์พุตเพิ่มเติมเกี่ยวกับข้อผิดพลาดมาตรฐานจะถูกละเว้น

สภาพการชนะ

รหัสที่สั้นที่สุดชนะเช่นเดียวกับในกอล์ฟ ในกรณีที่เสมอกันการแก้ปัญหาก่อนหน้านี้ชนะ

กรณีทดสอบ

มีสองสคริปต์ทดสอบที่มีกรณีทดสอบเหมือนกัน:

ภาวนาอยู่ในทั้งสองกรณี: <test script> <my program> [arguments]เช่นหรือ./test ruby jumprun.rb./test.ps1 ./jumprun.exe

หมายเหตุอื่น

งานนี้เป็นส่วนหนึ่งของการแข่งขันกอล์ฟที่จัดขึ้นที่มหาวิทยาลัยของฉันในช่วงปี 2011-W24 คะแนนและภาษาของผู้แข่งขันของเรามีดังนี้:

  • 104 - Haskell
  • 131 - Haskell
  • 154 - C
  • 170 - C
  • 275 - VB.NET
  • 286 - เสียงกระเพื่อมสามัญ

ทางออกของเราเองคือ

  •   92 - ทับทิม
  • 124 - PowerShell

@Joey ฉันได้รับข้อผิดพลาดในการพยายามที่จะทำงานกับ test.sh ./test.sh perl jump.pl- ./test.sh: line 42: syntax error near unexpected token 'done'ภายใต้การทุบตี 3.2.48
swilliams

@ โจฉันฉันล้างแคชของฉันดาวน์โหลดใหม่และมันใช้งานได้ดีในขณะนี้ ขอบคุณ
swilliams

เมื่อมองไปที่วิธีแก้ปัญหามันก็ดูเล็กน้อยเกินไป ขอโทษ.
Joey

1
ฉันเข้าใจว่าไม่อนุญาตให้วิ่ง / กระโดดถอยหลัง ถ้าเป็นเช่นนั้นมันจะทำให้ทิวทัศน์เหมือน - - - แก้ไขได้
Keith Randall

Keith: สายเกินไปที่จะเปลี่ยนงานฉันเดา
Joey

คำตอบ:


7

Perl, 53 ตัวอักษร

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

perl -p jumpnrun.plทำงานนี้ด้วย ฉันนับตัว-pเลือก3 ตัวซึ่งเป็นความยาวแตกต่างกันระหว่างperl jumpnrun.plและperl -p jumpnrun.plและ

ฉันไม่ได้พูดภาษา Perl อย่างคล่องแคล่วดังนั้นฉันค่อนข้างมั่นใจว่าสามารถย่อให้สั้นลงได้อีก นี้ใช้ regexp คล้ายกับวิธีการแก้ปัญหาของฮาวเวิร์ด


3

ทับทิม, 93 90 79 70 ตัวอักษร

ฉันคิดว่าวิธีการแก้ปัญหา regex จะค่อนข้างดีและมีขนาดกะทัดรัด (ให้ matcher ทำงานได้) โชคไม่ดีที่กรณีและการรักษาพิเศษทำให้สิ่งนี้ยาวอย่างน้อยที่สุดฉันไม่ได้แตะ 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]*)(-|-...)(?=(-|-...)*-$)และฉันจะแทนที่ '-' ด้วย 'R' และอย่างอื่นด้วย 'J' น่าเสียดายที่ Ruby ไม่อนุญาตให้มีการดูความยาวผันแปรและกลุ่มการจับภาพอื่นสำหรับส่วนแรกทำให้รหัสยาวขึ้น

ดังนั้นฉันจึงใช้วิธีวนซ้ำ: ถ้าฉันสามารถเริ่มต้นด้วยขั้นตอนหรือกระโดด^(-|-...)ตามด้วยชุดของขั้นตอนอื่น ๆ หรือข้ามไปจนถึงแพลตฟอร์มสุดท้าย(-|-...)*-$จากนั้นฉันพิมพ์ตัวอักษรที่เกี่ยวข้องลบตัวอักษรหนึ่ง / สี่ตัวแรกแล้วเริ่มต้นใหม่อีกครั้ง เปิดยังสามารถปรับแต่งลำดับความสำคัญ RJ กับ JR โดยการสลับตัวเลือกภายในนิพจน์ (ปัจจุบันเป็นที่ต้องการ 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!
Ventero

@Ventero ฉันได้ที่หนึ่งใส่การทดสอบครั้งแรกล้มเหลวเนื่องจากการส่งออกที่ทุกคนไม่มี "-" ;-)
ฮาวเวิร์ด

อืมดูเหมือนว่าสคริปต์ PowerShell ของฉันมีข้อบกพร่องเล็กน้อย เห็นได้ชัดว่ามันไม่ยอมรับอินพุตสำหรับการทดสอบ 2 และจะไม่ยอมรับสำหรับการทดสอบ 1 นั่นคือ ... แปลกที่จะพูดน้อย ฉันจะพยายามแก้ไข
Joey

ตกลงสคริปต์ทดสอบควรได้รับการแก้ไขและไม่ปฏิเสธผลลัพธ์ที่ว่างเปล่าสำหรับการทดสอบ 1 อีกต่อไปตอนนี้ควรได้รับการแก้ไขแล้ว
Joey

@ Joey Danke Nun sind es 90 ;-)
Howard

1

Perl - 71 60

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

ตอนนี้ผ่านการทดสอบทั้งหมด :) ปรากฎว่าฉันลบตัวละครตัวสุดท้ายเร็ว ๆ นี้ ... และครึ่งหนึ่งของ regex ดั้งเดิมของฉันซ้ำซ้อนอย่างสิ้นเชิง

$ _ = $ ARGV [0]; y / - / R /; s / (R ... (? = R)) (R * (? = R)) / J $ 2 / g; chop; print / /? "!": $ , $ /

อีกโซลูชันหนึ่งของ regex ผ่านการทดสอบ 5 ครั้งในการโพสต์

อาจถูกทำให้สั้นลงโดยใช้เป็นซับเดียว-Eและsayแทนprintแต่แล้ว Perl พยายามตีความอินพุตเป็นสวิตช์ ... ( Unrecognized switch: -_-_-_-_-_-)


คำถามระบุว่าการป้อนข้อมูลจะได้รับใน stdin เมื่อเปลี่ยนวิธีการแก้ปัญหาของคุณเพื่ออ่านจาก stdin แทนที่จะใช้$ARGVมันก็ยังคงล้มเหลว 108 testcases จากสคริปต์ทดสอบ
Ventero

@Ventero โอ๊ะโอ ... ฉันคิดว่าฉันรู้ว่าทำไมมันถึงเป็นเช่นนั้นฉันจะแก้ไขปัญหาในไม่ช้า ... นั่นคือสิ่งที่ฉันจะได้ไม่ผ่านการทดสอบทั้งหมด ... > _>
swilliams

ความตั้งใจของสคริปต์ก็เพื่อให้ผู้คนสามารถตรวจสอบความถูกต้องและการปฏิบัติตามข้อกำหนด :-) ได้อย่างง่ายดาย
Joey

@Joey ปัญหาคือการที่ฉันจัดการอย่างใดให้เกิดความสับสน 'ทดสอบสคริปต์' กับ 'ดำเนินการอ้างอิงจนกระทั่ง Ventero โพสต์ความคิดเห็นของเขา :) ... สคริปต์อยู่ในขณะนี้เกือบคงที่ในขณะนี้แม้ว่าปัจจุบันมีเพียง 20 ล้มเหลวทั้งหมดเชิงลบเท็จ
swilliams

1

Python - 89 93 97 93 ตัวอักษร

เพียงเพราะว่า.

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

ล้มเหลวเพียงสิบกรณีทดสอบในขณะนี้ (คำนึงถึงกรณีที่มีโซลูชั่นที่ถูกต้องหลายรายการ) ฉันจะแก้ไขอย่างเต็มที่ในภายหลัง


ยืมหนึ่งใน regexes ทำงานมันจะกลายเป็น

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

ด้วย 96 ตัวอักษร


1
ผ่านกรณีทดสอบเพียง 728 กรณี จริง ๆ แล้วฉันวางสคริปต์ทดสอบไว้ที่นั่น
Joey

@ โจอี้: ดูเหมือนว่าฉันลืมที่จะตัดแต่งตัวละครนำจากการป้อนข้อมูล โง่ฉัน ได้รับการแก้ไขแล้ว
JAB

ยังคงผ่านการทดสอบ 766/849 เท่านั้น
Ventero

1

Haskell, 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.