Déplaçons le rover Mars!


17

Sommaire

La tâche consiste à naviguer sur le rover Mars et à dire ses coordonnées finales et sa direction.

Contribution:

Première entrée:

Votre programme doit d'abord prendre l'entrée qui sera au format suivant:

[X-Coordinate],[Y-Coordinate],[Direction]

La direction doit être: Nou Sou Eou W(lettres de départ de Nord, Sud, Ouest, Est)

Exemple: 10,20,N(x = 10, y = 20, direction = N (Nord))

Deuxième entrée:

La seconde entrée est constituée d' une série de R, L, Mpour la droite, la gauche et déplacer respectivement.

Pour Ret L(droite et gauche), la direction du mobile doit changer en conséquence.

Car Mle rover doit avancer de 1 unité dans la direction où il était avant de se déplacer.

Règles de calcul des coordonnées:

N = Y + 1
E = X + 1
S = Y - 1
W = X - 1

Production:

Les coordonnées finales et la direction actuelle du rover.


Exemple:

Enter initial data:      1,2,N

Enter the instructions:  MRMLM

Output:                  2,4,N

Les coordonnées peuvent être n'importe quel entier et peuvent être négatives .

Toutes les failles standard ne sont pas autorisées. Si la démonstration sur des sites comme http://ideone.com etc. est possible, alors faites-le, afin que je puisse vérifier :)

Il s'agit d'un concours de popularité, alors soyez créatif!

En suivant les conseils des autres, je décide d'en faire un .


Y a-t-il des limites aux coordonnées?
Teun Pronk

5
Cela pourrait être plus intéressant comme code-golf au lieu de popularité-contest . Quel genre de bonus est accordé pour l'utilisation de l'idéone?
Kyle Kanos

@KyleKanos J'ai vu des gens l'utiliser, donc je viens de l'utiliser. Reformulé;)
Amit Joki

6
Vous savez, si vous rencontrez des commentaires négatifs sur vos défis, essayez d'abord de les exécuter dans le bac à sable .
Martin Ender

1
@Geobits merci. Dit explicitement.
Amit Joki

Réponses:


7

Rubis ≥ 2,0, 101

E,N,W,S=*0..3
x,y,i=eval"a="+gets
gets.bytes{|c|x+=c%2*1i**i=i+1-c&3}
$><<[(x+y.i).rect,"NWSE"[i]]*?,

Cette solution peut être testée ici: https://ideone.com/C4PLdE

Notez que la solution liée sur ideone a un caractère de plus ( 1.iau lieu de la 1iligne 3). La raison en est que ideone ne prend en charge que Ruby 1.9, ce qui ne permet pas la syntaxe abrégée pour les littéraux complexes.


en attendant de le voir jouer au golf plus loin :)
Amit Joki

Vous pouvez remplacer x,y,i=eval"[#{gets}]"par eval"x,y,i="+getspour enregistrer certains caractères.
afuous

@voidpigeon: Je ne sais pas qui fonctionne réellement en raison de evalrègles de détermination de la portée de »: ruby -e 'eval"x=1";p x'jette un NameErrorpour xà p x. Cela fonctionne lorsque vous utilisez constants ( eval"X,Y,I="+gets), mais comme je le modifie i, cela nécessiterait un supplément i=Ipour éviter les avertissements concernant la redéfinition d'une constante. Mais peut-être que nous parlons de différentes versions de Ruby?
Ventero

1
@Ventero Vous avez raison. Je l'ai testé en irb et cela m'a donné le bon tableau en sortie, j'ai donc supposé que cela fonctionnait. J'aime vraiment l'approche eval.
afuous

@voidpigeon Ah, vous avez raison, qui permet en fait une optimisation légèrement différente: x,y,i=eval"*a="+gets. Merci!
Ventero

5

Javascript ( ES6 ) 145 141 127

Edit: Suppression du besoin d'un tableau de traduction à l'aide de la méthode de la solution C d' edc65

[x,y,d]=(p=prompt)(s='NESW').split(','),[...p(d=s.search(d))].map(c=>c!='M'?(d+=c>'M'||3,d%=4):d%2?x-=d-2:y-=d-1),p([x,y,s[d]])

Non golfé / commenté:

s='NESW' // initialize variable for direction mapping
[x,y,d]=prompt().split(',') // get first input, split by commas, map to variables x,y,d
d=s.search(d) // get numeric value for direction
[...prompt()].map(c=> // get second input, map a function to every character in it
    c!='M'? // if char is not M
        (d+=c>'M'||3, // increment d by 1 if char greater than M, otherwise 3 
         d%=4) // modulo by 4 to wrap direction
    : // else
        d%2? // if odd direction
            x-=d-2 // move x position
        : // else
            y-=d-1 // move y position
)
prompt([x,y,s[d]]) // output result

tu peux le faire?! [a, b, c] = x.split (...)
edc65


Jetez un oeil à ma réponse C. peut-être que le tableau g n'est pas nécessaire
edc65

3

Java - 327

class R{public static void main(String[]a){char c,e=a[2].charAt(0),z[]={78,69,83,87};Integer x=Integer.valueOf(a[0]),y=x.valueOf(a[1]),d=e<70?1:e==83?2:e>86?3:0,i=0;for(;i<a[3].length();d=c>81?(d+1)%4:c<77?(d+3)%4:d){c=a[3].charAt(i++);if(c==77){x=d==1?x+1:d>2?x-1:x;y=d<1?y+1:d==2?y+1:y;}}System.out.print(x+","+y+","+z[d]);}}

Avec espace:

class R{
    public static void main(String[]a){
        char c,e=a[2].charAt(0),z[]={78,69,83,87};
        Integer x=Integer.valueOf(a[0]),y=x.valueOf(a[1]),d=e<70?1:e==83?2:e>86?3:0,i=0;
        for(;i<a[3].length();d=c>81?(d+1)%4:c<77?(d+3)%4:d){
            c=a[3].charAt(i++);
            if(c==77){
                x=d==1?x+1:d>2?x-1:x;
                y=d<1?y+1:d==2?y+1:y;
            }
        }
        System.out.print(x+","+y+","+z[d]);
    }
}

Comme d'habitude avec Java, environ la moitié de cela consiste simplement à analyser l'entrée et à former la sortie. La logique est assez simple.


3

Javascript (E6) 175

Éditer bug corrigé, éventuellement hors de la valeur de retour pour d

139 Logique, 36 E / S

F=(x,y,d,m,D='NESW')=>(d=D.search(d),[...m].map(s=>({M:_=>(y-=[-1,0,1,0][d],x-=[0,-1,0,1][d]),R:_=>d+=1,L:_=>d+=3}[s](),d%=4)),[x,y,D[d]]);
p=prompt,p(F(...p().split(','),p()))

Basique non golfé

function F(x,y,d,m) // In golf code use arrow sintax instead of 'function'
{
  var D='NESW';
  d = D.search(d); // map from letters to offset position 0..3
  var driver = { // driver object, each function map one of  command letters M,R,L
    M: function() { 
      y -= [-1, 0, 1, 0][d]; // subtract to be sure to have a numeric and not string result 
      x -= [0, -1, 0, 1][d]; // subtract to be sure to have a numeric and not string result 
    },
    R: function() {
       d += 1;
    },
    L: function() {
       d += 3; // with modulo 4 will be like -= 1
    }
  }
  m = [...m]; // string to array, to use iteration function 
  m.forEach(  // array scan, in golf versione use map do nearly the same and is shorter
    function (s) {
      driver[s](); // call driver function
      d = d % 4;   // restrict value to modulo 4
    }
  );  // in golf version, use comma separated expression to avoid 'return'
  return [x,y, D[d]] // return last status
}

Test Test dans la console javascript de Firefox. Il est plus simple de tester la fonction F en évitant les popups.

F(1,2,'N','MRMLM')

Production

[ 2, 4, "N" ]

Bien, cela ressemble beaucoup à ma solution.
nderscore

3

C 164 180 186

Modifier le format d'entrée fixe et supprimer strchr
Modifier le tableau de décalage supprimé, calculé à l'aide de bits

p,x,y;main(){char c,d,l[100];scanf("%d,%d,%c%s",&x,&y,&d,l);for(d=d<83?d&1:d>>2&1|2;c=l[p++];d&=3)c-77?d+=c+1:d&1?x+=d-2:(y+=1-d);printf("%d %d %c",x,y,"NESW"[d]);}

Non golfé

p, x, y;
main()
{
  char c, d, l[100];
  scanf("%d,%d,%c%s",&x,&y,&d,l);
  for (d = d<'S'?d&1:d>>2&1|2; c = l[p++]; d &= 3)
    c-'M'
    ? d += c+1
    : d & 1 ? x+=d-2 : (y+=1-d);
  printf("%d %d %c", x, y, "NESW"[d]);
} 
/*
M 77
R 82 0101 0010 R&3+1==3
L 76 0100 1100 L&3+1==1 
*/

2

C, 148 150 151

p,x[2];main(){char c,d,l[99],*j="%d,%d,%c%s";scanf(j,x,x+1,&d,l);for(d=d%8%5;c=l[p++];d-=c%23)x[d&1]-=c%2*~-(d&2);printf(j,*x,x[1],"ENWS"[d&3],"");}

Un ajustement de la solution @ edc65 pour utiliser mon approche d'abus de valeur ASCII.

Plus précisément:

  • d%8%5mappe les personnages ENWSà 0,1,2,3respectivement
  • c%23se transforme Len 7, Men 8et Ren 13. Parce que d(la variable de direction) est toujours utilisée mod 4, cela fait effectivement Lajouter -1 mod 4, Majouter 0 mod 4, etR ajouter 1 mod 4.
  • d&1est 1 pour NSet 0 pour les EWdirections.
  • d&2est 2 pour WSet 0 pour les NEdirections.
  • ~-(d&2)est 1 pour WSet -1 pour les NEdirections.
  • c%2est 1 pour Met 0 pour LR.

Pourquoi 23, et ce qui estc%(2*(1-(d&2)))

@tolos: Ajout d'une explication. Également raccourci de 2 caractères :)
nneonneo

2

Python 3 (avec graphiques de tortue), 251 199 octets

Sages pythonistes, soyez doux, car c'est ma première tentative de programme écrit dans votre beau langage.

Des tortues sur Mars!

from turtle import*
p="NESW"
mode("logo")
x,y,d=input().split(',')
setx(int(x))
sety(int(y))
seth(p.find(d)*90)
for c in input():fd(1)if c=="M"else[lt,rt][c>'L'](90)
print(pos(),p[int(heading()/90)])

Ce défi correspond tout naturellement aux graphiques de tortues de style logo, pour lesquels python a bien sûr une importation.

Lit l'entrée de deux lignes de STDIN.

Production:

$ { echo 1,2,N; echo MRMLM; } | python ./rover.py 
(2.00,4.00) N
$ 

Ce que j'aime particulièrement dans ce programme, c'est qu'il affiche graphiquement le chemin du rover. Ajoutez exitonclick()à la fin du programme pour que la sortie graphique persiste jusqu'à ce que l'utilisateur clique sur:

entrez la description de l'image ici

Je suis sûr que cela peut être joué beaucoup plus - toutes suggestions sont les bienvenues! Je fais cette CW, car j'espère que la communauté pourra la jouer encore.

Changements:

  • s est maintenant une liste, en ligne.
  • Ternaire utilisé pour le corps de la boucle.
  • N en ligne, suppression de la tranche inutile.
  • Suppression de l'espace inutile dans la déclaration d'importation.
  • Suppression de la chaîne d'importation pour utiliser la méthode de chaîne intégrée
  • Passé à Python 3 pour raccourcir raw_input

@isaacg Merci - bon golf!
Digital Trauma

2

GolfScript, 116 98 88 84 71

~'NESW':^@?:&;{4%[{&(4%:&;}{&[{)}{\)\}{(}{\(\}]=~}{&)4%:&;}]=~}/]`&^1/=

Cela devrait obtenir les coordonnées et les instructions comme arguments de la manière suivante:1 2 'N' 'MRMLM' . Les arguments sont transformés en chaîne et sont poussés dans la pile.

Si vous voulez tester cela en ligne, allez sur web golfscript et collez un point-virgule suivi d'une chaîne avec les arguments (par exemple ;"1 2 'N' 'MRMLM'") avant le code ( ici un lien avec un exemple).

Exemples de sortie:

1 2 'N' 'MRMLM'                    -> [2 4]N  
5 6 'E' 'MMLMRMRRMMML'             -> [5 7]S
1 2 'N' 'MMMMRLMRLMMRMRMLMRMRMMRM' -> [1 8]N


Mes tentatives précédentes

84 caractères:

~:i;'NESW':k\?:d;{i(\:i;4%[{d(4%:d;}{d[{)}{\)\}{(}{\(\}]=~}{d)4%:d;}]=~i}do]`d k 1/=

88 caractères:

~:i;'NESW':k\?:d;{i(\:i;'MRL'?[{d[{)}{\)\}{(}{\(\}]=~}{d)4%:d;}{d(4%:d;}]=~i}do]`d k 1/=

98 caractères:

 ~1/:i;:d;{'NESW'd?}:k;{k[{)}{\)\}{(}{\(\}]=~}:M;{k'ESWN'1/=:d;}:R;{k'WNES'1/=:d;}:L;{i(\:i;~i}do d

116 caractères:

[~])\~"NESW":k 1/:d?{d(1/+:d;}:f*:y;:x;{("MRL"?[{k d 0=?[{y):y}{x):x}{y(:y}{x(:x}]=~;}{f}{d)1/\+:d;}]=~.}do x y d 0=

btw: les anciennes versions de l'article sont stockées afin que vous puissiez voir comment elles étaient dans le passé (cliquez simplement sur le lien "Modifié il y a xxx")
masterX244

1

Delphi (819)

Quand j'ai commencé, ce n'était pas encore du . Éditera plus tard.

Impossible de trouver un compilateur en ligne cependant.

uses SysUtils;type TDirection = (dNorth, dEast, dSouth, dWest);var x,y:int64;dir:TDirection;input:string;c:char;function gd(C:Char):TDirection;var o:integer;begin o:=ord(dir);if C='L'then o:=o-1else if c='R'then o:=o+1else if c='N'then exit(dNorth)else if c='E'then exit(dNorth)else if c='S'then exit(dNorth)else if c='W'then exit(dNorth);if o>3 then exit(dNorth);if o<0 then exit(dWest);exit(TDirection(o))end;function DirLetter:string;begin if dir=dNorth then exit('N');if dir=dEast then exit('E');if dir=dSouth then exit('S');if dir=dWest then exit('W');end;begin Readln(x,y,input);dir := gd(Input[1]);readln(Input);Input:=UpperCase(Input);for C in Input do begin if C<>'M' then dir:=gd(C)else case dir of dNorth:y:=y+1;dEast:x:=x+1;dSouth:y:=y-1;dWest:x:=x-1;end;end;writeln(Format('%d,%d,%s',[x,y,DirLetter]));end.

Non golfé

uses
  SysUtils;
type
  TDirection = (dNorth, dEast, dSouth, dWest);

var
  x,y:int64;
  dir:TDirection;
  input:string;
  c:char;

  function gd(C:Char):TDirection;
  var
    o:integer;
  begin
    o:=ord(dir);
    if C='L' then
      o:=o-1
    else if c='R' then
      o:=o+1
    else if c='N' then
      exit(dNorth)
    else if c='E' then
      exit(dNorth)
    else if c='S' then
      exit(dNorth)
    else if c='W' then
      exit(dNorth);

    if o>3 then exit(dNorth);
    if o<0 then exit(dWest);
    exit(TDirection(o))
  end;
  function DirLetter:string;
  begin
    if dir=dNorth then exit('N');
    if dir=dEast then exit('E');
    if dir=dSouth then exit('S');
    if dir=dWest then exit('W');
  end;
begin
  Readln(x,y,input);
  dir := gd(Input[1]);
  readln(Input);
  Input:=UpperCase(Input);
  for C in Input do
  begin
    if C<>'M' then
      dir:=gd(C)
    else
      case dir of
        dNorth:y:=y+1;
        dEast:x:=x+1;
        dSouth:y:=y-1;
        dWest:x:=x-1;
      end;
  end;
  writeln(Format('%d,%d,%s',[x,y,DirLetter]));
end.

peut être idéone et l'option est Pascal?
Amit Joki

4
"Quand j'ai commencé, ce n'était pas encore du golf de code." Est-ce votre excuse pour coder en Delphi? ;)
Martin Ender

Que se passe-t-il avec les espaces autour =? Pourquoi sont-ils nécessaires? De plus, les noms de variables me semblent beaucoup trop longs
John Dvorak

@ m.buettner ssshh, ne renversez pas les haricots: P
Teun Pronk

@JanDvorak Comme je l'ai dit, ce n'était pas marqué comme code-golf
Teun Pronk

1

Javascript (353)

Ceci est ma première véritable tentative de code golf, semble fonctionner au moins!

var xx=[0,1,0,-1];var yy=[1,0,-1,0];var d=["N","E","S","W"];var e=0;var x,y=0;function sa(p){q=p.split(",");x=+q[0];y=+q[1];e=+d.indexOf(q[2]);}function sb(t){var g=t.split(",");for(var u=0;u<g.length;u++){if(g[u]=='R'){e++;if(e>3)e=0;}if(g[u]=='L'){e--;if(e<0)e=3;}if(g[u]=='M'){x+=+xx[e];y+=+yy[e];}}alert(x+","+y+","+d[e]);}sa(prompt());sb(prompt());

5
Je peux voir des noms de variables inutilement longs;). De plus, dans le golf de code, personne ne se soucie de la portée appropriée des variables, alors laissez tomber ces var s.
Martin Ender

1

Python (263)

input =  raw_input("Initial: ")
input2 = raw_input("Command: ")

position = [int(input[0]), int(input[2]), input[4]]

bearings = "NESW"
turns = {"L" : -1, "M": 0, "R" : 1}
move = {"N" : [0, 1], "E" : [1, 0], "S" : [0, -1], "W" : [-1, 0]}

for c in input2:
    turn = turns[c];
    if (turn == 0):
        position[0] += move[position[2]][0]
        position[1] += move[position[2]][1]
    else:
        position[2] = bearings[(bearings.index(position[2]) + turn)%4]

print "Output: ", ','.join((str(s) for s in position))

Il doit également y avoir une manière plus élégante de le faire, il n'a pas besoin de la branche après l'autre.

http://ideone.com/eD0FwD

L'entrée est horrible, je voulais le faire avec split(',') mais rencontré des problèmes de casting entre les entrées et les cordes. Idéalement, je voulais aussi ajouter l'ancienne position avec la position mobile ... oh c'est le code-golf maintenant. Eh bien quoi que ce soit, je vais le laisser ici, pourrait donner l'inspiration. D'autres idées que j'utilisais étaient d'utiliser le modulo 4 de la direction après avoir cartographié le relèvement initial à un indice. Fusionner également les virages et déplacer les tableaux vers un, car aucune des clés n'entre en collision.

même ainsi, raccourcir les noms de variables et supprimer les espaces, c'est 263:

i=raw_input()
j=raw_input()
p=[int(i[0]),int(i[2]),i[4]]
b="NESW"
m={"N":[0,1],"E":[1,0],"S":[0,-1],"W":[-1,0],"L":-1,"M":0,"R":1}
for c in j:
    if (m[c]==0):
        p[0]+=m[p[2]][0]
        p[1]+=m[p[2]][1]
    p[2] = b[(b.index(p[2])+m[c])%4]
print ','.join(str(s) for s in p)

1

Python 2.7 - 197 192 octets

q='NESW';x,y,d=raw_input().split(',');x=int(x);y=int(y);d=q.find(d);v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():exec['d+','d-',v[d]]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]

Je suis en fait super fier de celui-ci.

Explication

Tout d'abord, nettoyons ce gâchis. J'ai utilisé des points-virgules au lieu des sauts de ligne dans beaucoup d'endroits parce que je pense que ça me rend cool. Ici, il est normalement (c'est toujours 197 octets, il n'a pas été du tout golfé). Oui, il y a toujours un point-virgule, mais celui-ci enregistre en fait un octet.

q='NESW'
x,y,d=raw_input().split(',')
x=int(x)
y=int(y)
d=q.find(d)
v={0:'y+',1:'x+',2:'y-',3:'x-'}
for c in raw_input():m=v[d];exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'
print`x`+','+`y`+','+q[d]

Commençons!

q='NESW'

Nous définissons qd'abord la chaîne 'NESW'. Nous l'utilisons deux fois plus tard, etlen("q='NESW';qq") < len("'NESW''NESW'") .

x,y,d=raw_input().split(',')

Ici, nous séparons la première ligne d'inpupt à chaque virgule. Notre coordonnée x est stockée dans x, y dans y, et la première lettre de notre direction dansd .

x=int(x)
y=int(y)

Ensuite, nous faisons juste les coords ints. (J'ai été choqué de ne pas pouvoir penser à une meilleure façon de convertir deux cordes en pouces. J'ai essayéx,y=map(int,(x,y)) mais cela s'avère plus long.)

d=q.find(d)

Cela convertit notre direction en un entier. 0 est au nord, 1 à l'est, 2 au sud et 3 à l'ouest.

v={0:'y+',1:'x+',2:'y-',3:'x-'}

C'est là que le plaisir commence.

Lorsque nous allons vers le nord, Y augmente de 1. Donc, ce dictionnaire prend 0 et donne la chaîne 'y+' , pour "augmenter y". Il donne des résultats similaires pour d'autres directions: y ou x suivi de + ou -.

Nous y reviendrons.

for c in raw_input():
    m=v[d]
    exec['d+','d-',m]['RL'.find(c)]+'=1;d=d%4'

Je suis allé à la liberté de dégrader légèrement celui-ci.

Pour chaque caractère de la deuxième ligne d'entrée, nous faisons deux choses. Tout d'abord, nous définissons la variablem sur tout ce que notre dictionnaire d'avant nous donne pour notre direction actuelle. Il n'y a aucune raison pour que cela se produise à chaque fois, mais c'est plus facile que de le faire quand nous en avons besoin.

Ensuite, nous créons une liste avec trois éléments: 'd+', 'd-'et m. NOTE DE LA RÉDACTION: Je pense que je peux m'en tirer sans utiliser la variable mdu tout. Je pense que je peux simplement mettre v[d]la liste directement. Cela me fera économiser quelques octets si cela fonctionne, mais je n'ai pas envie de le tester avant d'avoir terminé cette explication pour que vous puissiez tous vous en occuper. (Oui, ça a marché.)

Nous recherchons le caractère actuel de l'entrée dans la chaîne «RL». str.findrenvoie -1 s'il ne trouve pas le caractère, donc cela convertit un R en 0, un L en 1 et tout le reste en -1. Bien sûr, la seule autre entrée que nous pouvons avoir est M, mais il y a moins de caractères pour le faire fonctionner pour tout.

Nous utilisons ce numéro comme index pour la liste que nous avons créée. Les indices de liste Python commencent à la fin s'ils sont négatifs, nous obtenons donc le premier élément si l'entrée est R, le second si c'est L et le dernier si c'est M. Par souci de commodité, je suis sur le point de supposer que nous sommes face au nord, mais un principe similaire s'applique pour d'autres directions.

Les valeurs possibles avec lesquelles nous travaillons sont 'd+'pour R, 'd-'pour L et 'y+'pour M. Ensuite, nous attachons '=1;d=d%4'à la fin de chacun. Cela signifie que nos valeurs possibles sont ...

d+=1;d=d%4
d-=1;d=d%4
y+=1;d=d%4

C'est du code python valide! C'est du code python valide qui fait exactement ce que nous voulons faire pour chacun de ces caractères d'entrée! (La d=d%4partie garde nos directions saines. Encore une fois, pas besoin de le faire à chaque fois, mais ce sont moins de personnages.)

Tout ce que nous avons à faire est d'exécuter le code que nous obtenons pour chaque caractère, de l'imprimer (reconvertir notre direction en chaîne), et nous avons terminé!


1

C - 350

Enregistrer sous rover.c:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){char c,*C="NWSE-WN";float x,y,d,k=M_PI/2;scanf("%f,%f,%c",&x,&y,&c);d=(strchr(C,c)-C)*k;do{switch(getchar()){case'R':d+=k;break;case'L':d-=k;break;case'M':x+=sin(d);y+=cos(d);break;case EOF:printf("%g,%g,%c\n",x,y,C[(int)(sin(d)+2*cos(d)+4.5)]);}}while(!feof(stdin));return 0;}

Compiler:

gcc -o rover rover.c -lm

Exemple d'exécution:

$ echo 1,2,N MRMLM | ./rover
2,4,N

Ideone

Non golfé:

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
    /* String is used for input and output, pi/2 == 90 degrees */
    char c, *C = "NWSE-WN";
    float x, y, d, k = M_PI/2;

    /* Get starting parameters */
    scanf("%f,%f,%c", &x, &y, &c);

    /* Convert the direction NWSE into radians */
    d = (strchr(C, c) - C) * k;

    /* Process each character */
    do
    {
        /* Recognize R(ight), L(eft), M(ove) or EOF */
        switch (getchar())
        {
            case 'R':
                /* Turn right 90 degrees */
                d += k;
                break;

            case 'L':
                /* Turn left 90 degrees */
                d -= k;
                break;

            case 'M':
                /* Advance 1 unit in the direction specified */
                x += sin(d);
                y += cos(d);
                break;

            case EOF:
                /* Output - formula is specially crafted so that S,E,W,N
                    map to indices 2,3,5,6 to reuse part of string */
                printf("%g,%g,%c\n", x, y, C[(int)(sin(d) + 2*cos(d) + 4.5)]);
        }
    }
    while (!feof(stdin));

    return 0;
}

1

Haskell - 412 octets

import Text.Parsec
import Text.Parsec.String
n='N'
s='S'
e='E'
w='W'
d(x,y,c)'M'|c==n=(x,y+1,c)|c==s=(x,y-1,c)|c==e=(x+1,y,c)|c==w=(x-1,y,c)
d(x,y,c)e=(x,y,i c e)
i 'N''R'=e
i 'N''L'=w
i 'S''R'=w
i 'S''L'=e
i 'E''R'=s
i 'E''L'=n
i 'W''R'=n
i 'W''L'=s
f=many digit
g=char ','
o=oneOf
main=interact(\s->show$parse(do x<-f;g;y<-f;g;c<-o"NSEW";newline;b<-many$o"MRL";return$foldl(\x c->d x c)(read x,read y,c)b)""s)

Testé avec:

$ printf "1,2,N\nMRMLM" | ./rv
Right (2,4,'N')

Hah hah! Super de voir Haskell si loin derrière le peloton, pour un changement: D
GreenAsJade

1
f=many digitBEAUCOUP LOL - TELLE WOW
tomsmeding

Fractionner l'entrée et utiliser readplusieurs fois a pris plus de caractères que d'utiliser parsec ...
gxtaillon

1

Bash + coreutils, 159 octets

t()(tr $2 0-3 $1<<<$d)
IFS=, read x y d
d=`t '' NESW`
for s in `fold -1`;{
[ $s = M ]&&((`t yxyx;t ++-`=1))||d=$[(d`tr LR -+<<<$s`1+4)%4]
}
echo $x,$y,`t NESW`

L'entrée est lue à partir de 2 lignes de STDIN.

Production:

$ { echo 1,2,N; echo MRMLM; } | ./rover.sh
2,4,N
$

1

PowerShell, 170 167 166

[int]$x,[int]$y,$e,$m="$input"-split'\W'
$d='NESW'.indexof($e)
switch([char[]]$m){'R'{$d++}'L'{$d--}'M'{iex(-split'$y++ $x++ $y-- $x--')[$d%4]}}
"$x,$y,"+'NESW'[$d%4]

Je n'arrive pas à jouer au golf plus bas, ce qui est un peu gênant. Mais tous les hacks évidents ne fonctionnent pas vraiment ici.

Je ne peux pas iexl'entrée parce que a) N, S, Eet Wdevrait être des fonctions pour que le travail (ou je besoin de préfixe avec $et b) 1,2,Naurait pour analyser le Nmode d'expression, ne pas être en mesure d'exécuter une commande .

Le switchsemble être le moyen le plus court de faire le mouvement. La table de hachage avec des blocs de script ou des chaînes n'est pas plus courte non plus et pour tous les autres moyens, à l'exception de switchla surcharge de la boucle explicite.

Je ne peux pas m'en débarrasser IndexOfcar un pipeline avec ?est plus long, encore.

Je ne peux pas non plus me débarrasser des types explicites dans la déclaration initiale parce que j'y ai des types mixtes, donc un simple |%{+$_}n'aide pas et toutes les autres options sont plus longues.

Parfois, je déteste la gestion des entrées dans PowerShell.


1

Python, 135 137 138

S,W,N,E=0,1,2,3;a,b,d=input();v=[b,a]
for c in map(ord,raw_input()):d+=c%23;v[d&1]+=c%2*~-(d&2)
print'%d,%d,%s'%(v[1],v[0],'SWNE'[d&3])

Les valeurs des abus ASCII de L, Met Rd'éviter d' utiliser des instructions conditionnelles.

Essayez-le en ideone .


1

Python 2.7, 170 149

N,E,S,W=q='NESW'
x,y,d=input()
d=q.find(d)
for c in raw_input():exec['d+','d-','yx'[d%2]+'+-'[d/2]]['RL'.find(c)]+'=1;d%=4'
print`x`+','+`y`+','+q[d]

Choses que j'ai changé par rapport à l'original:

Alias ​​raw_input, a changé le dictionnaire v [d], qui aurait dû être une liste de toute façon, en une sélection de chaîne, utilisée %=.

Edit: décompression de tuple et eval (raw_input ()) == input () pour enregistrer 21 caractères.

Fortement emprunté à @undergroundmonorail, mais avec de nombreuses améliorations.


Agréable! J'aime beaucoup ça.
undergroundmonorail

0

Bash / SHELF ,243 235

" ELLE ira LF " est une bibliothèque de golf pour Bash qui fournit quelques alias utiles. Il s'agit d'une réponse valable car la bibliothèque existait et se trouvait sur GitHub avant la publication du défi.

Désolé, je ne peux pas faire fonctionner ça sur l'idéone.

Comment courir

Cela prend la position initiale (séparée par des virgules comme spécifié; cela ajoute beaucoup de caractères au code) comme premier argument, et les instructions sur l'entrée standard.

source shelf.sh #you must load SHELF first
source rover.sh 1,2,N<<<MRMLM #now run the script via source so it has access to SHELF

Exemple de sortie

2,4,N

Code

o=$1
D(){ o=`y NESW $1<<<$o`;}
for x in `Y . '& '`;{
d $x R&&D ESWN
d $x L&&D WNES
d $x M&&z=(`y , \ <<<$o`)&&case ${z[2]} in N) z[1]=$[z[1]+1];;S) z[1]=$[z[1]-1];;W) z[0]=$[z[0]-1];;E) z[0]=$[z[0]+1];;esac&&o=`P ${z[@]}|y \  ,`
}
p $o

Explication

dest pour comparaison; il retourne 0 si ses deux arguments sont égaux et 1 sinon, il peut alors avoir d'autres commandes enchaînées dessus avec &&et ||.

yest comme tr(mais fait à travers sed).

Yest comme sed 's/.../.../g'pour ses deux arguments.

Pest echo -e -n; pest juste echo -e.

o=$1 #save first argument to variable
D(){ o=`y NESW $1<<<$o`;} #define an alias to turn R or L
for x in `Y . '& '`;{ #add a space after every character on stdin and loop for each one
d $x R&&D ESWN #turn R using alias
d $x L&&D WNES #turn L using alias

Le bit suivant est profondément moche, avec environ 145 caractères sur une ligne. Si la commande actuelle est M, transformez les virgules dans $ o en espaces, convertissez-les en tableau et enregistrez-les dans $ z. Ensuite, effectuez un bloc switch ... case pour le dernier élément de $ z (la direction vers laquelle pointe le mobile. Modifiez les coordonnées en conséquence, puis reconvertissez $ z en une chaîne séparée par des virgules et enregistrez-la dans $ o.

d $x M&&z=(`y , \ <<<$o`)&&case ${z[2]} in N) z[1]=$[z[1]+1];;S) z[1]=$[z[1]-1];;W) z[0]=$[z[0]-1];;E) z[0]=$[z[0]+1];;esac&&o=`P ${z[@]}|y \  ,`
} #end loop
p $o #print output

1
Le sourcing ne devrait-il pas shelf.shplutôt faire partie de la solution? Comme vous auriez à requirecertains packages en Ruby ou importeux en Python aussi si vous en avez besoin.
Joey

@Joey bon point, mais je ne pense pas que les gens importPYG lors de l'écriture d'un programme Python avec lui, ou Rebmu (AFAIK) lors de l'écriture d'un programme Rebol avec lui

0

Haskell, 291

data D=W|S|E|N deriving(Show,Read,Enum)
main=interact$(\(x,y)->tail$map show y++[show(toEnum x::D)]>>=(',':)).(\(a:b:_)->foldl(\(f,j@[g,h])i->case i of 'M'->(f,[g+rem(f-1)2,h+rem(f-2)2]);'L'->(mod(f+1)4,j);'R'->(mod(f-1)4,j))((\(c,d,e)->(fromEnum(e::D),[c::Int,d]))$read('(':a++")"))b).lines

Je n'étais pas sûr de la flexibilité du format de chaîne d'entrée et de sortie, alors je me suis assuré qu'il ressemblait exactement à l'exemple (moins les invites, bien sûr), mais cela a ajouté beaucoup de caractères supplémentaires. Lien Ideone


0

PHP - 224

Eh bien, je l'ai essayé.

$n=explode(",",$argv[1]);$d=($e=$n[2])==W?0:($e==N?1:($e==E?2:3));for(;$i<strlen($n[3]);)if(($o=$n[3][$i++])==M)$n[$d%2]+=$d>1?-1:1;else$d=$o==R?($d+1)%4:($d==0?3:$d-1);echo"{$n[0]},{$n[1]},".($d==1?N:($d==2?E:($d==3?S:W)));

Entrée dans STDIN, par exemple:

$ php mars_rover.php 1,2,N,MMMRRRRRMM
-1,5,E
$ php mars_rover.php 1,2,N,MMMMRLMRLMMRMRMLMRMRMMRM
1,8,N
$ php mars_rover.php 3,-2,W,MMMMLM
7,-3,S

0

Python3 (288)

Mise en œuvre utilisant une utilisation intensive des ifs ternaires.

m=['N','E','S','W']
cords=[int(n) for n in input().split()] + [input()] #Convert first inputs to integers and retrieve third
for n in input(): #Get instructions
    if n=='M':
        i=[1,0][cords[2] in m[1:3]] #See if vertical or horizontal
        j=[-1,1][cords[2] in m[0:2]] #See if negative or positive
        cords[i]+=j
    else:
        i=[-1,1][n=='R'] #Translate turn to numerals
        cords[2]=m[m.index(cords[2])+i] #Change direction relative to current orientation
print(cords)

Omettre les entrées évidentes grogne, donner aux chaînes de sens des valeurs intrinsèques peut avoir profité à la taille du script. Cependant, l'approche ici est parfaitement fonctionnelle (donc je crois)


Bienvenue chez PPCG. C'est le code-golf, donc la réponse la plus courte l'emporte. Vous pouvez commencer par faire de vos noms de variables un caractère long.
Digital Trauma

0

Python 3 (143)

I=input
a,b,D=I().split(',')
w='ENWS'
d=w.find(D)
x=int(a)+int(b)*1j
for c in I():x+=(c=='M')*1j**d;d+='ML'.find(c)
print(x.real,x.imag,w[d%4])

http://ideone.com/wYvt7J

Nous utilisons le type de nombre complexe intégré de Python pour stocker la paire de coordonnées. La direction est calculée en prenant l'unité imaginaire 1jà la puissance de d, qui stocke la direction mod 4. La rotation se fait par incrémentation ou décrémentation d. L'expression 'ML'.find(c)donne la quantité que nous voulons changer d: 1pour L, 0pour Met -1(la valeur par défaut pour introuvable) pour R.

Python n'a pas de moyen court pour convertir un nombre complexe en tuple, nous devons donc faire des appels coûteux vers .realet .imag.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.