Sağa öncelik


12

Göreviniz bir dönüm noktasında trafiği düzenlemek. Kuzey, doğu, güney ve batıdan 4 yol vardır.

Girdi, her yolda yaklaşan trafiği temsil eden bir dizedir. Örneğin, NNNWStoplam 5 araba olduğunu gösterir: üçü kuzeyde, biri batıda ve biri güneyde. Karakter sırasının burada bir önemi yoktur NNNWS, buna eşdeğerdir WNNSN.

Doğru kural önceliğini kullanarak otomobillerin gitmesi gereken sırayı vermelisiniz: güneyden gelen arabalar doğudan gelen arabaların önce gitmesine izin vermeli, doğu kuzeye, kuzey batıya ve batıya yol veriyor güney.

Örneğin, girdi ile NNNWS, güney araba önce gitmeli, sonra batı araba, sonra 3 kuzey araba. Çıktı böylece olmalıdır SWNNN.

Bazı kararsız durumlar vardır, örneğin NSveya NNWSE: sonra dizeyi çıktılamalısınız stuck.

Test senaryoları

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

3
Her ikisi de çok daha zor görünüyor çünkü giden yönleri de dikkate alıyorlar.
Martin Ender

3
Yazdırma yerine tanımsız davranış kullanmanızı tavsiye ederim stuck.
Outgolfer Erik

4
@ Yol güvenliği ile uğraşırken tanımlanmamış bir davranış kabul edilemez :-)
Arnaud


2
Boş dize girdi olarak mümkün mü? Eğer öyleyse, sonuç ne olmalı? Ve neden NSsıkışmış? Çünkü her ikisi de NSve SNbir çözüm olurdu?
Ton Hospel

Yanıtlar:


2

Perl, 65 bayt

İçin +2 içerir -lp

STDIN üzerinde giriş yapın. Boş dizenin geçerli bir giriş olmadığını varsayar

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

Sonra bir satır yokluğunu sakıncası yoksa stucksen bırak lseçeneği


2

PHP, 267 Bayt

Yeni kullanım uzay operatörü ve usort @IsmaelMiguel ile -5 bayt

<?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);

Yıkmak

# 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
Bunun yerine 5 bayt function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);kullanabilir $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});ve kaydedebilirsiniz. Uzay gemisi operatörü bu tür tasniflere gerçekten yardımcı oldu. Ne yaptığımı anlamanız için işlevi usort()anonim bir işlev haline getirdim . Sonra, global(ASLA kullanmayın) yerine, kullandım function(...)use($t,$p){...}. use(...)Sözdizimi (çok recerences kabul eder) anonim işlev vücuda değişkenleri geçmesine izin verir.
Ismael Miguel

@IsmaelMiguel Bu harika açıklama için teşekkür ederim.
Jörg Hülsermann

Rica ederim. use()Anonim işlevlerde biraz seviyorum . Kullanmalı ve kötüye kullanmalısınız.
Ismael Miguel

1

Toplu, 216 bayt

@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 yanıtımın basit bağlantı noktası. STDIN üzerine büyük veya küçük harf girişi yapar.


1

JavaScript (ES6), 108 107 106 104 bayt

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

Hangi yönlerin araçlara yaklaştığını gösteren bir bit maskesi biriktirir ve öncelik dizesinin uygun bölümünü çıkarır.


Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce

@Cyoce Whoops. Olan şey, tarayıcının o noktada kodu sarmasıydı ve yeni bir satırın içeri girdiğini düşündüm. Bunun için üzgünüm.
Neil

sorun değil, sadece haber ver.
Cyoce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.