Priorité à droite

12

Votre tâche consiste à réguler le trafic à un carrefour. Il y a 4 routes venant du nord, de l'est, du sud et de l'ouest.

L'entrée est une chaîne représentant le trafic à venir sur chaque route. Par exemple, NNNWSindique qu'il y a un total de 5 voitures: trois au nord, une à l'ouest et une au sud. L'ordre des caractères n'a pas d'importance ici, NNNWSest équivalent à WNNSN.

Vous devez sortir l'ordre dans lequel les voitures doivent aller, en utilisant la priorité à la bonne règle: les voitures venant du sud doivent laisser les voitures venant de l'est aller en premier, l'est cède la place au nord, le nord cède la place à l'ouest et l'ouest cède la place à Sud.

Par exemple, avec l'entrée NNNWS, la voiture sud devrait aller en premier, puis la voiture ouest, puis les 3 voitures nord. La sortie devrait donc être SWNNN.

Il existe des cas indécidables, par exemple NSou NNWSE: vous devez ensuite sortir la chaîne stuck.

Cas de test

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck
Arnaud
la source
3
Les deux semblent beaucoup plus difficiles car ils tiennent également compte des directions sortantes.
Martin Ender
3
Je recommanderais d'utiliser un comportement non défini au lieu d'imprimer stuck.
Erik the Outgolfer
4
@Erik en matière de sécurité routière, un comportement indéfini ne peut être accepté :-)
Arnaud
2
Connexes . Connexes .
Fatalize
2
La chaîne vide est-elle possible en entrée? Si oui, quel devrait être le résultat? Et pourquoi est NScoincé? Parce que les deux NSet SNserait une solution?
Ton Hospel

Réponses:

2

Perl, 65 octets

Comprend +2 pour -lp

Donnez votre avis sur STDIN. Suppose que la chaîne vide n'est pas une entrée valide

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

Si cela ne vous dérange pas l'absence d'une nouvelle ligne après avoir supprimé stuckl' loption

Ton Hospel
la source
2

PHP, 267 octets

utiliser le nouvel opérateur de vaisseau spatial et usort -5 octets par @IsmaelMiguel

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

Panne

# 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
Jörg Hülsermann
la source
1
Au lieu de function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);, vous pouvez utiliser $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});et enregistrer 5 octets. L'opérateur du vaisseau spatial a vraiment aidé avec ce type de tri. Pour que vous compreniez ce que j'ai fait, j'ai déplacé la fonction dans usort(), ce qui en fait une fonction anonyme. Ensuite, au lieu de global(NE JAMAIS l'utiliser), j'ai utilisé function(...)use($t,$p){...}. La use(...)syntaxe vous permet de passer des variables dans le corps de la fonction anonyme (elle accepte également les recérences).
Ismael Miguel
@IsmaelMiguel Merci pour cette merveilleuse explication.
Jörg Hülsermann
Je vous en prie. J'aime vraiment le use()peu sur les fonctions anonymes. Vous devez l'utiliser et en abuser.
Ismael Miguel
1

Lot, 216 octets

@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%%%

Port simple de ma réponse JavaScript. Prend l'entrée sur STDIN en majuscule ou en minuscule.

Neil
la source
1

JavaScript (ES6), 108 107 106 104 octets

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

Accumule un masque de bits dont les directions ont des voitures qui approchent et extrait la partie appropriée de la chaîne de priorité.

Neil
la source
Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce
@Cyoce Whoops. Ce qui s'est passé, c'est que le navigateur a encapsulé le code à ce moment-là et j'ai pensé qu'une nouvelle ligne s'était glissée. Désolé pour cela.
Neil
pas de problème, juste pour vous le faire savoir.
Cyoce