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 C
sur 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 = 4
et 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
Réponses:
CJam,
262522 octetsLe 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
la source
C,
8371 + 4 = 75 octetsMerci @Josh de m'avoir montré le style K&S , qui permettait 8 octets de réduction !!
Expliquant:
Exemple d'appel:
Test en direct sur ideone
la source
z
eta
n'est pas réinitialisée.JavaScript (ES6),
5453 octetsExplication
Utilise une fonction récursive en interne.
la source
Perl, 47 + 2 = 49 octets
Nécessite le
-p
drapeau,-i$N
pour cette dernière hauteur et une liste de mouvements séparés par une nouvelle ligne:Comment ça marche:
Débarqué:
la source
JavaScript (SpiderMonkey 30+),
6564 octetsComment ça marche
Nous définissons d'abord la variable
i
sur 0. Cela permettra de savoir combien de pas le robot a gravi. Ensuite, pour chaque caractèrec
de la chaîne d'entrée, nous exécutons la logique suivante:i
est supérieur ou égal àn
, ne faites rien.c
est"D"
:i
est 0, laissez-le tel quel.c
c'est le cas"U"
, incrémentezi
de 1.i
sur 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.la source
Haskell, 65 octets
Exemple d'utilisation:
f 4 "UDDUURUUUUUUUDDDD"
->10
.%
ajuste la position actuelle sur l'échelle,scanl
fait une liste de toutes les positions,fst.span(<n)
prend la partie avant l'explosion etlength
compte les pas.la source
JavaScript (ES6), 65 octets
la source
0,i=0
peut être changé eni=0
MATL ,
3734 octetsEssayez-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'échelletraite 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.la source
Python 2,
6362 octetsPar exemple,
f(4, 'UDDUURUUUUUUUDDDD')
est10
.xnor a trouvé une expression encore plus courte:
2%~h
c'est vraiment cool :)la source
%4
. Si je ne me trompe pas, vous pouvez sauver un personnage en faisant-[2%~h,~h,0][ord(s[0])%4]
.PowerShell,
8679 octetsUn léger réoutillage de mon Quand le Père Noël entre-t-il au sous-sol? répondre.
Prend l'entrée
$a
et$b
le transtypage explicite en$b
tant que tableau de caractères. Nous bouclons ensuite avec|%{...}
sur tout$b
. À chaque itération, nous incrémentons notre compteur$d
.Ensuite, une
if
déclaration pour vérifier si nous avons atteint le sommet avec-ge$a
. Si oui, nous sortons$d
etexit
. L'if
instruction est construite à partir d'un pseudo-ternaire créé en affectant$c
moins-égal au résultat de plusieurs index dans un tableau.Nous avons une astuce que les valeurs ASCII
D
,R
etU
correspondent à0
,2
et1
lorsqu'ils sont pris modulo-4, donc$_%4
sert notre premier indice. Si c'est le casR
, cela est$c
égal à$c-$c
, faisant la réinitialisation. SiU
, cela signifie que nous devons monter, alors le$c-(-1)
résultat. Sinon, c'est unD
, nous devons donc vérifier si nous sommes déjà en bas (c'est le!$c
- dans PowerShell, "non nul" est "vrai" ou1
) et définir$c
égal$c-0
ou$c-1
respectivement.Édition - 7 octets enregistrés en utilisant l'affectation moins égale que l'affectation directe
la source
Perl 5, 61 octets
Comprend deux octets pour
-F -i
. (-M5.01
est 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.la source
-anF
avant d'imprimer quoi que ce soit pour moi. mais il semble être implicitement activé avec seulement-F
en 5.20.3. pouvez-vous vérifier cela?-F
suffit juste (5,20 ou 5,22 environ). Iirc l'actuel perldoc perlrun dit qu'il implique-a
et-a
implique-n
.-i
? Je peux voir que vous le comptez comme 1 mais je suppose qu'il devrait en fait être compté comme 3? :-)-i
et sansperl -i10 -pe';'
vsperl -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 :-)Vitsy, 44 octets
Il pourrait probablement y avoir des réductions - je trouverai d'autres choses si je le peux.
Explication (en cours):
Essayez-le en ligne! (grand cas de test)
la source
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?
non golfé:
la source
Python, 121 octets
la source
## Python, <N> bytes
pour montrer aux autres votre score.0 if x==0 else x-1
parx and x-1
JavaScript,
131106 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:
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!
la source
l=>s=>Function('i=c=0;'+s.replace(/./g,x=>`c++;i${{R:"=0",U:`++;if(i>=${l})return c`,D:"--"}[x]};`))()
Python 3, 90
6 octets enregistrés grâce à DSM.
Assez simple en ce moment.
Cas de test:
la source
PHP, 129 octets
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:
la source
PHP, 113 octets
Version plus petite de https://codegolf.stackexchange.com/a/74575/13216
Non golfé:
la source
Pyth, 19 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
la source
Java, 250 octets
la source
# <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!int steps=1; int count=0;
vous pouvez utiliserint 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).C, 91 octets
Aucun avertissement avec
gcc -Wall
. Récursivité et expressions séparées par des virgules.r.c
contient une fonction nue:Commenté,
Pour référence,
roboladder.c
emballage,Makefile
pour tester,la source
Mathematica,
114120 octetsFonction 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&
pard=#~Max~1-1&
, afin que robie n'aille pas creuser.la source
Mathematica, 112 octets
la source
Clojure,
9284 octetsCompte
n
à zéro au lieu de zéro àn
, peut utilisertake-while pos?
.Original:
Mappe le 2e argument
U
à+
,D
à-
et d'autres ànil
. La fonction de réduction s'exécute(operand position 1)
avec non nuloperand
et0
autrement. Prend des valeurs jusqu'à ce que nous soyons supérieurs au premier argument d'entrée et compte le nombre que nous avons.la source
Mathematica, 67 octets
Fonctions sans nom de deux arguments, un entier positif et une liste de caractères, qui renvoie un entier positif. Une
While
implémentation plus simple que les autres entrées de Mathematica, qui parvient à donner une longueur plus compétitive.la source