ジャンプとランニング


18

マシューはパズルを解くのが好きです。彼がなんとか解決しようとするたびに、彼は喜んでスキップします。最近、彼は本当にこれをする必要があります、流星群が地面に彼が落ちたくないクレーターと穴を開けたので。

あなたは、マシューが横断したい風景の一部を与えられ、うまくいけば最後に健康に到着します。地面はメートル単位で与えられ、各メートルは通常の地面または穴のいずれかです。彼が走っているとき、彼はなんとかステップごとに1メートルを越えることができます。別の方法は、ステップごとに4メートルを超えるジャンプです。マシューは最初の地上メーターの一番左から始まり、最後のメーターまで行きたいと思っています(ただし、それ以上ではありません。風景の最後のメーターを超えて無限の穴を想像してください)。

入力

入力は、改行で終了する標準入力の単一行として指定されます。線はダッシュ(-)またはアンダースコア(_)で構成され、それぞれ地面または穴のメーターを表します。サンプル入力は次のとおりです。

----__--___---

指定されたランドスケープは少なくとも1メートル、最大で30メートルの長さで、常に地面から始まります。

出力

出力は標準出力で提供され、Matthewへの一連の移動コマンド(runR)またはjumpJ))を表します。上記のように、 実行コマンドによりマシューは1メートル走り、ジャンプすると正確に4メートル前進します。上記の例では、次の移動が可能です。

RRJRJRR

おおよそ次のようになります。

ムーブメントRRJRJRRのイラスト

ランドスケープを通る安全なパスがない場合は、感嘆符(!)を1つ印刷する必要があります。

サンプル入力

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

サンプル出力

JRRR
RRJRJRR
!
!

(最後の出力は移動する必要がないため空白ですが、Markdownはこれを解析できないと思います)

注意

単一の可能なパスのみが必要であるため、プログラム出力はサンプル出力に正確に一致する必要はありません。ソリューションが存在し、すべての移動コマンドが地面に移動し、最終的に最後のメーターに到達した場合にソリューションが提供される限り、出力は有効です。

標準エラーの追加出力は無視されます。

勝利条件

ゴルフで通例であるように、最短のコードが勝ちます。同点の場合、以前のソリューションが優先されます。

テストケース

同じテストケースを含む2つのテストスクリプトがあります。

呼び出しはどちらの場合でも:<test script> <my program> [arguments]./test ruby jumprun.rbまたは./test.ps1 ./jumprun.exe

別のメモ

このタスクは、2011〜W24の間に私の大学で開催されたゴルフコンテストの一部でした。出場者のスコアと言語は次のとおりです。

  • 104 –ハスケル
  • 131 –ハスケル
  • 154 – C
  • 170 – C
  • 275 – VB.NET
  • 286 – Common Lisp

私たち自身のソリューションは

  •   92 –ルビー
  • 124 – PowerShell

@Joey私はエラーがでtest.shを実行しようとしてもらう./test.sh perl jump.pl- ./test.sh: line 42: syntax error near unexpected token 'done'bashの3.2.48の下で、
SWILLIAMS

@Joey私はキャッシュをクリアし、再ダウンロードしました。ありがとう。
swilliams

解決策を見ると、どうやら本当にささいなことでした。謝罪。
ジョーイ

1
逆走/ジャンプは許可されていないと思いますか?それだったら、それは風景が好きになるだろう- - -解けます。
キースランドール

キース:タスクを変更するには遅すぎますね。
ジョーイ

回答:


7

Perl、53文字

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

これを実行しperl -p jumpnrun.plます。私はのための3つの文字を数えまし-p間の長さの差であるオプション、perl jumpnrun.plおよびperl -p jumpnrun.pl

私はPerlにそれほど流ではないので、これをさらに短縮できると確信しています。これは、Howardのsolutionに似た正規表現を使用します


3

ルビー、93 90 79 70文字

正規表現のソリューションは非常に細かくコンパクトだと思いました(マッチャーに作業を任せます)。残念ながら、すべてのエッジケースと特別な処理により、これは非常に長くなりました-少なくとも私は100には触れませんでした;-)。

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

提供されたスクリプトのすべてのテストケースに合格します。

前のスクリプトと比較していくつかの文字を保存しました(1回の呼び出しgsubで十分です)。

編集1:テストスクリプトがテストケース1の出力を許可しないputs z!=?-??!:''ようz!=?-&&$><<?!に変更されました。

編集2:以前のバージョンは

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

私の元々のアイデアは、このような後読みと先読みの戦略を使用してキャラクターを置き換えることでした:パターンがあったので^(?<=[RJ]*)(-|-...)(?=(-|-...)*-$)、「-」を「R」に、そうでなければ「J」に置き換えました。残念なことに、Rubyは可変長の後読みを許可しておらず、最初の部分の別のキャプチャグループがコードをさらに長くしました。

だから私は反復アプローチをしました:ステップまたはジャンプで始まり^(-|-...)、最後のプラットフォームまで一連の他のステップまたはジャンプが続く(-|-...)*-$場合、対応する文字を印刷し、最初の1/4文字を削除してやり直します。式内の選択肢を切り替えることで、RJとJRの優先度を調整することもできます(現在はRJを優先しています)。

編集3: 単一の置換を分割する

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

2つに

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

別の数文字を与えました。最後に、この行末の問題をなんとか取り除くことができましたが、代償があります。失敗の検出にはさらに多くのキャラクターが必要です。


最後の行をに変更すると、3文字を保存できますz!=?-&&$><<?!。それ以外に、素晴らしい解決策、+ 1!
ヴェンテロ

@Ventero「-」の出力がまったくないため、最初のテストが失敗したということです;-)
ハワード

私のPowerShellスクリプトには小さなバグがあるようです。どうやら、テスト2 入力を受け付け、テスト1 入力を受け付けないようです。修正してみます。
ジョーイ

OK、テストスクリプトを修正し、テスト1で実際に空の結果を拒否しないようにします。OK、修正する必要があります。
ジョーイ

@ジョーイ・ダンケ。修道女の罪es 90 ;-)
ハワード

1

Perl- 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; chop; print / /? 「!」:$、$ /

さらに別の正規表現ソリューションは、投稿の5つのテストケースに合格します。

-Eとのsay代わりにとを使用してワンライナーとして実行することで短縮できますprintが、perlは入力をスイッチとして解釈しようとします...(Unrecognized switch: -_-_-_-_-_-


質問は、入力が標準入力に与えられると述べています。を使用する代わりにstdinから読み取るようにソリューションを変更すると$ARGV、テストスクリプトからの108個のテストケースが失敗します。
ヴェンテロ

@Ventero Ohおっと...それがなぜ起こるのか知っていると思うので、すぐに修正します...それは私がすべてのテストケースを通過しないことで得られるものです...> _>
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))

現在、10個のテストケースのみが失敗します(複数の有効なソリューションがある場合を考慮して)後で完全に修正します。


作業中の正規表現の1つを借りると、最終的には

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

96文字。


1
728のテストケースのみに合格します。実際に、テストスクリプトをそこに配置しました。
ジョーイ

@Joey:入力から主人公を切り落とすのを忘れたようです。愚かな私。修正されました。
JAB

それでも766/849のテストケースのみが合格します。
ヴェンテロ

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

2番目の解決策-はるかに遅い(指数時間)が、はるかに短い: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.