優先権


12

あなたの仕事は、交差点の交通を規制することです。北、東、南、西から4本の道路があります。

入力は、各道路の今後の交通量を表す文字列です。たとえばNNNWS、北に3台、西に1台、南に1台の合計5台の車があることを示します。文字の順序はここでNNNWSは重要ではなく、と同等WNNSNです。

正しいルールの優先順位を使用して、車が進むべき順序を出力する必要があります:南から来る車は東から来る車を最初に行かなければなりません、東は北に、北は西に、西はに譲る南。

たとえば、入力NNNWSで、南の車が最初に移動し、次に西の車、次に3つの北の車が移動します。したがって、出力はになりますSWNNN。

いくつかの不確定なケースがあります。たとえば、NSまたはNNWSE:文字列を出力する必要がありますstuck。

テストケース

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck

3
どちらも送信方向も考慮しているため、どちらも非常に難しいようです。
— マーティンエンダー

3
印刷する代わりに、未定義の動作を使用することをお勧めしますstuck。
— エリックアウトゴルファー16

4
@Erik交通安全を扱う場合、未定義の動作は受け入れられません:
— Arnaud

2
関連。関連。
— 16

2
入力として空の文字列は可能ですか?もしそうなら、結果はどうでしょうか?そして、なぜNS立ち往生していますか?両方のためNSとSN解決策でしょうか?
— トンホスペル16年

回答:


2

Perl、65バイト

+2を含む -lp

STDINに入力します。空の文字列は有効な入力ではないと仮定します

#!/usr/bin/perl -lp
s%.%'+(y/NESW/ESWN/*s/N(.*)W/W$1N/,/N/^/S/)'x4%gere+0or$_=stuck

オプションstuckを削除した後、改行がないことを気にしないl場合


2

PHP、267バイト

新しい宇宙船演算子と@IsmaelMiguelによるusort -5バイトを使用します

<?foreach($f=[E,S,W,N]as$l)$s.=+!($r=strstr)($i=$argv[1],$l);if(in_array($s,[0101,1010,0000]))die(stuck);$x=($p=strpos)($s,"1");$t=$r($j=join($f),$f[$x]).$r($j,$f[$x],1);$a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});echo join($a);

壊す

# Extended Version without notices
$s="";
foreach($f=["E","S","W","N"] as $l){$s.=+!strstr($i=$argv[1],$l);} #bool concat swap the false true values in string
if(in_array($s,["0101","1010","0000"])){die("stuck");} # NS WE NESW -> stuck = end program
$x=strpos($s,"1"); # find the first false value for an begin for the sort algorithm
$t=strstr($j=join($f),$f[$x]).strstr($j,$f[$x],1); # create the sort pattern
#sort algorithm example sort string = NESW-> N is not in the string
function c($x,$y){
    global $t;
    return strpos($t,$x)<=>strpos($t,$y); # e.g. comparison E<=>W =-1 , W<=>S=1, W<=>W =0
}
$a=str_split($i); # Input in an array
usort($a,"c"); #sort array
echo join($a);# output array as string

1
の代わりにfunction c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);、$a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});5バイトを使用して保存できます。宇宙船オペレーターは、この種の並べ替えを本当に助けました。あなたが私がしたことを理解するために、関数をに移動usort()し、匿名関数にしました。次に、global(決して使用しない)の代わりに、を使用しましたfunction(...)use($t,$p){...}。このuse(...)構文を使用すると、変数を匿名関数本体に渡すことができます(参照も受け入れます)。
— イスマエルミゲル

@IsmaelMiguelこの素晴らしい説明をありがとう。
— ヨルグヒュルサーマン16年

どういたしまして。use()匿名関数のビットが大好きです。あなたはそれを使用し、悪用すべきです。
— イスマエルミゲル

1

バッチ、216バイト

@echo off
set/pt=
set/an=2,e=4,s=8,w=16,r=0
:l
set/ar^|=%t:~0,1%
set t=%t:~1%
if not "%t%"=="" goto l
set/a"o=449778192>>r&3,l=1053417876>>r&3"
if %l%==0 (echo stuck)else set t=NESWNE&call echo %%t:~%o%,%l%%%

JavaScript回答の簡単な移植。STDINの入力を大文字または小文字で受け取ります。


1

JavaScriptの(ES6)、108の 107 106 104バイト

s=>(r=t=`NESWNE`,s.replace(/./g,c=>r|=2<<t.search(c)),t.substr(449778192>>r&3,1053417876>>r&3)||`stuck`)

車が接近している方向のビットマスクを蓄積し、優先度文字列の適切な部分を抽出します。


Uncaught SyntaxError: Invalid regular expression: missing /
— チョイス

@Cyoceおっ​​と。起こったのは、その時点でブラウザがコードをラップしていて、改行が入り込んだと思ったということでした。申し訳ありません。
— ニール

問題ありません、ただ知らせます。
— チョイス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.