Robot su una scala


30

sfondo

Ho una scala appoggiata a un muro e un robot telecomandato che può arrampicarlo. Posso inviare tre diversi comandi al robot:

  • UP: il robot fa un passo verso l'alto. Se era sul gradino più alto, inciampa, cade ed esplode.
  • DOWN: il robot fa un passo verso il basso. Se era sul gradino più basso, non succede nulla.
  • RESET: il robot ritorna al gradino più basso.

Posso anche inviare una serie di comandi e il robot li eseguirà uno per uno. Il tuo compito è prevederne i movimenti.

Ingresso

I tuoi input sono un numero intero positivo N, che rappresenta il numero di passaggi nella scala e una stringa non vuota Csopra UDR, che rappresenta i comandi che ho inviato al robot. Puoi presumere che N < 1000. Il robot è inizializzato sul gradino più basso della scala.

Produzione

È garantito che ad un certo punto il robot salirà il gradino più alto ed esploderà. Il tuo output è il numero di comandi che esegue prima che ciò accada.

Esempio

Considera gli ingressi N = 4e C = "UDDUURUUUUUUUDDDD" Il robot, indicato da @, si muove lungo la scala a 4 gradini come segue:

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

I comandi rimanenti non vengono eseguiti, poiché il robot è esploso. L'esplosione è avvenuta dopo 10 comandi, quindi l'output corretto è 10.

Regole e punteggio

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.

Casi 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
Sono deluso che il compito non sia quello di generare quell'arte ASCII.
user253751


Invece di una stringa, possiamo prendere un elenco di codici carattere?
Cyoce

@Cyoce Solo se la tua lingua non ha altri mezzi per rappresentare una stringa.
Zgarb

Risposte:


10

CJam, 26 25 22 byte

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

Il formato di input è le istruzioni sulla prima riga e l'altezza della scala sulla seconda.

Provalo qui.

Spiegazione

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.

Buona idea per elaborare tutti i comandi anche dopo l'esplosione. Lo prenderò in prestito per risparmiare qualche byte
Luis Mendo il

7

C, 83 71 + 4 = 75 byte

Grazie @Josh per avermi mostrato lo stile K&S , che ha permesso 8 byte di sconto !!

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;}

spiegazione:

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

Esempio di chiamata:

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

Test dal vivo su ideone


1
Bella risposta, ma potrebbe valere la pena notare che la funzione può essere effettivamente utilizzata solo una volta dai globali ze anon viene ripristinata.
Josh

@Josh. Ho aggiornato. :)
rimosso il

1
Eccezionale! Puoi anche salvare un paio di personaggi giocando con le dichiarazioni dei tipi nella tua funzione: codegolf.stackexchange.com/a/40266/13877
Josh

@Josh. Wow, è fantastico! grazie
rimosso il

6

JavaScript (ES6), 54 53 byte

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

Spiegazione

Utilizza internamente una funzione ricorsiva.

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 byte

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

Richiede la -pbandiera, -i$Nper quest'ultima altezza e un elenco di mosse separato da una nuova riga:

$ 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

Come funziona:

                                                # '-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.

Deparsed:

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 byte

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

Come funziona

Per prima cosa impostiamo la variabile isu 0. Ciò terrà traccia di quanti passi ha salito il robot. Quindi per ogni carattere cnella stringa di input, eseguiamo la seguente logica:

  1. Se iè maggiore o uguale a n, non fare nulla.
  2. Se cè "D":
    • Se iè 0, lasciarlo così com'è.
    • Altrimenti, decrementalo di 1.
  3. Se cè "U", incrementare idi 1.
  4. Altrimenti, impostare isu 0.

Eliminando if i>=n, evitiamo di aggiungere altri elementi all'array dopo che il robot ha raggiunto la cima. Pertanto, possiamo semplicemente restituire la lunghezza dell'array risultante.


3

Haskell, 65 byte

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

Esempio di utilizzo: f 4 "UDDUURUUUUUUUDDDD"-> 10.

%regola la posizione corrente sulla scala, scanlcrea un elenco di tutte le posizioni, fst.span(<n)prende la parte prima dell'esplosione e lengthconta i passi.


Bel lavoro con la combinazione di argomenti denominati e composizione / curry
Cyoce


3

MATL , 37 34 byte

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

Provalo online!

Spiegazione

La posizione è basata su 0. Ogni nuova posizione viene inserita nella pila mantenendo le posizioni più vecchie. Quindi la dimensione dello stack rappresenta il numero di movimenti fino ad ora, più 1.

Un ciclo viene utilizzato per elaborare ciascun comando. Il loop viene chiuso quando la posizione raggiunge l'altezza della scala elabora tutti i comandi, anche dopo l'esplosione (idea presa dalla risposta di Martin ). Il risultato finale è dato dall'indice della prima posizione che è uguale all'altezza della scala.

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 byte

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

Ad esempio, lo f(4, 'UDDUURUUUUUUUDDDD')è 10.

xnor ha trovato un'espressione ancora più breve: 2%~hè davvero bello :)


Bello trovare con il %4. Se non sbaglio, puoi salvare un personaggio facendo -[2%~h,~h,0][ord(s[0])%4].
xnor

3

PowerShell, 86 79 byte

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

Un leggero ritocco del mio quando Babbo Natale entra nel seminterrato? risposta.

Accetta input $ae $b, esplicitamente, esegue $bil cast come char-array. Quindi eseguiamo il ciclo con |%{...}oltre tutti $b. Ogni iterazione incrementiamo il nostro contatore $d.

Quindi, una ifdichiarazione per verificare se abbiamo raggiunto il vertice con -ge$a. In tal caso, produciamo $de exit. L' ifistruzione è costruita da uno pseudo-ternario creato assegnando $cmeno-uguale al risultato di diversi indici in un array.

Abbiamo un trucco che i valori ASCII delle D, Re Ucorrispondono a 0, 2e 1quando prese modulo-4, in modo $_%4serve come il nostro primo indice. Se lo è R, è $cuguale a $c-$c, facendo il reset. Se Uciò significa che dobbiamo salire, quindi il $c-(-1)risultato. Altrimenti è un D, quindi dobbiamo controllare se siamo già in fondo (questo è il !$c- in PowerShell, "non-zero" è "vero" o 1) e impostato $cuguale $c-0o $c-1rispettivamente.

Modifica: 7 byte salvati utilizzando l'assegnazione meno uguale anziché l'assegnazione diretta


3

Perl 5, 61 byte

Include due byte per -F -i. ( -M5.01è gratuito.)

L'input dell'intero (es. 10) è as perl -M5.01 -F -i10 robot.pl; l'immissione dei comandi ladder è STDIN.

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

usando perl 5.12.5, ho anche dovuto abilitare esplicitamente la modalità autosplit con -anFprima che potesse stampare qualcosa per me. ma sembra essere abilitato implicitamente con solo -Fin 5.20.3. puoi verificarlo?
Ardnew

@ardnew, -Fmi è bastato (5,20 o 5,22 circa). In realtà l'attuale perldoc perlrun dice che implica -ae -aimplica -n.
msh210

Quanto contiamo -i? Posso vederti contarlo come 1 ma immagino che in realtà dovrebbe essere contato come 3? :-)
andlrc

@ dev-null, perché tre? Penso che la convenzione su PPCG.SE sia quella di contare le lettere in una bandiera ma non i trattini-meno, ma per favore correggimi se sbaglio. (Sembra che tu stia usando la stessa convenzione di conteggio per la tua stessa risposta a questa domanda. (Per inciso, bella risposta.))
msh210

@ msh210 Stavo solo contando la differenza quando usavo -ie senza perl -i10 -pe';'vs perl -pe';'3 caratteri in più e poi il numero di input - che immagino non dovremmo contare. Ma potrei sbagliarmi solo per questo stamattina :-)
andlrc

3

Vitsy, 44 byte

Probabilmente potrebbero esserci delle riduzioni - se potrò riuscirò a capire altre cose.

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

Spiegazione (in corso):

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.

Provalo online! (grande test case)


2

PHP, 88 byte

Questo genera alcuni avvisi (3 + 2n dove n è il numero di comandi eseguiti) ma non importa per il golf, giusto?

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

ungolfed:

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

Le comunicazioni vanno bene, purché sia ​​ancora possibile eseguire il codice.
Zgarb,

2

Python, 121 byte

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
Benvenuti in PPCG! Qui richiediamo per impostazione predefinita che le risposte siano programmi completi che accettano input da STDIN e stampano su STDOUT o funzioni che accettano input come argomenti e restituiscono il valore di output. La soluzione codifica in modo rigido gli input, il che non è consentito.
Zgarb

Corretto dalla formazione in funzione, stavo usando l'interprete quando l'ho scritto.
Alex Burge,

Grazie! Dovresti anche aggiungere un'intestazione del modulo ## Python, <N> bytesper mostrare agli altri il tuo punteggio.
Zgarb,

Non penso che ci possa essere una funzione senza nome.
user48538

Puoi salvare i byte sostituendoli 0 if x==0 else x-1conx and x-1
Cyoce

2

JavaScript, 131 106 byte

So che questo non vincerà una competizione di Code Golf, ma questa è stata una soluzione divertente e stupida da implementare:

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

In un certo senso ho fatto il contrario di un percorso "funzionale" realizzando una soluzione imperativa generata dinamicamente, ogni istanza di un'istruzione è sostituita da un incremento o decremento e da un incremento del contatore.

Grazie a Cycoce per avermi salvato 29 byte!


Qui, ho giocato a golf fuori 29 byte: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 byte salvati grazie a DSM.

Abbastanza semplice adesso.

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

Casi 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 byte

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;}}}

Non vincente, ma divertente da creare. PHP sembra non gradire le parti vuote nell'operatore ternario (genera un errore di sintassi), quindi ho dovuto inserirle 0.

Versione non golfata:

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 byte

Versione più piccola di 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;}}}

Ungolfed:

// $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
Ottimo primo post! Ho modificato il tuo post per una migliore leggibilità. Buon golf!
GamrCorps

1

Pyth, 19 byte

x.u@[tWNNhN00)CYz0Q

Provalo online: Dimostrazione o Test Suite

Spiegazione:

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 byte

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
Quando rispondi a una code-golf -challenge, dovresti iniziare con la tua risposta # <language_name>, XX bytes. Inoltre è possibile ridurre i nomi delle variabili a un carattere ciascuno e rimuovere spazi bianchi extra, in questo modo il conteggio dei byte si ridurrà (che è l'obiettivo qui) ... Ah, e benvenuto in PPCG!
rimosso il

Alcuni consigli: per rientrare nel codice come codice aggiungi 4 spazi all'inizio della riga. Hai rimosso alcuni spazi, ma puoi comunque rimuoverne di più (es: invece di int steps=1; int count=0;puoi usare int s=1,c=0;- guarda ho cambiato il nome della variabile - e così via). È ancora possibile mostrare il vostro ungolfed versione di sotto della golfed versione con una spiegazione (in questo modo è facile per aiuto a qualcuno che giocare a golf più byte).
rimosso il

1

C, 91 byte

Nessun avviso con gcc -Wall. Ricorsione ed espressioni separate da virgola.

r.c contiene la funzione nuda:

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;}

ha commentato,

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
}

Per riferimento,

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

roboladder.c involucro,

#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 per test,

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 byte

(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)&

Funzione anonima, che accetta i due argomenti (C, N). Usalo con attenzione, poiché non chiude il flusso che si apre. Inoltre assegna tutte le sue variabili a livello globale.

Modificato per sostituirlo d=#-1&con d=#~Max~1-1&, in modo che Robie non vada a scavare.


Aspetta: non credo sia valido. Permette al robot di scendere su pioli negativi. Ops. Questo mi insegnerà a testare in modo non completo ... Ne metterò uno corretto quando ne avrò la possibilità.
hYPotenuser

1

Mathematica, 112 byte

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

0

Clojure, 92 84 byte

Conta na zero invece di zero a n, può essere utilizzato take-while pos?.

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

Originale:

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

Mappa il secondo argomento Usu +, Dsu -e altri su nil. La funzione di riduzione viene eseguita (operand position 1)con non null operande in caso 0contrario. Prende valori finché non siamo più alti del primo argomento di input e conta quanti ne abbiamo.


0

Mathematica, 67 byte

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

Funzioni senza nome di due argomenti, un numero intero positivo e un elenco di caratteri, che restituisce un numero intero positivo. WhileUn'implementazione più semplice rispetto alle altre voci di Mathematica, che riesce a tradursi in una lunghezza più competitiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.