Priorität nach rechts

12

Ihre Aufgabe ist es, den Verkehr an einer Kreuzung zu regeln. Es gibt 4 Straßen, die aus dem Norden, Osten, Süden und Westen kommen.

Die Eingabe ist eine Zeichenfolge, die den anstehenden Verkehr auf jeder Straße darstellt. Gibt beispielsweise an, NNNWSdass insgesamt 5 Autos vorhanden sind: drei im Norden, eines im Westen und eines im Süden. Die Reihenfolge der Zeichen hat hier keine Bedeutung, NNNWSentspricht WNNSN.

Sie müssen die Reihenfolge, in der die Autos fahren sollen, anhand der Priorität der richtigen Regel ausgeben: Autos, die aus dem Süden kommen, müssen Autos, die aus dem Osten kommen, zuerst gehen lassen, Osten geht nach Norden, Norden geht nach Westen und Westen geht nach Süd.

Bei der Eingabe NNNWSsollte zum Beispiel das Südauto zuerst fahren, dann das Westauto, dann die 3 Nordautos. Die Ausgabe sollte also sein SWNNN.

Es gibt einige unbestimmbare Fälle, zum Beispiel NSoder NNWSE: Sie sollten dann den String ausgeben stuck.

Testfälle

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck
Arnaud
quelle
3
Beide scheinen viel schwieriger zu sein, weil sie auch die ausgehenden Richtungen berücksichtigen.
Martin Ender
3
Ich würde empfehlen, undefiniertes Verhalten anstelle von Drucken zu verwenden stuck.
Erik der Outgolfer
4
@ Erik im Umgang mit der Verkehrssicherheit kann ein undefiniertes Verhalten nicht akzeptiert werden :-)
Arnaud
2
Verwandte . Verwandte .
Fatalize
2
Ist die leere Zeichenfolge als Eingabe möglich? Wenn ja, wie sollte das Ergebnis aussehen? Und warum NSsteckt es fest? Weil beides NSund SNeine Lösung wäre?
Ton Hospel

Antworten:

2

Perl, 65 Bytes

Beinhaltet +2 für -lp

Geben Sie eine Eingabe für STDIN ein. Angenommen, die leere Zeichenfolge ist keine gültige Eingabe

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

Wenn Ihnen das Fehlen eines Zeilenumbruchs nach dem Löschen nichts ausmacht stuck, können Sie die lOption löschen

Tonne Hospel
quelle
2

PHP, 267 Bytes

benutze den neuen Raumschiff Operator und benutze -5 Bytes von @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);

Nervenzusammenbruch

# 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
quelle
1
Stattdessen function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);können Sie $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});5 Bytes verwenden und speichern. Der Raumschiffbetreiber hat bei dieser Art der Sortierung wirklich geholfen. Damit Sie verstehen, was ich getan habe, habe ich die Funktion in usort()eine anonyme Funktion verschoben . Dann globalhabe ich anstelle von (NIEMALS verwenden) verwendet function(...)use($t,$p){...}. Mit der use(...)Syntax können Sie Variablen an den anonymen Funktionskörper übergeben (es werden auch Referenzen akzeptiert).
Ismael Miguel
@IsmaelMiguel Danke für diese wundervolle Erklärung.
Jörg Hülsermann
Bitte. Ich mag die use()anonymen Funktionen sehr. Sie sollten es benutzen und missbrauchen.
Ismael Miguel
1

Stapel, 216 Bytes

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

Einfacher Port meiner JavaScript-Antwort. Übernimmt die Eingabe von STDIN in Groß- oder Kleinschreibung.

Neil
quelle
1

JavaScript (ES6), 108 107 106 104 Bytes

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

Sammelt eine Bitmaske, deren Richtungen sich Autos nähern, und extrahiert den entsprechenden Teil der Prioritätszeichenfolge.

Neil
quelle
Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce
@Cyoce Whoops. Was passierte war, dass der Browser den Code zu diesem Zeitpunkt umbrochen hatte und ich dachte, eine neue Zeile hätte sich eingeschlichen. Tut mir leid.
Neil
Kein Problem, lass es dich wissen.
Cyoce