Kiểm tra thiết bị xe máy!


36

Một số bạn có thể quen với cách mà một chiếc xe máy thay đổi. Nhưng đối với những người không, có vẻ như thế này

6

5

4

3

2

N

1

Bây giờ tôi muốn biết tôi đang ở trong thiết bị nào sau khi thực hiện một vài ca lên xuống. Chương trình nên hoạt động từ trung tính.

Đầu vào mẫu:

V^^

Đầu ra mẫu:

2

Như bạn có thể thấy tôi giảm tốc độ một lần từ N xuống 1 và tăng tốc hai lần sang số 2.

Đây là một mã golf. Câu trả lời ngắn nhất trong byte thắng.

Lưu ý: Đầu vào có thể là 2 ký tự bất kỳ. Có thể là U và D cho lên và xuống hoặc bất cứ điều gì bạn muốn nó phải là một chuỗi . Bạn không thể thay đổi thiết bị thứ 1 hoặc thứ 6. Nếu bạn ở thứ 6 và upshift một lần nữa, nó sẽ ở lại thứ 6. Chúc may mắn!


5
Lần tới, xin vui lòng gửi thử thách của bạn lên hộp cát để nhận phản hồi trước khi đăng lên chính
fnɛtɪk

1
@seshoumara hai yêu cầu duy nhất là đó phải là một chuỗi và bạn chỉ có thể nhập 2 ký tự. Vì vậy, có thể sử dụng một dòng mới như một nhân vật. Nhưng nếu bạn sử dụng nó cho một lý do khác, tôi không thực sự bận tâm. sẽ rất thú vị để xem những gì bạn có trong tâm trí. nhưng hãy giải thích ngắn gọn về lý do tại sao bạn làm theo cách đó nếu bạn làm như vậy. GL!
Martijn Vissers

4
Thật đáng tiếc vì điều này không giải thích cho sự thay đổi nửa bước giữa 1 và N. Sẽ thật gọn gàng khi không chỉ đi 2 N 1 N 2 3, mà còn đi 2 1 N 2 3
Cort Ammon

2
Tôi đồng ý với @CortAmmon - có một sự thay đổi duy nhất giữa 1 và 2. Đó là một nửa ca trong đó trung tính là.
Džuris

2
không phải tất cả các xe máy thay đổi như thế này. Hầu hết các xe máy không ly hợp thay đổi trong N-1-2-3-4 (hoặc N-1-2-3 trên một số phương tiện rất cổ). Họ không có bánh răng 5 hoặc 6 và sử dụng bánh răng tròn, tức là khi nó lên 4 thì việc tăng bánh răng sẽ khiến nó quấn quanh N.
phuclv

Câu trả lời:


15

JavaScript (ES6), 49 48 47 46 byte

Mong đợi:

  • 1 xuong
  • 7 cho lên
f=([c,...s],g=2)=>c?f(s,g-c&7||g):'1N'[--g]||g

Định dạng và nhận xét

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

Bánh răng được ánh xạ như sau:

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)

Cho phép chúng tôi dễ dàng kiểm tra tính hợp lệ của thiết bị hiện tại với:

(g & 7) != 0

Bản giới thiệu


7

05AB1E , 22 20 byte

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

Hãy thử trực tuyến!

Giải trình

Î                      # 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 byte

5 byte được lưu nhờ @Luis

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

Giải pháp này sử dụng '2'cho tăng ca và '0'giảm ca.

Dùng thử tại MATL Online

Giải trình

'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

@Lifless Cập nhật với lời giải thích
Suever

Rất đẹp! Tôi có thể hỏi tại sao chuỗi là 234561N thay vì 1n23456 hoặc 65432n1 không? Tôi cũng tìm thấy một lỗ hổng! Nếu bạn tiếp tục tăng tốc thì nó sẽ ở số 6 nhưng nó sẽ trả về N
Martijn Vissers

1
Tốt đẹp! Không biết về thủ thuật giới hạn trong cumsum
B. Mehta

1
@ B.Mehta Tôi cũng vậy! Luis đề nghị nó
Suever

1
@ B.Mehta Ngoài ra, vui lòng tham gia với chúng tôi trong phòng chat MATL !
Suever

6

V , 20 , 15 byte

:sil!î¬61énÀxVp

Hãy thử trực tuyến!

Đầu vào là một chuỗi các ký tự h(lên) và l(xuống).

Cảm ơn @nmjcman vì đã lưu 5 byte và dạy tôi về một tính năng vim mà tôi chưa từng biết đến!

Nếu chúng ta có thể giả sử đầu vào không bao giờ vượt quá giới hạn, thì đơn giản chỉ là 9 byte:

¬61énÀxVp

Nhưng thật không may, điều đó không được phép.

Giải trình:

: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
Ngoài ra, hãy thử trực tuyến! Nén V. Thật tuyệt.
nmjcman101

Trên thực tế, tôi nghĩ rằng điều này không hoạt động vì đi qua hoặc dưới 1/6 sẽ phá vỡ macro: /
nmjcman101

Tại sao câu trả lời 9 byte không được phép?
Albert Renshaw

@AlbertRenshaw Sẽ thất bại nếu bạn cố gắng vượt quá số 1 hoặc số 6. Ví dụ: Hãy thử trực tuyến! nên đầu ra n, không 1.
DJMcMayhem

Ồ tôi hiểu rồi, tôi nghĩ đầu vào luôn hợp lệ, ý bạn là nhân vật không thay đổi. Vẫn là một câu trả lời tuyệt vời ngay cả khi nó không hợp lệ
Albert Renshaw

6

Java 7, 106 105 103 byte

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

Giải trình:

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
}

Mã kiểm tra:

Hãy thử nó ở đây.

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

Đầu ra:

2
6
1
N

5

Haskell, 59 53 51 byte

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

Sử dụng 0cho xuống và 2lên. Ví dụ sử dụng:

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

Cảm ơn @xnor đã gỡ 6 byte! Ngoài ra, hóa ra tôi không cần tên hàm hoặc dấu ngoặc đơn để có thêm 2 byte.


Nếu bạn lấy ký tự đầu vào là 0 và 2, bạn có thể làm read[c]-2.
xnor

Chào mừng đến với PPCG! Các chức năng ẩn danh cũng tốt, vì vậy bạn không cần g=.
Laikoni

@Laikoni Tôi phải gói nó trong ngoặc đơn, phải không? Điều đó sẽ không thay đổi số byte vì vậy tôi nghĩ rằng tôi sẽ rời khỏi g=vì nó rõ ràng hơn
user1472751


4

JavaScript (ES6), 48 58 byte

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

Sử dụng

Gán nó cho một chức năng, và sau đó gọi nó. Đầu vào là một chuỗi chứa một 1upshift và một 0cho downshift.

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) trả về 1 chứ không phải N ... và mã của bạn trả về undef nếu bạn tăng từ 6 hoặc xuống từ 1
fəˈnɛtɪk

Nắm bắt tốt. Đã sửa với giá hai byte
Luke

Không hoạt động đầu vào như f("001")sẽ trả về N (giảm xuống 1, giảm xuống 1, giảm xuống N)
Emigna 23/2/2017

Không phải vòng quanh. Nó sẽ giữ ở mức 6 nếu tăng lên từ 6 và giữ ở mức 1 nếu giảm xuống từ 1. Ngoài ra, nó vẫn cung cấp cho undefift nếu bạn giảm từ 1
fəˈnɛtɪk

4

PHP 7.1, 71 byte

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

thay đổi $gtừ -1 đến 5, sử dụng bù chuỗi âm cho bánh răng đầu tiên.
Chạy với -nr, cung cấp chuỗi dịch chuyển như là đối số dòng lệnh.


4

Thạch , 17 14 byte

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

Sử dụng 6cho lên và 0xuống.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

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

Đầu vào dự kiến ​​là 'v' cho dịch chuyển xuống và '^' cho dịch chuyển lên


2

Xử lý JS (đã sửa đổi) 121 byte

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

Ung dung

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

Hãy thử trực tuyến!

Tôi đã đi với các PJ vì tôi biết nó tốt. Vấn đề duy nhất là phiên bản tôi sử dụng được gõ rất nghiêm ngặt. Tôi không thể bỏ dấu ngoặc và nhiều mánh khác. Nó khá đơn giản. Đầu vào phải đi vào biến avà nó viết thường u d. Chương trình lặp cho đến khi nó chạm vào cuối chuỗi và mỗi lần lặp nó sẽ kiểm tra xem nó là au hay d. Nếu có và nó sẽ không thử và "dịch chuyển" qua nơi bạn có thể thay đổi. Cuối cùng tôi in kết quả!


Nếu phiên bản của bạn cho phép các nhà khai thác thời gian, bạn có thể viết lại ifs của mình theo cách ngắn hơn nhiều, tôi nghĩ vậy.
Bojidar Marinov

The input should go into the variable aSử dụng đầu vào được mã hóa cứng không phải là một phương thức nhập mặc định, xem tại đây .
Laikoni

@Laikoni thật sao? Điều đó thật ngu ngốc. Tôi không có cách nào tốt hơn. Nếu tôi phải làm lại thì nó sẽ dài hơn ~ 100 byte
Christopher

Bạn có thể đơn giản bọc mã của bạn trong một chức năng? Ví dụ. void f(String[] a){...}Đó là hầu như không 100 byte.
Laikoni

@Laikoni Trong Khan Academy TreatmentJS, đó là JS thuần túy và do đó không có Chuỗi hoặc khoảng trống. Nhưng bạn đã đúng, một chức năng sẽ ngắn hơn nhiều
Kritixi Lithos

2

k, 25 byte

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

Nó nhận đầu vào dưới dạng một chuỗi và sử dụng [để chuyển xuống và ]chuyển lên, vì chúng nằm ở vị trí thuận tiện.

"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

Ví dụ:

 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 (cờ r) = 88 byte

Vì sed không có kiểu số nguyên hoặc phép toán số học, nên giải pháp được đưa ra bằng cách chỉ sử dụng các biểu thức thông thường.

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

Nó hoạt động bằng cách trượt con trỏ xdựa trên mỗi ca đầu vào, bên trái (đối với Up) hoặc bên phải (đối với Driêng), dọc theo một băng không quấn chỉ chứa các ô 65432N1. Câu trả lời ở cuối là giá trị trong ô bên trái của con trỏ.

Ví dụ chạy: hoặc Thử trực tuyến!

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

Giải trình:

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)

Đây là 76 byte , nhưng nó xuất ra trong unary.
Riley

@Riley Unary, tất nhiên! Vâng, giải pháp của bạn là khác nhau, vậy tại sao không đăng nó!
seshoumara

Bạn đã cho tôi cảm hứng cho nó. Tôi hình dung tôi sẽ cho phép bạn sử dụng nó nếu bạn muốn.
Riley

@Riley Sau đó, tôi sẽ tạo một phần riêng với phiên bản của bạn và ghi có cho bạn.
seshoumara

Tôi sẽ chỉ đăng bài của riêng tôi :)
Riley

2

GNU sed , 76 73 byte

Bao gồm +1 cho -r

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

Đầu ra là đơn nhất ngoại trừ trung tính, vẫn còn N(xem sự đồng thuận này ).

Hãy thử trực tuyến!

Điều này về cơ bản đếm lên và xuống trong unary sau đó chuyển đổi 1 thành N và 0 thành 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

Tôi nghĩ phiên bản sed của bạn có thể ngắn hơn 4 byte, nếu bạn làm việc với 1giá trị bắt đầu N, và, không có gì bằng 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 byte

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

Ung dung:

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

Ví dụ sử dụng (trong bảng điều khiển Rebol):

>> print f "DUU"         
2

>> print f "DDDUU"
2

>> print f "UUUUUUUUU"  
6

>> print f "UUUUUUUUUD"
5

2

> <> , 35 byte

Một đoạn mã nhiệt tình khuyến khích bạn lái xe vượt quá tốc độ cho phép.

Chấp nhận bất kỳ hai đầu vào có mã modulo 3 là 0 và 2, ví dụ 02.
Để tăng thêm độ tanh, tôi khuyên bạn nên sử dụng <>.

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

Giải trình :

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

Bạn có thể thử nó ở đây !


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)

Di chuyển chỉ mục của chuỗi tùy thuộc vào đầu vào và in ký tự liên quan.


1

Bình thường, 32 byte

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

Sử dụng không gian và dòng mới cho xuống và lên.

Giải trình

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

Gần như chắc chắn là một cách tốt hơn để làm tăng và đầu ra.


1

CJam , 24 22 byte

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

Sử dụng (cho xuống và )lên.

Hãy thử trực tuyến!

Giải trình

"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

Hàng loạt, 144 byte

@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

Đưa đầu vào vào STDIN, sử dụng 0để chuyển sang số thấp hơn và 6chuyển sang số cao hơn. Những con số này đã được chọn để làm cho nó dễ dàng bỏ qua các thiết bị hiện tại. Cuối cùng, nếu bánh răng 1sau đó Nđược in nếu không 0được chuyển đổi 1và bánh răng được in.


0

Javascript ES6 không giới hạn, 136 120 ký tự

136 ký tự cho 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 ký tự cho -+

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

Võng mạc , 65 byte

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

Sử dụng udcho lên và xuống.

Hãy thử trực tuyến!

Giải trình

Chương trình này hoạt động bằng cách giữ 1N23456đằng sau chuỗi hướng dẫn. Nó theo dõi các thiết bị hiện tại bằng cách có một không gian phía sau nó. Sau đó, phải mất một hướng dẫn tại một thời điểm cho đến khi không còn nữa.

^
1 N23456

Bắt đầu bằng cách đặt 1 N23456 trước đầu vào. Không gian trước Ncho biết đó Nlà thiết bị hiện tại.


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

Đây là hai giai đoạn thay thế, được nhóm lại với nhau và chạy cho đến khi chúng ngừng thay đổi chuỗi:

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

Người đầu tiên xử lý việc chuyển bánh răng lên. Nó sẽ tìm kiếm bất kỳ số lượng bánh răng nào sau khoảng trống, theo sau là a 6, sau đó theo sau u( ubiểu thị hướng dẫn chuyển bánh răng lên). Nếu có các ký tự trước 6, nó sẽ hoán đổi khoảng trắng với ký tự ngay sau nó, xóa uvà giữ nguyên phần còn lại của chuỗi. Kể từ khi6 là bắt buộc trong trận đấu, nó sẽ chỉ trao đổi không gian với bất kỳ nhân vật nào trước 6. Nó sẽ không bao giờ trao đổi với 6.

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

Giai đoạn thứ hai xử lý chuyển bánh răng xuống, và hoạt động tương tự. Nó trông tùy chọn cho một nhân vật trước không gian, sau đó một số bánh răng khác sau khi kết thúc 6, tiếp theo là d. Nó hoán đổi không gian với nhân vật trước nó, xóad và giữ nguyên phần còn lại. Nếu khoảng trắng ở đầu chuỗi, không có kết quả khớp nào cho một ký tự trước khoảng trắng, do đó không xảy ra hoán đổi.


.* (.).*
$1

Sau khi không thể thay thế ở trên nữa, tất cả các chuyển số đã được hoàn thành. Các dòng được xóa tất cả mọi thứ trừ thiết bị ngay sau không gian. Đây là thiết bị cuối cùng.


0

Powershell, 112 87 85 byte

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

vô dụng

$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

đã lưu 25 byte bằng cách đọc mẹo codegolf powershell

đã lưu 2 byte bằng cách lật các toán tử gt / le


0

Perl 6, 144 byte

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

Hoạt động như nó nên, tôi tin. Cải tiến được chào đón. Lần đầu tiên sử dụng Perl cho bất cứ điều gì, nhưng tôi thích ý nghĩ về ngôn ngữ, vì vậy tôi phải thử.


0

Clojure, 74 byte

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

Gấp qua chuỗi ca, duy trì một chỉ mục là bộ tích lũy. Mỗi lần lặp, nó tăng hoặc giảm chỉ số, sau đó kẹp nó vào phạm vi 0-6. Cuối cùng, một chuỗi giữ các bánh răng được lập chỉ mục và trả về.

Trả về một ký tự Clojure đại diện cho thiết bị hiện tại. Bánh răng 1 được trả về là \1và bánh răng 'N' được trả lại là \N.

Giải thích trước khi chơi golf. Thực hiện theo các con số, vì nó không đọc từ trên xuống.

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

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

Giải pháp khá đơn giản.

-4 byte nhờ @ovs!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.