Đảo ngược một số công tắc trên tổng đài


23

Lấy cảm hứng từ thử thách này .

Mục tiêu:

Đưa ra một tổng đài được cấu hình sẵn và một danh sách các chỉ mục, đảo ngược các công tắc tại các chỉ mục đã cho.

Một tổng đài được tạo thành từ một số số công tắc ( vhoặc ^) được bọc trong -và được sắp xếp thành các hàng có độ dài khác nhau. Dưới đây là một tổng đài ví dụ:

-v-^-v-
-^-v-
-v-^-v-

Để đảo / lật một công tắc có nghĩa là thay đổi nó từ vsang ^hoặc từ ^sang v.

Các công tắc được lập chỉ mục từ trái sang phải, từ trên xuống dưới. Ví dụ, trong ví dụ trên, hàng cuối cùng vở hàng đầu tiên sẽ ở vị trí 3 và ^ở hàng giữa sẽ ở vị trí 4 (sử dụng chỉ mục 1).

Đầu vào:

  • Một chuỗi (hoặc danh sách các chuỗi) đại diện cho tổng đài. Nó được đảm bảo để phù hợp với regex ((-[v^])+-)(\n(-[v^])+-)*.
  • Một danh sách các số có thể trống đại diện cho các chỉ mục, có thể là 0 hoặc 1 (hoặc một số tùy ý nếu bạn muốn) được lập chỉ mục. Đây là những công tắc cần được lật.

Đầu ra:

  • Một tổng đài có hình dạng giống như đầu vào với các công tắc được chỉ định đảo ngược. Bất kỳ thiết bị chuyển mạch không xác định nên giữ lại trạng thái ban đầu của chúng.

Quy tắc:

  • Đầu vào sẽ luôn được định dạng chính xác và không có chỉ mục nào được đưa ra ngoài giới hạn.
  • Danh sách các chỉ mục sẽ được sắp xếp và sẽ không có bản sao.
  • Hãy nêu câu trả lời của bạn về việc lập chỉ mục bạn sử dụng, có thể là 0, 1 hoặc một số tùy ý.
  • Khoảng trắng lưu trữ là tốt miễn là đầu ra trông giống như đầu vào.
  • Đây là nên mã ngắn nhất sẽ thắng.

Ví dụ:

#Using 1-indexing
input: #Empty Case
[],
-v-^-v-

output:
-v-^-v-

input: #Single switch
[1],
-v-

output:
-^-

input: #Skip a line
[3,5],
-^-v-v-
-v-
-^-^-

output:
-^-v-^-
-v-
-v-^-

input: #Flip one in each line + number wrap
[3,4,6],
-^-v-v-
-v-
-^-^-

output:
-^-v-^-
-^-
-^-v-

input: #Flip 'em all
[1,2,3,4,5,6],
-^-v-v-
-v-
-^-^-

output:
-v-^-^-
-^-
-v-v-

Chúng ta có thể xuất ra một mảng char hình chữ nhật, đệm bên phải các dòng ngắn hơn với khoảng trắng không? Ngoài ra, chúng ta có thể lấy đầu vào trong hình thức đó?
Luis Mendo

@LuisMendo Tôi sẽ nói Không khi lấy đó làm đầu vào. Trailing trắng là tốt miễn là nó trông giống như đầu vào.
Veskah

2
Gợi ý cho những người kiểm tra xem các ký tự có phải không >"-": Vì chuỗi đầu vào được đảm bảo bắt đầu bằng -, bạn có thể kiểm tra đối với tên tham số / đối số / tên biến bạn đang sử dụng để thay thế.
Xù xì

Câu trả lời:


11

Vim, 60, 46, 38 , 37 byte / tổ hợp phím

qq/\d
ggDJ@"/[v^]
sv^<esc>l?\V<C-r>"
x@qq4u@q

<esc><C-r>là cả 1 byte / tổ hợp phím. Bộ đếm byte

Trường hợp thử nghiệm 1 (Chế độ dài dòng)

Test Case 2 (Chế độ dài dòng)

Cảm ơn Grimy vì những ý tưởng đã dẫn đến việc giảm 22 byte :)


2
@Veskah ughhhhhh vim siêu khó tính về các trường hợp cạnh "làm gì đó 0 lần". Xem chỉnh sửa
DJMcMayhem

Không :s/\%V./\='v^'[submatch(0)=='v']thể cl<C-R>='v^'['<C-R>"'=='v']cho -13 byte? (mỗi <CR> chỉ một byte).
Grimmy

2
@Grimy Ooh, ý kiến ​​hay. Ngoài ra s == cl, như vậy -14tổng thể.
DJMcMayhem

Ý tưởng khác: s^v!<Esc>?\<C-R>"<CR>xhf!xhoặc s<CR>^v<Esc>:s/\V<C-R>"<CR>kgJ.
Grimmy

1
Tôi đã nghĩ về điều đó, nhưng không thành công nếu ký tự được đảo ngược ở cuối dòng, nhưng sau đó, thông số kỹ thuật đầu vào đảm bảo nó được theo sau bởi -vì vậy nó thực sự hoạt động! Duh.
Grimmy


4

K (oK) , 31 27 byte

Dung dịch:

`0:{@[x;(&x>93)y;"^v"94=]};

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

Giải trình:

Trả lời nhanh, sẽ cố gắng đánh golf nó. Chỉ số 0.

`0:{@[x;(&x>93)y;"^v"94=]}; / the solution
`0:                       ; / print to stdout
   {                     }  / lambda taking 2 implicit args x & y
    @[ ;        ;       ]   / apply @[var;index;function]
                     94=    / 94 (ASCII "v") equal to? returns 0 or 1
                 "v^"       / index into "v^" (ie flip switch)
               y            / index into
        (     )             / do this together
          x>93              / x greater than 93 (ASCII "]")
         &                  / indices where true
      x                     / apply to x

Ghi chú:

  • -4 byte nhờ >93thủ thuật

3

Python 3 , 140 134 103 byte

(-30 cảm ơn DJMcMayhem ♦, -1 nhiều hơn nhờ Black Owl Kai)

def f(i,y,x=1):
 for c in y:q=c>'-';p=len(i)and x==i[0]*q;print([c,"v^"[c>'^']][p],end='');x+=q;i=i[p:]

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


Oof, lần thứ hai thử chơi golf bất cứ điều gì cả. Điều này chỉ sử dụng một vòng lặp không phức tạp trên chuỗi, sử dụng xđể theo dõi chỉ số chuyển đổi hiện tại. Sử dụng 1 chỉ mục.

Ung dung:

def f(i,y):
     x = 1
     for c in y:
         nextchar = c # nextchar gets golfed out completely within the print
         if c in 'v^': # golfed as c>'-'
             if len(i) and x==i[0]:
                nextchar = 'v' if c=='^' else '^'
                i = i[1:]
             x += 1
         print(nextchar, end='')



Hoặc 104 nếu python 3 được chấp nhận
DJMcMayhem

@DJMcMayhem Ooh, cảm ơn vì đã thay thế bắt xd Bạn có muốn đăng Python 3 dưới dạng một câu trả lời riêng biệt không, hoặc bạn có nghĩ rằng nó đủ tương tự để thêm vào một chỉnh sửa này không?
Biến đổi Fourier của Rin

1
Vui lòng thêm nó :) Tôi có thể đăng câu trả lời python 3, nhưng có lẽ tôi sẽ thử đưa ra cách tiếp cận của riêng mình trước.
DJMcMayhem

3

Thạch , 12 byte

O^%5T⁴ịƲ¦40Ọ

Một chương trình đầy đủ chấp nhận một chuỗi và một danh sách các số nguyên in kết quả.

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

Làm sao?

O^%5T⁴ịƲ¦40Ọ - Main Link: list of characters, S; inversion indices, I
O            - to ordinals   ('\n':10, '-':45, '^':94, 'v':118)
        ¦    - sparse application...
       Ʋ     - ...to indices: last four links as a monad: f(O(S))
  %5         -   modulo 5   (10:0, 45:0, 94:4, 118:3)
    T        -   truthy indices (giving, X, indices of '^' and 'v' in S)
     ⁴       -   4th command line argument = I
      ị      -   index into X   (giving indices of '^' and 'v' to invert in S)
 ^       40  - ...action: XOR with 40   (94:118, 118:94)
           Ọ - from ordinals
             - implicit print


3

Perl 6 , 31 byte

->$_,\s{S:nth(s){\^|v}=$/~^'('}

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

(-2 byte nhờ Jo King)

Toán tử thay thế của Perl 6 Sthuận tiện lấy một nthtrạng từ chấp nhận không chỉ một chỉ mục duy nhất để thực hiện thay thế, mà cả danh sách của chúng, chính xác khi cần ở đây.

Sự thay thế là $/ ~^ '(', trong đó $/văn bản phù hợp (hoặc vhoặc ^), ~^là toán tử độc quyền hoặc chuỗi, và (là ký tự có bit biến vthành ^và ngược lại.





2

Thạch , 14 byte

⁾^vḟ$€>”-T⁹ịƲ¦

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

Chương trình đầy đủ.

Cảm giác này quá dài ...


Tôi không biết Jelly vì vậy không thể tự mình tìm cách thử nó nhưng bạn có thể thay thế ”-bằng tên của đối số đầu tiên ( ³?), Được đảm bảo bắt đầu bằng một -, thay vào đó không?
Shaggy

@Shaggy Không, vì >véc tơ. Bạn có thể thấy rằng nó không hoạt động .
Erik the Outgolfer

ah, đó chính xác là những gì tôi đã cố gắng :) Không biết liệu đó có phải là sự thiếu hiểu biết về Jelly của tôi hay không là nguyên nhân. Đừng cho rằng có một nhân vật được tích hợp sẵn để có được ký tự đầu tiên của đối số đầu tiên?
Shaggy

@Shaggy Erm ... chỉ được xây dựng-in cho các đối số dòng lệnh là ³, , , , đối với những người đầu tiên đến CLAS thứ năm tương ứng. Bạn có thể đọc trang Nguyên tử để tìm hiểu xem có tồn tại một chức năng tích hợp cụ thể nào không.
Erik the Outgolfer

Ah, tốt, đáng giá một shot. Một ngày nào đó, tôi sẽ lao vào Jelly đúng cách.
Shaggy

2

Stax , 13 byte

¿╫╦ÜΦ1▌X○!ΩTæ

Chạy và gỡ lỗi nó

Điều này sử dụng các chỉ số dựa trên 0.

  1. Tìm tất cả các chỉ số của regex [v^] .
  2. Chỉ số vào chỉ mục mảng bằng cách sử dụng đầu vào.
  3. Ở mỗi kết quả, xor mã ascii của đầu vào với 40. Đây là xor('v', '^').

2

Sạch , 93 byte

import StdEnv
$i=foldl(\s c=s++[if(any((==)(sum[1\\k<-s|k>'-']))i&&c>'-')if(c>'^')'^''v'c])[]

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

Xác định hàm $ :: [Int] -> [Char] -> [Char]lấy danh sách các chỉ mục được lập chỉ mục bằng 0 và trả về hàm lấy chuỗi và trả về chuỗi đã thay đổi.




1

JavaScript, 111 byte

x=>y=>{x.map(i=>eval(`y=y.replace(/(((v|\\^)[^^v]*){${i}})(v|\\^)/,(a,b,c,d,e)=>b+(e<"v"?"v":"^"))`));return y}

Đưa đầu vào ở định dạng f (x) (y) trong đó x là chỉ số và y là tổng đài. Các chỉ số là 0 được lập chỉ mục

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

Giải trình

Đối với mỗi chỉ số

x.map(i=>...

xây dựng biểu thức chính tìm thấy chỉ mục + 1 "^" hoặc "v"

`.../(((v|\\^)[^^v]*){${i}})(v|\\^)/...`

chèn nó vào một chuỗi để thay thế nó bằng ký hiệu ngược lại "v" <-> "^"

y=y.replace(...,(a,b,c,d,e)=>b+(e<"v"?"v":"^"))

sau đó đánh giá chuỗi như một hàm

eval(...)

Sau khi lặp qua các chỉ số để chuyển đổi, hãy trả lại tổng đài

return y

1

Thạch , 17 byte

⁾^vK;`©⁹e€ky@€⁸¦®

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

Một chương trình đầy đủ lấy các chỉ số làm đối số thứ nhất và chuỗi làm đối số thứ hai. In đầu ra với các công tắc được chỉ định lật.


1

Võng mạc 0.8.2 , 66 62 byte

\d+
$*
T`v^`^v`.(?<=\b(?(3)$)(?<-3>1)+(,1+)*(-|¶|(v|\^))+)
1A`

Hãy thử trực tuyến! Liên kết bao gồm trường hợp thử nghiệm. 1 chỉ mục. Giải trình:

\d+
$*

Chuyển đổi số đầu vào thành unary.

T`v^`^v`.(?<=\b(?(3)$)(?<-3>1)+(,1+)*(-|¶|(v|\^))+)

Chuyển ngữ giữa v^tất cả các ký tự có thuộc tính rằng số vs và ^s cho đến nay (đã bao gồm) bằng một trong các số đầu vào.

1A`

Xóa các số đầu vào.


1

Than , 23 byte

⭆η⎇№θ⌕ΦLη№v^§ηλκ§v^⁼vιι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉ số 0. Giải trình:

 η                      Input string
⭆                       Map over characters and join
  ⎇                     If
   №                    Count of (i.e. exists)
     ⌕                  Index of
               κ        Current index in
       L                Length of
        η               Input string
      Φ                 Implicit range filtered by
         №              Count of (i.e. exists)
             η          Input string
            §           Indexed by
              λ         Current value
          v^            In literal string `v^`
    θ                   In input list
                 v^     Then literal `v^`
                §       Indexed by
                     ι  Current character
                   ⁼    Equal to
                    v   Literal `v`
                      ι Else current character



1

Japt , 15 byte

®c^(Z>V©øT° *#(

Thử nó

®c^(Z>V©ø°T *#(    U = Input String, V = Array of Indices
®                  Map each Z in U
 c^                   XOR Z's charcode by
   (Z>V                 Z is 'v' or '^'
      ©                 Short-circuiting Logical and
       øT°              The current Z's index is in V
             *#(        Multiply the boolean with 40 (false = 0, true = 1)

1

Japt , 16 14 byte

Ëc^#(*(D>V©øT°

Thử nó

Ë>V©øT° ?Dc^#(:D     :Implicit input of multi-line string U & integer array V
Ë                    :Map each D in U
 >V                  :  Greater than V? (Coerces V to a string and, conveniently, all digits are > "\n" & "-" and < "^" & "v")
   ©                 :  Logical AND with
    ø                :  Does V contain
     T°              :    T (initially 0) postfix incremented
        ?            :  If true
         Dc          :  Charcode of D
           ^#(       :  XOR with 40
              :D     :  Else D

Aw, mã của bạn không còn hạnh phúc nữa (nó đã mất :D)
Veskah
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.