Robot sur une échelle


30

Contexte

J'ai une échelle appuyée sur un mur et un robot télécommandé qui peut y grimper. Je peux envoyer trois commandes différentes au robot:

  • UP: le robot fait un pas vers le haut. S'il était sur la plus haute marche, il trébuche, tombe et explose.
  • DOWN: le robot fait un pas vers le bas. Si c'était sur la marche la plus basse, rien ne se passe.
  • RESET: le robot revient à l'étape la plus basse.

Je peux également envoyer une série de commandes, et le robot les exécutera une par une. Votre tâche consiste à prédire ses mouvements.

Contribution

Vos entrées sont un entier positif N, représentant le nombre d'étapes dans l'échelle, et une chaîne non vide Csur UDR, représentant les commandes que j'ai envoyées au robot. Vous pouvez le supposer N < 1000. Le robot est initialisé sur la marche la plus basse de l'échelle.

Sortie

Il est garanti qu'à un moment donné, le robot grimpera sur la plus haute marche et explosera. Votre sortie est le nombre de commandes qu'elle exécute avant que cela ne se produise.

Exemple

Considérez les entrées N = 4et C = "UDDUURUUUUUUUDDDD" le robot, désigné par @, se déplace le long de l'échelle à 4 étapes comme suit:

|-|   |-|   |-|   |-|   |-|   |-|   |-|   |-|   |-|   |@|   |-||
|-|   |-|   |-|   |-|   |-|   |@|   |-|   |-|   |@|   |-|   |-||
|-|   |@|   |-|   |-|   |@|   |-|   |-|   |@|   |-|   |-|   |-|v
|@| U |-| D |@| D |@| U |-| U |-| R |@| U |-| U |-| U |-| U |-|# Boom!

Les commandes restantes ne sont pas exécutées, car le robot a explosé. L'explosion a eu lieu après 10 commandes, donc la sortie correcte est 10.

Règles et notation

Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.

Cas de test

  1 U -> 1
  1 DDRUDUU -> 4
  4 UDDUUUUURUUUUDDDD -> 7
  4 UDDUURUUUUUUUDDDD -> 10
  6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR -> 20
 10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU -> 34
  6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU -> 8
  6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU -> 32
 20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU -> 56
354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU -> 872


8
Je suis déçu que la tâche ne consiste pas à générer cet art ASCII.
user253751


Au lieu d'une chaîne, pouvons-nous prendre une liste de codes de caractères?
Cyoce

@Cyoce Uniquement si votre langue n'a pas d'autre moyen de représenter une chaîne.
Zgarb

Réponses:


10

CJam, 26 25 22 octets

0l{i"()~ "=~0e>_}%ri#)

Le format d'entrée est les instructions sur la première ligne et la hauteur de l'échelle sur la seconde.

Testez-le ici.

Explication

0         e# Push a 0 - the initial position of the robot.
l         e# Read the instructions.
{         e# Map this block over the instruction...
  i       e#   Convert to character code. D -> 68, U -> 85, R -> 82.
  "()~ "= e#   We use these as cyclic indices into this array. Note that the values
          e#   modulo 4 are 0, 1 and 2, respectively. So U -> ) (increment),
          e#   D -> ( (decrement), R -> ~ (bitwise NOT, i.e negated and decrement).
  ~       e#   Evaluate the character as code.
  0e>     e#   Clamp to non-negative numbers. So D can't go below 0, and since R is
          e#   guaranteed to yield something negative, this resets it to zero.
  _       e#   Duplicate, so we keep one copy of the current position on the stack.
}%        e# Since this was a map, the result will be wrapped in an array.
ri        e# Read the ladder height and convert it to an integer.
#         e# Find its first occurrence in the list of positions.
)         e# The result is off by one, so we increment it.

Bonne idée de traiter toutes les commandes même après l'explosion. Je vais l'emprunter pour économiser quelques octets
Luis Mendo

7

C, 83 71 + 4 = 75 octets

Merci @Josh de m'avoir montré le style K&S , qui permettait 8 octets de réduction !!

f(i,s,z,a)char*s;{z-=*s<82?z>0:*s>82?-1:z;return z-i?f(i,s+1,z,a+1):a;}

Expliquant:

f(i,s,z,a)char*s;{ // function needs one integer and one "string"
  z-=              // z is the bot's height
    *s<82?         // if 'Down'
      z>0          // then subtract 1 when z>0 or nothing otherwise
    :*s>82?        // else if 'Up'
      -1           // increase height z-=-1
    :z;            // else reset z=z-z
  return z-i?      // if z is not the max height
    f(i,s+1,z,a+1) // try next step
  :a;              // else print how many calls/steps were made
}                  // end of function

Exemple d'appel:

f(1,"U",0,1);    // I've added 4 bytes in the score because of ",0,1"

Test en direct sur ideone


1
Belle réponse, mais il convient de noter que la fonction ne peut être utilisée qu'une seule fois depuis les globaux zet an'est pas réinitialisée.
Josh

@Josh. J'ai mis à jour. :)
supprimé

1
Impressionnant! Vous pouvez également enregistrer quelques caractères en jouant avec les déclarations de type dans votre fonction: codegolf.stackexchange.com/a/40266/13877
Josh

@Josh. Wow c'est génial! merci
supprimé

6

JavaScript (ES6), 54 53 octets

n=>c=>(f=p=>n-p?f({D:p&&p-1,U:p+1}[c[i++]]|0):i)(i=0)

Explication

Utilise une fonction récursive en interne.

var solution =

n=>c=>(
  f=p=>             // f = recursive function, p = position of robot on ladder
    n-p?            // if p != n
      f({           // execute the next command
          D:p&&p-1, // D -> p = max of p - 1 and 0
          U:p+1     // U -> p = p + 1
        }[c[i++]]   // get current command then increment i (current command index)
        |0          // R -> p = 0
      )
    :i              // else return the current command index
)(i=0)              // initialise p and i to 0 for the first recurse
N = <input type="number" id="N" value="354" /><br />
C = <input type="text" id="C" value="UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU" /><br />
<button onclick="result.textContent=solution(+N.value)(C.value)">Go</button>
<pre id="result"></pre>


4

Perl, 47 + 2 = 49 octets

$z-=-/U/||$z&&/D/;$z*=!/R/;$^I<=$z&&last}{$_=$.

Nécessite le -pdrapeau, -i$Npour cette dernière hauteur et une liste de mouvements séparés par une nouvelle ligne:

$ perl -pi10 ladderbot.pl <<<< $'U\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nU\nR\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU\nU'
34

Comment ça marche:

                                                # '-p' wraps the code in (simplified):
                                                # while($_=<>) {...print $_}
$z-=-/U/||$z&&/D/;                              # Subtract -1 if UP. subtract 1 if DOWN
                  $z*=!/R/;                     # If R then times by zero
                           $^I<=$z&&last        # Break while loop if N is reached
                                        }{      # Eskimo operator:
                                                # while($_=<>){...}{print$_}
                                          $_=$. # `$.` contains number of lines read from input.

Débarqué:

LINE: while (defined($_ = <ARGV>)) {
    $z -= -/U/ || $z && /D/;
    $z *= !/R/;
    last if $^I <= $z;
}
{
    $_ = $.;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK

4

JavaScript (SpiderMonkey 30+), 65 64 octets

(n,s,i=0)=>[for(c of s)if(i<n)c<'E'?i&&i--:c>'T'?i++:i=0].length

Comment ça marche

Nous définissons d'abord la variable isur 0. Cela permettra de savoir combien de pas le robot a gravi. Ensuite, pour chaque caractère cde la chaîne d'entrée, nous exécutons la logique suivante:

  1. Si iest supérieur ou égal à n, ne faites rien.
  2. Si cest "D":
    • Si iest 0, laissez-le tel quel.
    • Sinon, décrémentez-le de 1.
  3. Si cc'est le cas "U", incrémentez ide 1.
  4. Sinon, définissez isur 0.

En coupant si i>=n, nous évitons d'ajouter d'autres éléments au tableau une fois que le robot a atteint le sommet. Ainsi, nous pouvons simplement renvoyer la longueur du tableau résultant.


3

Haskell, 65 octets

x%'U'=x+1
x%'D'=max(x-1)0
x%_=0
f n=length.fst.span(<n).scanl(%)0

Exemple d'utilisation: f 4 "UDDUURUUUUUUUDDDD"-> 10.

%ajuste la position actuelle sur l'échelle, scanlfait une liste de toutes les positions, fst.span(<n)prend la partie avant l'explosion et lengthcompte les pas.


Beau travail avec la combinaison d'arguments nommés et de composition / curry
Cyoce


3

MATL , 37 34 octets

Oj"t@4\1=?Q}6M?x0}qt0>*]]]N$h=f1)q

Essayez-le en ligne!

Explication

La position est basée sur 0. Chaque nouvelle position est poussée sur la pile en conservant les anciennes positions. La taille de la pile représente donc le nombre de mouvements jusqu'à présent, plus 1.

Une boucle est utilisée pour traiter chaque commande. La boucle est quittée lorsque la position atteint la hauteur de l'échelle traite toutes les commandes, même après l'explosion (idée tirée de la réponse de Martin ). Le résultat final est donné par l'indice de la première position qui est égal à la hauteur de l'échelle.

O             % push a 0: initial position (0-based)
j             % take first input (commands) as a string
"             % for each command
  t           %   duplicate current position
  @           %   push command
  4\          %   modulo 4. This gives 1, 2, 0 for 'U','R', 'D'
  1=?         %   if result equals 1 (command 'U')
    Q         %     increase position by 1
  }           %   else
    6M?       %     if result was nonzero (command 'R')
      x0      %       delete current position and push 0
    }         %     else (command 'D')
      q       %       decrement by 1
      t0>*    %       turn negative values into 0
    ]         %     end if
  ]           %   end if
]             % end for each
N$h           % pack all numbers in the stack into an array
=             % implicitly read second input: ladder height
f1)q          % find first position equal to that, and subtract 1.
              % Implicitly display

3

Python 2, 63 62 octets

f=lambda n,s,h=0:h^n and-~f(n,s[1:],-[2%~h,~h,0][ord(s[0])%4])

Par exemple, f(4, 'UDDUURUUUUUUUDDDD')est 10.

xnor a trouvé une expression encore plus courte: 2%~hc'est vraiment cool :)


Belle trouvaille avec le %4. Si je ne me trompe pas, vous pouvez sauver un personnage en faisant -[2%~h,~h,0][ord(s[0])%4].
xnor

3

PowerShell, 86 79 octets

param($a,[char[]]$b)$b|%{$d++;if(($c-=((1,0)[!$c],-1,$c)[$_%4])-ge$a){$d;exit}}

Un léger réoutillage de mon Quand le Père Noël entre-t-il au sous-sol? répondre.

Prend l'entrée $aet $ble transtypage explicite en $btant que tableau de caractères. Nous bouclons ensuite avec |%{...}sur tout $b. À chaque itération, nous incrémentons notre compteur $d.

Ensuite, une ifdéclaration pour vérifier si nous avons atteint le sommet avec -ge$a. Si oui, nous sortons $det exit. L' ifinstruction est construite à partir d'un pseudo-ternaire créé en affectant $cmoins-égal au résultat de plusieurs index dans un tableau.

Nous avons une astuce que les valeurs ASCII D, Ret Ucorrespondent à 0, 2et 1lorsqu'ils sont pris modulo-4, donc $_%4sert notre premier indice. Si c'est le cas R, cela est $cégal à $c-$c, faisant la réinitialisation. Si U, cela signifie que nous devons monter, alors le $c-(-1)résultat. Sinon, c'est un D, nous devons donc vérifier si nous sommes déjà en bas (c'est le !$c- dans PowerShell, "non nul" est "vrai" ou 1) et définir $cégal $c-0ou $c-1respectivement.

Édition - 7 octets enregistrés en utilisant l'affectation moins égale que l'affectation directe


3

Perl 5, 61 octets

Comprend deux octets pour -F -i. ( -M5.01est gratuit.)

L'entrée de l'entier (par exemple 10) est comme perl -M5.01 -F -i10 robot.pl; l'entrée des commandes à contacts est en STDIN.

for(@F){($i+=/U/)-=/R/?$i:$i&&/D/;$j++;last if$^I<=$i}say$j

en utilisant perl 5.12.5, j'ai également dû activer explicitement le mode autosplit avec -anFavant d'imprimer quoi que ce soit pour moi. mais il semble être implicitement activé avec seulement -Fen 5.20.3. pouvez-vous vérifier cela?
ardnew

@ardnew, me -Fsuffit juste (5,20 ou 5,22 environ). Iirc l'actuel perldoc perlrun dit qu'il implique -aet -aimplique -n.
msh210

Combien comptons-nous -i? Je peux voir que vous le comptez comme 1 mais je suppose qu'il devrait en fait être compté comme 3? :-)
andlrc

@ dev-null, pourquoi trois? Je pense que la convention sur PPCG.SE est de compter les lettres dans un drapeau mais pas les caractères de trait d'union moins, mais veuillez me corriger si je me trompe. (Il semble que vous utilisez également la même convention de comptage pour votre propre réponse à cette question. (Incidemment, bonne réponse.))
msh210

@ msh210 Je comptais juste la différence lors de l'utilisation -iet sans perl -i10 -pe';'vs perl -pe';'3 caractères de plus, puis le numéro d'entrée - que je suppose que nous ne devrions pas compter. Mais je me trompe peut-être ce matin :-)
andlrc

3

Vitsy, 44 octets

Il pourrait probablement y avoir des réductions - je trouverai d'autres choses si je le peux.

0vVWl:X[4M1+mDvV-);]lvXv?v-N
vD([1-]
v1+
vX0

Explication (en cours):

0vVWl:X[4M1+mDvV-);]lvXv?v-N
0v             Save 0 as our temp var to edit.
  V            Save the input as a global var.
   W           Grab a line of STDIN.
    l          Push the length of the stack.
     :         Clone the stack. This is for later use.
      X        Remove the top item of the stack (we don't need the length right now.
[            ] Do the stuff in the brackets infinitely.
 4M            Modulo 4.
   1+          Add one.
     m         Go to the line index as specified by the top item of the stack.
      Dv       Duplicate the top item, save it in the temp var.
        V-);   If the top value is equal to the input number, exit the loop.
l              Push the length of the stack.
 vXv           Dump the temp var, then save the top item.
    ?          Rotate back to the original stack.
     v-        Subtract the top item (the original length) by the temp var (new length)
       N       Output the top item of the stack of the number.

vD([1-]
v              Push the temp variable to the stack.
 D([  ]        If this value is not zero...
    1-         Subtract one from it.

v1+            Push the temp variable to the stack, then add one to it.

vX0            Dump the temp var and replace it with zero.

Essayez-le en ligne! (grand cas de test)


2

PHP, 88 octets

Cela génère des avis (3 + 2n où n est le nombre de commandes exécutées) mais cela n'a pas d'importance pour le golf, non?

<?php for(;$x++<$argv[1];)switch($argv[2][$i++]){case R;$x=2;case D;--$x?--$x:0;}echo$i;

non golfé:

<?php                    # actually 1 byte shorter not as a function
for(;$x++<$argv[1];)     # not initialising the $x causes a notice but still works
                         # post increment $x by 1 regardless of the command (saves us writing a U case)
  switch($argv[2][$i++]) # get next command, increment number of commands
    {case R;             # R gets treated as a constant with value 'R'. and a notice
      $x=2;              # falling through to D which will double decrement so set to 2
    case D;              # same trick as R
      --$x?--$x:0;}      # decrement once then again if >0
echo$i;                  # output

Les avis sont corrects, tant que le code peut toujours être exécuté.
Zgarb

2

Python, 121 octets

def f(a,n):
 i=c=0
 while i<n:i={'U':lambda x:x+1,'D':lambda x:0 if x==0 else x-1,'R':lambda x:0}[a[c]](i);c+=1
 return c

1
Bienvenue chez PPCG! Ici, nous exigeons par défaut que les réponses soient soit des programmes complets qui prennent des entrées de STDIN et impriment vers STDOUT, soit des fonctions qui prennent des entrées comme arguments et retournent la valeur de sortie. Votre solution code en dur les entrées, ce qui n'est pas autorisé.
Zgarb

Corrigé en formant en fonction, j'utilisais l'interprète quand je l'ai écrit.
Alex Burge

Merci! Vous devez également ajouter un en-tête du formulaire ## Python, <N> bytespour montrer aux autres votre score.
Zgarb

Je ne pense pas qu'il puisse y avoir une fonction sans nom.
user48538

Vous pouvez économiser des octets en remplaçant 0 if x==0 else x-1parx and x-1
Cyoce

2

JavaScript, 131 106 octets-

Je sais que cela ne gagnera pas une compétition de Code Golf, mais c'était une solution amusante et stupide à mettre en œuvre:

l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})re‌​turn c`,D:"--"}[x]};`))()

Je suis un peu allé à l'opposé d'une route "fonctionnelle" en créant une solution impérative générée dynamiquement, toute instance d'une instruction est remplacée par un incrément ou une décrémentation et un incrément de compteur.

Merci à Cycoce de m'avoir sauvé 29 octets!


Ici, j'ai joué au golf de 29 octets:l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Cyoce

2

Python 3, 90

6 octets enregistrés grâce à DSM.

Assez simple en ce moment.

def f(c,n):
 f=t=0
 for x in c:
  f+=1|-(x<'E');f*=(x!='R')&(f>=0);t+=1
  if f>=n:return t

Cas de test:

assert f('U', 1) == 1
assert f('DDRUDUU', 1) == 4
assert f('UDDUUUUURUUUUDDDD', 4) == 7
assert f('UDDUURUUUUUUUDDDD', 4) == 10
assert f('UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU', 354) == 872

1

PHP, 129 octets

function r($h,$s){$i=0;$c=1;while($x=$s[$i++]){if($x=='U'){$c++;}elseif($x=='D'){--$c<1?$c=1:0;}else{$c=1;}if($c>$h){return$i;}}}

Pas gagnant, mais amusant à créer. PHP semble détester les parties vides dans l'opérateur ternaire (il lance une erreur de syntaxe), j'ai donc dû y mettre un 0.

Version non golfée:

function r($h,$s) {          // $h - height of ladder; $s - instructions
  $i = 0;                    // Instruction index
  $c = 1;                    // Position on ladder
  while ($x = $s[$i++]){     // Set $x to current instruction and increment index
    if ($x == 'U'){          // If instruction is U...
      $c++;                  // Increment ladder position
    } elseif ($x == 'D') {   // If instruction is D...
      --$c < 1 ? $c = 1 : 0; // Decrement ladder position, if under 1 set to 1
    } else {                 // If instruction is anything else (in this case R)
      $c = 1;                // Reset ladder position
    }
    if ($c > $h) {           // If ladder position is larger than height...
      return $i;             // Return current instruction index
    }
  }
}

1

PHP, 113 octets

Version plus petite de https://codegolf.stackexchange.com/a/74575/13216

function r($h,$s){$i=0;$c=1;while($x=$s[$i++]){$c+=($x=='U'?1:($x=='D'?($c>1?-1:0):1-$c));if($c>$h){return $i;}}}

Non golfé:

// $h - height of ladder; $s - instructions
function r($h,$s) {
    $i = 0;
    $c = 1;
    while ($x = $s[$i++]) {
        $c += (
            $x=='U'?
                1
            :
                (
                    $x=='D'? (
                        $c>1?
                            -1
                        :
                            0
                    ):
                        1-$c
                )
        );
        if ($c > $h) {
            return $i;
        }
    }
}

2
Excellent premier post! J'ai édité votre message pour une meilleure lisibilité. Bon golf!
GamrCorps

1

Pyth, 19 octets

x.u@[tWNNhN00)CYz0Q

Essayez-le en ligne: démonstration ou suite de tests

Explication:

x.u@[tWNNhN00)CYz0Q   implicit: z = input string, Q = input number
 .u             z0    reduce z: for each char Y in z manipulate N = 0 with:
    [        )           create a list with
     tWNN                  * N-1 if N>0 else N
         hN                * N+1
           0               * 0
            0              * 0
   @          CY         replace N by the ord(Y)-th element (mod 4)
 .u                   .u give us a list with all intermediate values of N
x                 Q   print the index of Q in this list

1

Java, 250 octets

int cmds(int n, String s) {
int steps=1;
int count=0;
for (int i=0;i< s.length();i++) {
count++;
char c=s.charAt(i);
switch(c){
case 'D':
steps=(steps==1)?1:--steps;
break;
case 'R':
steps=1;
break;
case 'U':
++steps;
break;
}
if(steps>n)
return count;
}
return 0;
}

2
Lorsque vous répondez à un défi code-golf , vous devez commencer votre réponse par # <language_name>, XX bytes. Vous pouvez également réduire vos noms de variables à un caractère chacun et supprimer les espaces blancs supplémentaires, de cette façon, votre nombre d'octets sera réduit (ce qui est l'objectif ici) ... Ah, et bienvenue dans PPCG!
supprimé

Quelques conseils: Pour mettre en retrait votre code en tant que code, ajoutez 4 espaces au début de la ligne. Vous avez supprimé certains espaces, mais vous pouvez toujours en supprimer plus (ex: au lieu de int steps=1; int count=0;vous pouvez utiliser int s=1,c=0;- regardez, j'ai changé le nom de la variable - et ainsi de suite). Vous pouvez toujours montrer votre ungolfed version ci - dessous la golfed version avec une explication ( de cette façon est facile pour aider quelqu'un que vous jouer au golf plus d' octets).
supprimé

1

C, 91 octets

Aucun avertissement avec gcc -Wall. Récursivité et expressions séparées par des virgules.

r.c contient une fonction nue:

int r(int N,int n,int s,char*C){return*C&&s<=N?s+=*C&2?-s:*C&1?1:-1,r(N,n+1,s?s:1,C+1):n;}

Commenté,

int r(int N,   // number of steps on ladder
      int n,   // result, seed with 0
      int s,   // current step, seed with 1
      char *C  // command string
      )
{
    return *C&&s<=N ?  // still reading commands and still on ladder?
       s+=                // increment step value by...
        *C&2?             // bit test if 'R' but not 'U' or 'D'.
         -s               // negate to 0, will set to 1 in call if needed
         :*C&1?           // Not 'R', is it 'U'?
            1             // 'U', add 1
            :-1,          // Must be 'D', subtract 1
       r(N,n+1,s?s:1,C+1) // Recursive call, and fix case where s==0.
      :n;                 // end of string or fell off ladder
}

Pour référence,

'U'.charCodeAt(0).toString(2)
"1010101"
'D'.charCodeAt(0).toString(2)
"1000100"
'R'.charCodeAt(0).toString(2)
"1010010"

roboladder.c emballage,

#include <stdio.h>
#include <stdlib.h>
#include "r.c"
int main(int argc, char * argv[])
{
  int N = atoi(argv[1]);
  int n = r(N,0,1,argv[2]);
  int check = atoi(argv[3]);
  printf("%d : %d\n", n, check);
  return 0;
}

Makefile pour tester,

run:
    @gcc -Wall robotladder.c -o robotladder 
    @./robotladder 1 U 1
    @./robotladder 1 DDRUDUU 4  
    @./robotladder 4 UDDUUUUURUUUUDDDD 7
    @./robotladder 4 UDDUURUUUUUUUDDDD 10
    @./robotladder 6 UUUUUDRUDDDDRDUUUUUUDRUUUUUUUDR 20
    @./robotladder 10 UUUUUURUUUUUUURUUUUUUUURUUUUUUUUUUUUUU 34
    @./robotladder 6 UUUDUUUUDDDDDDDDDDDDDDRRRRRRRRRRRUUUUUU 8
    @./robotladder 6 UUUDUUUDURUDDDUUUUUDDRUUUUDDUUUUURRUUDDUUUUUUUU 32
    @./robotladder 20 UUDDUDUUUDDUUDUDUUUDUDDUUUUUDUDUUDUUUUUUDUUDUDUDUUUUUDUUUDUDUUUUUUDUDUDUDUDUUUUUUUUUDUDUUDUDUUUUU 56
    @./robotladder 354 UUDDUUDUDUUDDUDUUUUDDDUDUUDUDUDUDDUUUUDUDUUDUDUUUDUDUDUUDUUUDUUUUUDUUDUDUUDUDUUUUUDUDUUDUDUDUDDUUUUUUUDUDUDUDUUUUUDUDUDUDUDUDUDUDUUDUUUUUURUUUDUUUUDDUUDUDUDURURURUDUDUUUUDUUUUUUDUDUDUDUDUUUUUUDUDUUUUUUUDUUUDUUDUDUDUUDUDUDUUUUUUUUUUDUUUDUDUUDUUDUUUDUUUUUUUUUUUUUDUUDUUDUDUDUUUDUDUUUUUUUDUUUDUUUDUUDUUDDUUUUUUUUDUDUDUDUDUUUUDUDUUUUUUUUDDUUDDUUDUUDUUDUDUDUDUUUUUUUUUDUUDUUDUUUDUUDUUUUUUUUUUUDUDUDUDUUUUUUUUUUUUDUUUDUUDUDDUUDUDUDUUUUUUUUUUUUDUDUDUUDUUUDUUUUUUUDUUUUUUUUUDUDUDUDUDUUUUUUDUDUDUUDUDUDUDUUUUUUUUUUUUUUUDUDUDUDDDUUUDDDDDUUUUUUUUUUUUUUDDUDUUDUUDUDUUUUUUDUDUDUDUDUUUUDUUUUDUDUDUUUDUUDDUUUUUUUUUUUUUUUUUUDUUDUUDUUUDUDUUUUUUUUUUUDUUUDUUUUDUDUDUUUUUUUUUDUUUDUUUDUUDUUUUUUUUUUUUDDUDUDUDUUUUUUUUUUUUUUUDUUUDUUUUDUUDUUDUUUUUUUUUUUDUDUUDUUUDUUUUUUDUDUDUUDUUUUUUUUUUUUDUUUDUUDUDUDUUUUDUDUDUDUDUUUUUUUUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUDUUUUDUDUUUUUU 872
    @wc -c r.c

1

Mathematica, 114 120 octets

(d=#~Max~1-1&;u=#+1&;r=1&;s=StringToStream@ToLowerCase@#;l=1;t=1;While[(l=ToExpression[s~Read~Character]@l)<=#2,t++];t)&

Fonction anonyme, qui prend les deux arguments (C, N). Utilisez-le avec précaution, car il ne ferme pas le flux qu'il ouvre. Il affecte également toutes ses variables de manière globale.

Modifié pour le remplacer d=#-1&par d=#~Max~1-1&, afin que robie n'aille pas creuser.


Attendez: je ne pense pas que ce soit valide. Il permet au robot de descendre des échelons négatifs. Oups. Cela m'apprendra à tester de manière non exhaustive ... J'en mettrai un corrigé lorsque j'en aurai l'occasion.
hYPotenuser

1

Mathematica, 112 octets

i=0;First@Position[ToExpression["{"<>#~StringReplace~{"U"->"i++,","D"->"i=i~Max~1-1,","R"->"i=0,"}<>"0}"],#2-1]&

0

Clojure, 92 84 octets

Compte nà zéro au lieu de zéro à n, peut utiliser take-while pos?.

#(count(take-while pos?(reductions(fn[p o](if o(min(o p 1)%)%))%(map{\U -\D +}%2))))

Original:

#(count(take-while(partial > %)(reductions(fn[p o](if o(max(o p 1)0)0))0(map{\U +\D -}%2))))

Mappe le 2e argument Uà +, Dà -et d'autres à nil. La fonction de réduction s'exécute (operand position 1)avec non nul operandet 0autrement. Prend des valeurs jusqu'à ce que nous soyons supérieurs au premier argument d'entrée et compte le nombre que nous avons.


0

Mathematica, 67 octets

(p=i=0;While[p<#,p=Switch[#2[[++i]],"U",p+1,"D",1~Max~p-1,_,0]];i)&

Fonctions sans nom de deux arguments, un entier positif et une liste de caractères, qui renvoie un entier positif. Une Whileimplémentation plus simple que les autres entrées de Mathematica, qui parvient à donner une longueur plus compétitive.

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.