Verificador da engrenagem da motocicleta!


36

Alguns de vocês podem estar familiarizados com a maneira como uma motocicleta muda. Mas para aqueles que não, parece que isso

6

5

4

3

2

N

1

Agora, quero saber em que equipamento estou depois de realizar alguns turnos para cima e para baixo. O programa deve funcionar em ponto morto.

Entrada de amostra:

V^^

Saída de amostra:

2

Como você pode ver, reduzi a marcha uma vez de N para 1 e reduzi a marcha duas vezes para a segunda marcha.

Este é um código de golfe. A resposta mais curta em bytes vence.

Nota: A entrada pode ter 2 caracteres. Pode ser U e D para cima e para baixo ou o que você quiser , tem que ser uma string . Você não pode passar da 1ª ou 6ª marcha. Se você estiver na 6ª e aumentar a marcha novamente, ela permanecerá na 6ª. Boa sorte!


5
Da próxima vez, por favor poste o seu desafio para a caixa de areia para obter feedback antes de publicá-la na principal
— fənɛtɪk

1
@seshoumara, os dois únicos requisitos são: tem que ser uma string e você só pode inserir 2 caracteres. Então, poderia usar uma nova linha como personagem. mas se você o usar por outro motivo, eu realmente não me importo. seria interessante ver o que você tem em mente. mas dê uma breve explicação sobre por que você fez dessa maneira se o fez. GL!
— Martijn Vissers

4
É uma pena que isso não explique a mudança de meio-passo entre 1 e N. Seria ótimo poder não apenas ir 2 N 1 N 2 3, mas também ir 2 1 N 2 3
— Cort Ammon

2
Concordo com @CortAmmon - há um único turno entre 1 e 2. É meio turno onde o neutro é.
— Džuris

2
nem todas as motos mudam assim. A maioria das motocicletas sem embreagem muda em N-1-2-3-4 (ou N-1-2-3 em alguns veículos muito antigos). Eles não têm a engrenagem 5 ou 6 e usam uma engrenagem redonda, ou seja, quando for 4, aumentá-la fará com que ela
— atinja

Respostas:


15

JavaScript (ES6), 49 48 47 46 bytes

Espera:

  • 1 para baixo
  • 7 para cima
f=([c,...s],g=2)=>c?f(s,g-c&7||g):'1N'[--g]||g

Formatado e comentado

f = (                   // f is a recursive function which takes:
  [c,                   // - c = next character in input string
      ...s],            // - s = remaining characters
  g = 2                 // - g = current gear, with default = neutral = 2
) =>                    //
  c ?                   // if there's still a character to process:
    f(                  //   do a recursive call with:
      s,                //     - the remaining characters
      g - c & 7 ||      //     - the updated gear if it is valid
      g                 //       or the previous gear if not
    )                   //
  :                     // else:
    '1N'[--g] ||        //   decrement g and output '1' for g = 0, 'N' for g = 1,
    g                   //   or simply the corresponding digit for other values

As engrenagens são mapeadas da seguinte maneira:

g MOD 8 = 0 1 2 3 4 5 6 7
          ---------------
gear    = X 1 N 2 3 4 5 6       (where 'X' is an invalid state)

O que nos permite verificar facilmente a validade da engrenagem atual com:

(g & 7) != 0

Demo


7

05AB1E , 22 20 bytes

Îvy<+®‚Z5‚W}6LÀ'N¸ìè

Experimente online!

Explicação

Î                      # push 0 (accumulator) and input
 v         }           # for each in input
  y<+                  # decrement current element and add to accumulator
     ®‚Z               # take maximum of current value and -1
        5‚W            # take minimum of current value and 5
            6L         # push the range [1 ... 6]
              À        # rotate left
               'N¸ì    # prepend the letter "N" producing the list [N, 2, 3, 4, 5, 6, 1]
                   è   # index into this list with the value produced by the loop

6

MATL, 32 28 23 bytes

5 bytes salvos graças a @Luis

'234561N'j!Uq[aA]&Ys0))

Esta solução utiliza '2'para a troca de marchas para cima e '0'para marchas para baixo.

Experimente no MATL Online

Explicação

'234561N'   % Push the string literal to the stack
j           % Grab the input as a string
!U          % Convert the input to a numeric array based on the characters.
q           % Subtract 1 to turn '2' into 1 and '0' into -1
[aA]        % Push the array [-1 5] to the stack
&Ys         % Compute the cumulative sum using the array [-1, 5] as
            % the upper and lower limits at each point
0)          % Get the last value from the cumulative sum
)           % Use this to index into the initial string literal.
            % Implicitly display the result

@Lifeless Atualizado com uma explicação
— Suever

Muito agradável! posso perguntar por que a seqüência de caracteres é 234561N em vez de 1n23456 ou 65432n1? Eu também encontrei uma falha! Se você manter upshifting deve ficar em 6ª velocidade, mas ele retorna N
— Martijn Vissers

1
Agradável! Não sabia sobre o truque de limites no cumsum
— B. Mehta

1
@ B.Mehta Nem eu! Luis o recomendou
— Suever 23/02

1
@ B.Mehta Além disso, sinta-se à vontade para se juntar a nós na sala de bate-papo do MATL !
— Suever 23/02

6

V , 20 , 15 bytes

:sil!î¬61énÀxVp

Experimente online!

Entrada é uma sequência de caracteres h(para cima) e l(para baixo).

Obrigado a @nmjcman por salvar 5 bytes e me ensinar sobre um recurso do vim que eu nunca soube!

Se pudéssemos assumir que a entrada nunca sai dos limites, seria simplesmente 9 bytes:

¬61énÀxVp

Mas infelizmente isso não é permitido.

Explicação:

:sil!           " If the cursor goes out of bounds, ignore it and continue
     î          " Run the following keystrokes as V code, rather than vimscript:
      ¬61       "   Insert the string "654321". This will leave the cursor on the '1'
         én     "   Insert an 'n'
           À    "   Run the first arg as V code. This will move left and right a bunch of times
            x   "   Delete whatever character we ended up on
             V  "   Select this whole line,
              p "   And replace it with the character we just deleted

2
Além disso, Experimente online! Compressão V. Isso é legal.
— nmjcman101

Na verdade, acho que isso não funciona, porque passar acima ou abaixo do 1/6 quebra a macro: /
— nmjcman101

Por que a resposta de 9 bytes não é permitida?
— Albert Renshaw

@AlbertRenshaw Falha se você tentar mudar além da 1ª ou 6ª marcha. Por exemplo Experimente online! deve produzir n, não 1.
— DJMcMayhem

Oh, entendi, pensei que por entrada sempre é válido, você quis dizer caracteres não-mutáveis. Ainda uma resposta fria, mesmo se a sua inválido
— Albert Renshaw

6

Java 7, 106 105 103 bytes

char c(String s){int r=1;for(int c:s.toCharArray())r+=c<99?1:-1;return"1N23456".charAt(r<0?0:r>6?6:r);}

Explicação:

char c(String s){                // Method with String input and character return-type
  int r = 1;                     // Result-index (0-indexed and starting at 1)
  for(int c : s.toCharArray()){  // Loop over all characters in the input String
    r += c < 99 ?                //  If the current character is '^':
           1                     //   Raise the result-index by 1
         :                       //  If it is 'v' instead:
           -1;                   //   Decrease the result-index by 1
  }
  return "1N23456".charAt(       // Return the character based on the return-index:
           r < 0 ?               //  If the result-index is below 0
                  0              //   Use 0 instead
                 : r > 6 ?       //  Else-if the result-index is above 6
                          6      //   Use 6 instead
                         :       //  Else
                          r);    //   Use the result-index
}

Código do teste:

Experimente aqui.

class M{
  static char c(String s){int r=1;for(int c:s.toCharArray())r+=c<99?1:-1;return"1N23456".charAt(r<0?0:r>6?6:r);}

  public static void main(String[] a){
    System.out.println(c("v^^"));
    System.out.println(c("^^^^^^^^"));
    System.out.println(c("vvvv^^^vvvv"));
    System.out.println(c("^v^v^v^v"));
  }
}

Saída:

2
6
1
N

5

Haskell, 59 53 51 Bytes

("1N23456"!!).foldl(\l c->max 0$min 6$l+read[c]-1)1

Usa 0para baixo e 2para cima. Exemplo de uso:

(("1N23456"!!).foldl(\l c->max 0$min 6$l+read[c]-1)1) "0002"

Obrigado a @xnor por descolar 6 bytes! Além disso, acontece que eu não preciso de um nome de função ou parênteses, então isso significa mais 2 bytes.


Se você considerar os caracteres de entrada como 0 e 2, poderá fazê-lo read[c]-2.
— Xnor

Bem-vindo ao PPCG! Funções anônimas também são boas, então você não precisa do g=.
— Laikoni 23/02

@Laikoni eu teria que colocá-lo entre parênteses, certo? Isso não mudaria a contagem de bytes, então eu pensei que eu ia deixar o g=porque é mais clara
— user1472751


4

JavaScript (ES6), 48 58 bytes

s=>"1N23456"[[1,...s].reduce((a,b)=>a?a<6?+b?a+1:a-1:6:0)]

Uso

Atribua-o a uma função e chame-o. Input é uma sequência que contém a 1para uma mudança para cima e 0para para uma mudança para baixo.

f=s=>"1N23456"[[1,...s].reduce((a,b)=>a?a<6?+b?++a:a--:6:0)]
f("011")
-> "2"
f("0")
-> "1"
f("01")
-> "N"

f (0) retorna 1 não N ... e seus retornos de código undef se você mudar a partir de 6 ou para baixo a partir de 1
— fənɛtɪk

Boa pegada. Corrigido ao custo de dois bytes
— Luke

Não entrada de trabalho, tais como f("001")que deve retornar N (engrenagem para baixo a 1, engrenagem para baixo ficar no 1, preparam-se para N)
— Emigna

Não deveria dar a volta. Ele deve ficar em 6 se upshifted de 6 e estadia no 1 se downshifted de 1. Além disso, ele ainda dá undef se você downshift de 1
— fənɛtɪk

4

PHP 7.1, 71 bytes

for(;$c=$argv[1][$i++];))$g=max(-1,min($g+=$c<=>X,5));echo N234561[$g];

muda $gde -1 para 5, usa o deslocamento negativo da corda na primeira marcha.
Execute com -nr, forneça uma string de deslocamento como argumento de linha de comando.


4

Geléia , 17 14 bytes

1;r2ị$¥/CỊ¡o”N

Usa 6para cima e 0para baixo.

Experimente online!

Como funciona

1;r2ị$¥/CỊ¡o”N  Main link. Argument: s (string of 6's and 0's)

1;              Prepend a 1 (integer) to the string/character array s.
       /        Reduce the result by the following dyadic link.
                Let's call the arguments x and y.
      ¥           Create a dyadic chain of 2 links:
  r                 Construct the range [x, ..., y] (increasing or decreasing).
                    y will be a character, but 'r' casts both argument to int.
                    This is intended for use with floats, but it works just as well
                    when the argument is a digit.
     $              Create a monadic chain of two links:
   2ị                 Take the second element of the constructed range.
                  When y = 6 > x, this gives x + 1.
                  When y = 0 < x, this gives x - 1.
                  When y = x, the range is a singleton array, so this gives x.
          ¡     Conditional application:
         Ị        If the previous result is insignificant (0 or 1):
        C           Subtract it from 1.
                This swaps 0 and 1 without affecting the other potential outcomes.
           o”N  Logical OR with 'N', replacing 0 with that character.

2

Ruby, 58 bytes

->s{a=1;s.chars{|b|a-=[a<=>0,a<=>6][b<=>?v]};"1N23456"[a]}

A entrada esperada é 'v' para um downshift e '^' para upshift


2

Processando JS (modificado) 121 bytes

var g="1N23456",a="",c=0; for(var i=0;i<a.length;i++){if(a[i]==="d"&&c>0){c--;}else if(c<6&&a[i]==="u"){c++;}}println(g[c]);

Ungolfed

var g=[1,"N",2,3,4,5,6],a="",c=0;
for(var i=0;i<a.length;i++)
{if(a[i]==="d"&&c>0)
{
    c--;

}else if(c<6&&a[i]==="u")
{
    c++;

}

}
println(g[c]);

Experimente online!

Eu fui com PJs desde que eu conheço bem. O único problema é o uso versão que é muito estritamente digitado. Não posso deixar de fora parênteses e muitos outros truques. É bem simples. A entrada deve ir para a variável ae é minúscula u d. O programa faz um loop até atingir o final da string e a cada iteração, verifica se é au ou d. Se for e não tentará "mudar" o local onde você pode mudar. No final, imprimo os resultados!


Se sua versão permitir operadores ternários, você poderá reescrever seus ifs de uma maneira muito mais curta, eu acho.
— Bojidar Marinov 23/02

The input should go into the variable aO uso de entrada codificada não é um método de entrada padrão, veja aqui .
— Laikoni 23/02

@Laikoni realmente? Isso é bobagem. Eu não tenho nenhuma maneira melhor. Se eu tiver que refazer isso, serão mais ou menos 100 bytes #
— Christopher

Você não pode simplesmente agrupar seu código em uma função? Por exemplo. void f(String[] a){...}Isso é quase 100 bytes.
— Laikoni 23/02

@Laikoni No Khan Academy ProcessingJS, é JS puro e, portanto, não possui String ou nulo. Mas você está certo, uma função seria muito menor
— Kritixi Lithos

2

k, 25 bytes

"1N23456"@{6&0|x+y-92}/1,

Ele recebe a entrada como uma seqüência de caracteres e usa [para redução ]de marcha e mudança de marcha, porque estão convenientemente situados.

"1N23456"@                / the numbers 0 to 6 are used for the gears,
                          / this turns them into the correct number/letter
                       1, / prepend 1 because this is our initial gear
          {          }/   / fold the function through the list
                          / x is before, y is the next character
                 y-92     / subtract 92, which is between "[" and "]"
                          / "[" becomes -1 and "]" becomes 1
               x+         / add it to what we had before
           6&0|           / use max and min to set boundaries 6 and 0

Exemplos:

 shift:"1N23456"@{6&0|x+y-92}/1,
 shift"[]]"
"2"
 shift"]]]]]]]]"
"6"
 shift"[[[[]]][[[["
"1"
 shift"[][][][]"
"N"
 shift"[[[[[[[[]"
"N"
 shift"]]]]]]]]["
"5"

2

GNU sed , 89 87 + 1 (sinalizador r) = 88 bytes

Como o sed não possui tipos inteiros ou operações aritméticas, a solução é obtida usando apenas expressões regulares.

s:$:65432Nx1:
:
/6x/!s:^U(.*)(.)x:\1x\2:
s:^D(.*)x(.):\1\2x:
t
s:U|D::
t
s:.*(.)x.*:\1:

Ele funciona deslizando o ponteiro com xbase em cada turno de entrada, esquerdo (para Up) ou direito ( Dpróprio), ao longo de uma fita não envolvente que contém apenas as células 65432N1. A resposta no final é o valor na célula esquerda do ponteiro.

Exemplo de execução: ou Experimente online!

sed -rf gear.sed <<< "UUUUUUD"
5

Explicação:

s:$:65432Nx1:              # assign initial tape and pointer
:                          # start loop
/6x/!s:^U(.*)(.)x:\1x\2:   # if shift 'U', slide `x` to left, but not past the edge
s:^D(.*)x(.):\1\2x:        # if shift 'D', slide `x` to right, -||-
t                          # repeat
s:U|D::                    # if a shift couldn't be applied, delete it "manually",
t                          # and jump to the start of the loop again
s:.*(.)x.*:\1:             # print value left of pointer `x` (answer)

Aqui estão 76 bytes , mas são exibidos em unário.
— 23917 Riley

@Riley Unary, é claro! Bem, sua solução é diferente, então por que não publicá-la!
— seshoumara

O seu me deu a inspiração para isso. Imaginei que deixaria você usá-lo, se quisesse.
— Riley

@Riley Então vou fazer uma seção separada com sua versão e creditar você.
— seshoumara

Eu vou apenas postar o meu próprio :) #
— 239 Riley

2

GNU sed , 76 73 bytes

Inclui +1 para -r

s/$/1/
:
/1{6}/!s/^U(.*)/\11/
s/^D(.*)1/\1/
t
s/U|D//
t
s/^1$/N/
s/^$/1/

A produção é unária, exceto a neutra, que ainda é N(consulte este consenso ).

Experimente online!

Isso basicamente conta para cima e para baixo em unário e depois converte 1 em N e 0 em 1.

s/$/1/               # add 1 to the end (the starting value)
:                    # loop start
/1{6}/!s/^U(.*)/\11/ # If the string starts with 'U' and doesn't have 6 ones, increment
s/^D(.*)1/\1/        # If the string starts with 'D' decrement (but not past 0)
t                    # if something changed loop back
s/U|D//              # if the U or D couldn't be applied, remove it.
t                    # if something changed loop back
s/^1$/N/             # replace 1 with N
s/^$/1/              # if "0", replace with 1

Sua versão sed pode ser menor em 4 bytes, eu acho, se você trabalhar com 1o valor inicial, como N, e nada como 1. s/$/1/;:;/1{6}/!s/^U(.*)/\11/;s/^D(.*)1/\1/;t;s/U|D//;t;s/^1$/N/;s/^$/1/
— seshoumara

2

Rebol, 96 93 bytes

f: func[s][g: next"1N23456"parse s[any["D"(g: back g)|"U"(unless tail? x: next g[g: x])]]g/1]

Ungolfed:

f: func [s] [
    g: next "1N23456"
    parse s [
        any [
              "D" (g: back g)
            | "U" (unless tail? x: next g [g: x])
        ]
    ]
    g/1
]

Exemplo de uso (no console Rebol):

>> print f "DUU"         
2

>> print f "DDDUU"
2

>> print f "UUUUUUUUU"  
6

>> print f "UUUUUUUUUD"
5

2

> <> , 35 bytes

Um pedaço de código entusiasmado que incentiva você a dirigir acima do limite de velocidade.

Aceita quaisquer duas entradas cujo código módulo 3 seja 0 e 2, por exemplo, 0e 2.
Para pesar mais, eu recomendo o uso de <e >.

1i:0(?;3%1-+:0(?0:6)?6:1go!
1N23456

Explicação:

1i:0(?;3%1-+:0(?0:6)?6:1go!
1                             # initial position
 i                            # read the next char
  :0(?;                       # copies it, test copy against 0, if lower stops (EOF detection)
       3%1-                   # map the char to -1 or 1
           +                  # add it to the position
            :0(?0             # if the new position is lower than 0, set to 0
                 :6)?6        # if the new position is greater than 6, set to 6
                      :1go    # output a character from line 1 at the position
                          !   # loops and skip the position initialisation

Você pode tentar aqui !


1

EspecificaçõesBAS - 102

1 g=2: INPUT s$
2 FOR i=1 TO LEN s$
3 g+=(s$(i)="^" AND g<7)-(s$(i)="v" AND g>1)
4 NEXT i
5  ?"1N23456"(g)

Move o índice da sequência dependendo da entrada e imprime o caractere relevante.


1

Pitão, 32 bytes

J1VQ=JhtS[06+J-qNbqNd;?qJ1\N?JJ1

Usa espaço e nova linha para baixo e para cima.

Explicação

J1VQ=JhtS[06+J-qNbqNd;?qJ1\N?JJ1
J1                                 Initialize J to 1
  VQ                 ;             For each character in the input
            +J-qNbqNd              Increment or decrement J
      htS[06                       Get the middle sorted value of [0,6,J]
    =J                             Assign it to J
                      ?qJ1\N?JJ1   Change 1 to 'N' and 0 to 1

Há quase certamente uma maneira melhor de fazer o incremento e a saída.


1

CJam , 24 22 bytes

"1N23456"1q{~0e>6e<}/=

Usa (para baixo e )para cima.

Experimente online!

Explicação

"1N23456"               e# Push the string containing all gears
         1              e# Push 1, the initial index
          q             e# Push the input
           {            e# For each character in the input
            ~           e#   Eval that character. ( is decrement and ) is increment.
             0e>        e#   Take the maximum of (0, index)
                6e<     e#   Take the minimum of (6, index)
                   }/   e# (end of block)
                     =  e# Take that index of the string

1

Lote, 144 bytes

@set/ps=
@set g=1
:l
@if %g% neq %s:~,1% set/ag+=%s:~,1%/3-1
@set s=%s:~1%
@if not "%s%"=="" goto l
@if %g%==1 (echo N)else cmd/cset/ag+!g

Aceita STDIN, usando 0para ir para uma marcha mais baixa e 6para uma marcha mais alta. Esses números foram escolhidos para facilitar a ignição da engrenagem atual. Finalmente, se a transmissão é 1, em seguida, Né impressa de outra forma 0é convertido para 1e a engrenagem é impresso.


0

Javascript ES6 não restrito, 136 120 caracteres

136 caracteres para V^

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})f=s=>eval(s.replace(/(V)|./g,(m,v)=>`x${"-+"[+!v]}=1,`,y=1)+'"1N"[x]||x')

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})
f=s=>eval(s.replace(/(V)|./g,(m,v)=>`x${"-+"[+!v]}=1,`,y=1)+'"1N"[x]||x')
console.log(f("V^^"))

120 caracteres para -+

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})f=s=>eval(s.replace(/./g,m=>`x${m}=1,`,y=1)+'"1N"[x]||x')

with({get x(){return Math.max(0,Math.min(y,6))},set x(v){y=v}})
f=s=>eval(s.replace(/./g,m=>`x${m}=1,`,y=1)+'"1N"[x]||x')
console.log(f("-++"))


0

Retina , 65 bytes

^
1 N23456
+(` (.)?(\w*6)u
$1 $2
)`(.)? (\w*6)d
 $1$2
.* (.).*
$1

Usa ue dpara cima e para baixo.

Experimente online!

Explicação

Este programa funciona mantendo 1N23456a sequência de instruções. Ele mantém o controle da engrenagem atual, tendo um espaço atrás dela. Depois, são necessárias uma instrução de cada vez até que não haja mais.

^
1 N23456

Comece colocando 1 N23456antes da entrada. O espaço anterior Nindica que Né a marcha atual.


+(` (.)?(\w*6)u
$1 $2
)`(.)? (\w*6)d
 $1$2

Esses são dois estágios de substituição, agrupados e executados até que parem de alterar a sequência:

 (.)?(\w*6)u
$1 $2

O primeiro lida com a mudança de marcha. Ele procurará qualquer número de marchas após o espaço, seguido de a e 6, em seguida, seguido por u( uindica a instrução para mudar de marcha). Se houvesse caracteres antes do 6, ele trocaria o espaço pelo caractere imediatamente após, excluí-lo ue deixaria o restante da string intacta. Como o jogo 6é obrigatório na partida, ele só trocará o espaço com qualquer personagem antes do 6. Ele nunca será trocado com o 6.

(.)? (\w*6)d
 $1$2

O segundo estágio lida com a mudança de marchas para baixo e funciona da mesma forma. Ele procura opcionalmente um personagem antes do espaço, depois outras artes depois de terminar 6, seguido por d. Ele troca o espaço com o personagem antes dele, exclui o de deixa o resto intacto. Se o espaço estava no início da sequência, não havia correspondência para um caractere antes do espaço, portanto, nenhuma troca ocorre.


.* (.).*
$1

Depois que nenhuma das substituições acima pode ser realizada, todas as trocas de marchas foram concluídas. A linha é limpa de tudo, exceto a engrenagem imediatamente após o espaço. Esta é a engrenagem final.


0

Powershell, 112 87 85 bytes

$i=1;switch([char[]]$args[0]){'^'{if(5-gt$i){$i++}}'v'{if(1-le$i){$i--}}}'1N2345'[$i]

destroçado

$i=1;                                # index which gear we are in
switch([char[]]$args[0]){            # loop over all elements using a switch
  '^'{if(5-gt$i){$i++}}             # if there is a ^ and we are not in sixth yet, shift up
  'v'{if(1-le$i){$i--}}             # if there is a v and we are not in first, shift down
}
'1N2345'[$i]                         # print the output

economizou 25 bytes lendo as dicas do codegolf do powershell

economizou 2 bytes invertendo os operadores gt / le


0

Perl 6, 144 bytes

my enum C <1 N 2 3 4 5 6>;my $n=prompt("");my $p=1;for split("",$n) ->$l {$l eq "u" && $p < 6 ?? ++$p !! 0;$l eq"d"&&$p>0 ?? --$p!!0};say C($p);

Funciona como deveria, acredito. Melhorias são bem vindas. Primeira vez que usei Perl para qualquer coisa, mas adorei o pensamento da linguagem, então tive que tentar.


0

Clojure, 74 bytes

#((vec "1N23456")(reduce(fn[c s](max 0(min 6((if(= s \^)inc dec)c))))1 %))

Dobra a string de deslocamento, mantendo um índice como acumulador. Cada iteração aumenta ou diminui o índice e o prende no intervalo de 0 a 6. Finalmente, uma corda que segura as engrenagens é indexada e retornada.

Retorna um caractere Clojure que representa a engrenagem atual. A engrenagem 1 é retornada como \1e a engrenagem 'N' é retornada como \N.

Explicação pré-golfe. Siga os números, pois ele não lê bem de cima para baixo.

; Expects ^ for shift-up, and V (or anything else) for shift down
; Returns a character representing the current gear
(defn shift [shift-str]
  ((vec "1N23456") ; 4. Then index the gear list with the calculated index, and return
   (reduce (fn [current-gear s] ; 1. Fold over the shift symbols
             (max 0 (min 6 ; 3. Clamp it to the range 0-6 so we don't overflow
                      ((if (= s \^) inc dec) ; 2. If the shift is up, increase, else decrease
                       current-gear))))
           1
           shift-str)))

0

Python 3, 67 63 bytes

k=1
for i in input():k+=[k<6,-(k>0)][i<'1']
print('1N23456'[k])

Solução bastante simples.

-4 bytes graças a @ovs!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.