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.