Sprawdzanie sprzętu motocyklowego!


36

Niektórzy z was mogą znać sposób, w jaki zmienia się motocykl. Ale dla tych, którzy tego nie robią, wygląda to tak

6

5

4

3)

2)

N.

1

Teraz chcę wiedzieć, na jakim biegu jestem po kilku zmianach w górę iw dół. Program powinien działać od zera.

Przykładowe dane wejściowe:

V^^

Przykładowe dane wyjściowe:

2

Jak widać, zmniejszyłem bieg raz z N na 1 i dwukrotnie przerzuciłem na 2. bieg.

To jest golf golfowy. Najkrótsza odpowiedź w bajtach wygrywa.

Uwaga: Dane wejściowe mogą zawierać dowolne 2 znaki. Może być U i D dla wzlotów i upadków lub cokolwiek chcesz, to musi być ciąg znaków . Nie możesz zmienić biegu poza 1. lub 6. bieg. Jeśli jesteś na szóstej pozycji i ponownie przejdziesz na wyższy bieg, pozostanie na szóstej pozycji. Powodzenia!


5
Następnym razem, wyślij swoje wyzwanie do piaskownicy, aby uzyskać informację zwrotną przed opublikowaniem go na stronie głównej
fəˈnɛtɪk

1
@seshoumara, jedyne dwa wymagania to ciąg znaków i że można wprowadzić tylko 2 znaki. Więc może użyć nowego wiersza jako znaku. ale jeśli użyjesz go z innego powodu, nie mam nic przeciwko. byłoby interesujące zobaczyć, co masz na myśli. ale krótko wyjaśnij, dlaczego tak postąpiłeś. GL!
Martijn Vissers

4
Szkoda, że ​​nie stanowi to przesunięcia o pół kroku między 1 a N. Byłoby fajnie móc nie tylko przejść 2 N 1 N 2 3, ale także przejść 2 1 N 2 3
Cort Ammon

2
Zgadzam się na @CortAmmon - jest jedna zmiana między 1 a 2. Jest to połowa zmiany, gdzie jest neutralny.
Džuris

2
nie wszystkie motocykle zmieniają się w ten sposób. Większość motocykli bez sprzęgła zmienia bieg w N-1-2-3-4 (lub N-1-2-3 w niektórych bardzo starożytnych pojazdach). Nie mają biegu 5 lub 6 i używają okrągłego koła zębatego, tzn. Gdy jest 4, zwiększenie biegu sprawi, że
zwinie się

Odpowiedzi:


15

JavaScript (ES6), 49 48 47 46 bajtów

Oczekuje:

  • 1 na dół
  • 7 aż do
f=([c,...s],g=2)=>c?f(s,g-c&7||g):'1N'[--g]||g

Sformatowane i skomentowane

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

Koła zębate są mapowane w następujący sposób:

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)

Co pozwala nam łatwo sprawdzić ważność aktualnego sprzętu za pomocą:

(g & 7) != 0

Próbny


7

05AB1E , 22 20 bajtów

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

Wypróbuj online!

Wyjaśnienie

Î                      # 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 bajtów

5 bajtów zapisanych dzięki @Luis

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

To rozwiązanie wykorzystuje '2'do zmiany biegu na wyższy i '0'niższy.

Wypróbuj w MATL Online

Wyjaśnienie

'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 Zaktualizowano z wyjaśnieniem
Suever

Bardzo dobrze! czy mogę zapytać, dlaczego ciąg ma wartość 234561N zamiast 1n23456 lub 65432n1? Znalazłem też wadę! Jeśli będziesz dalej zmieniać bieg, powinien pozostać na 6. biegu, ale powróci N
Martijn Vissers

1
Miły! Nie wiedziałem o sztuczce z limitami w sumach
B. Mehta

1
@ B. Mehta Ja też! Luis polecił to
Suever

1
@ B.Mehta Zapraszamy również do przyłączenia się do nas na czacie MATL !
Suever

6

V , 20 , 15 bajtów

:sil!î¬61énÀxVp

Wypróbuj online!

Dane wejściowe to ciąg znaków h(w górę) i l(w dół).

Dzięki @nmjcman za uratowanie 5 bajtów i nauczenie mnie o funkcji vima, o której nigdy nie wiedziałem!

Gdybyśmy mogli założyć, że dane wejściowe nigdy nie wykraczają poza granice, byłoby to po prostu 9 bajtów:

¬61énÀxVp

Ale niestety nie jest to dozwolone.

Wyjaśnienie:

: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
Również Spróbuj online! Kompresja V. To super.
nmjcman101

Właściwie myślę, że to nie działa, ponieważ przekroczenie lub
obniżenie

Dlaczego 9-bajtowa odpowiedź jest niedozwolona?
Albert Renshaw

@AlbertRenshaw Nie udaje się, jeśli kiedykolwiek spróbujesz zmienić bieg na 1. lub 6. bieg. Na przykład Wypróbuj online! powinien generować n, a nie 1.
DJMcMayhem

Och, rozumiem, myślałem, że przez wprowadzanie zawsze jest ważna , chodziło o znaki, które się nie zmieniają. Nadal fajna odpowiedź, nawet jeśli jest nieprawidłowa
Albert Renshaw

6

Java 7, 106 105 103 bajtów

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

Wyjaśnienie:

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
}

Kod testowy:

Wypróbuj tutaj.

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

Wydajność:

2
6
1
N

5

Haskell, 59 53 51 bajtów

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

Używa 0w dół i 2w górę. Przykład użycia:

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

Dzięki @xnor za zdjęcie 6 bajtów! Okazuje się też, że nie potrzebuję nazwy funkcji ani nawiasów, więc to kolejne 2 bajty.


Jeśli weźmiesz znaki wejściowe jako 0 i 2, możesz to zrobić read[c]-2.
xnor

Witamy w PPCG! Funkcje anonimowe też są w porządku, więc nie potrzebujesz g=.
Laikoni

@Laikoni musiałbym zawinąć w nawiasy, prawda? To by nie zmieniło liczby bajtów, więc pomyślałem, że zostawiam, g=ponieważ jest jaśniejsze
user1472751


4

JavaScript (ES6), 48 58 bajtów

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

Stosowanie

Przypisz ją do funkcji, a następnie wywołaj. Dane wejściowe to ciąg znaków zawierający znak zmiany biegu 1na wyższy i zmiany 0biegu na niższy.

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) zwraca 1 nie N ... a kod zwraca undef, jeśli przejdziesz w górę z 6 lub w dół z 1
fəˈnɛtɪk

Dobry chwyt Naprawiono kosztem dwóch bajtów
Łukasz

Nie działa wejściowy, taki jak f("001")który powinien zwrócić N (bieg do 1, bieg poniżej 1, bieg do N)
Emigna

Nie powinien się kręcić. Powinien pozostać na poziomie 6, jeśli został przesunięty w
górę

4

PHP 7.1, 71 bajtów

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

przesuwa się $gz -1 na 5, używa ujemnego przesunięcia struny dla pierwszego biegu.
Uruchom z -nr, podaj ciąg przesuwający jako argument wiersza poleceń.


4

Galaretka , 17 14 bajtów

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

Używa 6w górę i 0w dół.

Wypróbuj online!

Jak to działa

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

Rubinowy, 58 bajtów

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

Oczekiwanym wejściem jest „v” dla zmiany biegu na niższy i „^” dla zmiany biegu na wyższy


2

Przetwarzanie JS (zmodyfikowane) 121 bajtów

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]);

Bez golfa

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]);

Wypróbuj online!

Poszedłem z PJ, ponieważ dobrze to wiem. Jedynym problemem jest to, że wersja, której używam, jest bardzo ściśle wpisana. Nie mogę pominąć nawiasów i wielu innych sztuczek. To jest dość proste. Dane wejściowe powinny przejść do zmiennej ai zajmuje małe litery u d. Program zapętla się, dopóki nie osiągnie końca łańcucha i każdej iteracji, którą sprawdza, aby sprawdzić, czy jest to au czy d. Jeśli tak jest i nie będzie próbował „przesunąć” przeszłości tam, gdzie to możliwe, przesunie się. Na koniec drukuję wyniki!


Jeśli twoja wersja pozwala operatorom trójskładnikowym, być może będziesz w stanie przepisać swoje ifs w znacznie krótszy sposób, tak myślę.
Bojidar Marinov

The input should go into the variable aUżywanie wejścia zakodowanego na stałe nie jest domyślną metodą wprowadzania, zobacz tutaj .
Laikoni

@Laikoni naprawdę? To głupie. Nie mam lepszego sposobu. Jeśli będę musiał to powtórzyć, będzie to ~ 100 bajtów dłużej
Christopher

Czy nie możesz po prostu zawinąć kodu w funkcję? Na przykład. void f(String[] a){...}To prawie 100 bajtów.
Laikoni

@Laikoni W Khan Academy ProcessingJS, jest to czysty JS, a zatem nie ma łańcucha ani nieważności. Ale masz rację, funkcja byłaby znacznie krótsza
Kritixi Lithos

2

k, 25 bajtów

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

Pobiera dane wejściowe jako ciąg znaków i używa ich [do zmiany biegów na niższy i ]wyższy, ponieważ są one dogodnie usytuowane.

"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

Przykłady:

 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 (flaga r) = 88 bajtów

Ponieważ sed nie ma żadnych liczb całkowitych ani operacji arytmetycznych, rozwiązanie jest osiągane przy użyciu tylko wyrażeń regularnych.

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

Działa poprzez przesuwanie wskaźnika xna podstawie każdego przesunięcia wejściowego, w lewo (dla Up) lub w prawo (dlaD własnego), wzdłuż taśmy bez opakowania, która zawiera tylko komórki65432N1 . Odpowiedź na końcu to wartość w komórce po lewej stronie wskaźnika.

Przykład uruchomienia: lub Wypróbuj online!

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

Wyjaśnienie:

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)

Tutaj jest 76 bajtów , ale dane wyjściowe są jednoargumentowe.
Riley

@Riley Unary, oczywiście! Twoje rozwiązanie jest inne, więc dlaczego nie opublikować!
seshoumara

Twoja zainspirowała mnie do tego. Pomyślałem, że pozwolę ci go użyć, jeśli chcesz.
Riley

@ Riley Potem utworzę osobną sekcję z twoją wersją i uznam cię.
seshoumara

Po prostu opublikuję własne :)
Riley

2

GNU sed , 76 73 bajtów

Obejmuje +1 dla -r

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

Wyjście jest jednomyślne, z wyjątkiem neutralnego, który jest nadal N(patrz ten konsensus ).

Wypróbuj online!

Zasadniczo liczy się to w górę i w dół, a następnie konwertuje 1 na N i 0 na 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

Myślę, że twoja wersja sed może być krótsza o 4 bajty, jeśli pracujesz z 1wartością początkową, jako Ni niczym jako 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 bajtów

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

Nie golfowany:

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

Przykładowe użycie (w konsoli Rebol):

>> print f "DUU"         
2

>> print f "DDDUU"
2

>> print f "UUUUUUUUU"  
6

>> print f "UUUUUUUUUD"
5

2

> <> , 35 bajtów

Entuzjastyczny fragment kodu, który zachęca do jazdy powyżej limitu prędkości.

Akceptuje dowolne dwa wejścia, których kod modulo 3 to 0 i 2, na przykład 0i 2.
Dla dodatkowej rybności polecam użycie <i >.

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

Objaśnienie:

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

Możesz spróbować tutaj !


1

SpecBAS - 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)

Przesuwa indeks łańcucha w zależności od danych wejściowych i drukuje odpowiedni znak.


1

Pyth, 32 bajty

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

Wykorzystuje spację i znak nowej linii do przewijania w dół i w górę.

Wyjaśnienie

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

Jest prawie na pewno lepszy sposób na zwiększenie i wyjście.


1

CJam , 24 22 bajtów

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

Używa (w dół i )w górę.

Wypróbuj online!

Wyjaśnienie

"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

Partia, 144 bajty

@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

Pobiera dane wejściowe na STDIN, używając, 0aby przejść na niższy bieg i 6przejść na wyższy bieg. Liczby te zostały wybrane, aby ułatwić zignorowanie obecnego sprzętu. Wreszcie, jeżeli narzędzie jest 1następnie Ndrukowany jest inaczej 0przekształca się 1, a narzędzie jest drukowany.


0

JavaScript ES6 bez ograniczeń, 136 120 znaków

136 znaków dla 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 znaków dla -+

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

Siatkówka , 65 bajtów

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

Używa uid do wzlotów i upadków.

Wypróbuj online!

Wyjaśnienie

Ten program działa z zachowaniem 1N23456sekwencji instrukcji. Śledzi bieżący bieg, mając za sobą miejsce. Potem wymaga jednej instrukcji na raz, aż nie będzie już więcej.

^
1 N23456

Zacznij od umieszczenia 1 N23456przed wejściem. Poprzednia spacja Nwskazuje, że Njest to bieżący bieg.


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

Są to dwa etapy wymiany, zgrupowane razem i trwają do momentu, aż przestaną zmieniać ciąg:

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

Pierwszy obsługuje zmianę biegów w górę. Będzie szukał dowolnej liczby biegów po spacji, a następnie a 6, a następnie u( uwskazuje instrukcję zmiany biegu na wyższy). Jeśli przed 6 znajdowały się znaki, zamienia spację znakiem bezpośrednio po nim, usuwa ui pozostawia nienaruszoną resztę ciągu. Ponieważ 6jest to obowiązkowe w meczu, zamieni przestrzeń tylko dowolną postacią przed 6. Nigdy nie zamieni się z 6.

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

Drugi etap obsługuje zmianę biegów i działa podobnie. Opcjonalnie szuka postaci przed spacją, a następnie kilku innych biegów po zakończeniu 6, a następnie d. Zamienia przestrzeń z postacią przed nią, usuwa di pozostawia resztę nietkniętą. Jeśli spacja znajdowała się na początku łańcucha, przed znakiem nie było żadnego znaku, więc nie następuje zamiana.


.* (.).*
$1

Po tym, jak nie można już wykonać żadnej z powyższych wymian, wszystkie zmiany biegów zostały zakończone. Linia jest oczyszczona ze wszystkiego oprócz sprzętu bezpośrednio po spacji. To jest ostatni bieg.


0

PowerShell, 112 87 85 bajtów

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

bez golfa

$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

zaoszczędzono 25 bajtów, czytając wskazówki codegolfa PowerShell

zapisano 2 bajty, odwracając operatorów gt / le


0

Perl 6, 144 bajtów

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

Wierzę, że działa tak, jak powinno. Ulepszenia są mile widziane. Pierwszy raz używam Perla do czegokolwiek, ale uwielbiałem myśl o języku, więc musiałem spróbować.


0

Clojure, 74 bajty

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

Składa się na sznurku zmiany biegów, utrzymując indeks jako akumulator. Każda iteracja albo zwiększa, albo zmniejsza indeks, a następnie zaciska go do zakresu 0–6. Na końcu ciąg przytrzymujący koła zębate jest indeksowany i zwracany.

Zwraca postać Clojure reprezentującą bieżący sprzęt. Bieg 1 jest zwracany jako \1, a bieg „N” jest zwracany jako\N .

Wyjaśnienie przed golfem. Podążaj za liczbami, ponieważ nie odczytuje dobrze od góry do dołu.

; 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 bajtów

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

Całkiem proste rozwiązanie.

-4 bajty dzięki @ovs!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.